<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Darpan Vithani</title>
    <description>The latest articles on DEV Community by Darpan Vithani (@vithanidarpan).</description>
    <link>https://dev.to/vithanidarpan</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F808509%2F198f977d-b837-49fc-b416-e6541da0c90c.jpeg</url>
      <title>DEV Community: Darpan Vithani</title>
      <link>https://dev.to/vithanidarpan</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/vithanidarpan"/>
    <language>en</language>
    <item>
      <title>Gestures in Jetpack compose — All you need to know</title>
      <dc:creator>Darpan Vithani</dc:creator>
      <pubDate>Fri, 13 Oct 2023 11:13:03 +0000</pubDate>
      <link>https://dev.to/canopassoftware/gestures-in-jetpack-compose-all-you-need-to-know-46a0</link>
      <guid>https://dev.to/canopassoftware/gestures-in-jetpack-compose-all-you-need-to-know-46a0</guid>
      <description>&lt;p&gt;Gestures play a pivotal role in user interaction, offering a means to navigate, select, and manipulate elements within an app.&lt;/p&gt;

&lt;p&gt;From simple taps and swipes to complex pinch-to-zoom and multi-touch gestures, Jetpack Compose provides a robust framework to seamlessly integrate these interactions into your application’s UI.&lt;/p&gt;

&lt;p&gt;In this comprehensive guide, we embark on a deep dive into Jetpack Compose’s gesture-handling capabilities. &lt;/p&gt;

&lt;h2&gt;
  
  
  Table of Contents
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;List of Gesture Modifiers and Gesture Detectors.&lt;/li&gt;
&lt;li&gt;How do you detect a tap?&lt;/li&gt;
&lt;li&gt;How to detect movements like drag, swipe, etc.? &lt;/li&gt;
&lt;li&gt;How do you detect scroll gestures?&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How do you detect scroll gestures?
&lt;/h2&gt;

&lt;p&gt;A few modifiers that make composable scrollable or allow us to detect the scroll like &lt;code&gt;LazyColumn&lt;/code&gt; or &lt;code&gt;LazyRow&lt;/code&gt; come with inbuilt scrolling, you can use the &lt;code&gt;state&lt;/code&gt; property of the &lt;code&gt;LazyListState&lt;/code&gt; to detect scroll events.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Modifier.verticalScroll() and Modifier.horizontalScroll()&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--SKdVC--J--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/65ple4tq2dqratsghagk.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--SKdVC--J--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/65ple4tq2dqratsghagk.gif" alt="Modifier example" width="368" height="138"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;How to detect movements like drag, swipe, etc.?&lt;/p&gt;

&lt;p&gt;To detect drag we can use either &lt;code&gt;Modifier.draggable&lt;/code&gt;, or &lt;code&gt;detectDragGesture&lt;/code&gt; also, or experimental &lt;code&gt;Modifier.anchoredDraggable&lt;/code&gt; API with anchored states like swipe-to-dismiss. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Modifier. draggable&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ou-f9qrI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/pqtyalliewdkf3eeb45t.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ou-f9qrI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/pqtyalliewdkf3eeb45t.gif" alt="Modifier.draggable" width="800" height="189"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now, Let’s examine the process of coding &lt;code&gt;Modifier.draggable&lt;/code&gt;, &lt;code&gt;Modifier.anchoredDraggable&lt;/code&gt;, &lt;code&gt;detectDragGesture&lt;/code&gt; in our blog post.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Jetpack Compose&lt;/strong&gt; provides a wide API range to handle gestures. Let’s divide it into modifiers and Detectors.&lt;/p&gt;

&lt;p&gt;We have only scratched the surface of what's possible. Refer to our blog post to dive even deeper into the realm of interactive &lt;a href="https://canopas.com/resources/what-is-uiux-design-and-its-impact-on-your-mobile-app-business-9985529987"&gt;UI design&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;To explore more about &lt;strong&gt;Jetpack Compose Gestures&lt;/strong&gt; and discover how they can revolutionize your app's user experience, head over to &lt;a href="https://blog.canopas.com/gestures-in-jetpack-compose-all-you-need-to-know-part-1-9d26570e56bb"&gt;Canopas Blog&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Follow &lt;a href="https://blog.canopas.com/"&gt;Canopas&lt;/a&gt; for our latest technical blog posts!&lt;/p&gt;

</description>
      <category>programming</category>
      <category>android</category>
      <category>mobile</category>
      <category>kotlin</category>
    </item>
    <item>
      <title>React Component library with Storybook + Anima</title>
      <dc:creator>Darpan Vithani</dc:creator>
      <pubDate>Fri, 15 Sep 2023 13:54:15 +0000</pubDate>
      <link>https://dev.to/canopassoftware/react-component-library-with-storybook-anima-46ga</link>
      <guid>https://dev.to/canopassoftware/react-component-library-with-storybook-anima-46ga</guid>
      <description>&lt;p&gt;Components are the building blocks of your website. They should be efficiently reusable to improve development speed and consistency.&lt;/p&gt;

&lt;p&gt;To streamline your web design process and create visually appealing user interfaces, it’s essential to have a robust component library in place.&lt;/p&gt;

&lt;h2&gt;
  
  
  Storybook and Anima
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://storybook.js.org/"&gt;Storybook&lt;/a&gt;: Storybook is a tool for developing and documenting UI components. It provides an interactive environment where you can build, view, and test individual components in isolation. Storybook is widely used in the industry to create and maintain component libraries.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.animaapp.com/"&gt;Anima&lt;/a&gt;: It is a design-to-code platform that allows designers to convert their design files directly into responsive code. It helps bridge the gap between design and development, making it easier to create web interfaces that match the original design.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Table Of Contents &lt;/li&gt;
&lt;li&gt;Storybook and Anima&lt;/li&gt;
&lt;li&gt;Component library in React App

&lt;ul&gt;
&lt;li&gt; Install and set up the storybook&lt;/li&gt;
&lt;li&gt; Setting up Anima&lt;/li&gt;
&lt;li&gt; Add component in the storybook&lt;/li&gt;
&lt;li&gt; Directory structure&lt;/li&gt;
&lt;li&gt; Example of Button component from anima&lt;/li&gt;
&lt;li&gt; Customise component&lt;/li&gt;
&lt;li&gt; Run storybook&lt;/li&gt;
&lt;li&gt; How to use these components?&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;Conclusion&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In this blog post, we’ll walk you through the process of building a component library with Anima and Storybook. In just a few steps, without code, you will have a ready-to-use component library for your website.&lt;/p&gt;

&lt;p&gt;It helps bridge the gap between design and development, making it easier to create web interfaces that match the original design.&lt;/p&gt;

&lt;p&gt;Your journey to web development excellence starts here, so let's build something amazing together. &lt;/p&gt;

&lt;p&gt;Visit &lt;a href="https://blog.canopas.com/react-component-library-with-storybook-anima-35ee689577fa"&gt;Canopas Blog&lt;/a&gt; now to read the full article.&lt;/p&gt;

&lt;p&gt;Follow &lt;a href="https://blog.canopas.com/"&gt;Canopas&lt;/a&gt; for our latest technical blog posts!&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>react</category>
      <category>programming</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>A comprehensive guide on how to design a responsive website.</title>
      <dc:creator>Darpan Vithani</dc:creator>
      <pubDate>Fri, 08 Sep 2023 11:33:27 +0000</pubDate>
      <link>https://dev.to/canopassoftware/a-comprehensive-guide-on-how-to-design-responsive-website-14m1</link>
      <guid>https://dev.to/canopassoftware/a-comprehensive-guide-on-how-to-design-responsive-website-14m1</guid>
      <description>&lt;p&gt;In today’s digital age, the internet is accessible from a multitude of devices, ranging from smartphones and tablets to desktop computers and even smart TVs.&lt;/p&gt;

&lt;p&gt;As a web developer, it’s your responsibility to ensure that the websites you create are not only visually appealing but also functional on all screen sizes. &lt;/p&gt;

&lt;p&gt;This is where responsive web design comes into play. It is important because it ensures that users have a consistent experience no matter what device they are using.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What is a Responsive Web Design?&lt;/strong&gt;&lt;br&gt;
Responsive web design is an approach that aims to make web pages render well on different devices and window or screen sizes.&lt;/p&gt;

&lt;p&gt;The primary goal is to ensure that users have a consistent and user-friendly experience regardless of the device they are using to access a website.&lt;/p&gt;

&lt;h2&gt;
  
  
  Table Of Contents
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Understanding Responsive Web Design&lt;/li&gt;
&lt;li&gt;Mobile-First Approach&lt;/li&gt;
&lt;li&gt;Viewport and Media Queries&lt;/li&gt;
&lt;li&gt;Flexible Grid Systems&lt;/li&gt;
&lt;li&gt;Images and Media for Different Devices&lt;/li&gt;
&lt;li&gt;Responsive Typography&lt;/li&gt;
&lt;li&gt;Testing and Debugging&lt;/li&gt;
&lt;li&gt;Frameworks and Tools&lt;/li&gt;
&lt;li&gt;Performance and Page Speed&lt;/li&gt;
&lt;li&gt;Closing Thoughts&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In this blog, You’ll explore the concept of responsive web design and discuss best practices for building websites that adapt seamlessly to various devices and screen resolutions.&lt;/p&gt;

&lt;p&gt;So, fasten your seat belts and get ready to embark on a journey of designing a responsive website by visiting to &lt;a href="https://blog.canopas.com/guidelines-to-consider-while-designing-a-responsive-website-bbee716d0389#cf25"&gt;Canopas Blog&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Follow &lt;a href="https://blog.canopas.com/"&gt;Canopas&lt;/a&gt; for our latest technical blog posts!&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>beginners</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>How to Create Chatbot Using PaLM 2 Model (chat-bison@001)</title>
      <dc:creator>Darpan Vithani</dc:creator>
      <pubDate>Thu, 24 Aug 2023 10:13:58 +0000</pubDate>
      <link>https://dev.to/canopassoftware/how-to-create-chatbot-using-palm-2-model-chat-bison001-127h</link>
      <guid>https://dev.to/canopassoftware/how-to-create-chatbot-using-palm-2-model-chat-bison001-127h</guid>
      <description>&lt;p&gt;It’s good to have a friendly companion with whom we can share our feelings and get consolidation as well as suggestions for our problems. A bot can do such things for us, as we can’t wander all the time with our friends or mentors!&lt;/p&gt;

&lt;p&gt;In a world where technology is constantly evolving, one innovation that has captured the imagination of both developers and users alike is the creation of chatbots.&lt;/p&gt;

&lt;p&gt;If you've ever wondered about the inner workings of these chatbots and How to craft one by yourself..? &lt;/p&gt;

&lt;p&gt;You're at the right place! &lt;/p&gt;

&lt;p&gt;Don't worry if you're new to the world of AI and programming – by the end of this journey, you'll have the knowledge and confidence to create your very own chatbot that leverages the power of PaLM 2.&lt;/p&gt;

&lt;h2&gt;
  
  
  List of Contents
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;When to use chat-bison and when text-bison?&lt;/li&gt;
&lt;li&gt;Do You need to use Vertex AI SDK or PaLM API?&lt;/li&gt;
&lt;li&gt;Authentication To Google&lt;/li&gt;
&lt;li&gt;Setup service account key&lt;/li&gt;
&lt;li&gt;Setup Virtual Environment&lt;/li&gt;
&lt;li&gt;Implement Bot with Vertex AI Python SDK&lt;/li&gt;
&lt;li&gt;Final Thoughts&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In this blog, you will learn different use cases of text-bison vs. chat-bison models.&lt;/p&gt;

&lt;p&gt;It’s quite easy to integrate the built-in chat model provided by Google Cloud &lt;a href="https://cloud.google.com/vertex-ai"&gt;Vertex AI&lt;/a&gt;, with a few steps of configuration.&lt;/p&gt;

&lt;p&gt;So, let's embark on this adventure and unlock the secrets behind designing a chatbot that's bound to engage, assist, and captivate by visiting &lt;a href="https://blog.canopas.com/how-to-create-your-own-chatbot-using-palm-2-model-chat-bison-001-fe99a2448f28"&gt;Canopas Blog&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Follow &lt;a href="https://blog.canopas.com/"&gt;Canopas&lt;/a&gt; for our latest technical blog posts!&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>tutorial</category>
      <category>ai</category>
    </item>
    <item>
      <title>Golang: Test-Driven Development(TDD) with Gin and MySQL</title>
      <dc:creator>Darpan Vithani</dc:creator>
      <pubDate>Thu, 17 Aug 2023 11:01:47 +0000</pubDate>
      <link>https://dev.to/canopassoftware/golang-test-driven-developmenttdd-with-gin-and-mysql-590j</link>
      <guid>https://dev.to/canopassoftware/golang-test-driven-developmenttdd-with-gin-and-mysql-590j</guid>
      <description>&lt;p&gt;Test-Driven Development (TDD) is a software development technique in which &lt;strong&gt;You write tests for a piece of code before you write the code.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;We write tests to define the desired behavior of the code and to ensure that the code meets those requirements. &lt;/p&gt;

&lt;p&gt;The process of writing the tests first helps to ensure that the code is testable and that it meets the requirements of the user or client.&lt;/p&gt;

&lt;p&gt;TDD helps to catch bugs early in the development process and to ensure that the code is maintainable and easy to understand. &lt;/p&gt;

&lt;p&gt;It also promotes a test-first mindset and encourages the developer to think about the requirements and desired behavior of the code before writing it.&lt;/p&gt;

&lt;p&gt;Throughout this blog, I’ll assume you’re familiar with the basics of Golang, like package importing and all.&lt;/p&gt;

&lt;h2&gt;
  
  
  Table of Contents
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;How TDD works?&lt;/li&gt;
&lt;li&gt;Define API Routes, Struct, and functions&lt;/li&gt;
&lt;li&gt;Create a User using TDD&lt;/li&gt;
&lt;li&gt;Get the User using TDD&lt;/li&gt;
&lt;li&gt;Update User using TDD&lt;/li&gt;
&lt;li&gt;Delete User using TDD&lt;/li&gt;
&lt;li&gt;Final Thoughts&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;How TDD works?&lt;/strong&gt;&lt;br&gt;
&lt;em&gt;TDD is an iterative process that follows these steps.&lt;/em&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Write a test for a small piece of functionality that doesn’t exist yet.&lt;/li&gt;
&lt;li&gt;Run the test, which should fail because the code doesn’t exist yet.&lt;/li&gt;
&lt;li&gt;Write the minimum amount of code necessary to make the test pass.&lt;/li&gt;
&lt;li&gt;Rerun the test, which should now pass because the code has been written.&lt;/li&gt;
&lt;li&gt;Refactor the code if necessary, making sure that all tests still pass.&lt;/li&gt;
&lt;li&gt;Repeat the process for the next piece of functionality.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Let’s examine the above steps with a basic example of a sum function, which calculates the sum of two values.&lt;/p&gt;

&lt;p&gt;For detailed posts with code examples, check out our &lt;a href="https://blog.canopas.com/golang-test-driven-development-tdd-with-gin-and-mysql-e3d353b978f8"&gt;Canopas Blog.&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The goal of TDD is to ensure that the code meets the requirements and behaves as expected by constantly testing the code during the development process.&lt;/p&gt;

&lt;p&gt;This can help to catch bugs early on, improve code quality, and increase confidence in the software.&lt;/p&gt;

&lt;p&gt;TDD is an iterative process that begins with writing a test, running it to confirm it fails, then writing the minimum amount of code to make the test pass and repeating this process until the feature is complete.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>go</category>
      <category>unittest</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Understanding Vertex AI on Google Cloud: Key Terms Explained</title>
      <dc:creator>Darpan Vithani</dc:creator>
      <pubDate>Fri, 11 Aug 2023 11:06:50 +0000</pubDate>
      <link>https://dev.to/canopassoftware/understanding-vertex-ai-on-google-cloud-key-terms-explained-2dfb</link>
      <guid>https://dev.to/canopassoftware/understanding-vertex-ai-on-google-cloud-key-terms-explained-2dfb</guid>
      <description>&lt;p&gt;Google is making the AI model publicly available, which it has used for BARD and other products like Gmail, Google Docs, etc.&lt;/p&gt;

&lt;p&gt;Quite often, we want to implement a chatbot for us, that can interact with humans as humans. For that purpose, google is making our life more accessible, by providing a pre-trained model readily available, rather than we need to implement it by ourselves.&lt;/p&gt;

&lt;p&gt;For Chat models, Google is providing a service named &lt;strong&gt;Vertex AI.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In this blog, we will introduce some of the terms used by Google Vertex AI and will clarify things I felt you should grasp easily that drove me crazy while going through it. &lt;/p&gt;

&lt;p&gt;No doubt Google has documented everything, but sometimes it becomes hard to understand. So I’m trying to make it more clear, especially for developers!&lt;/p&gt;

&lt;h2&gt;
  
  
  Table Of Contents
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;What is Vertex AI?&lt;/li&gt;
&lt;li&gt;What is Generative AI Studio?&lt;/li&gt;
&lt;li&gt;What is a Model Garden?&lt;/li&gt;
&lt;li&gt;What are Foundation Models?&lt;/li&gt;
&lt;li&gt;What is Custom Model?&lt;/li&gt;
&lt;li&gt;What is fine-tuning of a Model?&lt;/li&gt;
&lt;li&gt;What is a Prompt Tuning of a Model?&lt;/li&gt;
&lt;li&gt;What is the PaLM 2 Model?&lt;/li&gt;
&lt;li&gt;What is PaLM API?&lt;/li&gt;
&lt;li&gt;Conclusion&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;What is Vertex AI?&lt;br&gt;
It’s a service provided by Google Cloud, that lets you train and deploy Machine Learning(ML) models and AI applications. For more information visit &lt;a href="https://cloud.google.com/vertex-ai"&gt;Vertex AI&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Want to be a Vertex AI pro? We've got you covered. Head over to our definitive terminology guide on &lt;a href="https://blog.canopas.com/google-cloud-vertex-ai-terminologies-you-will-worth-understand-53248983a10a"&gt;Canopas Blog&lt;/a&gt; and elevate your knowledge.&lt;/p&gt;

</description>
      <category>programming</category>
      <category>ai</category>
      <category>beginners</category>
      <category>learning</category>
    </item>
    <item>
      <title>Web Deployment Simplified: GitHub Workflow with EC2, ECR, and Docker</title>
      <dc:creator>Darpan Vithani</dc:creator>
      <pubDate>Wed, 02 Aug 2023 11:43:36 +0000</pubDate>
      <link>https://dev.to/canopassoftware/web-deployment-simplified-github-workflow-with-ec2-ecr-and-docker-18j7</link>
      <guid>https://dev.to/canopassoftware/web-deployment-simplified-github-workflow-with-ec2-ecr-and-docker-18j7</guid>
      <description>&lt;p&gt;In software development, efficient deployment workflows are crucial to ensure seamless and reliable application delivery. &lt;/p&gt;

&lt;p&gt;With the rise of containerization and cloud computing, developers have a powerful arsenal of tools at their disposal to streamline the deployment process.&lt;/p&gt;

&lt;p&gt;In this blog, we will explore how to set up deployment workflow using &lt;strong&gt;GitHub, Docker, Nginx, Amazon Elastic Container Registry&lt;/strong&gt; (ECR), and &lt;strong&gt;Amazon Elastic Compute Cloud&lt;/strong&gt; (EC2).&lt;/p&gt;

&lt;p&gt;Whether you are a seasoned DevOps professional or just getting started with application deployment, this guide will walk you through the entire process step-by-step.&lt;/p&gt;

&lt;p&gt;So, let’s roll up our sleeves and embark on this exciting journey of mastering GitHub Workflow for deploying your applications.&lt;/p&gt;

&lt;p&gt;Refer to &lt;a href="https://github.com/canopas/canopas-blog"&gt;our ready-to-use blog platform&lt;/a&gt; in case you want to see the working example of the workflow we’re going to implement in this blog.&lt;/p&gt;

&lt;h2&gt;
  
  
  Table of contents
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Create Dockerfile&lt;/li&gt;
&lt;li&gt;Setup GitHub workflow&lt;/li&gt;
&lt;li&gt;Deploy on ECR&lt;/li&gt;
&lt;li&gt;NGINX configuration&lt;/li&gt;
&lt;li&gt;Prepare docker-compose&lt;/li&gt;
&lt;li&gt;Deploy the application to EC2&lt;/li&gt;
&lt;li&gt;Final workflow file&lt;/li&gt;
&lt;li&gt;Conclusion&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Please note that we will deploy the node.js application on AWS EC2 in this example. But, you can deploy applications developed using any language like GoLang, Python, or PHP by following the same approach.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;For detailed step by step guide with code example, check out &lt;a href="https://blog.canopas.com/simplified-your-deployment-github-workflow-with-ec2-ecr-and-docker-4c9c392d238d"&gt;Canopas Blog.&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>docker</category>
      <category>devops</category>
      <category>programming</category>
    </item>
    <item>
      <title>How to Transform Dart Streams: A Basic Guide to Stream Operators</title>
      <dc:creator>Darpan Vithani</dc:creator>
      <pubDate>Thu, 27 Jul 2023 12:02:24 +0000</pubDate>
      <link>https://dev.to/canopassoftware/how-to-transform-dart-streams-a-basic-guide-to-stream-operators-3749</link>
      <guid>https://dev.to/canopassoftware/how-to-transform-dart-streams-a-basic-guide-to-stream-operators-3749</guid>
      <description>&lt;p&gt;According to the Flutter documentation, streams provide an essential feature for handling asynchronous sequences of data. &lt;/p&gt;

&lt;p&gt;It provides a way to handle and process a continuous flow of data, where each event can be asynchronously received and processed.&lt;/p&gt;

&lt;p&gt;To use the streams to their full potential, we can use stream operators. These operators are the methods that allow us to transform, filter, process, and combine stream data efficiently. &lt;/p&gt;

&lt;p&gt;In this article, let’s take a tour of some operators/methods that are available in the Stream class.&lt;/p&gt;

&lt;h2&gt;
  
  
  Table of contents
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;asyncMap&lt;/li&gt;
&lt;li&gt;asyncExpand&lt;/li&gt;
&lt;li&gt;StreamTransformer&lt;/li&gt;
&lt;li&gt;pipe&lt;/li&gt;
&lt;li&gt;singleWhere&lt;/li&gt;
&lt;li&gt;cast&lt;/li&gt;
&lt;li&gt;distinct&lt;/li&gt;
&lt;li&gt;skip&lt;/li&gt;
&lt;li&gt;Conclusion&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Streams are very helpful when you want to listen for changes in your data and react according to them and stream operators add functionality to the stream. &lt;/p&gt;

&lt;p&gt;Let’s experiment with these operators, explore their different use cases, and adapt them to fit your specific needs.&lt;/p&gt;

&lt;p&gt;For full article with examples, check out &lt;a href="https://blog.canopas.com/how-to-transform-dart-streams-a-basic-guide-to-stream-operators-c33f17c1aaf9"&gt;canopas blog.&lt;/a&gt;&lt;/p&gt;

</description>
      <category>flutter</category>
      <category>dart</category>
      <category>programming</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Docker: Lesser known but Important facts you need to know</title>
      <dc:creator>Darpan Vithani</dc:creator>
      <pubDate>Wed, 19 Jul 2023 10:10:11 +0000</pubDate>
      <link>https://dev.to/canopassoftware/docker-lesser-known-but-important-facts-you-need-to-know-54dc</link>
      <guid>https://dev.to/canopassoftware/docker-lesser-known-but-important-facts-you-need-to-know-54dc</guid>
      <description>&lt;p&gt;While many developers are well-versed in the fundamental aspects of Docker, such as building images and creating containers, several lesser-known features hold immense value in the deployment process.&lt;/p&gt;

&lt;p&gt;Recently, I delved deeper into Docker's capabilities and discovered some additional important and useful facets. Some of these features may prove beneficial during deployment, while others simply serve as good-to-know pieces of information.&lt;/p&gt;

&lt;p&gt;In this article, we will explore some advanced Docker features and facts that transcend the basics, offering the potential to significantly enhance application performance.&lt;/p&gt;

&lt;p&gt;Let's dive into the world of Docker 🐋 to uncover these important insights.&lt;/p&gt;

&lt;h2&gt;
  
  
  Table of contents
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Introduction&lt;/li&gt;
&lt;li&gt;Multi-Stage Builds&lt;/li&gt;
&lt;li&gt;BuildKit &lt;/li&gt;
&lt;li&gt;Docker Compose Profiles&lt;/li&gt;
&lt;li&gt;Docker Content Trust(DCT)&lt;/li&gt;
&lt;li&gt;SBOM for Docker images&lt;/li&gt;
&lt;li&gt;Official Go SDK&lt;/li&gt;
&lt;li&gt;Conclusion&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Docker is a platform that enables developers to automate the deployment and management of applications within lightweight, isolated containers. &lt;/p&gt;

&lt;p&gt;Containers only include necessary dependencies, configurations, and library files required to run an application.&lt;/p&gt;

&lt;p&gt;Docker provides a consistent and efficient way to build, distribute, and run applications across different environments. &lt;/p&gt;

&lt;p&gt;It provides many features like &lt;strong&gt;Multi-stage builds&lt;/strong&gt;, &lt;strong&gt;Content trust&lt;/strong&gt;, and &lt;strong&gt;Compose profiling&lt;/strong&gt; which can be helpful to us when building the applications.&lt;/p&gt;

&lt;p&gt;The latest features in Docker, such as&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Multi-Stage Builds,&lt;/li&gt;
&lt;li&gt;BuildKit,&lt;/li&gt;
&lt;li&gt;Docker Compose Profiles,&lt;/li&gt;
&lt;li&gt;Docker Content Trust, and the official Go SDK&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;enhance the platform’s capabilities and provide developers with powerful tools to streamline their workflows, improve performance, enhance security, and seamlessly integrate Docker into their applications.&lt;/p&gt;

&lt;p&gt;For further explanation with examples, visit our &lt;a href="https://blog.canopas.com/docker-lesser-known-but-important-facts-you-need-to-know-5e01cf129078"&gt;Canopas Blog.&lt;/a&gt;&lt;/p&gt;

</description>
      <category>docker</category>
      <category>programming</category>
      <category>beginners</category>
      <category>devops</category>
    </item>
    <item>
      <title>Jetpack compose — How to implement Custom Pager Indicators</title>
      <dc:creator>Darpan Vithani</dc:creator>
      <pubDate>Mon, 17 Jul 2023 10:25:20 +0000</pubDate>
      <link>https://dev.to/canopassoftware/jetpack-compose-how-to-implement-custom-pager-indicators-g9e</link>
      <guid>https://dev.to/canopassoftware/jetpack-compose-how-to-implement-custom-pager-indicators-g9e</guid>
      <description>&lt;p&gt;Pager indicators are vital in guiding users through multiple screens or pages in an app. &lt;/p&gt;

&lt;p&gt;While Jetpack Compose offers a wide range of built-in components, customizing pager indicators to match your app's unique style and branding can elevate the user experience.&lt;/p&gt;

&lt;p&gt;In this blog post, we will explore how to create and implement custom pager indicators in Jetpack Compose, allowing you to add a touch of uniqueness to your app’s navigation.&lt;/p&gt;

&lt;h2&gt;
  
  
  Table of Contents
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Expanding Line/Dot indicators&lt;/li&gt;
&lt;li&gt;Sliding Indicators&lt;/li&gt;
&lt;li&gt;Worm Dot indicator&lt;/li&gt;
&lt;li&gt;Jumping Dot Indicator&lt;/li&gt;
&lt;li&gt;Bouncing Dot Indicator&lt;/li&gt;
&lt;li&gt;Swapping Dot Indicator&lt;/li&gt;
&lt;li&gt;Revealing Dot Indicators&lt;/li&gt;
&lt;li&gt;Conclusion&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The final output will look like this:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--VkjBY1MD--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/j434el9qgjp7i3t9rxnk.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--VkjBY1MD--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/j434el9qgjp7i3t9rxnk.gif" alt="jetpack compose pager indicators" width="217" height="410"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I have implemented most of the indicators using the Canvas API. Additionally, to demonstrate alternative approaches, I have also implemented a few using built-in composable like Box.&lt;/p&gt;

&lt;p&gt;We’ll highlight the flexibility of pager indicators and showcase how they can be implemented using a unified logic.&lt;/p&gt;

&lt;p&gt;For detailed explanations with examples, check out our &lt;a href="https://blog.canopas.com/jetpack-compose-how-to-implement-custom-pager-indicators-8b6a01d63964"&gt;Canopas Blog.&lt;/a&gt;&lt;/p&gt;

</description>
      <category>android</category>
      <category>mobile</category>
      <category>beginners</category>
      <category>programming</category>
    </item>
    <item>
      <title>Custom Error Handling in GraphQL — with examples</title>
      <dc:creator>Darpan Vithani</dc:creator>
      <pubDate>Fri, 14 Jul 2023 13:11:27 +0000</pubDate>
      <link>https://dev.to/canopassoftware/custom-error-handling-in-graphql-with-examples-53he</link>
      <guid>https://dev.to/canopassoftware/custom-error-handling-in-graphql-with-examples-53he</guid>
      <description>&lt;p&gt;Error handling is a critical aspect of building robust and reliable GraphQL APIs. As developers, we need to ensure that error responses are informative, consistent, and easy to handle on the client side.&lt;/p&gt;

&lt;p&gt;In this article, we will explore advanced error-handling techniques in GraphQL. By leveraging these techniques, you can enhance user experience, provide meaningful error messages, and improve debugging.&lt;/p&gt;

&lt;p&gt;We will use &lt;a href="https://github.com/graphql/graphql-js/tree/main/src/error"&gt;GraphQLError&lt;/a&gt; class of &lt;a href="https://github.com/graphql/graphql-js"&gt;GraphQL&lt;/a&gt; to play with errors. &lt;/p&gt;

&lt;p&gt;By customizing error messages, implementing validation rules, and centralizing error-handling logic, you can provide informative and consistent error responses. &lt;/p&gt;

&lt;p&gt;Plus, advanced error-handling techniques allow you to catch and handle errors in nested resolvers and test different error scenarios.&lt;/p&gt;

&lt;h2&gt;
  
  
  Table of contents
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;GraphQLError&lt;/li&gt;
&lt;li&gt;Customizing Errors&lt;/li&gt;
&lt;li&gt;Custom error interface&lt;/li&gt;
&lt;li&gt;Global Error Handling&lt;/li&gt;
&lt;li&gt;Error Bubbling and Error Handling in Nested Resolvers&lt;/li&gt;
&lt;li&gt;Conclusion&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This post shows you the basics of error handling in GraphQL using GraphQLError class. Using this, we can easily customize errors whether it's database, validations, or any other errors.&lt;/p&gt;

&lt;p&gt;For detailed explanation with examples, check out our &lt;a href="https://blog.canopas.com/custom-error-handling-in-graphql-with-examples-8daad20181d0"&gt;Canopas Blog.&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>graphql</category>
      <category>programming</category>
    </item>
    <item>
      <title>How to use CocoaLumberjack for Advanced Logging</title>
      <dc:creator>Darpan Vithani</dc:creator>
      <pubDate>Fri, 14 Jul 2023 12:50:46 +0000</pubDate>
      <link>https://dev.to/canopassoftware/how-to-use-cocoalumberjack-for-advanced-logging-3ebn</link>
      <guid>https://dev.to/canopassoftware/how-to-use-cocoalumberjack-for-advanced-logging-3ebn</guid>
      <description>&lt;p&gt;Welcome back to the second part of our series on setting up logging correctly with CocoaLumberjack in iOS.&lt;/p&gt;

&lt;p&gt;Logging is an essential part of app development, providing valuable insights for debugging, analysis, and support purposes. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/CocoaLumberjack/CocoaLumberjack"&gt;CocoaLumberjack&lt;/a&gt; is a popular logging framework that offers a range of powerful features to customize and manage logs effectively.&lt;/p&gt;

&lt;p&gt;Using the advanced features will enable us to take our logging to the next level, providing enhanced readability, efficient log management, and &lt;strong&gt;centralized log analysis&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;In the previous blog, we covered the basics of CocoaLumberjack and logging into the console and file, and its use with Crashlytics.&lt;/p&gt;

&lt;p&gt;If you have missed the previous blog then please read it before starting reading this advanced version of it.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.canopas.com/ios-how-to-setup-logging-correctly-with-cocoalumberjack-37836ec821b0"&gt;iOS — How to Setup Logging Correctly with CocoaLumberjack&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I already explained CocoaLumberjeck briefly in the previous blog, So let’s move forward quickly by skipping details.&lt;/p&gt;

&lt;h2&gt;
  
  
  Table of contents
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Introduction&lt;/li&gt;
&lt;li&gt;Zip file and Upload it to the server&lt;/li&gt;
&lt;li&gt;Upload logs to AWS CloudWatch&lt;/li&gt;
&lt;li&gt;Conclusion&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In this blog, we will learn how to zip the log file and upload them to the server, and send logs to the AWS CloudWatch.&lt;/p&gt;

&lt;p&gt;Logging application data and diagnostic information to the console or a file can be very useful when debugging problems both during development and production. Having a solid logging solution in place is therefore essential.&lt;/p&gt;

&lt;p&gt;Along with many other developers, I have created custom logging solutions for many projects, but CocoaLumberjack is an ideal replacement and it has a lot more to offer.&lt;/p&gt;

&lt;p&gt;Remember to refer to the official &lt;a href="https://github.com/CocoaLumberjack/CocoaLumberjack"&gt;CocoaLumberjack&lt;/a&gt; documentation for more detailed information and customization options.&lt;/p&gt;

&lt;p&gt;For examples and other details, visit &lt;a href="https://blog.canopas.com/ios-how-to-use-cocoalumberjack-for-advanced-logging-part-2-76ab56627d01"&gt;Canopas Blog&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>ios</category>
      <category>mobile</category>
      <category>programming</category>
      <category>tutorial</category>
    </item>
  </channel>
</rss>
