<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Utkal Labs's Engineering blog]]></title><description><![CDATA[Team of experienced industry experts sharing a common goal to provide optimum solutions to any problem. Let's discuss: (+1)32390 05072, (+91)93383 08255]]></description><link>https://blog.utkallabs.com</link><image><url>https://cdn.hashnode.com/res/hashnode/image/upload/v1667322860256/D9shgf8tu.png</url><title>Utkal Labs&apos;s Engineering blog</title><link>https://blog.utkallabs.com</link></image><generator>RSS for Node</generator><lastBuildDate>Sun, 17 May 2026 21:05:43 GMT</lastBuildDate><atom:link href="https://blog.utkallabs.com/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[Exploring Data Visualization with D3.js and Nivo]]></title><description><![CDATA[Introduction:
In today's digital landscape, effective data visualization is crucial for understanding and communicating complex information like it's for business intelligence, scientific research, or storytelling, data visualization tools play a cru...]]></description><link>https://blog.utkallabs.com/exploring-data-visualization-with-d3js-and-nivo</link><guid isPermaLink="true">https://blog.utkallabs.com/exploring-data-visualization-with-d3js-and-nivo</guid><category><![CDATA[d3 in react]]></category><category><![CDATA[nivo]]></category><category><![CDATA[D3.js]]></category><dc:creator><![CDATA[Ashish sahoo]]></dc:creator><pubDate>Sat, 28 Jun 2025 03:08:49 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1710505557666/d8d80ca0-3020-4bb0-9706-e97acef24a31.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2 id="heading-introduction">Introduction:</h2>
<p>In today's digital landscape, effective data visualization is crucial for understanding and communicating complex information like it's for business intelligence, scientific research, or storytelling, data visualization tools play a crucial role in helping us make sense of complex datasets.</p>
<p>Among the Excess Surplus of tools available, D3.js (Data-Driven Documents) and Nivo stand out as powerful libraries for crafting visually stunning and interactive graphics.</p>
<p>This blog explores the features, pros and cons, and practical examples of both D3.js and Nivo to help you choose the right tool for your data visualization needs.</p>
<h2 id="heading-section-1-understanding-d3js">Section 1: Understanding D3.js</h2>
<p>D3.js, short for Data-Driven Documents, is a powerful JavaScript library for creating dynamic, interactive data visualizations in web browsers. D3.js enables developers to create custom visualizations tailored to specific needs and apply data-driven transformations to generate visual representations of the data. It provides a comprehensive toolkit for manipulating documents based on data, making it ideal for building custom and highly expressive visualizations.</p>
<h3 id="heading-here-are-some-of-the-things-you-can-do-with-d3">Here are some of the things you can do with D3:</h3>
<ul>
<li><p>Create bar charts, line charts, pie charts, and other common chart types.</p>
</li>
<li><p>Create more complex visualizations, such as maps, heatmaps, and treemaps.</p>
</li>
<li><p>Add interactivity to your visualizations, such as panning, zooming, and brushing.</p>
</li>
</ul>
<h3 id="heading-drawbacks">Drawbacks:</h3>
<ul>
<li><p>we need to write the code everything from scartch to create charts</p>
</li>
<li><p>there is no pre-built, high-level components, requiring custom solutions for common visualization tasks.</p>
</li>
<li><p>we need to handle many details manually, which is diffcult to manage code and longer development times.</p>
</li>
<li><p>Lack of Official Support that leading to slower bug fixes and less predictability to counter the bug</p>
</li>
</ul>
<h3 id="heading-installing-d3js-in-a-react-application">Installing D3.js in a React Application:</h3>
<p>To install D3.js in a React application using npm, you can run the following command in your project directory:</p>
<pre><code class="lang-javascript">npm install d3
</code></pre>
<p>Once D3.js is installed, you can import it into your React component like this:</p>
<pre><code class="lang-javascript"><span class="hljs-keyword">import</span> * <span class="hljs-keyword">as</span> d3 <span class="hljs-keyword">from</span> <span class="hljs-string">'d3'</span>;
</code></pre>
<pre><code class="lang-javascript"><span class="hljs-comment">// Sample dataset</span>
<span class="hljs-keyword">const</span> data = [<span class="hljs-number">10</span>, <span class="hljs-number">20</span>, <span class="hljs-number">30</span>, <span class="hljs-number">40</span>, <span class="hljs-number">50</span>];

<span class="hljs-comment">// Create SVG container</span>
<span class="hljs-keyword">const</span> svg = d3.select(<span class="hljs-string">'body'</span>)
  .append(<span class="hljs-string">'svg'</span>)
  .attr(<span class="hljs-string">'width'</span>, <span class="hljs-number">400</span>)
  .attr(<span class="hljs-string">'height'</span>, <span class="hljs-number">200</span>);

<span class="hljs-comment">// Create bars</span>
svg.selectAll(<span class="hljs-string">'rect'</span>)
  .data(data)
  .enter()
  .append(<span class="hljs-string">'rect'</span>)
  .attr(<span class="hljs-string">'x'</span>, <span class="hljs-function">(<span class="hljs-params">d, i</span>) =&gt;</span> i * <span class="hljs-number">50</span>)
  .attr(<span class="hljs-string">'y'</span>, <span class="hljs-function">(<span class="hljs-params">d</span>) =&gt;</span> <span class="hljs-number">200</span> - d)
  .attr(<span class="hljs-string">'width'</span>, <span class="hljs-number">40</span>)
  .attr(<span class="hljs-string">'height'</span>, <span class="hljs-function">(<span class="hljs-params">d</span>) =&gt;</span> d)
  .attr(<span class="hljs-string">'fill'</span>, <span class="hljs-string">'steelblue'</span>);
</code></pre>
<h2 id="heading-section-2-introducing-nivo">Section 2: Introducing Nivo</h2>
<p>Nivo is a powerful React data visualization library that built on top of D3.js, Nivo abstracts away much of the complexity of D3 to offer a rich set of customizable and responsive components for creating stunning visualizations. Built with React developers in mind, Nivo provides a declarative API and a wide range of ready-to-use chart types, making it easy to create complex visualizations with minimal code.</p>
<h2 id="heading-features-of-nivo">Features of Nivo:</h2>
<h3 id="heading-declarative-api">Declarative API:</h3>
<p>Nivo's declarative API allows developers to define visualizations using simple React components, abstracting away much of the complexity of D3.js while maintaining flexibility and customization options.</p>
<h3 id="heading-rich-set-of-components">Rich Set of Components:</h3>
<p>Nivo offers a diverse collection of components for various chart types, including line charts, bar charts, pie charts, scatter plots, and more, catering to a wide range of data visualization needs.</p>
<h3 id="heading-responsive-design">Responsive Design:</h3>
<p>All Nivo components are designed to be responsive out of the box, ensuring that visualizations adapt gracefully to different screen sizes and devices, providing an optimal viewing experience across desktop and mobile platforms.</p>
<h3 id="heading-customization">Customization:</h3>
<p>Nivo provides extensive customization options, allowing developers to fine-tune every aspect of the visualizations, including colors, labels, legends, tooltips, and animations, to match the design and branding requirements of their applications.</p>
<h2 id="heading-installing-nivo-in-a-react-application">Installing Nivo in a React Application:</h2>
<p>to install Nivo in a React application using npm, you can run the following command:</p>
<pre><code class="lang-javascript">npm install @nivo/pie @nivo/bar
</code></pre>
<h3 id="heading-importing-nivo-components-in-a-react-component">Importing Nivo Components in a React Component:</h3>
<p>Once Nivo is installed, you can import the desired Nivo components into your React component. For example, if you want to use the bar chart component, you can import it like this:</p>
<pre><code class="lang-javascript"><span class="hljs-keyword">import</span> { ResponsiveBar } <span class="hljs-keyword">from</span> <span class="hljs-string">'@nivo/bar'</span>;
</code></pre>
<ol>
<li>Importing Nivo Components in a React Component:</li>
</ol>
<p>Once Nivo is installed, you can import the desired Nivo components into your React component. For example, if you want to use the bar chart component, you can import it like this:</p>
<pre><code class="lang-javascript"><span class="hljs-keyword">import</span> { ResponsiveBar } <span class="hljs-keyword">from</span> <span class="hljs-string">'@nivo/bar'</span>;
</code></pre>
<pre><code class="lang-javascript"><span class="hljs-keyword">import</span> React <span class="hljs-keyword">from</span> <span class="hljs-string">"react"</span>;
<span class="hljs-keyword">import</span> { ResponsiveBar } <span class="hljs-keyword">from</span> <span class="hljs-string">"@nivo/bar"</span>;

<span class="hljs-keyword">const</span> data = [
  {
    <span class="hljs-attr">country</span>: <span class="hljs-string">"AD"</span>,
    <span class="hljs-string">"hot dog"</span>: <span class="hljs-number">103</span>,
    <span class="hljs-string">"hot dogColor"</span>: <span class="hljs-string">"hsl(299, 70%, 50%)"</span>,
    <span class="hljs-attr">burger</span>: <span class="hljs-number">153</span>,
    <span class="hljs-attr">burgerColor</span>: <span class="hljs-string">"hsl(31, 70%, 50%)"</span>,
    <span class="hljs-attr">sandwich</span>: <span class="hljs-number">98</span>,
    <span class="hljs-attr">sandwichColor</span>: <span class="hljs-string">"hsl(228, 70%, 50%)"</span>,
    <span class="hljs-attr">kebab</span>: <span class="hljs-number">198</span>,
    <span class="hljs-attr">kebabColor</span>: <span class="hljs-string">"hsl(124, 70%, 50%)"</span>,
    <span class="hljs-attr">fries</span>: <span class="hljs-number">13</span>,
    <span class="hljs-attr">friesColor</span>: <span class="hljs-string">"hsl(17, 70%, 50%)"</span>,
    <span class="hljs-attr">donut</span>: <span class="hljs-number">123</span>,
    <span class="hljs-attr">donutColor</span>: <span class="hljs-string">"hsl(18, 70%, 50%)"</span>,
  },
  {
    <span class="hljs-attr">country</span>: <span class="hljs-string">"AE"</span>,
    <span class="hljs-string">"hot dog"</span>: <span class="hljs-number">126</span>,
    <span class="hljs-string">"hot dogColor"</span>: <span class="hljs-string">"hsl(313, 70%, 50%)"</span>,
    <span class="hljs-attr">burger</span>: <span class="hljs-number">167</span>,
    <span class="hljs-attr">burgerColor</span>: <span class="hljs-string">"hsl(354, 70%, 50%)"</span>,
    <span class="hljs-attr">sandwich</span>: <span class="hljs-number">109</span>,
    <span class="hljs-attr">sandwichColor</span>: <span class="hljs-string">"hsl(179, 70%, 50%)"</span>,
    <span class="hljs-attr">kebab</span>: <span class="hljs-number">190</span>,
    <span class="hljs-attr">kebabColor</span>: <span class="hljs-string">"hsl(51, 70%, 50%)"</span>,
    <span class="hljs-attr">fries</span>: <span class="hljs-number">77</span>,
    <span class="hljs-attr">friesColor</span>: <span class="hljs-string">"hsl(313, 70%, 50%)"</span>,
    <span class="hljs-attr">donut</span>: <span class="hljs-number">19</span>,
    <span class="hljs-attr">donutColor</span>: <span class="hljs-string">"hsl(73, 70%, 50%)"</span>,
  },
  {
    <span class="hljs-attr">country</span>: <span class="hljs-string">"AF"</span>,
    <span class="hljs-string">"hot dog"</span>: <span class="hljs-number">67</span>,
    <span class="hljs-string">"hot dogColor"</span>: <span class="hljs-string">"hsl(16, 70%, 50%)"</span>,
    <span class="hljs-attr">burger</span>: <span class="hljs-number">25</span>,
    <span class="hljs-attr">burgerColor</span>: <span class="hljs-string">"hsl(265, 70%, 50%)"</span>,
    <span class="hljs-attr">sandwich</span>: <span class="hljs-number">78</span>,
    <span class="hljs-attr">sandwichColor</span>: <span class="hljs-string">"hsl(335, 70%, 50%)"</span>,
    <span class="hljs-attr">kebab</span>: <span class="hljs-number">128</span>,
    <span class="hljs-attr">kebabColor</span>: <span class="hljs-string">"hsl(269, 70%, 50%)"</span>,
    <span class="hljs-attr">fries</span>: <span class="hljs-number">82</span>,
    <span class="hljs-attr">friesColor</span>: <span class="hljs-string">"hsl(20, 70%, 50%)"</span>,
    <span class="hljs-attr">donut</span>: <span class="hljs-number">93</span>,
    <span class="hljs-attr">donutColor</span>: <span class="hljs-string">"hsl(279, 70%, 50%)"</span>,
  },
  {
    <span class="hljs-attr">country</span>: <span class="hljs-string">"AG"</span>,
    <span class="hljs-string">"hot dog"</span>: <span class="hljs-number">63</span>,
    <span class="hljs-string">"hot dogColor"</span>: <span class="hljs-string">"hsl(215, 70%, 50%)"</span>,
    <span class="hljs-attr">burger</span>: <span class="hljs-number">197</span>,
    <span class="hljs-attr">burgerColor</span>: <span class="hljs-string">"hsl(191, 70%, 50%)"</span>,
    <span class="hljs-attr">sandwich</span>: <span class="hljs-number">159</span>,
    <span class="hljs-attr">sandwichColor</span>: <span class="hljs-string">"hsl(241, 70%, 50%)"</span>,
    <span class="hljs-attr">kebab</span>: <span class="hljs-number">44</span>,
    <span class="hljs-attr">kebabColor</span>: <span class="hljs-string">"hsl(2, 70%, 50%)"</span>,
    <span class="hljs-attr">fries</span>: <span class="hljs-number">144</span>,
    <span class="hljs-attr">friesColor</span>: <span class="hljs-string">"hsl(147, 70%, 50%)"</span>,
    <span class="hljs-attr">donut</span>: <span class="hljs-number">15</span>,
    <span class="hljs-attr">donutColor</span>: <span class="hljs-string">"hsl(108, 70%, 50%)"</span>,
  },
  {
    <span class="hljs-attr">country</span>: <span class="hljs-string">"AI"</span>,
    <span class="hljs-string">"hot dog"</span>: <span class="hljs-number">28</span>,
    <span class="hljs-string">"hot dogColor"</span>: <span class="hljs-string">"hsl(270, 70%, 50%)"</span>,
    <span class="hljs-attr">burger</span>: <span class="hljs-number">37</span>,
    <span class="hljs-attr">burgerColor</span>: <span class="hljs-string">"hsl(172, 70%, 50%)"</span>,
    <span class="hljs-attr">sandwich</span>: <span class="hljs-number">18</span>,
    <span class="hljs-attr">sandwichColor</span>: <span class="hljs-string">"hsl(3, 70%, 50%)"</span>,
    <span class="hljs-attr">kebab</span>: <span class="hljs-number">199</span>,
    <span class="hljs-attr">kebabColor</span>: <span class="hljs-string">"hsl(210, 70%, 50%)"</span>,
    <span class="hljs-attr">fries</span>: <span class="hljs-number">75</span>,
    <span class="hljs-attr">friesColor</span>: <span class="hljs-string">"hsl(294, 70%, 50%)"</span>,
    <span class="hljs-attr">donut</span>: <span class="hljs-number">35</span>,
    <span class="hljs-attr">donutColor</span>: <span class="hljs-string">"hsl(317, 70%, 50%)"</span>,
  },


];

<span class="hljs-keyword">const</span> Nivobar = <span class="hljs-function">() =&gt;</span> {
  <span class="hljs-keyword">return</span> (
    <span class="xml"><span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">style</span>=<span class="hljs-string">{{</span> <span class="hljs-attr">width:</span> "<span class="hljs-attr">80vw</span>", <span class="hljs-attr">height:</span> "<span class="hljs-attr">54vh</span>", <span class="hljs-attr">margin:</span> "<span class="hljs-attr">auto</span>" }}&gt;</span>
      <span class="hljs-tag">&lt;<span class="hljs-name">ResponsiveBar</span>
        <span class="hljs-attr">data</span>=<span class="hljs-string">{data}</span>
        <span class="hljs-attr">keys</span>=<span class="hljs-string">{[</span>"<span class="hljs-attr">hot</span> <span class="hljs-attr">dog</span>", "<span class="hljs-attr">burger</span>", "<span class="hljs-attr">sandwich</span>", "<span class="hljs-attr">kebab</span>", "<span class="hljs-attr">fries</span>", "<span class="hljs-attr">donut</span>"]}
        <span class="hljs-attr">indexBy</span>=<span class="hljs-string">"country"</span>
        <span class="hljs-attr">margin</span>=<span class="hljs-string">{{</span> <span class="hljs-attr">top:</span> <span class="hljs-attr">50</span>, <span class="hljs-attr">right:</span> <span class="hljs-attr">130</span>, <span class="hljs-attr">bottom:</span> <span class="hljs-attr">50</span>, <span class="hljs-attr">left:</span> <span class="hljs-attr">60</span> }}
        <span class="hljs-attr">padding</span>=<span class="hljs-string">{0.3}</span>
        <span class="hljs-attr">valueScale</span>=<span class="hljs-string">{{</span> <span class="hljs-attr">type:</span> "<span class="hljs-attr">linear</span>" }}
        <span class="hljs-attr">indexScale</span>=<span class="hljs-string">{{</span> <span class="hljs-attr">type:</span> "<span class="hljs-attr">band</span>", <span class="hljs-attr">round:</span> <span class="hljs-attr">true</span> }}
        <span class="hljs-attr">colors</span>=<span class="hljs-string">{{</span> <span class="hljs-attr">scheme:</span> "<span class="hljs-attr">nivo</span>" }}
        <span class="hljs-attr">defs</span>=<span class="hljs-string">{[</span>
          {
            <span class="hljs-attr">id:</span> "<span class="hljs-attr">dots</span>",
            <span class="hljs-attr">type:</span> "<span class="hljs-attr">patternDots</span>",
            <span class="hljs-attr">background:</span> "<span class="hljs-attr">inherit</span>",
            <span class="hljs-attr">color:</span> "#<span class="hljs-attr">38bcb2</span>",
            <span class="hljs-attr">size:</span> <span class="hljs-attr">4</span>,
            <span class="hljs-attr">padding:</span> <span class="hljs-attr">1</span>,
            <span class="hljs-attr">stagger:</span> <span class="hljs-attr">true</span>,
          },
          {
            <span class="hljs-attr">id:</span> "<span class="hljs-attr">lines</span>",
            <span class="hljs-attr">type:</span> "<span class="hljs-attr">patternLines</span>",
            <span class="hljs-attr">background:</span> "<span class="hljs-attr">inherit</span>",
            <span class="hljs-attr">color:</span> "#<span class="hljs-attr">eed312</span>",
            <span class="hljs-attr">rotation:</span> <span class="hljs-attr">-45</span>,
            <span class="hljs-attr">lineWidth:</span> <span class="hljs-attr">6</span>,
            <span class="hljs-attr">spacing:</span> <span class="hljs-attr">10</span>,
          },
        ]}

        <span class="hljs-attr">borderColor</span>=<span class="hljs-string">{{</span>
          <span class="hljs-attr">from:</span> "<span class="hljs-attr">color</span>",
          <span class="hljs-attr">modifiers:</span> [["<span class="hljs-attr">darker</span>", <span class="hljs-attr">1.6</span>]],
        }}
        <span class="hljs-attr">axisTop</span>=<span class="hljs-string">{null}</span>
        <span class="hljs-attr">axisRight</span>=<span class="hljs-string">{null}</span>
        <span class="hljs-attr">axisBottom</span>=<span class="hljs-string">{{</span>
          <span class="hljs-attr">tickSize:</span> <span class="hljs-attr">5</span>,
          <span class="hljs-attr">tickPadding:</span> <span class="hljs-attr">5</span>,
          <span class="hljs-attr">tickRotation:</span> <span class="hljs-attr">0</span>,
          <span class="hljs-attr">legend:</span> "<span class="hljs-attr">country</span>",
          <span class="hljs-attr">legendPosition:</span> "<span class="hljs-attr">middle</span>",
          <span class="hljs-attr">legendOffset:</span> <span class="hljs-attr">32</span>,
          <span class="hljs-attr">truncateTickAt:</span> <span class="hljs-attr">0</span>,
        }}
        <span class="hljs-attr">axisLeft</span>=<span class="hljs-string">{{</span>
          <span class="hljs-attr">tickSize:</span> <span class="hljs-attr">5</span>,
          <span class="hljs-attr">tickPadding:</span> <span class="hljs-attr">5</span>,
          <span class="hljs-attr">tickRotation:</span> <span class="hljs-attr">0</span>,
          <span class="hljs-attr">legend:</span> "<span class="hljs-attr">food</span>",
          <span class="hljs-attr">legendPosition:</span> "<span class="hljs-attr">middle</span>",
          <span class="hljs-attr">legendOffset:</span> <span class="hljs-attr">-40</span>,
          <span class="hljs-attr">truncateTickAt:</span> <span class="hljs-attr">0</span>,
        }}
        <span class="hljs-attr">labelSkipWidth</span>=<span class="hljs-string">{12}</span>
        <span class="hljs-attr">labelSkipHeight</span>=<span class="hljs-string">{12}</span>
        <span class="hljs-attr">labelTextColor</span>=<span class="hljs-string">{{</span>
          <span class="hljs-attr">from:</span> "<span class="hljs-attr">color</span>",
          <span class="hljs-attr">modifiers:</span> [["<span class="hljs-attr">darker</span>", <span class="hljs-attr">1.6</span>]],
        }}
        <span class="hljs-attr">legends</span>=<span class="hljs-string">{[</span>
          {
            <span class="hljs-attr">dataFrom:</span> "<span class="hljs-attr">keys</span>",
            <span class="hljs-attr">anchor:</span> "<span class="hljs-attr">bottom-right</span>",
            <span class="hljs-attr">direction:</span> "<span class="hljs-attr">column</span>",
            <span class="hljs-attr">justify:</span> <span class="hljs-attr">false</span>,
            <span class="hljs-attr">translateX:</span> <span class="hljs-attr">120</span>,
            <span class="hljs-attr">translateY:</span> <span class="hljs-attr">0</span>,
            <span class="hljs-attr">itemsSpacing:</span> <span class="hljs-attr">2</span>,
            <span class="hljs-attr">itemWidth:</span> <span class="hljs-attr">100</span>,
            <span class="hljs-attr">itemHeight:</span> <span class="hljs-attr">20</span>,
            <span class="hljs-attr">itemDirection:</span> "<span class="hljs-attr">left-to-right</span>",
            <span class="hljs-attr">itemOpacity:</span> <span class="hljs-attr">0.85</span>,
            <span class="hljs-attr">symbolSize:</span> <span class="hljs-attr">20</span>,
            <span class="hljs-attr">effects:</span> [
              {
                <span class="hljs-attr">on:</span> "<span class="hljs-attr">hover</span>",
                <span class="hljs-attr">style:</span> {
                  <span class="hljs-attr">itemOpacity:</span> <span class="hljs-attr">1</span>,
                },
              },
            ],
          },
        ]}
        <span class="hljs-attr">role</span>=<span class="hljs-string">"application"</span>
        <span class="hljs-attr">ariaLabel</span>=<span class="hljs-string">"Nivo bar chart demo"</span>
        <span class="hljs-attr">barAriaLabel</span>=<span class="hljs-string">{(e)</span> =&gt;</span>
          e.id + ": " + e.formattedValue + " in country: " + e.indexValue
        }
      /&gt;
    <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span></span>
  );
};

<span class="hljs-keyword">export</span> <span class="hljs-keyword">default</span> Nivobar
</code></pre>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1710662613248/b58889aa-aea0-4004-9d3d-0ea4563e6676.png" alt class="image--center mx-auto" /></p>
<h2 id="heading-conclusion">Conclusion</h2>
<p>Choosing between D3.js and Nivo depends on project requirements and developer preferences. Both empower developers to transform data into compelling visual narratives, driving informed decisions in the ever-evolving landscape of data visualization.</p>
<p>May your visualizations illuminate insights and inspire action. Happy visualizing!</p>
]]></content:encoded></item><item><title><![CDATA[Generics in Typescript]]></title><description><![CDATA[Definition :)
A TypeScript generic can be defined as a programming feature that enables the creation of reusable components and functions capable of working with various data types without sacrificing type safety. By allowing the specification of typ...]]></description><link>https://blog.utkallabs.com/generics-in-typescript</link><guid isPermaLink="true">https://blog.utkallabs.com/generics-in-typescript</guid><category><![CDATA[UtkalLabs]]></category><category><![CDATA[React]]></category><category><![CDATA[JavaScript]]></category><category><![CDATA[TypeScript]]></category><category><![CDATA[Developer]]></category><category><![CDATA[technology]]></category><dc:creator><![CDATA[Abhisek Mohapatra]]></dc:creator><pubDate>Sat, 28 Jun 2025 03:07:30 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1710474421547/bbd17e20-a32a-4519-b165-70048755b0c7.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h3 id="heading-definition">Definition :)</h3>
<p>A TypeScript generic can be defined as a programming feature that enables the creation of reusable components and functions capable of working with various data types without sacrificing type safety. By allowing the specification of type parameters when defining functions, classes, or interfaces, generics empower developers to write flexible and adaptable code that maintains strict type checking, enhancing code readability, maintainability, and scalability in our projects.</p>
<h3 id="heading-when-to-use">When To Use? 🤔:)</h3>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1710417953530/57816303-4cf3-4825-bb90-390f554f9122.png" alt class="image--center mx-auto" /></p>
<p>Have a look at the above screenshot, here I am trying to store a number in an array. This is the correct way, but what if after going ahead I have a requirement to do the same thing with a string or a boolean or anything else? You can solve it by writing another function according to your requirement or you will use "<strong>any"</strong> and it will work absolutely fine, but it is not a good practice to write the same code again and again and use <strong>"any"</strong> with Typescript as well. Also At this time, the generics came into the picture. let's solve this and I will explain after.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1710423496289/db865ba1-8baf-457d-b854-ab3bfe77d39f.png" alt class="image--center mx-auto" /></p>
<p>In the above example, I did the same thing but with multiple data types. Let's understand how it works.</p>
<p>Syntax :)</p>
<p><code>&lt;&gt;</code> (angle brackets) : We pass and receive data types using these brackets.</p>
<p>In the above example, I am receiving the datatypes in <code>&lt;T&gt;</code>, T is not mandatory you can use anything. Following the syntax, I pass the data types inside <code>&lt;&gt;</code> as per my requirements and don't need to write extra codes.</p>
<p>Do you think, it is possible to work with multiple data types? Yes, we can use it. Let's see in action :)</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1710486451051/2d3f873e-f3c1-4eb2-831f-648e23332f40.png" alt class="image--center mx-auto" /></p>
<p>In the above, I defined a function named sendResponse. When I have to send a response, The response might be a success or an error or whatever, according to the response I am sure that the data type has never been a constant. So I am using <mark>Generics</mark> here so that I can use data types as per my requirement.</p>
<h3 id="heading-use-generics-with-types">Use Generics With Types 🛶:)</h3>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1710430520471/a2ff7884-5cda-4822-b051-82f58d904378.png" alt class="image--center mx-auto" /></p>
<p>As a developer, we all are doing API calls, and we are getting the response in different Data Types as per our requirements, but most of the time structures are the same. As I create a structure for storing the responses, as we know <code>"any"</code> is not a good practice. So what can we do?</p>
<p>If we use <code>generic</code> and pass the data type of the data which we are going to store 💡. Let's do this 🚀.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1710431790376/d3dc8a17-d5b2-4a28-8b16-4bf80f5d6172.png" alt class="image--center mx-auto" /></p>
<p>In the provided example, I have a structure where I need to store data against the <strong>"data"</strong> key. However, my requirements vary, so I created a generic type holder named <code>&lt;Data&gt;</code>. Now, I am storing various data types in a single structure. Initially, I store a user's details in a variable named <code>userDetails</code>. Subsequently, I store the details of all users in a variable named <code>allUsers</code>.</p>
<h3 id="heading-conclusion">Conclusion 🌨️:)</h3>
<p>That's all from my side.</p>
<p>Thanks for your valuable time.</p>
<p>I am looking forward to hearing from you if I missed something.</p>
<p>Happy Coding :)</p>
]]></content:encoded></item><item><title><![CDATA[Taming the Bugs: Mobile App Testing Strategies]]></title><description><![CDATA[In today's digital age, mobile applications are integral to our daily routines, from staying connected to managing finances and entertainment. Behind every successful mobile app lies a robust testing process ensuring it functions flawlessly across de...]]></description><link>https://blog.utkallabs.com/taming-the-bugs-mobile-app-testing-strategies</link><guid isPermaLink="true">https://blog.utkallabs.com/taming-the-bugs-mobile-app-testing-strategies</guid><category><![CDATA[automation]]></category><category><![CDATA[QA]]></category><category><![CDATA[Testing]]></category><dc:creator><![CDATA[Vivek Singhdeo]]></dc:creator><pubDate>Sat, 28 Jun 2025 03:06:42 GMT</pubDate><content:encoded><![CDATA[<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1719561019863/c97b5a8d-7e1d-44f6-8aff-547ec6ffb61e.jpeg" alt class="image--center mx-auto" /></p>
<p>In today's digital age, mobile applications are integral to our daily routines, from staying connected to managing finances and entertainment. Behind every successful mobile app lies a robust testing process ensuring it functions flawlessly across devices and operating systems. Let's explore the critical aspects of mobile app testing, challenges, and strategies for delivering top-notch user experiences.</p>
<h4 id="heading-importance-of-mobile-application-testing">Importance of Mobile Application Testing 🧩</h4>
<p>Mobile app testing is more than just ensuring an app works; it's about delivering a seamless experience that users can rely on. Here’s why it matters:</p>
<ul>
<li><p><strong>Functionality Assurance:</strong> It verifies that all features work as intended across different devices and OS versions.</p>
</li>
<li><p><strong>Enhanced User Experience:</strong> A well-tested app provides a smooth, intuitive interface, reducing frustration and improving engagement.</p>
</li>
<li><p><strong>Preventing Post-Release Issues:</strong> Identifying and fixing bugs before launch saves time, money, and prevents negative user reviews.</p>
</li>
<li><p><strong>Boosting App Store Ratings:</strong> Higher quality apps receive better reviews, leading to increased downloads and visibility.</p>
</li>
<li><p><strong>Security and Compliance:</strong> Testing ensures the app protects user data and complies with industry regulations, building trust among users.</p>
</li>
</ul>
<h4 id="heading-unique-challenges-in-mobile-app-testing">Unique Challenges in Mobile App Testing 🌍📶</h4>
<p>Testing mobile apps comes with unique challenges due to the diversity of devices, operating systems, and network conditions:</p>
<ul>
<li><p><strong>Device Fragmentation:</strong> Apps must function seamlessly across various manufacturers, screen sizes, and hardware capabilities.</p>
</li>
<li><p><strong>OS Fragmentation:</strong> Testing across multiple OS versions and custom skins requires thorough compatibility checks.</p>
</li>
<li><p><strong>Network Variability:</strong> Different network speeds and conditions (3G, 4G, Wi-Fi) affect app performance and reliability.</p>
</li>
<li><p><strong>Battery Consumption:</strong> Optimizing the app to minimize battery drain without compromising performance is crucial.</p>
</li>
<li><p><strong>Performance Constraints:</strong> Managing memory usage, CPU load, and ensuring smooth operation under all circumstances.</p>
</li>
</ul>
<h4 id="heading-strategies-for-identifying-mobile-specific-bugs">Strategies for Identifying Mobile-Specific Bugs 🕵️‍♂️🔍</h4>
<p>To effectively identify and resolve mobile-specific bugs, testers employ several strategies:</p>
<ul>
<li><p><strong>Manual Testing:</strong> Exploratory testing to uncover unexpected issues and simulate real-world scenarios.</p>
</li>
<li><p><strong>Automated Testing:</strong> Using tools like Appium and Espresso for repetitive tests and CI/CD integration for continuous testing.</p>
</li>
<li><p><strong>Cross-Device Testing:</strong> Testing on a variety of physical devices and using cloud-based platforms to cover a broad spectrum of user environments.</p>
</li>
<li><p><strong>Network Simulation:</strong> Tools like Charles Proxy simulate different network conditions to evaluate app performance under varied scenarios.</p>
</li>
<li><p><strong>Beta Testing:</strong> Engaging real users through platforms like TestFlight to gather feedback and validate app performance in diverse use cases.</p>
</li>
</ul>
<h4 id="heading-strategies-for-resolving-mobile-specific-bugs">Strategies for Resolving Mobile-Specific Bugs 🛠️🔧</h4>
<p>When bugs are identified, prioritizing and resolving them promptly is essential:</p>
<ul>
<li><p><strong>Bug Prioritization:</strong> Classifying bugs based on severity and impact to address critical issues first.</p>
</li>
<li><p><strong>Continuous Integration:</strong> Regularly integrating code changes with automated testing to catch bugs early in the development process.</p>
</li>
<li><p><strong>Code Reviews:</strong> Conducting thorough peer reviews using version control systems to maintain code quality and catch logical errors.</p>
</li>
<li><p><strong>User Feedback Loop:</strong> Incorporating feedback from beta testers to refine usability and ensure the app meets user expectations.</p>
</li>
<li><p><strong>Performance Monitoring:</strong> Using tools like Firebase Performance Monitoring to track app performance and optimize resource usage in real-time.</p>
</li>
</ul>
<h4 id="heading-case-study-enhancing-mobile-app-stability-and-performance">Case Study: Enhancing Mobile App Stability and Performance 📊📈</h4>
<p>Consider a case where a social media app faced frequent crashes and slow performance during peak usage times. By conducting comprehensive cross-device testing, optimizing network handling, and refining background processes, the app achieved:</p>
<ul>
<li><p><strong>Improved Stability:</strong> Reduced crashes by identifying device-specific issues and optimizing app performance under varying conditions.</p>
</li>
<li><p><strong>Enhanced Performance:</strong> Optimized resource management and network utilization led to faster load times and smoother user interactions.</p>
</li>
<li><p><strong>Positive User Feedback:</strong> Addressing user-reported issues through beta testing resulted in higher user satisfaction and improved app store ratings.</p>
</li>
</ul>
<h4 id="heading-conclusion">Conclusion 🌟🚀</h4>
<p>Mobile app testing is crucial for delivering reliable, secure, and user-friendly apps. By understanding challenges, adopting effective strategies, and refining based on feedback, developers can create standout apps in the competitive mobile landscape. Invest in robust testing practices to build trust, enhance user satisfaction, and propel your app towards success.</p>
<hr />
]]></content:encoded></item><item><title><![CDATA[Data Behind the Data - How Metadata Drives Digital Intelligence]]></title><description><![CDATA[Introduction to Metadata – The Quiet Game-Changer
Imagine a world where nothing has labels. A supermarket without aisle signs. A library without cataloging.
Chaos, right? That’s exactly how media and content would exist without metadata.
Metadata is ...]]></description><link>https://blog.utkallabs.com/all-about-metadata</link><guid isPermaLink="true">https://blog.utkallabs.com/all-about-metadata</guid><category><![CDATA[metadata]]></category><category><![CDATA[Google]]></category><category><![CDATA[SEO]]></category><category><![CDATA[SEO for Developers]]></category><category><![CDATA[Web Development]]></category><category><![CDATA[Mobile Development]]></category><category><![CDATA[Blogging]]></category><dc:creator><![CDATA[Kamruddin Khan]]></dc:creator><pubDate>Sat, 28 Jun 2025 03:05:33 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1738518465456/f83b8b39-ddf0-4b5e-a669-1addd458b053.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2 id="heading-introduction-to-metadata-the-quiet-game-changer"><strong>Introduction to Metadata – The Quiet Game-Changer</strong></h2>
<p>Imagine a world where nothing has <strong>labels</strong>. A supermarket without aisle <strong>signs</strong>. A library without <strong>cataloging</strong>.</p>
<p><strong>Chaos, right?</strong> That’s exactly how media and content would exist without <strong><em>metadata</em></strong>.</p>
<p>Metadata is the behind-the-scenes genius that gives context to your content—whether it’s a picture-perfect sunset photo, a killer YouTube video, or your latest blog masterpiece. It may not be flashy, but trust me, <em>metadata</em> deserves a spotlight.</p>
<p><strong>Still not convinced?</strong> Let’s explore why this invisible hero matters more than you think—and how it’s working its magic every time you interact with the digital world.</p>
<h2 id="heading-what-exactly-is-metadata-and-why-does-it-matter"><strong>What Exactly is Metadata? (And Why Does It Matter?)</strong></h2>
<p>In plain English, metadata is <strong>data about data</strong>. Still sounds dull? Let me make it more relatable:</p>
<p>- <strong>A Photo</strong>: Pixels make the image, but metadata tells you <strong>who took it, where, and when</strong>.</p>
<p>- <strong>A Video</strong>: The visuals tell the story, but metadata organises it—<strong>tags</strong>, <strong>thumbnails</strong>, <strong>descriptions</strong>.</p>
<p>- <strong>A Blog Post</strong>: The content is what you read, but metadata drives it to your screen—<strong>title</strong> <strong>tags</strong>, <strong>keywords</strong>, and <strong>categories</strong>.</p>
<p>Metadata is the unsung hero that ensures content isn’t just created—it’s found, understood, and shared.</p>
<h2 id="heading-media-metadata-how-it-works-its-magic"><strong>Media + Metadata: How It Works Its Magic</strong></h2>
<h3 id="heading-1-image-metadata-what-your-photos-arent-telling-you"><strong>1. Image Metadata: What Your Photos Aren’t Telling You <sup>🤫</sup></strong></h3>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1749929205691/8530a44d-0179-48c1-9495-316902df0db9.png" alt class="image--center mx-auto" /></p>
<p>Take a photo with your phone, and you’re unknowingly saving a lot of details—like time, location, and camera settings. This is called <strong>EXIF metadata</strong>. Why does it matter?</p>
<p><strong>-</strong> Platforms use it to categorise and <strong>recommend</strong> images.</p>
<p><strong>-</strong> Search engines rely on metadata like <strong>alt text</strong> to “see” and display your images.</p>
<p><strong>-</strong> Tools can verify metadata to <strong>spot fake or manipulated photos</strong>—a critical weapon in the fight against misinformation.</p>
<p><strong>Task Time!</strong></p>
<p>Let’s have a little fun. Go to <a target="_blank" href="https://www.metadata2go.com/view-metadata">Media Metadata Viewer.</a></p>
<p>1. Upload any image from your gallery.</p>
<p>2. Discover its hidden metadata—location, camera model, and even date.</p>
<p>It’s like peeking behind the curtain of your digital photos. Spooky, right? And yet <strong>super cool</strong>. Speaking of digital authenticity, if you’re curious how tech battles fake images, check out <a target="_blank" href="https://blog.utkallabs.com/demystifying-deepfakes-a-comprehensive-guide"><strong>Demystifying Deep Fakes</strong></a>.</p>
<h3 id="heading-2-video-metadata-turning-views-into-virality"><strong>2. Video Metadata: Turning Views into Virality</strong></h3>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1749929597692/5ccddea7-5cfe-499f-83fa-398f6c5559f9.png" alt class="image--center mx-auto" /></p>
<p>Ever wondered how YouTube recommends videos <strong><em>you can’t resist clicking?</em></strong> That’s metadata at work.</p>
<p>Every thumbnail, tag, and description plays a role:</p>
<p><strong>- Title Tags</strong>: The eye-catching first impression.</p>
<p><strong>- Descriptions</strong>: A keyword-rich invitation to watch.</p>
<p><strong>- Tags</strong>: Categories that help the algorithm push content to the right audience.Whether it’s Netflix predicting your next binge-watch or YouTube showing you that <em>“one more video”</em> , metadata quietly keeps you glued to your screen.</p>
<h3 id="heading-3-website-metadata-the-digital-glue-that-holds-it-together"><strong>3. Website Metadata: The Digital Glue That Holds It Together</strong></h3>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1749929772391/71d2cc65-fa47-4880-9bcc-129c54346ae3.png" alt class="image--center mx-auto" /></p>
<p>If you’ve ever Googled something and clicked the <strong><em>perfect result</em></strong>, thank metadata. It powers:</p>
<p><strong>- Title Tags:</strong> The bold, clickable blue links.</p>
<p><strong>- Meta Descriptions:</strong> Snappy previews that convince you to click.</p>
<p><strong>- Schema Markup:</strong> Code that helps search engines understand whether it’s a blog, recipe, or review.</p>
<p>But metadata isn’t just for <strong>SEO</strong>—it also enhances user experience. Imagine scrolling through a messy website with no headings or structure. Nightmare, right? Proper metadata ensures clarity and navigation.</p>
<p>In fact, smart metadata helps users build habits effortlessly—much like the concept of muscle memory, which we explored in From <a target="_blank" href="https://blog.utkallabs.com/from-click-to-habit-how-muscle-memory-enhances-user-experience">Click to Habit</a>.</p>
<h2 id="heading-why-metadata-is-more-relevant-than-ever"><strong>Why Metadata Is More Relevant Than Ever</strong></h2>
<p>Metadata isn’t just technical fluff; it’s <strong><em>essential</em></strong>. Here’s why:</p>
<h3 id="heading-1-digital-transparency"><strong>1. Digital Transparency</strong></h3>
<p>As deep fakes and scams become more sophisticated, metadata acts as a truth detector. Tools can analyse image or video metadata to determine authenticity—something we cover more in <a target="_blank" href="https://blog.utkallabs.com/safeguarding-against-scams-in-apps">Safeguarding Against Scams in Apps</a>.</p>
<h3 id="heading-2-content-organisation"><strong>2. Content Organisation</strong></h3>
<p>Your phone gallery, Spotify playlists, or Netflix recommendations—everything is sorted and served through metadata. Without it, the digital world would be chaos.</p>
<h3 id="heading-3-accessibility"><strong>3. Accessibility</strong></h3>
<p>Metadata powers screen readers, describing images to visually impaired users. Adding alt text doesn’t just boost SEO—it’s the <em>right thing to do</em>.</p>
<h3 id="heading-4-ai-and-personalisation"><strong>4. AI and Personalisation</strong></h3>
<p>From voice assistants to AI-driven recommendations, metadata helps machines <em>understand</em> and organise your content for you. It’s paving the way for a more intuitive, personalised digital future.</p>
<h2 id="heading-how-to-unlock-the-full-potential-of-this-hidden-data"><strong>How to Unlock the Full Potential of this hidden data?</strong></h2>
<p>Ready to give metadata the love it deserves? Here are some tips:</p>
<h3 id="heading-1-for-images-and-videos"><strong>1. For Images and Videos</strong></h3>
<p>• Add <strong>alt text</strong> that’s descriptive but concise.</p>
<p>• Use file names like <em>“<strong><strong>sunset-beach-2024.jpg</strong></strong>”</em> instead of*“<strong>IMG1234.jpg</strong>”*</p>
<p>• Update video <strong>tags</strong>, <strong>descriptions</strong>, and <strong>captions</strong> for clarity.</p>
<h3 id="heading-2-for-websites"><strong>2. For Websites</strong></h3>
<p>• Write engaging <strong>title tags</strong> with keywords.</p>
<p>• Craft click-worthy <strong>meta descriptions</strong> that hook readers.</p>
<p>• Add structured data (<strong>schema markup</strong>) to enhance search results.</p>
<h3 id="heading-3-update-old-metadata"><strong>3. Update Old Metadata</strong></h3>
<p>Think of your older content as treasure chests gathering <strong>dust ?</strong> Update their metadata, and they might shine like <strong>gold</strong> again—reaching new audiences <strong>organically</strong>.</p>
<h2 id="heading-conclusion-small-silent-and-seriously-powerful"><strong>Conclusion: Small, Silent, and Seriously Powerful</strong></h2>
<p>Metadata isn’t just “<strong>extra stuff</strong>”—it’s the hidden genius that makes content <strong>accessible</strong>, <strong>discoverable</strong>, and <strong>authentic</strong>. From organising your photo gallery to helping search engines <strong><em>find the right answers</em></strong>, metadata is working hard behind the scenes.</p>
<p>So, next time you upload an image, post a blog, or binge-watch a Netflix series, take a moment to appreciate metadata. Without it, the digital world would be a chaotic, unsorted mess.</p>
<p><strong>Ready to dive in?</strong></p>
<p>Go explore your image’s metadata and start optimising your content—because even heroes need a little polish.</p>
<p><strong>It’s invisible, but once you notice it, you’ll wonder how you ever ignore it.</strong> 🚀</p>
]]></content:encoded></item><item><title><![CDATA[Understanding Virtual DOM 🆚 Real DOM in React]]></title><description><![CDATA[Introduction 📖
In the ever-evolving landscape of web development, React has emerged as a powerhouse, transforming how developers build user interfaces. At the heart of React's efficiency lies a fascinating duo – the Virtual DOM and the Real DOM.
In ...]]></description><link>https://blog.utkallabs.com/understanding-virtual-dom-real-dom-in-react</link><guid isPermaLink="true">https://blog.utkallabs.com/understanding-virtual-dom-real-dom-in-react</guid><category><![CDATA[UtkalLabs]]></category><category><![CDATA[JavaScript]]></category><category><![CDATA[React]]></category><category><![CDATA[Virtual DOM and Browser DOM in React.js]]></category><dc:creator><![CDATA[Abhisek Mohapatra]]></dc:creator><pubDate>Thu, 01 May 2025 10:52:57 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1701269647707/63c1081f-7441-4e15-8f4b-7bff8953b647.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h3 id="heading-introduction">Introduction 📖</h3>
<p>In the ever-evolving landscape of web development, React has emerged as a powerhouse, transforming how developers build user interfaces. At the heart of React's efficiency lies a fascinating duo – the Virtual DOM and the Real DOM.</p>
<p>In this blog, we'll embark on a journey to demystify these concepts, explore their intricacies, and understand why they are pivotal in shaping React applications.</p>
<h3 id="heading-real-dom-unraveling-the-traditional-web-page-representation">Real Dom: Unraveling the Traditional Web Page Representation 🪔</h3>
<p>The Real DOM (Document Object Model), a stalwart of web development, directly mirrors the structure of a web page. As changes occur, the entire Real DOM is recalculated and updated, a process that can become a bottleneck as applications grow in complexity. Direct manipulation of the Real DOM is not only cumbersome but can lead to sluggish user experiences.</p>
<h3 id="heading-virtual-dom-the-ingenious-solution"><strong>Virtual DOM: The Ingenious Solution</strong> 🚀</h3>
<p>Enter the Virtual DOM, a lightweight and nimble representation of the Real DOM. React ingeniously leverages the Virtual DOM to optimize rendering, addressing the inefficiencies of direct Real DOM manipulation. But how does it work? 💡</p>
<h3 id="heading-the-rendering-process">The Rendering Process 🛠️</h3>
<p>React's rendering process involves a dance between the Virtual DOM and the Real DOM. When changes occur, React creates a new Virtual DOM, compares it with the previous one using a <strong><mark>reconciliation</mark></strong> algorithm, and then selectively updates the Real DOM with only the necessary changes. This dance minimizes redundant updates, resulting in a smoother and more responsive user interface.</p>
<h3 id="heading-reconciliation-the-key-core-part">Reconciliation The Key || Core Part 🎯</h3>
<p>React reconciliation is the process of comparing the previous state of the DOM with the new state, identifying the differences, and updating only the necessary parts to reflect the changes. It makes react so fast and efficient.</p>
<h3 id="heading-benefits-of-the-virtual-dom">Benefits of the Virtual DOM 🎖️</h3>
<p><strong>Performance Boost</strong>: By minimizing direct interaction with the Real DOM, React significantly enhances performance, making applications faster and more efficient.</p>
<p><strong>Efficient Updates</strong>: The Virtual DOM allows React to update only the components that have changed, reducing the overall workload and ensuring a seamless user experience.</p>
<p><strong>Simplified Development</strong>: Developers can work with a more abstract representation of the UI, focusing on building components without getting bogged down by manual DOM manipulation.</p>
<p>It’s extremely fast as compared to the Browser’s DOM — It can produce about 200,000 Virtual DOM Nodes / Second 😲</p>
<h3 id="heading-in-a-nutshell">In a NUTSHELL 🥜</h3>
<p><strong>Performance Comparison</strong>: In a head-to-head comparison, the Virtual DOM emerges as the victor in performance. Its ability to batch updates and strategically apply changes to the Real DOM sets it apart from the direct manipulation of the Real DOM.</p>
<p><strong>DOM Manipulation</strong>: Direct manipulation of the Real DOM requires meticulous attention to detail and can result in unnecessary reflows and repaints. The Virtual DOM, acting as an intermediary, streamlines this process, making the developer's life easier and the application more responsive.</p>
<p><strong>Rendering Efficiency</strong>: React's reconciliation algorithm, the secret sauce behind the Virtual DOM, ensures that updates are applied with surgical precision. This not only minimizes computational overhead but also leads to a more efficient rendering process.</p>
<p>I’d love to hear your thoughts! 🤩.</p>
<p>Happy Coding 👨🏼‍💻</p>
]]></content:encoded></item><item><title><![CDATA[From Click to Habit: How Muscle Memory Enhances User Experience]]></title><description><![CDATA[Recently, while chatting with my 7-year-old daughter’s dance teacher, I learned about the pivotal role muscle memory plays in dance. The teacher explained how repeated practice allows dancers to perform complex routines effortlessly, relying on ingra...]]></description><link>https://blog.utkallabs.com/from-click-to-habit-how-muscle-memory-enhances-user-experience</link><guid isPermaLink="true">https://blog.utkallabs.com/from-click-to-habit-how-muscle-memory-enhances-user-experience</guid><category><![CDATA[UX]]></category><category><![CDATA[ux design]]></category><category><![CDATA[#Ux research]]></category><category><![CDATA[user experience]]></category><category><![CDATA[UI]]></category><dc:creator><![CDATA[Suvendu Shekhar Giri]]></dc:creator><pubDate>Fri, 06 Dec 2024 19:02:40 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1721021160790/508f74fc-467e-424b-bff6-3cd7e6eae8f7.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Recently, while chatting with my 7-year-old daughter’s dance teacher, I learned about the pivotal role muscle memory plays in dance. The teacher explained how repeated practice allows dancers to perform complex routines effortlessly, relying on ingrained movements. This conversation inspired me to think about muscle memory's application in user experience (UX) design. At <a target="_blank" href="https://www.utkallabs.com">Utkal Labs</a>, we follow all futuristic trends and best practices of UX to ensure best experiences for the users. I realized that just like in dance, UX designed for muscle memory significantly enhances user interactions in digital products.</p>
<h3 id="heading-whats-muscle-memory-btw"><strong>What's Muscle Memory BTW?</strong></h3>
<p>Muscle memory refers to the process by which our brains encode and automate repetitive physical actions, making these actions more efficient and requiring less conscious thought over time.</p>
<p><strong>Examples:</strong></p>
<p><strong>Driving a car:</strong> Shifting gears, pressing pedals, and turning the steering wheel - all happens without consciously thinking about these actions.</p>
<p><strong>Using a TV remote:</strong> At our home, we hardly look at the remote while adjusting volume or accessing some other functionalities. If you have used JIO Set-top box, you must have found it very difficult to use initially. Muscle memory is one of the reason.</p>
<p><img src="https://www.reliancedigital.in/medias/Jio-Set-Top-Box-Remote-492403585-i-1-1200Wx1200H-300Wx300H?context=bWFzdGVyfGltYWdlc3wxNTIyMnxpbWFnZS9qcGVnfGltYWdlcy9oZTEvaDdmLzEwMDc2NjAwMDQxNTAyLmpwZ3wxOTA3MWM2NjEyMmFiNWViZDM0N2I4MmYzODI2YWYxMmVkMTJmZGEzOTcyOGYzYWVmMWJlZjJkZTA0MjczZTU5" alt="Jio Set - Top Box Remote" /></p>
<h3 id="heading-a-ux-perspective">A UX Perspective</h3>
<p>From a UX perspective, muscle memory is crucial in designing web and mobile apps. When users become accustomed to a particular interface, their ability to navigate and interact with it becomes second nature. This leads to a smoother, more intuitive experience, reducing cognitive load and increasing user satisfaction.</p>
<p><strong>Examples:</strong></p>
<p><strong>Google Pay - Payment Navigation:</strong> Users who frequently use Google Pay for transactions develop a habit of navigating the payment interface with ease. The consistent placement of the "Scan QR code" button and "Pay contacts" options helps users complete transactions swiftly.</p>
<p><strong>Facebook- Like Button:</strong> Regular users of Facebook instinctively know the location and appearance of the "Like" button. Over years of usage, the placement of this button has become a part of their muscle memory.</p>
<h3 id="heading-a-ux-developers-approach">A UX Developer's Approach</h3>
<p><strong>Consistency is Key!</strong></p>
<p>Ensure that the placement of key elements like buttons, navigation bars, and icons remains consistent across all versions of the app. This helps users develop muscle memory, making their interaction more intuitive.</p>
<p><strong>Example:</strong> WhatsApp has kept its chat interface largely unchanged over the years, allowing users to rely on muscle memory for quick navigation and message sending.</p>
<p><img src="https://preview.redd.it/evolution-of-whatsapp-ui-for-android-v0-u4j5rnohqmvc1.jpeg?auto=webp&amp;s=c803f885ebe116a923d1437ad0637f0cc84d5b33" alt class="image--center mx-auto" /></p>
<p><em>(Image source:</em> <a target="_blank" href="https://www.reddit.com/r/UXDesign/comments/1c8p0gs/evolution_of_whatsapp_ui_for_android/"><em>Reddit</em></a><em>)</em></p>
<p>Here are a few more suggestions to consider:</p>
<ol>
<li><p><strong>Follow Established Patterns:</strong> Adhere to common design patterns and conventions familiar to users. For example, placing navigation tabs at the bottom of the screen in mobile apps, as seen in Instagram and Facebook.</p>
</li>
<li><p><strong>Usability Testing and Feedback:</strong> Conduct regular usability tests to observe how users interact with the app. Gather feedback to identify areas where users struggle and make necessary adjustments while maintaining consistency.</p>
</li>
<li><p><strong>Keep things simple and predictable:</strong> Design with a clear visual hierarchy to guide user attention to important elements. Consistent use of colors, fonts, and iconography helps users quickly recognize and interact with key features.</p>
</li>
<li><p><strong>Documentation:</strong> Create comprehensive design guidelines and documentation to ensure that all developers and designers follow the same principles, ensuring consistency, even across different app versions.</p>
</li>
</ol>
<div data-node-type="callout">
<div data-node-type="callout-emoji">💡</div>
<div data-node-type="callout-text"><strong>Not all users have the same physical abilities; relying too heavily on muscle memory can exclude those who can't perform certain actions easily.</strong></div>
</div>

<h2 id="heading-conclusion">Conclusion</h2>
<p>Muscle memory plays a vital role in creating intuitive and user-friendly experiences, whether in mobile apps, websites, or physical interactions. By leveraging muscle memory, designers and developers can ensure that their users navigate and interact with digital products effortlessly.</p>
<p>The idea of writing this article stemmed from the fact that there are not many resources available on the role of muscle memory in UX design. If you found the ideas and examples shared here valuable, I would love to hear your thoughts in the comments below. Your encouragement will motivate me to delve deeper into this topic and explore in-depth concepts and implementations that can further enrich our understanding of muscle memory in UX design.</p>
<p><em>At Utkal Labs, we prioritize futuristic trends and best practices in UX design to deliver high-quality solutions tailored to our clients' needs. By understanding user behavior and focusing on consistency, accessibility, and familiarity, we help create products that not only meet but exceed user expectations.</em></p>
]]></content:encoded></item><item><title><![CDATA[Seamlessly Integrate CallHippo into Your React App: A Step-by-Step Guide]]></title><description><![CDATA[Introduction
In today's fast-paced digital world, embedding communication tools into your applications is not just a bonus; it's a necessity. CallHippo, a powerful cloud-based telephony solution, offers seamless communication capabilities that can be...]]></description><link>https://blog.utkallabs.com/integrate-callhippo-into-your-react-app</link><guid isPermaLink="true">https://blog.utkallabs.com/integrate-callhippo-into-your-react-app</guid><category><![CDATA[call hippo]]></category><category><![CDATA[Call Hippo Embedded Dialer]]></category><category><![CDATA[call-dialer]]></category><category><![CDATA[React]]></category><category><![CDATA[MERN Stack]]></category><category><![CDATA[Node.js]]></category><category><![CDATA[vite]]></category><dc:creator><![CDATA[Adarsh Kumar Sahu]]></dc:creator><pubDate>Mon, 24 Jun 2024 06:57:01 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1710769568234/91f634c3-f7c2-4526-8037-69b373dd02a2.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h1 id="heading-introduction"><strong>Introduction</strong></h1>
<p>In today's fast-paced digital world, embedding communication tools into your applications is not just a bonus; it's a necessity. CallHippo, a powerful cloud-based telephony solution, offers seamless communication capabilities that can be integrated into any application, including React-based projects.</p>
<p>This blog post will walk you through the process of integrating CallHippo into a React application, enabling direct phone calls from your app's interface.</p>
<h1 id="heading-prerequisites"><strong>Prerequisites</strong></h1>
<p>Before we dive in, make sure you have the following:</p>
<ul>
<li><p>Node.js installed on your system.</p>
</li>
<li><p>A basic understanding of React and its ecosystem.</p>
</li>
<li><p>An active CallHippo account to obtain your API token.</p>
</li>
</ul>
<h1 id="heading-setting-up-your-react-application"><strong>Setting Up Your React Application</strong></h1>
<p>First, create a new React application using Create React App or Vite. For this guide, we'll use Vite with yarn for its simplicity:</p>
<pre><code class="lang-powershell">yarn create vite my<span class="hljs-literal">-vue</span><span class="hljs-literal">-app</span> -<span class="hljs-literal">-template</span> vue
<span class="hljs-built_in">cd</span> callhippo<span class="hljs-literal">-vite</span><span class="hljs-literal">-app</span>
yarn
yarn dev
</code></pre>
<p>We can also use npm:</p>
<pre><code class="lang-powershell">npm create vite@latest callhippo<span class="hljs-literal">-vite</span><span class="hljs-literal">-app</span> -- -<span class="hljs-literal">-template</span> react
<span class="hljs-built_in">cd</span> callhippo<span class="hljs-literal">-vite</span><span class="hljs-literal">-app</span>
npm install
npm run dev
</code></pre>
<h1 id="heading-integrating-callhippo"><strong>Integrating CallHippo</strong></h1>
<p>Integration involves embedding the CallHippo dialer into your application and configuring it with your API token. Here's how:</p>
<h2 id="heading-how-to-obtain-your-api-token"><strong>How to Obtain Your API Token</strong></h2>
<p>Integrating CallHippo into your React application starts with securing an API token. This token is essential for authenticating your requests and interacting with CallHippo's services securely. Here’s how you can obtain it:</p>
<ol>
<li><p><strong>Sign Up or Log In to CallHippo</strong></p>
<ul>
<li>If you haven't already, start by creating an account on CallHippo or log into your existing account. Visit the <a target="_blank" href="https://www.callhippo.com/">CallHippo website</a> and navigate to the signup or login page.</li>
</ul>
</li>
<li><p><strong>Access the Integrations Section</strong></p>
<ul>
<li>Once logged in, navigate to the Integrations tab in the sidebar menu. This section typically contains various integration options for your CallHippo account.</li>
</ul>
</li>
<li><p><strong>Navigate to the REST API Section</strong></p>
<ul>
<li>Within the Integrations tab, locate and click on the REST API section. This is where you can manage your API settings and access your API token.</li>
</ul>
</li>
<li><p><strong>Locate Your Unique API Token</strong></p>
<ul>
<li>Upon entering the REST API section, you should find your unique API token displayed prominently. This token serves as the key to access CallHippo's API services.</li>
</ul>
</li>
<li><p><strong>Copy Your API Token</strong></p>
<ul>
<li>To use the API token in your React application, simply copy it from the CallHippo dashboard. Ensure you securely store this token as it grants access to your CallHippo account.</li>
</ul>
</li>
<li><p><strong>Implement the Token in Your Application</strong></p>
<ul>
<li>With your API token in hand, you're now ready to integrate CallHippo into your React app. When making API requests, include the token in the headers for authentication purposes.</li>
</ul>
</li>
</ol>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1710767728563/d63ef233-e921-4268-9ff8-75cc72eba359.png" alt class="image--center mx-auto" /></p>
<h2 id="heading-embed-the-dialer-script"><strong>Embed the Dialer Script</strong></h2>
<p>Insert the CallHippo dialer script into your <code>index.html</code> or dynamically load it within your React component to keep your application modular.</p>
<h2 id="heading-create-the-clicktocall-component"><strong>Create the</strong> <code>ClickToCall</code> <strong>Component</strong></h2>
<p>This component will manage the dialing functionality. It loads the CallHippo script and initializes the dialer when clicking a phone number.</p>
<h2 id="heading-implementation-details"><strong>Implementation Details</strong></h2>
<p>The <code>ClickToCall</code> component plays a pivotal role. Here's a simplified version of what the component's structure might look like:</p>
<pre><code class="lang-javascript"><span class="hljs-keyword">import</span> React <span class="hljs-keyword">from</span> <span class="hljs-string">"react"</span>;

<span class="hljs-keyword">const</span> ClickToCall = <span class="hljs-function">(<span class="hljs-params">{ phoneNumber }</span>) =&gt;</span> {
  <span class="hljs-keyword">const</span> loadCallHippoDialer = <span class="hljs-function">() =&gt;</span> {
    <span class="hljs-keyword">if</span> (<span class="hljs-built_in">window</span>.TOKEN &amp;&amp; <span class="hljs-built_in">window</span>.EMAIL) {
      <span class="hljs-built_in">window</span>.chCall(phoneNumber);
      <span class="hljs-keyword">return</span>;
    }

    <span class="hljs-keyword">var</span> chWidgetDiv = <span class="hljs-built_in">document</span>.createElement(<span class="hljs-string">"div"</span>);
    chWidgetDiv.id = <span class="hljs-string">"ch-dialer-container"</span>;
    <span class="hljs-built_in">document</span>.body.appendChild(chWidgetDiv);
    <span class="hljs-built_in">window</span>.TOKEN = &lt;&lt;YOUR_TOKEN&gt;&gt;;
    <span class="hljs-built_in">window</span>.EMAIL = &lt;&lt;YOUR REGISTERED CALL HIPPO EMAIL ID&gt;&gt;;
    <span class="hljs-built_in">window</span>.REGION = <span class="hljs-string">"global"</span>;

    <span class="hljs-keyword">var</span> callhippoScript = <span class="hljs-built_in">document</span>.createElement(<span class="hljs-string">"script"</span>);
    callhippoScript.type = <span class="hljs-string">"text/javascript"</span>;
    callhippoScript.async = <span class="hljs-literal">true</span>;
    callhippoScript.src =
      <span class="hljs-string">"https://d1x9dsge91xf6g.cloudfront.net/callhippo/files/ch-dialer.js"</span>;
    <span class="hljs-built_in">document</span>.body.appendChild(callhippoScript);

   callhippoScript.onload = <span class="hljs-function">() =&gt;</span> {
     <span class="hljs-built_in">console</span>.log(<span class="hljs-string">"CallHippo script loaded successfully."</span>);
     <span class="hljs-keyword">if</span> (<span class="hljs-built_in">window</span>.chCall) {
       <span class="hljs-built_in">console</span>.log(<span class="hljs-string">"Attempting to make a call to:"</span>, phoneNumber);
       <span class="hljs-built_in">window</span>.chCall(phoneNumber);
     } <span class="hljs-keyword">else</span> {
       <span class="hljs-built_in">console</span>.error(<span class="hljs-string">"window.chCall is not defined."</span>);
     }
   };

  };

  <span class="hljs-keyword">return</span> (
    <span class="xml"><span class="hljs-tag">&lt;<span class="hljs-name">div</span>
      <span class="hljs-attr">onClick</span>=<span class="hljs-string">{loadCallHippoDialer}</span>
      <span class="hljs-attr">style</span>=<span class="hljs-string">{{</span> <span class="hljs-attr">cursor:</span> "<span class="hljs-attr">pointer</span>", <span class="hljs-attr">color:</span> "<span class="hljs-attr">blue</span>", <span class="hljs-attr">textDecoration:</span> "<span class="hljs-attr">underline</span>" }}
    &gt;</span>
      {phoneNumber}
    <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span></span>
  );
};

<span class="hljs-keyword">export</span> <span class="hljs-keyword">default</span> ClickToCall;
</code></pre>
<p>With the API token securely integrated into your project, the next step involves directly incorporating the CallHippo dialer functionality into your React application. This is achieved by calling the ClickToCall component within <code>App.jsx</code> and passing the desired phone number as a prop. Here’s a step-by-step guide to do just that:</p>
<ol>
<li><p><strong>Import the ClickToCall Component</strong></p>
<ul>
<li>Begin by importing the ClickToCall component into your <code>App.jsx</code> file. This assumes you've already created a ClickToCall component that encapsulates the dialer's logic and UI.</li>
</ul>
</li>
<li><p><strong>Place the ClickToCall Component in Your App's UI</strong></p>
<ul>
<li>Determine where you want the CallHippo dialer to appear within your application. Inside the <code>App.jsx</code> return statement, including the ClickToCall component at the desired location.</li>
</ul>
</li>
<li><p><strong>Pass the Phone Number as a Prop</strong></p>
<ul>
<li>The ClickToCall component should be designed to accept a phone number as a prop. This allows the component to be reusable and dynamically adjust based on the phone number you wish to dial. Pass the desired phone number to the ClickToCall component as follows:</li>
</ul>
</li>
</ol>
<pre><code class="lang-javascript">&lt;ClickToCall phoneNumber=<span class="hljs-string">"+1234567890"</span> /&gt;
</code></pre>
<h2 id="heading-testing-the-integration"><strong>Testing the Integration</strong></h2>
<p>After setting up the <code>ClickToCall</code> component, test the integration by clicking on the phone number in your application. Ensure the CallHippo dialer opens and is ready to place a call.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1710769153848/92ed1ab9-2bdb-4a31-90b5-5d65943377dc.png" alt class="image--center mx-auto" /></p>
<h2 id="heading-best-practices-and-tips"><strong>Best Practices and Tips</strong></h2>
<ul>
<li><p>Keep your API token secure and avoid exposing it in your client-side code.</p>
</li>
<li><p>Utilize environment variables for sensitive information.</p>
</li>
<li><p>Explore CallHippo's documentation for advanced features and customization options.</p>
</li>
</ul>
<h1 id="heading-conclusion"><strong>Conclusion</strong></h1>
<p>Following the steps outlined in this guide, you can seamlessly integrate CallHippo into your React application, enhancing its communication capabilities. For those interested in exploring a live demonstration of the integration, you can access the demo project through this <a target="_blank" href="https://drive.google.com/file/d/1irw6AObz5a10YMjZSoq8Jvtq-FKV_e7t/view?usp=drive_link">Google Drive link</a>.</p>
<p>We encourage you to delve deeper into the integration process and customize it to fit your specific requirements. Should you have any questions or encounter any challenges along the way, feel free to reach out for assistance. <strong>Happy coding!</strong></p>
<h1 id="heading-references-and-further-reading"><strong>References and Further Reading</strong></h1>
<ul>
<li><a target="_blank" href="https://web.callhippo.com/api-docs/?utm_adgroup=&amp;utm_keyword=&amp;utm_device=c&amp;utm_term=&amp;utm_campaign=performance-max-remarketing&amp;utm_source=google-ppc&amp;utm_medium=global&amp;utm_content=&amp;gad_source=1&amp;gclid=Cj0KCQiAoeGuBhCBARIsAGfKY7zgOhw7GYKJ6Y1J37c9zdzTHXs52HokMnUkAMG0OumZNDh0qK3A91MaAnenEALw_wcB#/Activity%20Feed%20/%20Call%20Logs">CallHippo API Documentation</a></li>
</ul>
<p>Feel free to adapt this draft to include more specific details about your project or any additional insights you gained from the integration process.</p>
]]></content:encoded></item><item><title><![CDATA[Is Torrent Dead?]]></title><description><![CDATA[Once upon a time, in the digital world, there was a mighty giant 🧌 named Torrent. It was the go-to for anyone looking to download anything, from the latest blockbusters to the popular or obscure indie games to software packages having large size. Ma...]]></description><link>https://blog.utkallabs.com/is-torrent-dead</link><guid isPermaLink="true">https://blog.utkallabs.com/is-torrent-dead</guid><category><![CDATA[Torrent]]></category><category><![CDATA[peer to peer]]></category><category><![CDATA[File sharing]]></category><category><![CDATA[netflix]]></category><category><![CDATA[hotstar]]></category><category><![CDATA[primevideo]]></category><category><![CDATA[The Pirate Bay]]></category><category><![CDATA[uTorrent]]></category><category><![CDATA[bittorrent]]></category><dc:creator><![CDATA[Suvendu Shekhar Giri]]></dc:creator><pubDate>Thu, 02 May 2024 05:47:36 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1710657149702/ae3f9b46-fb3c-4ad1-b8c3-0a6b0a33211c.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Once upon a time, in the digital world, there was a mighty giant 🧌 named Torrent. It was the go-to for anyone looking to download anything, from the latest blockbusters to the popular or obscure indie games to software packages having large size. Many were using it to download pirated stuffs and pre-cracked software packages [shhhhhh....🤫]. But as the years passed, whispers began to circulate - <strong>is Torrent dead?</strong></p>
<p>Let's embark on a journey through time to uncover the truth.</p>
<p><strong>The Golden Age of Torrents</strong></p>
<p>Rewind to the early 2000s, when dial-up tones still haunted our dreams, and the word 'streaming' was mostly associated with water. It was the era of slow internet connection and even slower official releases. Enter <a target="_blank" href="https://en.wikipedia.org/wiki/BitTorrent">BitTorrent</a>, a protocol created by Bram Cohen in 2001. It was a game-changer, allowing large files to be shared by breaking them into tiny pieces, making the download process faster and more efficient.</p>
<p><strong>The Peak of Piracy and Popularity</strong></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1710662820525/93830621-c251-4eb0-b923-8d909d684e0c.png" alt class="image--center mx-auto" /></p>
<p>At its zenith, around the mid-2000s, Torrent was the go-to for downloading almost anything. From college students sharing lecture notes to recordings of online classes, Torrent had it all. It was the era of uTorrent and Vuze, where every file felt just a click away.</p>
<p>Bollywood movies like <a target="_blank" href="https://en.wikipedia.org/wiki/Udta_Punjab">Udta Punjab</a>, <a target="_blank" href="https://en.wikipedia.org/wiki/Manjhi_%E2%80%93_The_Mountain_Man">Manjhi</a> and <a target="_blank" href="https://en.wikipedia.org/wiki/Paanch">Paanch</a> found their way onto Torrent sites even before their official release dates, causing a stir in the industry. Popular movies like <a target="_blank" href="https://en.wikipedia.org/wiki/Paa_(film)">Paa</a> was also made available on Torrent sites on the same day of its theatre release. I didn't find any reference in the internet but I can recall, I have watched the <a target="_blank" href="https://en.wikipedia.org/wiki/I_Am_Kalam">I am Kalam</a> uncut movie around 15 days before it was released. The leaks not only sparked debates over digital rights but also highlighted the rampant issue of piracy in the country. It wasn't just the big screen that felt the impact. Popular TV shows, often not available through official channels, were downloaded in mass, creating a parallel universe of entertainment consumption.</p>
<p>Even Hollywood blockbusters like <a target="_blank" href="https://en.wikipedia.org/wiki/Avatar_(2009_film)https://en.wikipedia.org/wiki/Avatar_(2009_film)">Avatar</a> and <a target="_blank" href="https://en.wikipedia.org/wiki/The_Dark_Knight">The Dark Knight</a> found themselves swirling in the Torrent storm, with early leaks causing a headache for studios and led to significant box office losses.</p>
<p>In 2001, Torrent was a newborn, taking its first steps in the digital playground. By 2006, it was a superstar, with millions of users worldwide.</p>
<p><strong>The Decline of Torrent</strong></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1710662923266/9f1d6916-0ae8-49be-a6ee-a5b7175cc514.jpeg" alt class="image--center mx-auto" /></p>
<p>Fast forward to the present day, and the landscape has drastically changed. Streaming services like Netflix, Hotstar, Spotify and many more have taken over, offering convenience and speed.</p>
<p>Torrent files sometimes had malware, adware or viruses that severely infect the system and was a major concern.</p>
<p>Torrent sites face constant legal battles, with giants like The Pirate Bay playing a never-ending game of cat and mouse with authorities.</p>
<p><strong>Is Torrent Really Dead Now?</strong></p>
<p>Not quite. While it's true that the golden age of Torrenting has passed, the protocol itself is far from extinct. It's no longer the mainstream colossus but rather a niche player. Torrents are still used for sharing open-source software, large datasets, and in regions where streaming services are limited.</p>
<p>In India, despite the government's efforts to block access to Torrent websites, the practice remains popular. There are still active Torrent sites that cater to the Indian audience, offering everything from Bollywood movies to software and games.</p>
<p>It's important to note that while Torrenting itself is not illegal, downloading copyrighted material is illegal in India and many other countries. This has led to a complex situation where Torrent sites operate in a grey area, often being blocked and then reappearing under different domains.</p>
<p><strong>Conclusion</strong></p>
<p>Torrent technology revolutionized file sharing, and its impact is undeniable. So, <strong>is Torrent dead?</strong> The answer is a resounding no. It's simply transformed, adapting to the new digital ecosystem. Torrent might not be the king of the jungle anymore, but it's still out there, quietly powering downloads in its own unique way.</p>
]]></content:encoded></item><item><title><![CDATA[Say Hello To "Object.groupBy();"]]></title><description><![CDATA[Introduction📍
Hello dev mates, today I am sharing about the Object.groupBy() method which was recently introduced by Javascript, Basically what it is doing like its grouping the elements of an iterable(such as an array).
Syntax 📌
Object.groupBy(ite...]]></description><link>https://blog.utkallabs.com/say-hello-to-objectgroupby</link><guid isPermaLink="true">https://blog.utkallabs.com/say-hello-to-objectgroupby</guid><category><![CDATA[JavaScript]]></category><category><![CDATA[UtkalLabs]]></category><category><![CDATA[Objects]]></category><category><![CDATA[Programming Blogs]]></category><category><![CDATA[Programming Tips]]></category><category><![CDATA[software development]]></category><category><![CDATA[software architecture]]></category><dc:creator><![CDATA[Abhisek Mohapatra]]></dc:creator><pubDate>Mon, 15 Apr 2024 04:22:39 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1707921507973/3670f7df-a0db-4216-83dd-f397b4c19324.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2 id="heading-introduction">Introduction📍</h2>
<p>Hello dev mates, today I am sharing about the <code>Object.groupBy()</code> method which was recently introduced by Javascript, Basically what it is doing like its grouping the elements of an iterable(such as an array).</p>
<h2 id="heading-syntax">Syntax 📌</h2>
<p><code>Object.groupBy(items, callbackFn)</code></p>
<p>From its syntax we know that it takes two parameters first one is <em>items</em> and another is a <em>callback function</em>.</p>
<p><em><mark>items</mark></em> An iterable (such as an Array) whose elements will be grouped.</p>
<p><a target="_blank" href="https://developer.mozilla.org/en-US/docs/Glossary/Callback_function"><mark>callback function</mark></a> It is applied to each item in the group of items. This function should provide a result that will be treated as a key (like a name or symbol) indicating which group the current item belongs to. The function is given some information when it's called, and it needs to return something that represents the category or group of the current item.</p>
<h2 id="heading-lets-understand-from-the-examples">Let's understand from the examples💡</h2>
<h3 id="heading-example-1">Example 1</h3>
<p>The below code snippet showcases the implementation of the <code>groupBy()</code> method to organize an array of cars based on their respective models.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1707920143158/3b6e8e3c-7bd9-4b48-b6d0-8fc6495b8dc7.png" alt class="image--center mx-auto" /></p>
<p>Within the first parameter, the array of cars is passed, and in the callback function's initial parameter, the 'model' property is destructured from each element. Subsequently, the callback function returns the model name.</p>
<p>In accordance with the syntax, the <code>groupBy()</code> method utilizes this returned model name as the key for grouping, resulting in the desired organized structure.</p>
<p>Various approaches exist to solve this problem, and the chosen method is considered straightforward and easy to comprehend.</p>
<h3 id="heading-example-2">Example 2</h3>
<p>In Example 2, the objective is to group an array of students based on their ages.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1707920323452/cb8d5c01-7454-464b-bbde-f4f8c0eb5a77.png" alt class="image--center mx-auto" /></p>
<p>The solution involves organizing the students according to their respective ages. In the code, I created the grouping keys to achieve this task.</p>
<h3 id="heading-conclusion">Conclusion 🔚</h3>
<p>Thanks for reading. I would love to hear more about your thoughts 🤩.</p>
<p>Happy Coding 👨🏼‍💻</p>
]]></content:encoded></item><item><title><![CDATA[Safeguarding Against Scams in Apps]]></title><description><![CDATA[Introduction
🛡️ In the contemporary digital era, technology plays a pivotal role in shaping our daily lives, leading to the widespread adoption of smartphones and increased internet usage across all age groups. While smartphones offer convenience, t...]]></description><link>https://blog.utkallabs.com/safeguarding-against-scams-in-apps</link><guid isPermaLink="true">https://blog.utkallabs.com/safeguarding-against-scams-in-apps</guid><category><![CDATA[Testing]]></category><category><![CDATA[security testing ]]></category><category><![CDATA[securityawareness]]></category><dc:creator><![CDATA[Vivek Singhdeo]]></dc:creator><pubDate>Tue, 26 Mar 2024 14:17:12 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1711462598195/db144a63-0777-4130-977c-a6cf078c503f.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2 id="heading-introduction">Introduction</h2>
<p>🛡️ In the contemporary digital era, technology plays a pivotal role in shaping our daily lives, leading to the widespread adoption of smartphones and increased internet usage across all age groups. While smartphones offer convenience, they also expose us to vulnerabilities such as scams.</p>
<p>🔍 As software testers, it's vital to spot and address threats by raising awareness and taking proactive steps. Testing isn't just about bugs; it's about protecting our digital world.</p>
<h2 id="heading-app-ecosystem">App Ecosystem</h2>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1711007658489/2c13ff5f-dc1d-4f89-be56-82e44188c210.jpeg" alt class="image--center mx-auto" /></p>
<p>📱 With over 3.7 million apps on Google Play and 1.8 million on the App Store, downloaded 250 million times daily, mobile apps are integral to daily life. Yet, their convenience poses security challenges. Many apps are vulnerable to scams, increasing risks. Rigorous testing is crucial to mitigate these risks</p>
<h2 id="heading-the-scam-epidemic-a-growing-concern">The Scam Epidemic: A Growing Concern</h2>
<p>📈 The app ecosystem's rapid growth has led to a surge in scams, highlighted by recent high-profile incidents. Individuals have fallen victim to fraudulent schemes promising lucrative job opportunities and high returns, resulting in significant financial losses, identity theft, and data breaches.</p>
<p>This underscores the urgent need for robust testing measures to combat these threats and emphasizes testing's critical role in safeguarding security🛡️🔍💼</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1711007707345/1450083b-1ea6-43fa-8ce1-1453ad180d96.jpeg" alt class="image--center mx-auto" /></p>
<h3 id="heading-importance-of-testing-a-cornerstone-for-security"><strong>Importance of Testing: A Cornerstone for Security</strong></h3>
<h3 id="heading-rigorous-testing">Rigorous testing</h3>
<p>Rigorous testing can be a secure and reliable app ecosystem. Thorough rigorous testing will help in identifying vulnerabilities and weaknesses in the app. By proactively identifying and fixing weaknesses, we can help ensure the safety and security of our users.</p>
<h3 id="heading-security-testing">Security testing</h3>
<p>Security testing plays a pivotal role in identifying and addressing potential vulnerabilities that could be exploited by hackers to steal data, inject malware, or disrupt operations. The methods include Penetration Testing, Mobile Application Security Testing, and Static Application Security Testing.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1711007759143/930a8618-3cc7-491d-8fd0-18d7ba32b744.jpeg" alt class="image--center mx-auto" /></p>
<h3 id="heading-functionality-testing">Functionality Testing</h3>
<p>Functionality Testing is crucial to ensuring that app features and functionalities operate as intended, preventing exploitation by scammers, and robust testing helps identify and rectify issues before reaching end-users.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1711007842115/e623b94b-5a64-439e-b385-89316a9066f8.jpeg" alt class="image--center mx-auto" /></p>
<h3 id="heading-user-experience-ux-testing">User Experience (UX) Testing</h3>
<p>User Experience Testing is integral for building trust among users, with good UX leading to increased satisfaction and loyalty, while poor user experience can contribute to the success of scams. UX testing focuses on creating a secure and user-friendly environment.</p>
<p>Compliance testing verifies whether the app adheres to industry standards and regulations, a critical aspect of ensuring user protection.</p>
<p>Continuous testing throughout the development lifecycle is essential. Best practices include regular security audits, comprehensive functional testing, and ongoing UX testing for a seamless user experience.</p>
<h2 id="heading-safe-app-downloading-practices"><strong>Safe App Downloading Practices</strong></h2>
<ul>
<li><p>📱 Always download apps from official app stores (e.g., Apple App Store, Google Play Store).</p>
</li>
<li><p>🔍 Verify the company providing the app.</p>
</li>
<li><p>📝 Read reviews before installing an app.</p>
</li>
<li><p>🚫 Caution against granting unnecessary permissions that could compromise privacy and security.</p>
</li>
<li><p>🌟 Stay away from apps with poor reviews and lack of developer information.</p>
</li>
<li><p>🛡️ Always stay informed about app security.</p>
</li>
<li><p>🔄 Always keep apps updated with the latest security patches.</p>
</li>
<li><p>🚨 Always report any suspicious apps or security concerns to the app store and relevant authorities.</p>
</li>
<li><p>👫 Share information with friends and family to collectively contribute to a safer digital environment</p>
</li>
</ul>
<h2 id="heading-final-thoughts">Final Thoughts</h2>
<p>🏰 Let's see our app experience as crafting a resilient stronghold. Thorough testing methods work like examining every brick, ensuring our walls are sturdy. But it's not just developers' duty – users also have a critical role.</p>
<p>Selecting apps from trusted sources, reviewing feedback, and updating apps bolster our digital sanctuary. Together, with developers reinforcing defenses and users making informed decisions, we can shape a safer digital realm for all.🛡️👤🔒</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1711007869890/1ab290f7-b774-4933-a2b6-2cbc4d8c51d7.jpeg" alt class="image--center mx-auto" /></p>
]]></content:encoded></item><item><title><![CDATA[Svelte: A Quick Introduction]]></title><description><![CDATA[What is Svelte? 🙋‍♀️
Svelte stands out as an open-source front-end framework designed to craft dynamic and engaging user interfaces within web browsers.
Tell me more...⬇️
It takes a unique approach – acting as a compiler, not just a framework – resu...]]></description><link>https://blog.utkallabs.com/svelte-a-quick-introduction</link><guid isPermaLink="true">https://blog.utkallabs.com/svelte-a-quick-introduction</guid><category><![CDATA[Frontend Development]]></category><category><![CDATA[Svelte]]></category><category><![CDATA[Sveltekit]]></category><category><![CDATA[Developer]]></category><dc:creator><![CDATA[Sarthak Pattnaik]]></dc:creator><pubDate>Thu, 14 Mar 2024 14:20:59 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1701343935120/ff3cdcbd-4aed-4a16-b412-8e8eed92c22a.webp" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2 id="heading-what-is-svelte">What is Svelte? 🙋‍♀️</h2>
<p>Svelte stands out as an open-source front-end framework designed to craft dynamic and engaging user interfaces within web browsers.</p>
<h2 id="heading-tell-me-more">Tell me more...⬇️</h2>
<p>It takes a unique approach – acting as a compiler, not just a framework – resulting in faster performance compared to counterparts like ReactJS, AngularJS, and VueJS. Svelte is ideal for building reactive web applications, ensuring instantaneous updates whenever data changes.</p>
<p>It excels in rapid application development (RAD), allowing the swift creation of minimally coded software applications. Additionally, Svelte plays a pivotal role in web optimization, distinguishing itself by avoiding the use of a virtual DOM.</p>
<p>When it comes to deployment, Svelte stands apart; there's no need to deploy it separately, streamlining the process and contributing to its rapid execution.</p>
<h2 id="heading-prerequisites">Prerequisites 🎒</h2>
<p>Before diving into Svelte, ensure the following prerequisites are in place:</p>
<ul>
<li><p>Any text editor (e.g., VS Code, Atom, etc.).</p>
</li>
<li><p>NodeJS is installed on your system.</p>
</li>
</ul>
<h2 id="heading-installation-steps">Installation Steps 🔨</h2>
<h3 id="heading-step-1-install-degit">Step 1: Install Degit</h3>
<p>Open your command prompt or terminal and install the 'degit' package globally:</p>
<pre><code class="lang-bash">npm install -g degit
</code></pre>
<h3 id="heading-step-2-create-a-svelte-project">Step 2: Create a Svelte Project</h3>
<p>Create a directory on your desktop and run the following command:</p>
<pre><code class="lang-bash">degit sveltejs/template project-name
</code></pre>
<h3 id="heading-step-3-project-created">Step 3: Project created.</h3>
<p>Open it in your text editor. In '<strong>src</strong>', find <strong>main.js</strong> (the Svelte app executor), <strong>App.svelte</strong> (the root component), and check <strong>package.json</strong> for dependencies. Ready to roll! <strong>🚀</strong></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1701322229451/f90ec740-6451-4a72-9489-dc8254d6b02e.png" alt class="image--center mx-auto" /></p>
<h3 id="heading-step-4-navigate-to-project-directory">Step 4: Navigate to Project Directory</h3>
<p>Ensure you are in your project directory:</p>
<pre><code class="lang-bash"><span class="hljs-built_in">cd</span> project-name
</code></pre>
<h3 id="heading-step-5-install-dependencies">Step 5: Install Dependencies</h3>
<p>Install project dependencies:</p>
<pre><code class="lang-bash">npm install
</code></pre>
<h3 id="heading-step-6-start-the-development-server">Step 6: Start the Development Server</h3>
<p>Create a local development server to run your application:</p>
<pre><code class="lang-bash">npm run dev
</code></pre>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1701321394444/b2fe186f-aa27-4440-a8bd-faba15ba6e28.png" alt class="image--center mx-auto" /></p>
<h3 id="heading-step-7-follow-the-link">Step 7: Follow the Link</h3>
<p>Open the provided link in your browser to explore and develop your Svelte application further.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1710426017455/438faa88-27b0-4bc0-85fc-a6a737f7a69f.png" alt class="image--center mx-auto" /></p>
<p>Thats it..!</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1701321769587/8a5184ad-c1bb-4be0-84de-245bd947a006.gif" alt class="image--center mx-auto" /></p>
<p>Congratulations on Choosing Svelte! 🎉 Get ready to code at warp speed. Time to sprinkle some magic on your web development journey with Svelte's lightning-fast vibes! 🚀✨</p>
<p>Happy Coding🤠</p>
]]></content:encoded></item><item><title><![CDATA[Automating our Lead Management System Using Selenium]]></title><description><![CDATA[Introduction
Today, I am taking you on a journey of automating a Lead Management System. Lead Tracking System, as the name suggests is a system designed to keep track of all the leads a company has or procures.
From a broader perspective, it is a sys...]]></description><link>https://blog.utkallabs.com/automating-our-lead-management-system-using-selenium</link><guid isPermaLink="true">https://blog.utkallabs.com/automating-our-lead-management-system-using-selenium</guid><category><![CDATA[Quality Assurance]]></category><category><![CDATA[selenium]]></category><category><![CDATA[jmeter]]></category><category><![CDATA[automation]]></category><category><![CDATA[automation testing ]]></category><category><![CDATA[Open Source]]></category><category><![CDATA[Java]]></category><category><![CDATA[selenium-webdriver]]></category><dc:creator><![CDATA[Vivek Singhdeo]]></dc:creator><pubDate>Tue, 05 Dec 2023 04:16:29 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1701327108957/a7603f8e-0e61-4885-8de8-611d417f0c09.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h1 id="heading-introduction">Introduction</h1>
<p>Today, I am taking you on a journey of automating a <em>Lead Management System</em>. <em>Lead Tracking System</em>, as the name suggests is a system designed to keep track of all the leads a company has or procures.</p>
<p>From a broader perspective, it is a system where an organization can store, view, and update all the information about their prospects and their requirements.</p>
<h1 id="heading-background">Background</h1>
<p>We have our own in-house <em>Lead Management System</em>, and as a member of the automation team, I and my peer <em>Gopabandhu Barik</em> were assigned the responsibility of automating the system.</p>
<p>I used <em>Selenium</em> (in <em>JAVA</em>) for the above purpose. To get into the system, first, I used my official credential to log in.</p>
<p>The application consists of 3 roles namely.</p>
<ol>
<li><p>Admin,</p>
</li>
<li><p>Sales, and</p>
</li>
<li><p>Delivery Owner</p>
</li>
</ol>
<p>To cover most scenarios, I used the account with Admin privileges. Upon a successful login, the registered lands on the Dashboard page.</p>
<h1 id="heading-what-is-selenium">What is Selenium?</h1>
<p>Selenium is a widely used tool that automates web browsers, facilitating the creation of scripts for automated interactions with web applications.</p>
<p>QA professionals can utilize Selenium to automate processes without the need for manual clicks through tasks on the web. Selenium programmatically emulates human actions, such as clicking buttons, filling out forms, and navigating websites.</p>
<p>It supports various programming languages like Java, Python, C#, and Ruby, making it accessible to many developers.</p>
<h2 id="heading-benefits-of-using-selenium-in-java">Benefits of Using Selenium in Java</h2>
<h3 id="heading-powerful-and-flexible">Powerful and flexible</h3>
<p>Selenium is a powerful and flexible automation tool that can be used to automate a wide variety of tasks.</p>
<h3 id="heading-open-source">Open source</h3>
<p>Selenium is an open-source tool, which means that it is free to use and modify.</p>
<h3 id="heading-cross-browser-compatibility-testing">Cross-Browser Compatibility Testing</h3>
<p>Selenium enables testing web applications across multiple browsers, ensuring compatibility and a consistent user experience.</p>
<h3 id="heading-integration-with-j-meter">Integration with J Meter</h3>
<p>Selenium can be integrated with J Meter, allowing you to create robust automation scripts for testing while simulating user load tests.</p>
<h2 id="heading-how-to-set-up-selenium-in-java">How to Set Up Selenium in Java</h2>
<p>Before you start using Selenium in Java, you need to set up your development environment. Follow these steps:</p>
<h3 id="heading-java-installation">Java Installation</h3>
<p>Ensure you have Java Development Kit (JDK) installed on your Windows machine. You can download it from the official Oracle website. Or</p>
<h3 id="heading-ide-optional">IDE (Optional)</h3>
<p>You can use an Integrated Development Environment (IDE) like Eclipse or IntelliJ IDEA for writing and running Selenium scripts. Download and install your preferred IDE.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1700715219225/8350ef93-78eb-40f3-b0cb-85c7a2a98cca.jpeg" alt class="image--center mx-auto" /></p>
<h3 id="heading-download-and-install-selenium-webdriver">Download and Install Selenium WebDriver</h3>
<p>Download Selenium JAR Files: Visit the official Selenium website and download the latest version of the Selenium WebDriver Java bindings.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1700715406836/4c5e0058-dc69-48e1-a9cc-862050bed0f6.png" alt class="image--center mx-auto" /></p>
<p>Download and Configure Browser Drivers</p>
<p><strong>Download Browser Drivers</strong><br />1. Depending on the web browser you need to automate (e.g., Chrome, Firefox, Edge), download the respective browser driver executable ( <a target="_blank" href="https://www.selenium.dev/downloads/">https://www.selenium.dev/downloads/</a> )</p>
<p>2. For Chrome, download ChromeDriver from the official site.</p>
<p>3. For Firefox, download GeckoDriver from the official site.</p>
<p>4. For Edge, download the Microsoft Edge WebDriver from the official site.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1700715357115/25898b7b-02e1-4a7a-90cc-dad6b7f842c7.png" alt class="image--center mx-auto" /></p>
<p>Set Up Your Selenium Script Using Eclipse</p>
<p>1. Open Eclipse and create a new Java project.</p>
<p>2. Add the Selenium WebDriver JAR files to the project's build path.</p>
<p>3. Create a new Java class and import the packages.</p>
<pre><code class="lang-java"><span class="hljs-keyword">package</span> Basicweb;

<span class="hljs-keyword">import</span> org.openqa.selenium.By;
<span class="hljs-keyword">import</span> org.openqa.selenium.WebDriver;
<span class="hljs-keyword">import</span> org.openqa.selenium.chrome.ChromeDriver;

<span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Firsttestclass</span> </span>{
<span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title">main</span><span class="hljs-params">(String[] args)</span> </span>{
System.setProperty(
<span class="hljs-string">"webdriver.chrome.driver"</span>,<span class="hljs-string">"C:\\Users\\Utkal Labs\\Desktop\\New folder\\chrome\\chromedriver.exe"</span>);
WebDriver driver = <span class="hljs-keyword">new</span> ChromeDriver();
driver.get(<span class="hljs-string">"https://leadstaging.utkallabs.com/"</span>);

driver.manage().window().maximize();

driver.findElement(By.name(<span class="hljs-string">"email"</span>)).sendKeys(<span class="hljs-string">"Vivek.singhdeo@utkallabs.com"</span>);
driver.findElement(By.name(<span class="hljs-string">"password"</span>)).sendKeys(<span class="hljs-string">"12345678"</span>);
driver.findElement(By.xpath(
<span class="hljs-string">"//*[@id=\"root\"]/div/div[2]/div[2]/div/div/div[2]/div/form/div/div[4]/button"</span>)).click();
driver.findElement(By.cssSelector(
<span class="hljs-string">"input[class= 'MuiButtonBase-root MuiIconButton-root MuiIconButton-sizeMedium css-10ygcul']"</span>)).click();
System.out.println(driver.getTitle());
System.out.println(driver.getCurrentUrl());
driver.close();
    }
}
</code></pre>
<ol>
<li>Create a new WebDriver object, passing in the path to the ChromeDriver executable as an argument.</li>
</ol>
<pre><code class="lang-java">WebDriver driver = <span class="hljs-keyword">new</span> ChromeDriver();
</code></pre>
<p>5. Use the WebDriver object to navigate to the web page that you want to automate.</p>
<pre><code class="lang-java">driver.get(<span class="hljs-string">"https://leadstaging.utkallabs.com/"</span>);
</code></pre>
<p>6. Use the WebDriver object to interact with the web page elements. For example, you can use the findElement() method to locate a web element and the sendKeys() method to enter text into a text field.</p>
<pre><code class="lang-java">driver.findElement(By.name(<span class="hljs-string">"email"</span>)).sendKeys(<span class="hljs-string">"Vivek.singhdeo@utkallabs.com"</span>);
</code></pre>
<pre><code class="lang-java">driver.findElement(By.xpath(
<span class="hljs-string">"//*[@id=\"root\"]/div/div[2]/div[2]/div/div/div[2]/div/form/div/div[4]/button"</span>)).click();
</code></pre>
<pre><code class="lang-java">driver.findElement(By.cssSelector(
<span class="hljs-string">"input[class= 'MuiButtonBase-root MuiIconButton-root MuiIconButton-sizeMedium css-10ygcul']"</span>)).click();
</code></pre>
<p>7. Use the close() method to close the WebDriver object and the web browser.</p>
<pre><code class="lang-java">driver.close();
</code></pre>
<h1 id="heading-going-forward">Going Forward</h1>
<p>In the forthcoming blog, we will embark on creating content centered around <em>JMeter</em> and Selenium primarily focusing on showing you the details of load testing using<br /><em>JMeter</em> and <em>Selenium</em>.</p>
<p>Stay tuned for an insightful exploration into the practical application of these tools in the realm of performance testing. 🥂</p>
]]></content:encoded></item><item><title><![CDATA[YOLOv5: Fast and Accurate Object Detection]]></title><description><![CDATA[Introduction: The Crucial Role of Object Detection
In the realm of computer vision, object detection takes center stage, with the primary goal of identifying objects within images or video streams. This task is pivotal in a wide range of applications...]]></description><link>https://blog.utkallabs.com/yolov5-fast-and-accurate-object-detection</link><guid isPermaLink="true">https://blog.utkallabs.com/yolov5-fast-and-accurate-object-detection</guid><category><![CDATA[object detection ]]></category><category><![CDATA[AI]]></category><category><![CDATA[Machine Learning]]></category><category><![CDATA[YOLO]]></category><category><![CDATA[Python]]></category><dc:creator><![CDATA[Sarthak Pattnaik]]></dc:creator><pubDate>Thu, 30 Nov 2023 06:10:08 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1699366584970/eb163c65-a211-4857-9699-85b7c6b49bb6.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h1 id="heading-introduction-the-crucial-role-of-object-detection">Introduction: The Crucial Role of Object Detection</h1>
<p>In the realm of computer vision, object detection takes center stage, with the primary goal of identifying objects within images or video streams. This task is pivotal in a wide range of applications, from security systems to autonomous vehicles. Let's have a leap through the categories.</p>
<h1 id="heading-categories">Categories</h1>
<p>Object detection methods can be broadly classified into two categories: <em>non-neural</em> and <em>neural approaches</em>.</p>
<h2 id="heading-non-neural-methods">Non-Neural Methods</h2>
<ul>
<li><p><strong>Viola-Jones:</strong> This approach harnesses Haar features to achieve robust and efficient object detection.</p>
</li>
<li><p><strong>SIFT (Scale-Invariant Feature Transform):</strong> SIFT extracts key points and descriptors from images, enabling effective object recognition.</p>
</li>
<li><p><strong>HOG (Histogram of Oriented Gradients):</strong> HOG is a feature descriptor that characterizes objects based on their shape and appearance.</p>
</li>
</ul>
<h2 id="heading-neural-network-methods">Neural Network Methods</h2>
<ul>
<li><p><strong>R-CNN Family (Region-Based Convolutional Neural Networks):</strong> These models leverage region proposals to enhance object detection accuracy.</p>
</li>
<li><p><strong>SSD (Single Shot Detector):</strong> SSD is renowned for real-time object detection, accomplishing this task in a single pass through the network.</p>
</li>
<li><p><strong>Retina-Net:</strong> Exceptional at managing objects of varying scales and aspect ratios.</p>
</li>
<li><p><strong>YOLO (You Only Look Once):</strong> YOLO is a real-time object detection marvel that performs the detection and classification of objects in a single, efficient pass through a neural network.</p>
</li>
</ul>
<h2 id="heading-understanding-yolo"><strong>Understanding YOLO</strong></h2>
<h3 id="heading-what-is-yolo"><strong>What is YOLO?</strong></h3>
<p><em>You Only Look Once (YOLO)</em>, born in 2016, stands as a formidable object detection algorithm renowned for its speed and accuracy.</p>
<p>In a single efficient pass through the network, YOLO predicts both bounding boxes and object classes, rendering it perfect for real-time applications. YOLO's elegance and its proficiency in handling diverse objects have propelled it to popularity.</p>
<h2 id="heading-training-your-yolo-model">Training Your YOLO Model</h2>
<p>When it comes to training your YOLO model, you have the freedom to harness datasets such as those provided by Roboflow.</p>
<p>By creating an account and downloading YOLO-compatible formats, you are poised to embark on the journey of customizing your YOLO model to suit your specific objectives.</p>
<p>To acquire your custom dataset, execute the following command:</p>
<pre><code class="lang-python">curl -L <span class="hljs-string">"https://public.roboflow.ai/ds/YOUR-LINK-HERE"</span> &gt; roboflow.zip; unzip roboflow.zip; rm roboflow.zip
</code></pre>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1699364284936/2d21fa68-15fd-4ec4-ba0c-48219dcf3e93.png" alt class="image--center mx-auto" /></p>
<p>Before you begin training your YOLOv5 model, you need to set up <em>data.yaml</em> configuration file. This file is essential for defining key parameters, including:</p>
<ul>
<li><p>The location of your YOLOv5 image folder.</p>
</li>
<li><p>The path to your YOLOv5 labels folder.</p>
</li>
<li><p>Custom class information.</p>
</li>
</ul>
<p>This <em>data.yaml</em> file serves as a blueprint for your training process. It provides the necessary instructions for your YOLOv5 model, ensuring it understands your dataset, class labels, and how to handle them effectively during training.</p>
<h2 id="heading-installing-the-yolov5-environment"><strong>Installing the YOLOv5 Environment</strong></h2>
<p>To start with YOLOv5 we first clone the YOLOv5 repository and install dependencies. This will set up our programming environment to be ready to run object detection training and inference commands.</p>
<p><code>!git clone https://github.com/ultralytics/yolov5.git</code></p>
<p><code>%cd /content/yolov5</code></p>
<p><code>!pip install -U -r yolov5/requirements.txt</code></p>
<h2 id="heading-yolov5-model-configuration-and-architecture"><strong>YOLOv5 Model Configuration and Architecture</strong></h2>
<p>For our YOLOv5 model, we've opted for the leanest and swiftest base model available. However, it's important to note that you have a range of YOLOv5 model options to choose from, depending on your specific requirements:</p>
<ul>
<li><p>YOLOv5s</p>
</li>
<li><p>YOLOv5m</p>
</li>
<li><p>YOLOv5l</p>
</li>
<li><p>YOLOv5x</p>
</li>
</ul>
<h2 id="heading-training-your-custom-yolov5-detector">Training Your Custom YOLOv5 Detector</h2>
<p>Now that we have our <em>data.yaml</em> and <em>yolov5s.yaml</em> files primed and ready, we're all set to commence our training journey.</p>
<p>To initiate the training process, execute the training command with the following pivotal options:</p>
<ul>
<li><p><code>img</code>: Specifies the input image size.</p>
</li>
<li><p><code>batch</code>: Determines the batch size for training.</p>
</li>
<li><p><code>epochs</code>: Sets the number of training epochs.</p>
</li>
<li><p><code>data</code>: Points to the path of our <code>data.yaml</code> configuration file.</p>
</li>
<li><p><code>cfg</code>: Specifies the model configuration (in this case, <code>yolov5s.yaml</code>).</p>
</li>
<li><p><code>weights</code>: Allows you to specify a custom path to pre-trained weights.</p>
</li>
<li><p><code>name</code>: Defines the name for your training results.</p>
</li>
<li><p><code>nosave</code>: Saves only the final checkpoint, minimizing disk space usage.</p>
</li>
<li><p><code>cache</code>: Enables image caching to expedite the training process.</p>
</li>
</ul>
<p>Execute this training command to kickstart your YOLOv5 model customization and training.</p>
<pre><code class="lang-python">!python train.py --data ../data.yaml --weights yolov5s.pt \
    --img <span class="hljs-number">640</span> --epochs {EPOCHS} --batch-size <span class="hljs-number">16</span> --name {RES_DIR}
</code></pre>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1699364595304/b3f9d76d-168a-46e0-8aa8-c7429ced90b0.png" alt class="image--center mx-auto" /></p>
<p>After training it will save in this path as <strong>best.pt</strong></p>
<p><em>runs/train/results_1/weights/best.pt</em></p>
<h2 id="heading-run-yolov5-inference-on-test-images"><strong>Run YOLOv5 Inference on Test Images</strong></h2>
<p>Once our YOLOv5 model has been meticulously trained, it's time to put it to the test by making inferences on test images. After the training process has concluded, the model weights will be securely stored in the 'weights/' directory.</p>
<p>You can employ the 'source' parameter to specify the source of inference. It's versatile and can accept a variety of inputs, including:</p>
<ul>
<li><p>A directory containing multiple images</p>
</li>
<li><p>Individual image files</p>
</li>
<li><p>Video files</p>
</li>
<li><p>Even a webcam's input port</p>
</li>
</ul>
<p>To put our model to the test with test images, utilize the following command:</p>
<p><code>!python detect.py --weights runs/train/{RES_DIR}/weights/best.pt \</code></p>
<p><code>--source {data_path} --name {INFER_DIR}</code></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1699364873877/05698f47-c69c-45c7-a117-4543b2880049.png" alt class="image--center mx-auto" /></p>
<p>Here are some visualizations after running test images.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1699365085068/b2497d29-7f88-41ed-9a2c-4c48537ee354.png" alt="xd" class="image--center mx-auto" /></p>
<p><em>Image Courtesy: Roboflow</em></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1699365157973/063f0fc0-44e9-4ed3-b856-290ee06439cb.png" alt class="image--center mx-auto" /></p>
<p><em>Image Courtesy: Roboflow</em></p>
<p>To further assess the performance of our trained model, we've acquired random images from the internet. These additional tests serve to showcase the model's versatility and effectiveness, Here are the results of these evaluations</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1699365158910/2b9bd57b-308f-4066-8b92-54288282fa8e.png" alt class="image--center mx-auto" /></p>
<p><em>Image Courtesy: click4vector</em></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1699365171659/e47553c6-3985-4538-afb2-a3557424df5b.png" alt class="image--center mx-auto" /></p>
<p><em>Image Courtesy: pexels</em></p>
<h2 id="heading-conclusion"><strong>Conclusion</strong></h2>
<p>Training your custom YOLO object detection model is a rewarding experience. YOLO stands out for its lightweight and user-friendly nature, enabling quick training, fast inferences, and outstanding performance. Whether you're working on real-time applications or complex projects, YOLO is a versatile and powerful tool in your computer vision toolkit.</p>
<p>Happy Coding…. 🙏🙏🤝</p>
]]></content:encoded></item><item><title><![CDATA[React: Behind the Scenes]]></title><description><![CDATA[Generally, when we start writing a react code we start with a create-react-app setup and write our code in a JSX file but today we will use just a single HTML file.
We will start with setting up a project and creating one HTML file called index.html ...]]></description><link>https://blog.utkallabs.com/react-behind-the-scenes</link><guid isPermaLink="true">https://blog.utkallabs.com/react-behind-the-scenes</guid><category><![CDATA[React]]></category><category><![CDATA[JavaScript]]></category><category><![CDATA[Beginner Developers]]></category><dc:creator><![CDATA[Alok Kumar]]></dc:creator><pubDate>Tue, 14 Nov 2023 13:30:09 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/stock/unsplash/zwsHjakE_iI/upload/dad81e17eaf6bd0a743a60cecdbbcce3.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Generally, when we start writing a react code we start with a <code>create-react-app</code> setup and write our code in a JSX file but today we will use just a single HTML file.</p>
<p>We will start with setting up a project and creating one HTML file called <strong>index.html</strong> with starter code:-</p>
<pre><code class="lang-html"><span class="hljs-meta">&lt;!DOCTYPE <span class="hljs-meta-keyword">html</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">html</span> <span class="hljs-attr">lang</span>=<span class="hljs-string">"en"</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">head</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">meta</span> <span class="hljs-attr">charset</span>=<span class="hljs-string">"UTF-8"</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">meta</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"viewport"</span> <span class="hljs-attr">content</span>=<span class="hljs-string">"width=device-width, initial-scale=1.0"</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">title</span>&gt;</span>React BTS<span class="hljs-tag">&lt;/<span class="hljs-name">title</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">head</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">body</span>&gt;</span>

<span class="hljs-tag">&lt;/<span class="hljs-name">body</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">html</span>&gt;</span>
</code></pre>
<p>Let's add a root div where we will render our React app. Also, we will add two script tags which are basically used to include react library and <mark>react-dom</mark>. Then, we will add one empty script tag where we will write our code.</p>
<pre><code class="lang-html"><span class="hljs-meta">&lt;!DOCTYPE <span class="hljs-meta-keyword">html</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">html</span> <span class="hljs-attr">lang</span>=<span class="hljs-string">"en"</span>&gt;</span>
  <span class="hljs-tag">&lt;<span class="hljs-name">head</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">meta</span> <span class="hljs-attr">charset</span>=<span class="hljs-string">"UTF-8"</span> /&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">meta</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"viewport"</span> <span class="hljs-attr">content</span>=<span class="hljs-string">"width=device-width, initial-scale=1.0"</span> /&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">title</span>&gt;</span>React BTS<span class="hljs-tag">&lt;/<span class="hljs-name">title</span>&gt;</span>
  <span class="hljs-tag">&lt;/<span class="hljs-name">head</span>&gt;</span>
  <span class="hljs-tag">&lt;<span class="hljs-name">body</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"root"</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>

    <span class="hljs-tag">&lt;<span class="hljs-name">script</span> <span class="hljs-attr">src</span>=<span class="hljs-string">"https://unpkg.com/react@18.2.0/umd/react.development.js"</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">script</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">script</span> <span class="hljs-attr">src</span>=<span class="hljs-string">"https://unpkg.com/react-dom@18.2.0/umd/react-dom.development.js"</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">script</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">script</span>&gt;</span>

    <span class="hljs-tag">&lt;/<span class="hljs-name">script</span>&gt;</span>
  <span class="hljs-tag">&lt;/<span class="hljs-name">body</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">html</span>&gt;</span>
</code></pre>
<blockquote>
<p>First script tag is used to include the React library in our web page.</p>
<p>Second script tag is used to include ReactDOM, which used for integrating React with the DOM (Document Object Model). ReactDOM is used for rendering React components into the actual HTML DOM.</p>
</blockquote>
<p>Now let's add our react code, we will add a very simple <strong>h1</strong> with the text <strong>Hello World!</strong>.</p>
<pre><code class="lang-html"><span class="hljs-meta">&lt;!DOCTYPE <span class="hljs-meta-keyword">html</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">html</span> <span class="hljs-attr">lang</span>=<span class="hljs-string">"en"</span>&gt;</span>
  <span class="hljs-tag">&lt;<span class="hljs-name">head</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">meta</span> <span class="hljs-attr">charset</span>=<span class="hljs-string">"UTF-8"</span> /&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">meta</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"viewport"</span> <span class="hljs-attr">content</span>=<span class="hljs-string">"width=device-width, initial-scale=1.0"</span> /&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">title</span>&gt;</span>React BTS<span class="hljs-tag">&lt;/<span class="hljs-name">title</span>&gt;</span>
  <span class="hljs-tag">&lt;/<span class="hljs-name">head</span>&gt;</span>
  <span class="hljs-tag">&lt;<span class="hljs-name">body</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"root"</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>

    <span class="hljs-tag">&lt;<span class="hljs-name">script</span> <span class="hljs-attr">src</span>=<span class="hljs-string">"https://unpkg.com/react@18.2.0/umd/react.development.js"</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">script</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">script</span> <span class="hljs-attr">src</span>=<span class="hljs-string">"https://unpkg.com/react-dom@18.2.0/umd/react-dom.development.js"</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">script</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">script</span>&gt;</span><span class="javascript">
      <span class="hljs-keyword">const</span> App = <span class="hljs-function">() =&gt;</span> {
        <span class="hljs-keyword">return</span> React.createElement(
          <span class="hljs-string">"div"</span>,
          {},
          React.createElement(<span class="hljs-string">"h1"</span>, {}, <span class="hljs-string">"Hello World!"</span>)
        );
      };

      <span class="hljs-keyword">const</span> container = <span class="hljs-built_in">document</span>.getElementById(<span class="hljs-string">"root"</span>);
      <span class="hljs-keyword">const</span> root = ReactDOM.createRoot(container);
      root.render(React.createElement(App));
    </span><span class="hljs-tag">&lt;/<span class="hljs-name">script</span>&gt;</span>
  <span class="hljs-tag">&lt;/<span class="hljs-name">body</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">html</span>&gt;</span>
</code></pre>
<p>Let's break this code.</p>
<p><code>const App = () =&gt; { ... }</code>:</p>
<ul>
<li><p>This code defines a React functional component called App. Functional components are a way to define React components using JavaScript functions.</p>
</li>
<li><p>Inside the component, there is a return statement that uses the <code>React.createElement</code> function to create a virtual DOM element. Here, it creates a div element containing an h1 element with the text <em>"Hello World!"</em></p>
</li>
</ul>
<p><code>const container = document.getElementById("root")</code>:</p>
<ul>
<li>Here we have fetched an HTML element with the id "root" using <code>document.getElementById</code>. This element will serve as the container in which the React application will be rendered.</li>
</ul>
<p><code>const root = ReactDOM.createRoot(container)</code>:</p>
<ul>
<li><p>This creates a React Root using <code>ReactDOM.createRoot()</code>. A React Root is a new rendering API introduced in React 18 to enable concurrent rendering.</p>
</li>
<li><p>The container element we obtained earlier is passed as an argument to <code>createRoot()</code>, indicating that this is where the React application will be rendered.</p>
</li>
</ul>
<p><code>root.render(React.createElement(App))</code>:</p>
<ul>
<li><p>The last line of code renders the App component into the specified container using the React Root's render method.</p>
</li>
<li><p><code>React.createElement(App)</code> creates an instance of the App component, and the <code>root.render()</code> method renders it into the container.</p>
</li>
</ul>
<p>Let's run this code and see the output.</p>
<p><img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/gz01seasld5xy0hqdh3d.png" alt="Image description" /></p>
<p>You can see we have created our <em>Hello World React app</em> with just a few lines of code. At the end of the day, all the JSX code we write is transformed into <code>React.createElement()</code> calls by transpilers like Babel before it's executed by a JavaScript engine.</p>
<p>We just explored the process of creating a <em>"Hello World!"</em> React app using just a single HTML page. Now, we will delve into the separation of our JavaScript code from our HTML page and learn how to create reusable components.</p>
<hr />
<p>This is the code we have till now:</p>
<pre><code class="lang-html"><span class="hljs-meta">&lt;!DOCTYPE <span class="hljs-meta-keyword">html</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">html</span> <span class="hljs-attr">lang</span>=<span class="hljs-string">"en"</span>&gt;</span>
  <span class="hljs-tag">&lt;<span class="hljs-name">head</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">meta</span> <span class="hljs-attr">charset</span>=<span class="hljs-string">"UTF-8"</span> /&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">meta</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"viewport"</span> <span class="hljs-attr">content</span>=<span class="hljs-string">"width=device-width, initial-scale=1.0"</span> /&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">title</span>&gt;</span>React BTS<span class="hljs-tag">&lt;/<span class="hljs-name">title</span>&gt;</span>
  <span class="hljs-tag">&lt;/<span class="hljs-name">head</span>&gt;</span>
  <span class="hljs-tag">&lt;<span class="hljs-name">body</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"root"</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>

    <span class="hljs-tag">&lt;<span class="hljs-name">script</span> <span class="hljs-attr">src</span>=<span class="hljs-string">"https://unpkg.com/react@18.2.0/umd/react.development.js"</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">script</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">script</span> <span class="hljs-attr">src</span>=<span class="hljs-string">"https://unpkg.com/react-dom@18.2.0/umd/react-dom.development.js"</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">script</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">script</span>&gt;</span><span class="javascript">
      <span class="hljs-keyword">const</span> App = <span class="hljs-function">() =&gt;</span> {
        <span class="hljs-keyword">return</span> React.createElement(
          <span class="hljs-string">"div"</span>,
          {},
          React.createElement(<span class="hljs-string">"h1"</span>, {}, <span class="hljs-string">"Hello World!"</span>)
        );
      };

      <span class="hljs-keyword">const</span> container = <span class="hljs-built_in">document</span>.getElementById(<span class="hljs-string">"root"</span>);
      <span class="hljs-keyword">const</span> root = ReactDOM.createRoot(container);
      root.render(React.createElement(App));
    </span><span class="hljs-tag">&lt;/<span class="hljs-name">script</span>&gt;</span>
  <span class="hljs-tag">&lt;/<span class="hljs-name">body</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">html</span>&gt;</span>
</code></pre>
<p>Now, let's first move our JS code to a separate file called <strong>app.js</strong> and include it in our HTML page using a script tag.</p>
<pre><code class="lang-html"><span class="hljs-meta">&lt;!DOCTYPE <span class="hljs-meta-keyword">html</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">html</span> <span class="hljs-attr">lang</span>=<span class="hljs-string">"en"</span>&gt;</span>
  <span class="hljs-tag">&lt;<span class="hljs-name">head</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">meta</span> <span class="hljs-attr">charset</span>=<span class="hljs-string">"UTF-8"</span> /&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">meta</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"viewport"</span> <span class="hljs-attr">content</span>=<span class="hljs-string">"width=device-width, initial-scale=1.0"</span> /&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">title</span>&gt;</span>React BTS<span class="hljs-tag">&lt;/<span class="hljs-name">title</span>&gt;</span>
  <span class="hljs-tag">&lt;/<span class="hljs-name">head</span>&gt;</span>
  <span class="hljs-tag">&lt;<span class="hljs-name">body</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"root"</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>

    <span class="hljs-tag">&lt;<span class="hljs-name">script</span> <span class="hljs-attr">src</span>=<span class="hljs-string">"https://unpkg.com/react@18.2.0/umd/react.development.js"</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">script</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">script</span> <span class="hljs-attr">src</span>=<span class="hljs-string">"https://unpkg.com/react-dom@18.2.0/umd/react-dom.development.js"</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">script</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">script</span> <span class="hljs-attr">src</span>=<span class="hljs-string">"./app.js"</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">script</span>&gt;</span>
  <span class="hljs-tag">&lt;/<span class="hljs-name">body</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">html</span>&gt;</span>
</code></pre>
<pre><code class="lang-javascript"><span class="hljs-comment">// app.js</span>
<span class="hljs-keyword">const</span> App = <span class="hljs-function">() =&gt;</span> {
  <span class="hljs-keyword">return</span> React.createElement(
    <span class="hljs-string">"div"</span>,
    {},
    React.createElement(<span class="hljs-string">"h1"</span>, {}, <span class="hljs-string">"Hello World!"</span>)
  );
};

<span class="hljs-keyword">const</span> container = <span class="hljs-built_in">document</span>.getElementById(<span class="hljs-string">"root"</span>);
<span class="hljs-keyword">const</span> root = ReactDOM.createRoot(container);
root.render(React.createElement(App));
</code></pre>
<p>If we run this project now, the output will remain the same.</p>
<hr />
<p>Let's create our first component:</p>
<pre><code class="lang-javascript"><span class="hljs-comment">// app.js</span>

<span class="hljs-keyword">const</span> Student = <span class="hljs-function">() =&gt;</span> {
  <span class="hljs-keyword">return</span> React.createElement(<span class="hljs-string">"div"</span>, {}, [
    React.createElement(<span class="hljs-string">"h1"</span>, {}, <span class="hljs-string">"John"</span>),
    React.createElement(<span class="hljs-string">"h2"</span>, {}, <span class="hljs-string">"Male"</span>),
    React.createElement(<span class="hljs-string">"h3"</span>, {}, <span class="hljs-string">"21"</span>),
  ]);
};

<span class="hljs-keyword">const</span> App = <span class="hljs-function">() =&gt;</span> {
  <span class="hljs-keyword">return</span> React.createElement(<span class="hljs-string">"div"</span>, {}, [
    React.createElement(<span class="hljs-string">"h1"</span>, {}, <span class="hljs-string">"Hello World!"</span>),
    React.createElement(Student),
  ]);
};

<span class="hljs-keyword">const</span> container = <span class="hljs-built_in">document</span>.getElementById(<span class="hljs-string">"root"</span>);
<span class="hljs-keyword">const</span> root = ReactDOM.createRoot(container);
root.render(React.createElement(App));
</code></pre>
<p>Here we have created a component called <strong>Student</strong> which uses <code>React.createElement</code> to create a DOM structure with a parent "div" element and three child elements ("h1," "h2," and "h3"). When this component is rendered, it will produce the following HTML structure:</p>
<pre><code class="lang-html"><span class="hljs-tag">&lt;<span class="hljs-name">div</span>&gt;</span>
  <span class="hljs-tag">&lt;<span class="hljs-name">h1</span>&gt;</span>John<span class="hljs-tag">&lt;/<span class="hljs-name">h1</span>&gt;</span>
  <span class="hljs-tag">&lt;<span class="hljs-name">h2</span>&gt;</span>Male<span class="hljs-tag">&lt;/<span class="hljs-name">h2</span>&gt;</span>
  <span class="hljs-tag">&lt;<span class="hljs-name">h3</span>&gt;</span>21<span class="hljs-tag">&lt;/<span class="hljs-name">h3</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
</code></pre>
<p>The output would be something like this:</p>
<p><img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/q2416i5lzdveh5ddhg0j.png" alt="output" /></p>
<p>Now that we have a component, we can utilize it multiple times by simply calling it.</p>
<pre><code class="lang-javascript"><span class="hljs-comment">// app.js</span>

<span class="hljs-keyword">const</span> Student = <span class="hljs-function">() =&gt;</span> {
  <span class="hljs-keyword">return</span> React.createElement(<span class="hljs-string">"div"</span>, {}, [
    React.createElement(<span class="hljs-string">"h1"</span>, {}, <span class="hljs-string">"John"</span>),
    React.createElement(<span class="hljs-string">"h2"</span>, {}, <span class="hljs-string">"Male"</span>),
    React.createElement(<span class="hljs-string">"h3"</span>, {}, <span class="hljs-string">"21"</span>),
  ]);
};

<span class="hljs-keyword">const</span> App = <span class="hljs-function">() =&gt;</span> {
  <span class="hljs-keyword">return</span> React.createElement(<span class="hljs-string">"div"</span>, {}, [
    React.createElement(<span class="hljs-string">"h1"</span>, {}, <span class="hljs-string">"Hello World!"</span>),
    React.createElement(Student),
    React.createElement(Student),
  ]);
};

<span class="hljs-keyword">const</span> container = <span class="hljs-built_in">document</span>.getElementById(<span class="hljs-string">"root"</span>);
<span class="hljs-keyword">const</span> root = ReactDOM.createRoot(container);
root.render(React.createElement(App));
</code></pre>
<p>And the output would be.</p>
<p><img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/533lmopl4y58q40zt18y.png" alt="output" /></p>
<p>Here, we can see that it doesn't make any sense to use the component twice, as it gives the same output. That's because, until now, we have been using static data only.</p>
<p>Let's make this component dynamic using props:</p>
<pre><code class="lang-javascript"><span class="hljs-comment">// app.js</span>

<span class="hljs-keyword">const</span> Student = <span class="hljs-function">(<span class="hljs-params">props</span>) =&gt;</span> {
  <span class="hljs-keyword">return</span> React.createElement(<span class="hljs-string">"div"</span>, {}, [
    React.createElement(<span class="hljs-string">"h1"</span>, {}, props.name),
    React.createElement(<span class="hljs-string">"h2"</span>, {}, props.gender),
    React.createElement(<span class="hljs-string">"h3"</span>, {}, props.age),
  ]);
};

<span class="hljs-keyword">const</span> App = <span class="hljs-function">() =&gt;</span> {
  <span class="hljs-keyword">return</span> React.createElement(<span class="hljs-string">"div"</span>, {}, [
    React.createElement(<span class="hljs-string">"h1"</span>, {}, <span class="hljs-string">"Hello World!"</span>),
    React.createElement(Student, { <span class="hljs-attr">name</span>: <span class="hljs-string">"John"</span>, <span class="hljs-attr">gender</span>: <span class="hljs-string">"Male"</span>, <span class="hljs-attr">age</span>: <span class="hljs-number">21</span> }),
    React.createElement(Student, { <span class="hljs-attr">name</span>: <span class="hljs-string">"Mary"</span>, <span class="hljs-attr">gender</span>: <span class="hljs-string">"Female"</span>, <span class="hljs-attr">age</span>: <span class="hljs-number">20</span> }),
  ]);
};

<span class="hljs-keyword">const</span> container = <span class="hljs-built_in">document</span>.getElementById(<span class="hljs-string">"root"</span>);
<span class="hljs-keyword">const</span> root = ReactDOM.createRoot(container);
root.render(React.createElement(App));
</code></pre>
<p>Here, we have used props to pass some dynamic data to the component, and then we are using them accordingly. Let's see the output.</p>
<p><img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9i95w839hngwq09zbk3a.png" alt="output" /></p>
<hr />
<p>As a result, we've successfully separated our JavaScript code from the HTML, created components, and gained a deeper understanding of how React operates.</p>
]]></content:encoded></item><item><title><![CDATA[Demystifying Deepfakes: A Comprehensive Guide]]></title><description><![CDATA[Introduction
Deepfake videos have become a concerning issue in the digital age, leveraging the power of artificial intelligence (AI) and machine learning to create realistic-looking videos with altered appearances and voices. This article delves into...]]></description><link>https://blog.utkallabs.com/demystifying-deepfakes-a-comprehensive-guide</link><guid isPermaLink="true">https://blog.utkallabs.com/demystifying-deepfakes-a-comprehensive-guide</guid><category><![CDATA[AI]]></category><category><![CDATA[Deep Learning]]></category><category><![CDATA[Deepfake]]></category><category><![CDATA[Machine Learning]]></category><category><![CDATA[threat]]></category><dc:creator><![CDATA[Sarthak Pattnaik]]></dc:creator><pubDate>Thu, 09 Nov 2023 08:04:16 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1699436647684/712fceb9-6fc4-47bc-ad28-3918e2694e0e.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h1 id="heading-introduction">Introduction</h1>
<p>Deepfake videos have become a concerning issue in the digital age, leveraging the power of artificial intelligence (AI) and machine learning to create realistic-looking videos with altered appearances and voices. This article delves into the world of deepfakes, exploring their creation process, the threats they pose, and methods to detect them, as well as tools for defense.</p>
<h1 id="heading-what-is-deepfake"><strong>What is Deepfake?</strong></h1>
<p>Deepfake videos are a type of manipulated or forged video content that uses artificial intelligence (AI) and machine learning techniques to create realistic-looking videos in which the appearance and sometimes even the voice of a person are convincingly altered. The term "deepfake" is a combination of "deep learning," a subset of machine learning, and "fake."</p>
<h1 id="heading-how-deepfake-videos-are-made"><strong>How deepfake videos are made?</strong></h1>
<h2 id="heading-data-collection"><strong>Data Collection</strong></h2>
<p>Deepfake creators require an extensive collection of data to initiate the process. This dataset often includes a substantial number of images and audio clips featuring the target person.</p>
<h2 id="heading-training-the-model"><strong>Training the Model</strong></h2>
<p>The collected data is then used to train sophisticated machine learning models, specifically deep neural networks. Through this training, the AI system learns to replicate the target person's facial expressions, vocal nuances, and mannerisms.</p>
<h2 id="heading-generation"><strong>Generation</strong></h2>
<p>Once the AI model is effectively trained, it can begin to generate manipulated content. The most common application of deepfake technology involves mapping the target person's face onto another individual's face in a video. This results in a video that seemingly portrays the target person saying or doing things they never actually did.</p>
<h1 id="heading-the-looming-threat"><strong>The Looming Threat</strong></h1>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1699437263107/a953acb4-21ce-41c7-bd17-9716b0875f08.jpeg" alt class="image--center mx-auto" /></p>
<p>The rise of deepfake technology has raised alarm bells due to its potential for misuse. These manipulated videos can serve a range of sinister purposes, including:</p>
<ul>
<li><p><strong>Misinformation and Disinformation:</strong> Deepfakes can be exploited to spread false narratives, deceive the public, and undermine trust in legitimate sources of information.</p>
</li>
<li><p><strong>Identity Theft and Harassment:</strong> Individuals can fall victim to impersonation and character assassination, as deepfakes are used to manipulate their likeness in compromising situations or making false statements.</p>
</li>
<li><p><strong>Propaganda and Political Manipulation:</strong> Political adversaries may use deepfakes to tarnish the reputation of rivals, sway public opinion, or distort the truth in the political arena.</p>
</li>
</ul>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1699436770129/9db498d2-af0d-4676-a7d0-713d9f66677b.jpeg" alt class="image--center mx-auto" /></p>
<h1 id="heading-how-to-detect-deepfake"><strong>How to detect Deepfake?</strong></h1>
<h2 id="heading-blink-frequency"><strong>Blink Frequency</strong></h2>
<p>Watch for how often images blink in a video. Real people blink and move their eyes naturally, while deepfakes may blink less often or in an unnatural way.</p>
<h2 id="heading-face-body-discrepancies"><strong>Face-Body Discrepancies</strong></h2>
<p>Deepfake tech mainly changes faces, so check for mismatches in body proportions or differences in expressions and body actions.</p>
<h3 id="heading-video-duration"><strong>Video Duration</strong></h3>
<p>Real videos are longer, capturing real events, while deepfakes are usually shorter, often just a few seconds, due to the complexity of creating them.</p>
<h3 id="heading-sound-and-vision"><strong>Sound and Vision</strong></h3>
<p>Focus on the video's sound. Changing audio is tough for software. Be cautious if there's no audio or if it doesn't match the visuals, especially the lips.</p>
<h3 id="heading-mouth-matters"><strong>Mouth Matters</strong></h3>
<p>Check the mouth's fine details like the tongue, teeth, and oral area. Deepfakes struggle with these. Blurriness or oddities inside the mouth may hint at a fake image.</p>
<h1 id="heading-do-we-have-tools-to-detect-deepfakes"><strong>Do We Have Tools to Detect Deepfakes?</strong></h1>
<p>Deepfake videos are a growing problem, but there are tools in the works to spot them. These tools are getting better at telling real from fake. As we face this challenge, improving our detection methods is key to keeping digital info safe.</p>
<p>Here are some tools you can use to protect yourself</p>
<h2 id="heading-sentinel">Sentinel</h2>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1699436440278/ceb650eb-ec7d-49db-bca8-f0fec1ac0f62.webp" alt class="image--center mx-auto" /></p>
<h2 id="heading-intels-real-time-deepfake-detector">Intel’s Real-time Deepfake Detector</h2>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1699514700855/d9eb9e4a-3f69-4532-b661-52a309345cef.jpeg" alt class="image--center mx-auto" /></p>
<h2 id="heading-weverify">WeVerify</h2>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1699515492492/a89b2185-dc3c-4414-9229-296441357400.png" alt class="image--center mx-auto" /></p>
<h2 id="heading-microsofts-video-authenticator-tool">Microsoft’s video authenticator tool</h2>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1699436473611/834be0aa-2e2b-4a5a-a127-0ba3c1fddb37.webp" alt class="image--center mx-auto" /></p>
<h2 id="heading-phoneme-viseme">Phoneme-Viseme</h2>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1699515050481/d4df7c8f-be43-4948-8ab3-feca803f6b81.png" alt class="image--center mx-auto" /></p>
<h1 id="heading-conclusion">Conclusion</h1>
<p>While these tools are instrumental in the battle against deepfakes, it's important to stay informed and use them in conjunction with a critical eye to ensure the digital landscape remains trustworthy and authentic.</p>
<p>Thanks for reading. 🤝</p>
]]></content:encoded></item><item><title><![CDATA[Javascript Accessors in action 🚀]]></title><description><![CDATA[While discussing with my friends I came across one interesting question which excites me to create this blog entry.
The question was, how the following conditions get satisfied to print the text in the console.

How I solved it? 💡
Let's solve this w...]]></description><link>https://blog.utkallabs.com/javascript-accessors-in-action</link><guid isPermaLink="true">https://blog.utkallabs.com/javascript-accessors-in-action</guid><category><![CDATA[JavaScript]]></category><category><![CDATA[Problem Solving]]></category><category><![CDATA[Web Development]]></category><category><![CDATA[UtkalLabs]]></category><category><![CDATA[Object Oriented Programming]]></category><dc:creator><![CDATA[Abhisek Mohapatra]]></dc:creator><pubDate>Sun, 29 Oct 2023 03:14:31 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1698310240533/b8c20593-81f2-4cc5-981f-0e27e315002d.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>While discussing with my friends I came across one interesting question which excites me to create this blog entry.</p>
<p>The question was, how the following conditions get satisfied to print the text in the console.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1698051675949/e6abf9cf-32b6-44d3-8279-ce5bafe06fa3.png" alt class="image--center mx-auto" /></p>
<h2 id="heading-how-i-solved-it">How I solved it? 💡</h2>
<p>Let's solve this with the help of Javascript Object.</p>
<p>First, we will define an object and use one of the Object Accessors.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1698049866133/5b9aa0bb-c4b4-4654-b028-b3f54f8d8692.png" alt class="image--center mx-auto" /></p>
<p>Basically, there are two types of accessors in javascript</p>
<ul>
<li><p><strong>getters</strong></p>
</li>
<li><p><strong>setters</strong></p>
</li>
</ul>
<p>Here we are using get also we can say <strong>getters.</strong></p>
<p>More about the accessors can be referred from here, <a target="_blank" href="https://www.w3schools.com/js/js_object_accessors.asp">https://www.w3schools.com/js/js_object_accessors.asp</a></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1698050756036/2f8af22b-6ac5-4a6e-952d-7f47e0c4c5f2.png" alt class="image--center mx-auto" /></p>
<p>Now we can see here that the output is printing that log as we expected.</p>
<p>It satisfies the first condition with the temp's actual value for the very first time because get accessor is not called until the value of the temp is actually used. This is because JavaScript uses a process called <strong>lazy evaluation</strong>.</p>
<p>Please let me know if you have any other approach to solve this.</p>
<p>Happy coding 😊</p>
]]></content:encoded></item><item><title><![CDATA[Transparent Communication: A Key to Collaboration and Innovation]]></title><description><![CDATA[🌍 My Daily Hazards 🤔
As a part of my job, I come across people from different parts of the globe and talk to them about multiple projects, ideas, architectures, implementations etc. 🌏 Many times I found people talking about the pinching factors in...]]></description><link>https://blog.utkallabs.com/transparent-communication-a-key-to-collaboration-and-innovation</link><guid isPermaLink="true">https://blog.utkallabs.com/transparent-communication-a-key-to-collaboration-and-innovation</guid><category><![CDATA[communication]]></category><category><![CDATA[outsourcing]]></category><category><![CDATA[transparency]]></category><category><![CDATA[UtkalLabs]]></category><category><![CDATA[GlobalCollaboration]]></category><dc:creator><![CDATA[Nirmal Hota]]></dc:creator><pubDate>Thu, 19 Oct 2023 10:27:56 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1697643406729/a9646599-5560-4eb0-8269-61edc87f6257.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h3 id="heading-my-daily-hazards">🌍 My Daily Hazards 🤔</h3>
<p>As a part of my job, I come across people from different parts of the globe and talk to them about multiple projects, ideas, architectures, implementations etc. 🌏 Many times I found people talking about the pinching factors in outsourcing the work such as trustworthiness, poor customer experiences, etc. These are the kinds of key worrying points for them to outsource the work.</p>
<p>When I sat down to evaluate, I did find valid points to their worrying ones especially when someone is outsourcing or hiring from a few thousand miles away.</p>
<p>Below are the points, I found the factors that cause the issues:</p>
<h3 id="heading-the-missing-link">🔗 The Missing Link</h3>
<p>I have seen people working hard and dedicated but not communicating the same with the customer. They are always waiting for a stage to touch before they report to the client. That's quite possible the stage may take days or weeks. When we reach the stage and start communicating, the expectation clash happens between the client and vendor as there is the presence of silent days.</p>
<h3 id="heading-missing-progress-bar">📊 Missing Progress Bar</h3>
<p>The human brain loves to see the progress. Probably that is the reason, we enjoy seeing a progress bar on screen while the huge dataset gets loaded rather than seeing a white screen and knowing nothing about what is happening in the background. Similarly, a lack of proper communication misaligned the progress syncing process between customer and vendor.</p>
<h3 id="heading-the-black-box">⚫ The Black Box</h3>
<p><em>"What's going on???</em> " are the possible words of frustration coming from the client to vendors which eventually leads to a poor customer experience. If they are not seeing the progress transparently then it becomes a black box and they have no clue what is happening.</p>
<h2 id="heading-how-we-tackle-this-at-utkal-labs">💡 How we tackle this at Utkal Labs</h2>
<p>At <a target="_blank" href="https://utkallabs.com">Utkal Labs</a>, we practice transparent communication with the customer from the beginning of the projects.</p>
<p>A milestone-driven <strong><em>agile approach</em></strong> sets the timely expectations of our customers as we keep progressing.</p>
<p>Challenges in the work are inevitable but communicating with the customers and keeping "<strong>the customers in <em>sync</em> always"</strong> is our approach to avoid the frustration of the black box. 🚀</p>
<p>Share your thoughts on how you handle these challenges! 💬🤝</p>
]]></content:encoded></item><item><title><![CDATA[Fun Challenge - Guess the Indian city names from the icons & phrases.]]></title><description><![CDATA[Hello there!
A few lines before we present the challenge to you. We at Utkal Labs believe in delivering creative work while having fun as a team, we call it UL Family. Last month, we had this fantastic fun activity where one has to guess the Indian c...]]></description><link>https://blog.utkallabs.com/fun-challenge-guess-the-indian-city-names-from-the-icons-phrases</link><guid isPermaLink="true">https://blog.utkallabs.com/fun-challenge-guess-the-indian-city-names-from-the-icons-phrases</guid><category><![CDATA[UI]]></category><category><![CDATA[UX]]></category><category><![CDATA[ux design]]></category><category><![CDATA[#Ux research]]></category><category><![CDATA[UI Design]]></category><dc:creator><![CDATA[Suvendu Shekhar Giri]]></dc:creator><pubDate>Mon, 16 Jan 2023 04:47:02 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1673752381971/c3f9adbe-2cdb-4b01-8a41-2b5c5a0d3b46.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Hello there!</p>
<p>A few lines before we present the challenge to you. We at Utkal Labs believe in delivering creative work while having fun as a team, we call it UL Family. Last month, we had this fantastic fun activity where one has to guess the Indian city name from a hint consisting of an icon and an incomplete phrase that forms the city name.</p>
<p>While allowing work from home to their employees is a big headache for most companies, we are one of the very few companies in India that have the whole team working remotely. To know more about the UL Culture and some interesting insider stories (our secret sauce🤫) stay tuned. These fun activities are part of the employee engagement program.</p>
<p>So, here I present you the visuals we used in that activity.</p>
<p>[1]</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1673753482836/409833c2-3ff0-43f1-a6c5-be8bdeb98cac.png" alt class="image--center mx-auto" /></p>
<p>[2]</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1673754677229/9297b0fa-da2b-4ee2-9505-3f96ce67ff17.jpeg" alt class="image--center mx-auto" /></p>
<p>[3]</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1673754751463/0fe84fa3-e289-4e0c-934a-adba2b02a457.jpeg" alt class="image--center mx-auto" /></p>
<p>[4]</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1673754870357/5d380358-c8e3-4d8d-99dc-4b76764a3827.jpeg" alt class="image--center mx-auto" /></p>
<p>[5]</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1673754924004/8e1cd586-562f-41b4-a985-b9801aa370bb.jpeg" alt class="image--center mx-auto" /></p>
<p>[6]</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1673754931011/cbb330c7-23a3-445a-8b0a-42d8a883fc14.jpeg" alt class="image--center mx-auto" /></p>
<p>[7]</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1673754969924/4aff50be-32b1-4ecc-9bf3-6a4c59ecf6ef.jpeg" alt class="image--center mx-auto" /></p>
<p>[8]</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1673754999004/07037f67-443c-40b5-9d89-4427bc06180f.jpeg" alt class="image--center mx-auto" /></p>
<p>[9]</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1673755052611/c886ee07-2a15-4000-9637-96ca5b84d820.jpeg" alt class="image--center mx-auto" /></p>
<p>[10]</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1673755112865/ce240e94-43d6-403b-aa27-114bc36679b5.jpeg" alt class="image--center mx-auto" /></p>
<p>[11]</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1673755147817/28bef22a-5d99-44fb-866c-cd40f30c2741.jpeg" alt class="image--center mx-auto" /></p>
<p>[12]</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1673755252766/bb9f0496-9b5d-41af-b59e-d0cef7756ab4.png" alt class="image--center mx-auto" /></p>
<p>[13]</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1673755279244/e1be033f-925c-445e-a705-6198b74c47f2.png" alt class="image--center mx-auto" /></p>
<p>[14]</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1673755321052/0c700458-eccd-4264-8ade-7c68e4a5e504.png" alt class="image--center mx-auto" /></p>
<p>[15]</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1673755364585/0bd582d3-ef57-4a01-8162-ac8d9d125327.png" alt class="image--center mx-auto" /></p>
<p>[16]</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1673755400003/22b62ac9-0f54-420c-898f-ab8911f6879c.jpeg" alt class="image--center mx-auto" /></p>
<p>[17]</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1673755425599/d3a6846a-986d-4867-9c15-90696e9ec280.png" alt class="image--center mx-auto" /></p>
<p>[18]</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1673755455776/bf3531b5-5e68-4f8b-9451-bac76b6646f5.png" alt class="image--center mx-auto" /></p>
<p>[19]</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1673755478538/2abb44d0-ca35-4756-954c-270e23fe82bf.png" alt class="image--center mx-auto" /></p>
<p>[20]</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1673755504935/bc3b2228-c9bd-48bf-bda1-631adc2d060d.jpeg" alt class="image--center mx-auto" /></p>
<p>[21]</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1673755535724/4e77440b-b287-411c-9e49-616aedd0c8db.jpeg" alt class="image--center mx-auto" /></p>
<p>[22]</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1673837798458/45c96fb9-9b20-40e6-9b46-d92e8cc01ef5.jpeg" alt class="image--center mx-auto" /></p>
<p>[23]</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1673837848597/e9efbd27-7958-4a35-8760-a0ac246e6474.jpeg" alt class="image--center mx-auto" /></p>
<p>[24]</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1673837934492/4ff8324c-7f8e-4857-ac1e-55411fd95d86.png" alt class="image--center mx-auto" /></p>
<p>[25]</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1673837952215/3659f197-d024-420f-afd1-d5fbefe15bc2.png" alt class="image--center mx-auto" /></p>
<p>[26]</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1673837996970/e81ed499-b078-4aa1-96c6-7ed84f4b5581.png" alt class="image--center mx-auto" /></p>
<p>[27]</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1673838003276/fefb3a17-4fec-42ef-a7c4-8c172a80777c.png" alt class="image--center mx-auto" /></p>
<p>[28]</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1673838016977/416821f9-41f4-46b7-9055-4a2b261ac2f8.png" alt class="image--center mx-auto" /></p>
<p>[29]</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1673838028118/1b9eb88b-bd13-43de-9945-648baaee0810.png" alt class="image--center mx-auto" /></p>
<p>[30]</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1673838248533/0e9d6593-bb71-41e8-a37e-58fb5f16767a.png" alt class="image--center mx-auto" /></p>
<p>[31]</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1673842252671/5f879176-7692-495c-942f-f153a21c46c6.png" alt class="image--center mx-auto" /></p>
<p>[32]</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1673842282109/5eb3e13a-215a-44ab-baa5-4821047dfebf.png" alt class="image--center mx-auto" /></p>
<p>[33]</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1673842293775/570d82ca-09f2-4b62-8aec-60b423e6b513.png" alt class="image--center mx-auto" /></p>
<p>[34]</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1673842320750/e9d86217-9cdc-41f1-a8dc-8bda20c4ed4f.png" alt class="image--center mx-auto" /></p>
<p>[35]</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1673842343192/e96883ca-6962-49a0-a8d5-9ae186cd31fe.png" alt class="image--center mx-auto" /></p>
<p>[36]</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1673842368510/25c4e0fc-4ece-4a56-a607-6c9d1408d5bf.png" alt class="image--center mx-auto" /></p>
<p>[37]</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1673842399010/091d2329-005b-4054-a25e-fc2b4dbbbcfc.png" alt class="image--center mx-auto" /></p>
<p>[38]</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1673842433432/c70785e6-0a9a-47e7-bece-b8ccf14ee4eb.png" alt class="image--center mx-auto" /></p>
<p>[39]</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1673842493366/11cf519c-eb74-4dbd-9c12-924872930c19.png" alt class="image--center mx-auto" /></p>
<p>[40]</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1673842518400/2b4edd04-9b0d-4989-ad3c-09991abd551c.png" alt class="image--center mx-auto" /></p>
<p>[41]</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1673842537949/3b4d39a3-82e0-4c0d-a233-cab3ab84cb38.png" alt class="image--center mx-auto" /></p>
<p>[42]</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1673842555653/f8df3630-6dd9-4de0-a0a6-c5b51d0294b7.jpeg" alt class="image--center mx-auto" /></p>
<p>[43]</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1673842828771/8a2f05d6-0d53-4661-b743-9e0ae483e8c0.png" alt class="image--center mx-auto" /></p>
<p>[44]</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1673842858539/cbb5c77a-31c5-49b9-89d8-513e820f5fbe.jpeg" alt class="image--center mx-auto" /></p>
<p>[45]</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1673842884621/6f776498-19e3-4eae-9e26-fb72ad37fc61.jpeg" alt class="image--center mx-auto" /></p>
<p>[46]</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1673843161895/a22ee550-f706-4ea9-8cbf-925cd95d1661.png" alt class="image--center mx-auto" /></p>
<p>[47]</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1673843187982/fa6772a3-0a59-4a00-94f0-685be6f1707e.jpeg" alt class="image--center mx-auto" /></p>
<p>[48]</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1673843210053/c36bc1fa-9d45-4447-8fab-348ded2026fc.jpeg" alt class="image--center mx-auto" /></p>
<p>[49]</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1673843573832/18476897-df3a-45c4-908a-1b866fcd5fdc.jpeg" alt class="image--center mx-auto" /></p>
<p>[50]</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1673843783652/2a6ae87e-ea29-4471-99a6-ba3523487dde.jpeg" alt class="image--center mx-auto" /></p>
<p>Please share your guesses/answers in the comment.</p>
<p>If you liked this fun activity, please like-comment-share this article.</p>
<p><strong>Credits:</strong> <a class="user-mention" href="https://hashnode.com/@biswarekha">Biswarekha Jagadev</a>, Pragati Pattnaik, Sradhanjali Kabi, Chandrani Das, <a class="user-mention" href="https://hashnode.com/@suvendugiri">Suvendu Shekhar Giri</a> and team.</p>
<p><strong>Thank you!</strong> 🙏</p>
]]></content:encoded></item><item><title><![CDATA[How to show Image upload preview]]></title><description><![CDATA[Hey All 👋👋👋
In this article, I am about to discuss something that was given to me as part of my interview task. Which was to create a preview of the picture before it is uploaded. So let's start.

Here, I have used a React application. After clear...]]></description><link>https://blog.utkallabs.com/how-to-show-image-upload-preview</link><guid isPermaLink="true">https://blog.utkallabs.com/how-to-show-image-upload-preview</guid><category><![CDATA[Tutorial]]></category><category><![CDATA[React]]></category><category><![CDATA[JavaScript]]></category><category><![CDATA[Web Development]]></category><dc:creator><![CDATA[Alok Kumar]]></dc:creator><pubDate>Mon, 12 Dec 2022 03:45:24 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1669920797897/BhGSMgbHn.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Hey All 👋👋👋</p>
<p>In this article, I am about to discuss something that was given to me as part of my interview task. Which was to create a preview of the picture before it is uploaded. So let's start.</p>
<hr />
<p>Here, I have used a React application. After clearing the app.js file, the code now looks like this:</p>
<pre><code class="lang-javascript"><span class="hljs-keyword">export</span> <span class="hljs-keyword">default</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">App</span>(<span class="hljs-params"></span>) </span>{
  <span class="hljs-keyword">return</span> (
    <span class="xml"><span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">className</span>=<span class="hljs-string">"App"</span>&gt;</span>
    <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span></span>
  );
}
</code></pre>
<p>Then I added a header and a div which will contain input and an image:</p>
<pre><code class="lang-javascript"><span class="hljs-keyword">export</span> <span class="hljs-keyword">default</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">App</span>(<span class="hljs-params"></span>) </span>{
  <span class="hljs-keyword">return</span> (
    <span class="xml"><span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">className</span>=<span class="hljs-string">"App"</span>&gt;</span>
      <span class="hljs-tag">&lt;<span class="hljs-name">h1</span>&gt;</span>Image Upload Preview<span class="hljs-tag">&lt;/<span class="hljs-name">h1</span>&gt;</span>
      <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">className</span>=<span class="hljs-string">"imageContainer"</span>&gt;</span>
      <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
    <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span></span>
  );
}
</code></pre>
<p>After that, I added the styles:</p>
<pre><code class="lang-javascript"><span class="hljs-keyword">import</span> <span class="hljs-string">"./styles.css"</span>;

<span class="hljs-keyword">export</span> <span class="hljs-keyword">default</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">App</span>(<span class="hljs-params"></span>) </span>{
  <span class="hljs-keyword">return</span> (
    <span class="xml"><span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">className</span>=<span class="hljs-string">"App"</span>&gt;</span>
      <span class="hljs-tag">&lt;<span class="hljs-name">h1</span>&gt;</span>Image Upload Preview<span class="hljs-tag">&lt;/<span class="hljs-name">h1</span>&gt;</span>
      <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">className</span>=<span class="hljs-string">"imageContainer"</span>&gt;</span>
      <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
    <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span></span>
  );
}
</code></pre>
<pre><code class="lang-css"><span class="hljs-selector-class">.App</span> {
  <span class="hljs-attribute">font-family</span>: sans-serif;
  <span class="hljs-attribute">text-align</span>: center;
}

<span class="hljs-selector-class">.imageContainer</span> {
  <span class="hljs-attribute">display</span>: flex;
  <span class="hljs-attribute">flex-direction</span>: column;
  <span class="hljs-attribute">align-items</span>: center;
}
</code></pre>
<p>Then I added an input for uploading the picture and used a state to store it:</p>
<pre><code class="lang-javascript"><span class="hljs-keyword">import</span> <span class="hljs-string">"./styles.css"</span>;
<span class="hljs-keyword">import</span> { useState } <span class="hljs-keyword">from</span> <span class="hljs-string">"react"</span>;

<span class="hljs-keyword">export</span> <span class="hljs-keyword">default</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">App</span>(<span class="hljs-params"></span>) </span>{
<span class="hljs-keyword">const</span> [image, setImage] = useState(<span class="hljs-literal">null</span>);

<span class="hljs-keyword">const</span> handleImageUpload = <span class="hljs-function">(<span class="hljs-params">e</span>) =&gt;</span> {
    setImage(URL.createObjectURL(e.target.files[<span class="hljs-number">0</span>]));
  };

  <span class="hljs-keyword">return</span> (
    <span class="xml"><span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">className</span>=<span class="hljs-string">"App"</span>&gt;</span>
      <span class="hljs-tag">&lt;<span class="hljs-name">h1</span>&gt;</span>Image Upload Preview<span class="hljs-tag">&lt;/<span class="hljs-name">h1</span>&gt;</span>
      <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">className</span>=<span class="hljs-string">"imageContainer"</span>&gt;</span>
          <span class="hljs-tag">&lt;<span class="hljs-name">input</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"file"</span> <span class="hljs-attr">accept</span>=<span class="hljs-string">"image/*"</span> <span class="hljs-attr">onChange</span>=<span class="hljs-string">{handleImageUpload}</span> /&gt;</span>
      <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
    <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span></span>
  );
}
</code></pre>
<blockquote>
<p><strong>Note:</strong> The <strong>URL.createObjectURL()</strong> static method creates a string containing a URL representing the object given in the parameter. Read more <a target="_blank" href="https://developer.mozilla.org/en-US/docs/Web/API/URL/createObjectURL#:~:text=See%20also-,URL.createObjectURL(),File%20object%20or%20Blob%20object.">-&gt;</a></p>
</blockquote>
<p>Now the page would look something like this:</p>
<p><img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/nmr3n1v1683kl5jnbh9p.png" alt="preview" /></p>
<p>Lastly, I displayed the image if it existed and added styles:</p>
<pre><code class="lang-javascript"><span class="hljs-keyword">import</span> { useState } <span class="hljs-keyword">from</span> <span class="hljs-string">"react"</span>;
<span class="hljs-keyword">import</span> <span class="hljs-string">"./styles.css"</span>;

<span class="hljs-keyword">export</span> <span class="hljs-keyword">default</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">App</span>(<span class="hljs-params"></span>) </span>{
  <span class="hljs-keyword">const</span> [image, setImage] = useState(<span class="hljs-literal">null</span>);

  <span class="hljs-keyword">const</span> handleImageUpload = <span class="hljs-function">(<span class="hljs-params">e</span>) =&gt;</span> {
    setImage(URL.createObjectURL(e.target.files[<span class="hljs-number">0</span>]));
  };
  <span class="hljs-keyword">return</span> (
    <span class="xml"><span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">className</span>=<span class="hljs-string">"App"</span>&gt;</span>
      <span class="hljs-tag">&lt;<span class="hljs-name">h1</span>&gt;</span>Image Upload Preview<span class="hljs-tag">&lt;/<span class="hljs-name">h1</span>&gt;</span>
      <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">className</span>=<span class="hljs-string">"imageContainer"</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">input</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"file"</span> <span class="hljs-attr">accept</span>=<span class="hljs-string">"image/*"</span> <span class="hljs-attr">onChange</span>=<span class="hljs-string">{handleImageUpload}</span> /&gt;</span>
        {image ? <span class="hljs-tag">&lt;<span class="hljs-name">img</span> <span class="hljs-attr">src</span>=<span class="hljs-string">{image}</span> <span class="hljs-attr">className</span>=<span class="hljs-string">"image"</span> <span class="hljs-attr">alt</span>=<span class="hljs-string">"preview"</span> /&gt;</span> : null}
      <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
    <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span></span>
  );
}
</code></pre>
<pre><code class="lang-css"><span class="hljs-selector-class">.App</span> {
  <span class="hljs-attribute">font-family</span>: sans-serif;
  <span class="hljs-attribute">text-align</span>: center;
}

<span class="hljs-selector-class">.imageContainer</span> {
  <span class="hljs-attribute">display</span>: flex;
  <span class="hljs-attribute">flex-direction</span>: column;
  <span class="hljs-attribute">align-items</span>: center;
}

<span class="hljs-selector-class">.image</span> {
  <span class="hljs-attribute">height</span>: <span class="hljs-number">200px</span>;
  <span class="hljs-attribute">width</span>: <span class="hljs-number">200px</span>;
  <span class="hljs-attribute">margin-top</span>: <span class="hljs-number">20px</span>;
  <span class="hljs-attribute">border</span>: <span class="hljs-number">1px</span> solid black;
  <span class="hljs-attribute">border-radius</span>: <span class="hljs-number">5px</span>;
}
</code></pre>
<p>The final result after uploading a picture:</p>
<p><img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4k5w7byhzul989vnyd23.png" alt="preview" /></p>
<blockquote>
<p>Link to code-sandbox <a target="_blank" href="https://codesandbox.io/s/pensive-thunder-qmolek?file=/src/App.js">-&gt;</a></p>
</blockquote>
<hr />
<p>Thanks for reading. Have a nice day. 🙂</p>
<p>Let's connect - <a target="_blank" href="twitter.com/thecoollearner">👋👋👋</a></p>
]]></content:encoded></item><item><title><![CDATA[UtkalLabs - We are awesome! We are coming soon!]]></title><description><![CDATA[We just created this space. Stay tuned for great articles! 💾👊🙌😍
For now, you can know more about us by visiting our website and LinkedIn. 🤝🤝]]></description><link>https://blog.utkallabs.com/utkallabs-we-are-awesome-we-are-coming-soon</link><guid isPermaLink="true">https://blog.utkallabs.com/utkallabs-we-are-awesome-we-are-coming-soon</guid><category><![CDATA[UtkalLabs]]></category><category><![CDATA[software development]]></category><category><![CDATA[Software Engineering]]></category><category><![CDATA[mobile app development]]></category><category><![CDATA[Web3]]></category><dc:creator><![CDATA[Utkal Labs]]></dc:creator><pubDate>Tue, 01 Nov 2022 17:28:24 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1667323473646/OujFYEUV8.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>We just created this space. Stay tuned for great articles! 💾👊🙌😍</p>
<p>For now, you can know more about us by visiting our <a target="_blank" href="https://utkallabs.com">website</a> and <a target="_blank" href="https://in.linkedin.com/company/utkal-labs">LinkedIn</a>. 🤝🤝</p>
]]></content:encoded></item></channel></rss>