<?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: Viraj Chavan</title>
    <description>The latest articles on DEV Community by Viraj Chavan (@virajvchavan).</description>
    <link>https://dev.to/virajvchavan</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%2F199539%2F4a0f70a8-f922-4c91-aebe-4175de809bdb.jpeg</url>
      <title>DEV Community: Viraj Chavan</title>
      <link>https://dev.to/virajvchavan</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/virajvchavan"/>
    <language>en</language>
    <item>
      <title>What I learned from my first ever software development internship</title>
      <dc:creator>Viraj Chavan</dc:creator>
      <pubDate>Sat, 25 Jan 2020 07:11:55 +0000</pubDate>
      <link>https://dev.to/virajvchavan/what-i-learned-from-my-first-ever-software-development-internship-1b6h</link>
      <guid>https://dev.to/virajvchavan/what-i-learned-from-my-first-ever-software-development-internship-1b6h</guid>
      <description>&lt;p&gt;I was a student at an engineering college in India. After 3 and a half years years of learning computer science academically, I now had a chance to test my knowledge in the real world through an internship.&lt;/p&gt;

&lt;p&gt;In this article, I’ll be sharing my internship experience at &lt;a href="http://joshsoftware.com/"&gt;Josh Software&lt;/a&gt;, Pune with the hope that it will be helpful to other IT and computer engineering students that are looking for internships.&lt;/p&gt;

&lt;p&gt;Like most of my colleagues at the college, I had a very limited view about software development in general and didn’t know what to expect from an internship.&lt;/p&gt;

&lt;p&gt;Lucky for me, I was assigned a live project, which was based on Ruby on Rails, something that I had already developed an interest for.&lt;/p&gt;

&lt;p&gt;After I had learned PHP and MySQL in the 2nd year of my studies, I built a basic web app, and all that it did was some CRUD (Create, Read, Update, Destroy) operations. I remember talking with a friend who had similar skills to mine, and said “Even we can build Facebook now that we know PHP and MySQL!”&lt;/p&gt;

&lt;p&gt;How ridiculously simple things seemed at that time. Now I understand how complex building/maintaining a software can be.&lt;/p&gt;

&lt;p&gt;So here’s what I learned from my Internship while working on a live project.&lt;/p&gt;

&lt;h1&gt;
  
  
  General lessons
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Scale Makes a huge difference
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--yeIodG66--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/vc2zotdm1rtt10dz1fgh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--yeIodG66--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/vc2zotdm1rtt10dz1fgh.png" alt="Scale" width="514" height="372"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  How many users are going to use the software?&lt;/li&gt;
&lt;li&gt;  How much data will be processed?&lt;/li&gt;
&lt;li&gt;  What are the expected response times for a function?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These are questions that we, as college students, hardly think about. Our college projects were usually short-sighted. In real-world projects though, the above questions fundamentally affect decisions about hardware, technologies/tools to be used, system architecture, algorithms, and so on.&lt;/p&gt;

&lt;h2&gt;
  
  
  Working with a large codebase
&lt;/h2&gt;

&lt;p&gt;Back in college, we used to work on projects that had like 15 - 20 files or so. Built in under a week, the whole project could be &lt;strong&gt;understood&lt;/strong&gt; in a few hours.&lt;/p&gt;

&lt;p&gt;Now the project I’m working on has hundreds of files spread across dozens of folders. It can take months to understand the whole project, and hours to debug a bug that’s spread across multiple files. And the first time you look at the whole project directory, you don’t know where to start understanding the code.&lt;/p&gt;

&lt;h2&gt;
  
  
  Writing maintainable code
&lt;/h2&gt;

&lt;p&gt;Knowing that the code you write will be read, understood, and improved/changed by someone else (or even yourself) in the future makes you write code that’s maintainable.&lt;/p&gt;

&lt;p&gt;In college, all I focused on was getting the expected functionality to be complete, and never considered whether the code I wrote was maintainable.&lt;/p&gt;

&lt;p&gt;This resulted in scrambled pieces of code that somehow worked at the time. But two days later even I wouldn’t understand why I had written a certain piece of code that way. And changing some part of the code almost always broke other parts. 😆&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Code Maintainability is easier to recognise by its absence&lt;/strong&gt;, like when something you thought should take an hour ends up taking a week.&lt;/p&gt;

&lt;h2&gt;
  
  
  Using a version control system - properly
&lt;/h2&gt;

&lt;p&gt;When I first started building small software, all the files existed on my own development machine, and maybe they were backed up to Google Drive as regular files.&lt;/p&gt;

&lt;p&gt;Then I got to know about GitHub, but I merely used it as a safe storage place for my code. I used the GitHub desktop app to commit all changes on just the master branch. I even hesitated using it through the command line.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--xYw4Fg-2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/gq0bxkj4hle20yfjmgic.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--xYw4Fg-2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/gq0bxkj4hle20yfjmgic.png" alt="Git joke" width="330" height="478"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now not a day goes by that I don’t use Git. It’s such a great tool for collaboratively writing code, distributed development, branching out for new features, pull requests, and so on.&lt;/p&gt;

&lt;p&gt;Here’s a &lt;a href="https://www.git-tower.com/learn/git/ebook/en/command-line/basics/why-use-version-control"&gt;little article&lt;/a&gt; on why version control systems are awesome!&lt;/p&gt;

&lt;h2&gt;
  
  
  The importance of using a Test Driven Development approach
&lt;/h2&gt;

&lt;p&gt;During my internship, I was assigned to work on a new feature that was to be added to the main project .&lt;/p&gt;

&lt;p&gt;I wrote the code and tested if it was working the way it was supposed to. It worked perfectly, or so I thought. I deployed the feature to the production confidently, and moved on to work on something else.&lt;/p&gt;

&lt;p&gt;After a few hours, &lt;a href="https://rollbar.com"&gt;Rollbar&lt;/a&gt;, a real time error reporting tool burst with a number of errors in our code deployed to production. I checked the errors and they seemed unrelated to anything I had ever worked on.&lt;/p&gt;

&lt;p&gt;After some debugging, all of those errors traced back to a single method. A method that was called in numerous places, and in which I had modified just a single line, and hadn’t checked where else it was used.&lt;/p&gt;

&lt;p&gt;Now this could’ve been avoided if the code that used that method had test cases written for it, and if I had checked if all the test cases ran successfully before deploying the code. That made me realize the importance of test driven development.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://sd.jtimothyking.com/2006/07/11/twelve-benefits-of-writing-unit-tests-first/"&gt;Here’s an article&lt;/a&gt; to understand why writing test cases is important.&lt;/p&gt;

&lt;h1&gt;
  
  
  Things specific to Web Development
&lt;/h1&gt;

&lt;h2&gt;
  
  
  The MVC Architecture
&lt;/h2&gt;

&lt;p&gt;Back in my college days, when I developed applications in PHP, I had no clue what Model, View, and Controller were. Any project was so complexly scrambled that I couldn’t find in which file a piece of important logic was written. The HTML embedded PHP scripts at odd places and I had placed all the files in just one folder.&lt;/p&gt;

&lt;p&gt;Then I learned about the Rails framework, and got accustomed with the MVC architecture.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Model-View-Controller (MVC) is an architectural pattern that separates an application into three main logical components - Model, View, and Controller. Each of these components are built to handle specific development aspects of an application (&lt;a href="https://medium.freecodecamp.org/model-view-controller-mvc-explained-through-ordering-drinks-at-the-bar-efcba6255053"&gt;source&lt;/a&gt;)&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;MVC really simplifies things and is an important part of many major frameworks.&lt;/p&gt;

&lt;h2&gt;
  
  
  Dealing with Databases
&lt;/h2&gt;

&lt;p&gt;In the last 6 months, I haven’t written a single direct SQL database query. Yet I deal with databases everyday, even doing some complex operations. This is thanks to the ORM (Object Relational Mapper) that Ruby On Rails uses.&lt;/p&gt;

&lt;p&gt;ORMs convert object-oriented programming language such as Ruby into database lingo in which to perform operations. Which makes data access more portable and abstracted from the required database queries that are necessary when manipulating data.&lt;/p&gt;

&lt;p&gt;Thanks to ORM, it’s much much easier to query the database. This gives a big &lt;a href="https://m.signalvnoise.com/conceptual-compression-means-beginners-dont-need-to-know-sql-hallelujah-661c1eaed983"&gt;advantage to beginners&lt;/a&gt;, who can start writing applications without even knowing SQL.&lt;/p&gt;

&lt;h2&gt;
  
  
  Writing/Using REST APIs (Application Programming Interfaces)
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://hackernoon.com/what-are-web-apis-c74053fa4072"&gt;APIs&lt;/a&gt; make it easier for one application to talk to another.&lt;/p&gt;

&lt;p&gt;APIs make some other applications’s functionalities easily accessible to our application. For example, I once developed a Road Trip Planner application that used the Google Maps API to show various places on a map that a user could visit on a particular route.&lt;/p&gt;

&lt;p&gt;APIs can also be used to separate the front-end and the back-end completely. For example, we can write the back-end as an API-only Rails application that can be used by a web site, an Android/iOS application, or even some third party applications.&lt;/p&gt;

&lt;h2&gt;
  
  
  Using ElasticSearch for searching
&lt;/h2&gt;

&lt;p&gt;Although I don’t know much about ElasticSearch so far, but I’ve learned that it’s a NOSQL, distributed full text database. It acts as a distributed search engine that is incredibly easy to scale and returns results at lightning speed.&lt;/p&gt;

&lt;p&gt;Why would we need it for searching? Because having millions of records in a regular database can make it really complex to make efficient searches. &lt;br&gt;
With Elasticsearch, we can index the documents needed to be searched and it can perform queries across all those millions of documents and return accurate results in a &lt;strong&gt;fraction of a second&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Elasticsearch has a Restful API, which makes it really easy to query the searches and get the results.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://joelabrahamsson.com/elasticsearch-101/"&gt;Here’s a tutorial&lt;/a&gt; that helped me, and here are some &lt;a href="https://www.elastic.co/blog/found-uses-of-elasticsearch"&gt;use cases&lt;/a&gt; of Elasticsearch.&lt;/p&gt;

&lt;h2&gt;
  
  
  Using asynchronous/background tasks
&lt;/h2&gt;

&lt;p&gt;Sometimes the user will perform an action on our application that takes a considerable amount of time to complete. We don’t want the user to sit there waiting for this action to complete, so we send it off to a background worker.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.iron.io/every-web-application-needs-background/"&gt;Here’s a link&lt;/a&gt; that explains it better.&lt;/p&gt;

&lt;p&gt;In Ruby On Rails, I came across &lt;a href="https://sidekiq.org/"&gt;Sidekiq&lt;/a&gt;, which makes it &lt;a href="https://medium.com/@aledalgrande/3-ways-to-make-your-web-pages-more-responsive-with-sidekiq-a3fcb1e9dcef"&gt;easy to handle background tasks efficiently&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;Thanks for reading! If you found this article helpful, give me some claps. 👏&lt;/p&gt;

&lt;p&gt;There’s still a long way to go!&lt;/p&gt;

&lt;p&gt;Check out my website at &lt;a href="https://virajc.tech"&gt;https://virajc.tech&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;(Originally published on Medium(25-07-2018): &lt;a href="https://medium.com/free-code-camp/what-i-learned-from-my-first-ever-software-development-internship-701aa756a72f"&gt;https://medium.com/free-code-camp/what-i-learned-from-my-first-ever-software-development-internship-701aa756a72f&lt;/a&gt;)&lt;/p&gt;

</description>
      <category>career</category>
      <category>ruby</category>
      <category>beginners</category>
      <category>codenewbie</category>
    </item>
    <item>
      <title>Search your website directly from Chrome’s Omnibox</title>
      <dc:creator>Viraj Chavan</dc:creator>
      <pubDate>Sat, 25 Jan 2020 05:30:10 +0000</pubDate>
      <link>https://dev.to/virajvchavan/search-your-website-directly-from-chrome-s-omnibox-9c0</link>
      <guid>https://dev.to/virajvchavan/search-your-website-directly-from-chrome-s-omnibox-9c0</guid>
      <description>&lt;p&gt;You might have searched for YouTube videos directly from Chrome’s Omnibar.&lt;br&gt;&lt;br&gt;
You start typing &lt;code&gt;youtube.com&lt;/code&gt; and the Omnibar shows a little message: &lt;code&gt;Press Tab to Search YouTube&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--GIVZcXnN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/n9acac0owqfds4ypmhya.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--GIVZcXnN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/n9acac0owqfds4ypmhya.png" alt="Youtube search" width="474" height="37"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And when you do press the &lt;code&gt;Tab&lt;/code&gt; key, it lets you search YouTube directly, without needing to visit the site.&lt;/p&gt;

&lt;p&gt;Some websites also show you the search suggestions provided by them instead of the default search engine’s suggestions.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--qwYypf3r--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/40vscwrjlnrwyhycjp4s.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--qwYypf3r--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/40vscwrjlnrwyhycjp4s.png" alt="Suggestions" width="740" height="287"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Wikipedia providing its own search suggestions&lt;/p&gt;

&lt;p&gt;Ever wondered if you can implement the same for your own website? Turns out, it’s quite easy!&lt;/p&gt;

&lt;p&gt;Here’s how.&lt;/p&gt;
&lt;h2&gt;
  
  
  1. Create a search results page
&lt;/h2&gt;

&lt;p&gt;First, your website needs to have a page which can show search results for a query. (You already might have one).  &lt;br&gt; For example,&lt;br&gt;
&lt;code&gt;http://yourwebsite.com/search?q={searchTerms}&lt;/code&gt; &lt;br&gt;&lt;br&gt;
How you handle search queries and show the results is completely up to you.&lt;/p&gt;
&lt;h2&gt;
  
  
  2. Define where your searches should be directed
&lt;/h2&gt;

&lt;p&gt;To tell the browser that your website can accept search queries through the search bar, you just need to write a simple XML file.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--RR6lmpeU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/0w5p9kz66ulw8se9yoiv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--RR6lmpeU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/0w5p9kz66ulw8se9yoiv.png" alt="Code" width="880" height="285"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The most important part of the document is this tag:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&amp;lt;Url type="text/html" method="get" template="http://yourwebsite.com/search?q={searchTerms}" /&amp;gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;This is the URL the browser will redirect the search queries to. When the user presses enter in the Omnibox the string &lt;code&gt;{searchTerms}&lt;/code&gt; in the url is replaced with the string the user typed.&lt;/p&gt;
&lt;h2&gt;
  
  
  3. Let the browsers know
&lt;/h2&gt;

&lt;p&gt;On your site’s homepage, provide a link to the file you created. Place it in the head of the html file. For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;head&amp;gt;  
 &amp;lt;link type="application/opensearchdescription+xml" rel="search"  
       href="/url\_of\_xml\_file"/&amp;gt;  
&amp;lt;/head&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And that’s it!&lt;/p&gt;

&lt;p&gt;With this setup, your website is searchable through Chrome’s Omnibar.&lt;/p&gt;

&lt;p&gt;Do note that Chrome enables it for a website only after user visits the website for the first time. It also adds the website as a Search Engine Provider in its settings as an option.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Enable search suggestions
&lt;/h2&gt;

&lt;p&gt;To make things better, we can show some search suggestions as the user types the search query. Let’s implement that as well.&lt;/p&gt;

&lt;p&gt;First, create a suggestion service on your website which will accept a search query and return suggestions.&lt;br&gt;&lt;br&gt;
It should always return a JSON array of results, with the first result being the original search query.&lt;/p&gt;

&lt;p&gt;For example, if I hit the API &lt;code&gt;[https://yourwebsite.com/suggestions?q=g](https://yourwebsite.com/suggestions?q=cat,)it&lt;/code&gt; , the response should be a valid JSON array like &lt;code&gt;['git', 'github', 'gitlab', 'git commands', 'github login']&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Now add this tag to the XML document we created:&lt;br&gt;&lt;br&gt;
&lt;code&gt;&amp;lt;Url type="application/x-suggestions+json" method="get" rel="suggestions" template="http://yourwebsite.com/suggestions?q={searchTerms}" /&amp;gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;The omnibox will now use your suggestion service to provide query suggestions based on the user’s partial query.&lt;/p&gt;




&lt;p&gt;The XML file we created is called an &lt;a href="http://www.opensearch.org/Specifications/OpenSearch/1.1#OpenSearch_description_document"&gt;OpenSearch description document&lt;/a&gt;. A specification for such functionality is created by &lt;a href="https://github.com/dewitt/opensearch"&gt;OpenSearch&lt;/a&gt;. It has defined simple formats which the browsers can implement.&lt;/p&gt;

&lt;p&gt;So ideally this should work on all browsers! Although the way browsers implement this visually may be different. For example, &lt;a href="https://support.mozilla.org/en-US/kb/add-or-remove-search-engine-firefox"&gt;Firefox implements&lt;/a&gt; it in a separate search bar next to its address bar.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--nouydzhD--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/92v1vdoh06oq58an3nby.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--nouydzhD--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/92v1vdoh06oq58an3nby.png" alt="Code" width="741" height="247"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;How Firefox implements OpenSearch&lt;/p&gt;

&lt;p&gt;The &lt;a href="http://www.opensearch.org/Specifications/OpenSearch/1.1#OpenSearch_description_document"&gt;document&lt;/a&gt; we created was the bare minimum needed for this example. For more details, see the &lt;a href="https://github.com/dewitt/opensearch/blob/master/opensearch-1-1-draft-6.md#opensearch-description-document"&gt;detailed specification&lt;/a&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;a href="https://github.com/dewitt/opensearch"&gt;OpenSearch Documentation&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://developer.mozilla.org/en-US/docs/Web/OpenSearch"&gt;MDN OpenSearch Docs&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://www.chromium.org/tab-to-search"&gt;The Chromium Projects: Tab to Search&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://developer.apple.com/library/archive/releasenotes/General/WhatsNewInSafari/Articles/Safari_8_0.html"&gt;Safari 8.0 Release Notes: Quick Website Search&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://docs.microsoft.com/en-us/microsoft-edge/dev-guide/browser-features/search-provider-discovery"&gt;Microsoft Edge Dev Guide: Search provider discovery&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Thanks for reading!&lt;br&gt;&lt;br&gt;
Find me on &lt;a href="https://github.com/virajvchavan"&gt;Github&lt;/a&gt;/&lt;a href="https://www.linkedin.com/in/virajvchavan/"&gt;LinkedIn&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>searchengines</category>
      <category>webdev</category>
      <category>browsers</category>
    </item>
    <item>
      <title>JavaScript tip: How to properly isolate your code using Anonymous Closures (IIFEs)</title>
      <dc:creator>Viraj Chavan</dc:creator>
      <pubDate>Sat, 25 Jan 2020 05:19:43 +0000</pubDate>
      <link>https://dev.to/virajvchavan/javascript-tip-how-to-properly-isolate-your-code-using-anonymous-closures-iifes-23lf</link>
      <guid>https://dev.to/virajvchavan/javascript-tip-how-to-properly-isolate-your-code-using-anonymous-closures-iifes-23lf</guid>
      <description>&lt;p&gt;JavaScript code can get really messy when we keep adding random functionalities as the requirements come.&lt;/p&gt;

&lt;p&gt;And most of the times, any new functionality you add to an app should not interfere with the existing code in your app.&lt;/p&gt;

&lt;p&gt;You don’t want the new piece of code to override your existing variables/functions accidentally. When such code causes some unexpected behaviour, it can get really annoying to debug through multiple files.&lt;/p&gt;

&lt;p&gt;To achieve this, our new code should run in an isolated environment. In JavaScript, &lt;a href="https://medium.com/javascript-scene/master-the-javascript-interview-what-is-a-closure-b2f0d2152b36"&gt;closures&lt;/a&gt; can help us do that. Closures are the primary mechanism used to enable data privacy in JavaScript.&lt;/p&gt;

&lt;p&gt;This is how an anonymous closures looks like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;(function () {  
    // ... all vars and functions are in this scope only.  
    // still maintains access to all global variables  
}());
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Just put your code inside of this function, and it will have its own scope while keeping the global scope pollution-free.&lt;/p&gt;

&lt;p&gt;This is also known as a Self-Executing Anonymous Function or Immediately Invoked Function Expressions (IIFEs).&lt;/p&gt;

&lt;p&gt;Variables declared inside the closure are not accessible outside it, but it still can access/create global variables. (The use of global variables should ideally be &lt;a href="https://stackoverflow.com/questions/2613310/ive-heard-global-variables-are-bad-what-alternative-solution-should-i-use"&gt;avoided&lt;/a&gt; though, they are known to be &lt;a href="https://yuiblog.com/blog/2006/06/01/global-domination/"&gt;evil&lt;/a&gt;.)&lt;/p&gt;

&lt;p&gt;All of the code that runs inside this function lives in a &lt;strong&gt;closure&lt;/strong&gt;, which provides &lt;strong&gt;privacy&lt;/strong&gt; and &lt;strong&gt;state&lt;/strong&gt; throughout the lifetime of our application.&lt;/p&gt;

&lt;p&gt;If we need to, we can expose variables/methods by returning them in the function.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;var result = (function () {  
    var name = "Harry";   
    return name;   
})();

console.log(result); // "Harry"  
console.log(name); // "error, 'name' not defined"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;JavaScript Closures is the main idea behind the Module Pattern in JavaScript, you can explore the basics of module patter here: &lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.adequatelygood.com/JavaScript-Module-Pattern-In-Depth.html"&gt;http://www.adequatelygood.com/JavaScript-Module-Pattern-In-Depth.html&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dev.to/tomekbuszewski/module-pattern-in-javascript-56jm"&gt;https://dev.to/tomekbuszewski/module-pattern-in-javascript-56jm&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Find me at &lt;a href="https://virajc.tech"&gt;https://virajc.tech&lt;/a&gt;&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>webdev</category>
    </item>
    <item>
      <title>The World of Charts in Web Development (Part 2)</title>
      <dc:creator>Viraj Chavan</dc:creator>
      <pubDate>Sat, 25 Jan 2020 05:05:01 +0000</pubDate>
      <link>https://dev.to/virajvchavan/the-world-of-charts-in-web-development-part-2-2j1m</link>
      <guid>https://dev.to/virajvchavan/the-world-of-charts-in-web-development-part-2-2j1m</guid>
      <description>&lt;p&gt;Do read the &lt;a href="https://dev.to/virajvchavan/the-world-of-charts-in-web-development-part-1-4ij1"&gt;Part 1&lt;/a&gt; before this one, if you haven’t yet.&lt;/p&gt;

&lt;p&gt;In Part 1, we discussed about rendering graphs on the server-side v/s client-side, and the 2 ways to render graphs on a web page: &lt;a href="https://www.w3schools.com/graphics/svg_inhtml.asp"&gt;SVGs&lt;/a&gt; and HTML5 &lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/Canvas_API/Tutorial"&gt;Canvas&lt;/a&gt;. Now let’s take a look at some client-side JavaScript libraries that we can use to render different types of charts on our front-end.&lt;/p&gt;

&lt;p&gt;Some of these are open source and some proprietary. While open source libraries are free to be used and modified as we like, they are often not as feature-rich as some if its paid counterparts. Open source libraries may also not provide reliable support on issues you may face during development.&lt;/p&gt;

&lt;p&gt;If data visualizations is a critical part of your application, then it may make sense to use a paid solution.&lt;/p&gt;

&lt;h1&gt;
  
  
  D3.js
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://d3js.org/"&gt;D3&lt;/a&gt; is probably the most flexible and powerful data visualization JS library ever! It allows great control over the final visual result. It’s also probably the most difficult to get started with.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--yCTwuQB0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/ikgznvc9nx0mxoytaxh6.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--yCTwuQB0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/ikgznvc9nx0mxoytaxh6.jpg" alt="D3 js" width="580" height="350"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;D3 allows us to programmatically create SVG objects, style them, and add transitions, dynamic effect. One needs to spend quiet some time learning its concepts before being productive in it. There’s a &lt;a href="https://www.udacity.com/course/data-visualization-and-d3js--ud507"&gt;course&lt;/a&gt; on Udacity that teaches D3Js.&lt;/p&gt;

&lt;p&gt;D3 does not use Canvas to render the elements. It strictly uses SVG to give a greater control over everything.&lt;/p&gt;

&lt;p&gt;D3 is widely used (89k + stars on Github). In fact there are lots of libraries that use D3 to create new libraries on top of it, making it more accessible.&lt;br&gt;
Following libraries are built using D3:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/metricsgraphics/metrics-graphics"&gt;Metrics Graphics JS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://epochjs.github.io/epoch/"&gt;Epoch&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://vega.github.io/vega/"&gt;Vega&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://nvd3.org/index.html"&gt;NVD3&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Since D3 is a lower level library and intended more as a supporting layer for higher-level visualization tools, you may not use it directly unless what you’re building is very unique and can’t be achieved by simpler higher level libraries.&lt;/p&gt;

&lt;h1&gt;
  
  
  ChartJs
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://www.chartjs.org/"&gt;ChartJs&lt;/a&gt; is a popular JavaScript data visualization library. It uses Html5 Canvas to render elements on the screen. The designs of the charts are simple and responsive with limited options to customize looks and features.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--5d4JmmB6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/pagt2592u4cg6smuarzu.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--5d4JmmB6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/pagt2592u4cg6smuarzu.jpeg" alt="ChartJs" width="880" height="381"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It provides basic data visualization types of charts such as Line, Bar, Doughnut, Pie, Scatter etc. It’s very easy to get started with, takes little time to learn how it works.&lt;/p&gt;

&lt;p&gt;The features of the library are simple and will be enough for most use-cases one might come across. Although it is not very customizable for complex custom features.&lt;/p&gt;

&lt;p&gt;If you want to use ChartJs with a frontend framework, wrappers for ReactJs, VeuJs, Angular etc are available to make things easy.&lt;/p&gt;

&lt;h1&gt;
  
  
  Chartist
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://gionkunz.github.io/chartist-js/"&gt;Chartist&lt;/a&gt; is another open source library that uses SVGs to create responsive data visualizations.&lt;br&gt;
&lt;br&gt;&lt;br&gt;&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Mn28hHqU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/47flpnkgcqtrfb5pmmf0.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Mn28hHqU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/47flpnkgcqtrfb5pmmf0.jpeg" alt="Chartist" width="880" height="381"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can use CSS to style the elements the way you want. You can event add some animations using CSS. This makes Chartist more configurable than ChartJs.&lt;/p&gt;

&lt;p&gt;Chartist is way simpler to get started with since it follows the principle ‘convention over configuration’ and provides may types of charts out of the box. It also has some wrapper-libraries in React/VueJs to make development easier.&lt;/p&gt;

&lt;h1&gt;
  
  
  HighCharts
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://www.highcharts.com/"&gt;HighCharts&lt;/a&gt; is a popular premium library for creating customizable, interactive charts of any complexity. It is free for personal/non-commercial use, but you’ll need to buy a license for any commercial use.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--MYs_6aTU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/ne6yjnz95spzku7lorxk.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--MYs_6aTU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/ne6yjnz95spzku7lorxk.jpg" alt="Highcharts" width="880" height="455"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It uses SVG and fallbacks to VML for backward compatibility all the way to IE6/IE8.&lt;/p&gt;

&lt;p&gt;It provides rich functionality with minimal configuration. The results are often premium, well tested visualizations. The charts will be mobile-optimized, responsive, browser-compatible, exportable and more.&lt;/p&gt;

&lt;p&gt;It is very well documented and any issue you face during development is likely to be solved through its community/support.&lt;/p&gt;

&lt;h1&gt;
  
  
  AmCharts
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://www.amcharts.com/"&gt;AmCharts&lt;/a&gt; is a commercial feature-rich JavaScript library. It’a a simple yet powerful and flexible library. It is also free for personal use, but you’ll need to pay for a license for commercial use.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Z_dOSA1Q--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/bszb53wav1vrjikvfs2o.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Z_dOSA1Q--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/bszb53wav1vrjikvfs2o.png" alt="AmCharts" width="689" height="357"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It also uses SVG to render charts in the browser, which makes it highly configurable. It offers a variety of charts out of the box that offer great design and functionality.&lt;/p&gt;

&lt;p&gt;It is easy to get started with, with good documentation and customer support.&lt;/p&gt;

&lt;h1&gt;
  
  
  Fusion Charts
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://www.fusioncharts.com/"&gt;Fusion Charts&lt;/a&gt; offers a wide variety of charts out of the box. It has over &lt;a href="https://www.fusioncharts.com/dev/chart-guide/list-of-charts"&gt;95+ types&lt;/a&gt; of charts to work with. You’ll need to buy a license to use their library.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--nMb75WJ---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/jqu8nqt6ja4t1qvj1dis.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--nMb75WJ---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/jqu8nqt6ja4t1qvj1dis.jpg" alt="FusionCharts" width="610" height="329"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It offers great documentation, support for plugins, smart defaults, exportable charts, UX elements for interactivity, browser compatibility and more.&lt;/p&gt;

&lt;p&gt;Unlike most other libraries, it also offers official support for server-side rendering of graphs through FusionExport SDK!&lt;/p&gt;

&lt;p&gt;It has officially-supported plugins for major front-end frameworks such as React and VueJs. It also comes with customer support for solving your problems during development.&lt;/p&gt;

&lt;h1&gt;
  
  
  Google Charts
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://developers.google.com/chart"&gt;Google Charts&lt;/a&gt; are powerful, free and simple to use. Developers can create the most basic charts using Google Charts. It uses SVGs to render charts in the browser.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--4ZpyRlGR--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/m4rstpginxcodoq0b974.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--4ZpyRlGR--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/m4rstpginxcodoq0b974.jpg" alt="Google Charts" width="880" height="467"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Although suitable for most requirements, it does not offer as extensive set of features as its paid counterparts such as HighCharts. Google Charts have reasonable defaults, but can also be customized in countless ways&lt;/p&gt;

&lt;p&gt;Google itself uses this library for its data visualization needs across products.&lt;/p&gt;




&lt;p&gt;Thanks for reading! Let me know if you liked the article in the comments!&lt;/p&gt;

&lt;p&gt;Find me at &lt;a href="https://virajc.tech"&gt;https://virajc.tech&lt;/a&gt;&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>webdev</category>
      <category>charts</category>
      <category>beginners</category>
    </item>
    <item>
      <title>The World of Charts in Web Development (Part 1)</title>
      <dc:creator>Viraj Chavan</dc:creator>
      <pubDate>Sat, 25 Jan 2020 04:55:13 +0000</pubDate>
      <link>https://dev.to/virajvchavan/the-world-of-charts-in-web-development-part-1-4ij1</link>
      <guid>https://dev.to/virajvchavan/the-world-of-charts-in-web-development-part-1-4ij1</guid>
      <description>&lt;p&gt;The best way to make sense of lots of data is through visualizations. Want to know how the stock price of Facebook has changed over the past 1 year? Why spend time looking at the numbers when there’s a &lt;a href="https://www.smartdraw.com/line-graph/"&gt;line chart&lt;/a&gt; to look at!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--nLc18oOC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/t7kn1o35olkr6u203agu.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--nLc18oOC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/t7kn1o35olkr6u203agu.jpeg" alt="Alt Text" width="720" height="480"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/Chart#Types_of_charts"&gt;A variety of chart types&lt;/a&gt; exist to satisfy any data visualization needs you might have. As a web developer, you’re sure to have come across a requirement to show a chart on a web-page that represents dynamic data.&lt;/p&gt;

&lt;p&gt;Now, you can try to render a chart from some dynamic data all by yourself. But why reinvent the wheel when lots of people have already worked hard to do it for you!&lt;/p&gt;

&lt;p&gt;There’s a plethora of chart libraries you can use. Some are paid. Some are open source. Some are highly powerful. Some are minimal but also easy to use. Which one should you use?&lt;/p&gt;

&lt;p&gt;But first, let’s understand how a chart can be rendered on a web page?&lt;/p&gt;




&lt;h1&gt;
  
  
  Server-side rendered charts
&lt;/h1&gt;

&lt;p&gt;Although rarely used, we sometimes may need to generate our charts on the server and then deliver them to the user.&lt;/p&gt;

&lt;p&gt;A common use case for this is when we want to show some charts in the dynamic emails we send to users through the back-end. Since JavaScript execution is not allowed in the HTML emails, we can generate image files for the charts and render them in emails. (Other use-cases might include creating embedded charts in PDF files, attaching images in emails etc)&lt;/p&gt;

&lt;p&gt;There are limited libraries available for server-side chart generation. Different libraries are available for most server-side languages. Separate services like &lt;a href="https://www.image-charts.com/"&gt;image charts&lt;/a&gt; and &lt;a href="https://quickchart.io/"&gt;quickchart.io&lt;/a&gt; also exist, which give you a &lt;a href="https://restfulapi.net/"&gt;REST API&lt;/a&gt; to use.&lt;/p&gt;

&lt;p&gt;If you can’t find a server-side library that fits your needs, as a workaround, you can write a script on your server that uses one of the client-side libraries to create the chart in HTML. Then you can convert the html to PDF or an image file on the server.&lt;/p&gt;

&lt;h1&gt;
  
  
  Client-side rendered charts
&lt;/h1&gt;

&lt;p&gt;This is the most common use-case. Before learning about libraries that do this, let us first look at how you would implement it yourself.&lt;/p&gt;

&lt;p&gt;There are two ways you can render a chart in modern web applications: SVGs and HTML 5 Canvas. Some libraries out there offer both canvas and SVG renders. Others tend to stick with just one of the two options.&lt;/p&gt;

&lt;h2&gt;
  
  
  Using SVGs
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.w3schools.com/graphics/svg_inhtml.asp"&gt;SVG (Scalable Vector Graphics)&lt;/a&gt;, is an &lt;a href="https://en.wikipedia.org/wiki/XML"&gt;XML&lt;/a&gt;-based graphic format with the ability to infinitely scale without losing the image quality. It has a &lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/Document_Object_Model/Introduction"&gt;DOM&lt;/a&gt;, letting you reference any graphical elements individually using JavaScript. Which lets you do cool things such as attach event handlers to an element on the chart. You can also use CSS to style elements.&lt;/p&gt;

&lt;p&gt;SVG shines when you want a high quality graphic that is resolution-independent. It does not loose its quality on large resolutions.&lt;/p&gt;

&lt;p&gt;While having every element available in the DOM is beneficial, for large data-points, the performance of the SVG-rendered chart falls short. Performance degrades &lt;a href="https://en.wikipedia.org/wiki/Logarithmic_growth"&gt;logarithmically&lt;/a&gt; as the number of elements increase.&lt;/p&gt;

&lt;h2&gt;
  
  
  Using HTML5 Canvas
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/Canvas_API/Tutorial"&gt;Canvas&lt;/a&gt; is a pixel based element in HTML. The Canvas element is simply a large XY grid of pixels and gives the developer freedom to decide what and how to render things on it using JavaScript.&lt;/p&gt;

&lt;p&gt;Canvas uses a “fire and forget” model, there is no DOM that can be referenced once an element has been drawn.&lt;/p&gt;

&lt;p&gt;Canvas is quite fast in rendering large number of data points. In fact, people use have &lt;a href="https://tutorialzine.com/2015/02/30-amazing-games-made-only-with-html5"&gt;built games&lt;/a&gt; with lots of graphics and animations using Canvas. Although as the size of the screen increases, the performance may degrade as more pixels need to be drawn. Which makes its performance resolution-dependant.&lt;/p&gt;

&lt;h2&gt;
  
  
  When to use which: SVG v/s Canvas
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;  Highly customizable elements for limited data: SVG&lt;/li&gt;
&lt;li&gt;  Zoomable graphics without loosing quality: SVG&lt;/li&gt;
&lt;li&gt;  Visualizations for large amount of data: Canvas&lt;/li&gt;
&lt;li&gt;  When large real-time data processing is required: Canvas&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Here’s an in-depth discussion on the pros and cons of both: &lt;a href="https://docs.microsoft.com/en-us/previous-versions/windows/internet-explorer/ie-developer/samples/gg193983(v=vs.85)#html5-graphic-technologies"&gt;SVG vs canvas: how to choose&lt;/a&gt;. You don’t need to know this to use any of the libraries, but it’s always good to know how it works underneath in an abstract way.&lt;/p&gt;

&lt;p&gt;In &lt;a href="https://virajc.tech/blog/world-of-charts-2/"&gt;Part 2&lt;/a&gt;, we discuss popular client-side JavaScript data-visualization libraries.&lt;/p&gt;

&lt;p&gt;Thanks for reading! Find me at &lt;a href="https://virajc.tech"&gt;virajc.tech&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;References:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;a href="https://docs.microsoft.com/en-us/previous-versions/windows/internet-explorer/ie-developer/samples/gg193983(v=vs.85)#html5-graphic-technologies"&gt;&lt;/a&gt;&lt;a href="https://docs.microsoft.com/en-us/previous-versions/windows/internet-explorer/ie-developer/samples/gg193983(v=vs.85)#html5-graphic-technologies"&gt;https://docs.microsoft.com/en-us/previous-versions/windows/internet-explorer/ie-developer/samples/gg193983(v=vs.85)#html5-graphic-technologies&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>javascript</category>
      <category>charts</category>
      <category>webdev</category>
      <category>beginners</category>
    </item>
  </channel>
</rss>
