<?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: Nishant Mittal</title>
    <description>The latest articles on DEV Community by Nishant Mittal (@nishantwrp).</description>
    <link>https://dev.to/nishantwrp</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%2F239671%2F98b595a2-72f3-4814-9e6d-b14ede18cfff.jpeg</url>
      <title>DEV Community: Nishant Mittal</title>
      <link>https://dev.to/nishantwrp</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/nishantwrp"/>
    <language>en</language>
    <item>
      <title>What terminal config do you use?</title>
      <dc:creator>Nishant Mittal</dc:creator>
      <pubDate>Tue, 16 Nov 2021 11:48:32 +0000</pubDate>
      <link>https://dev.to/nishantwrp/what-terminal-config-do-you-use-chd</link>
      <guid>https://dev.to/nishantwrp/what-terminal-config-do-you-use-chd</guid>
      <description>&lt;p&gt;Hey all,&lt;/p&gt;

&lt;p&gt;Writing this post to know what terminal config do you all I use?&lt;/p&gt;

&lt;p&gt;Here's mine. (Oh-My-Zsh + Spaceship Theme)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--HJo1RBg0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9b955gdlc104ucs19op4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--HJo1RBg0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9b955gdlc104ucs19op4.png" alt="My Terminal" width="880" height="527"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>programming</category>
      <category>watercooler</category>
      <category>discuss</category>
    </item>
    <item>
      <title>What tools do you guys use for managing your tasks/goals</title>
      <dc:creator>Nishant Mittal</dc:creator>
      <pubDate>Wed, 18 Aug 2021 19:25:09 +0000</pubDate>
      <link>https://dev.to/nishantwrp/what-tools-do-you-guys-use-for-managing-your-tasks-1kf8</link>
      <guid>https://dev.to/nishantwrp/what-tools-do-you-guys-use-for-managing-your-tasks-1kf8</guid>
      <description>&lt;p&gt;As the title says, i am intersted in knowing what all tools do you guys use for managing everything like daily tasks, project specs, plans, professional goals, long-term (yearly) goals, kanban baords maybe, etc. &lt;/p&gt;

&lt;p&gt;Currently, I use two tools&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://www.notion.so/"&gt;Notion&lt;/a&gt; - To manage a list of long-term goals, what I want to do focus on for the next couple of months etc.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.joplinapp.org/"&gt;Joplin&lt;/a&gt; - For managing daily tasks. &lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>discuss</category>
      <category>help</category>
      <category>watercooler</category>
    </item>
    <item>
      <title>Reasons why Django is the best web framework</title>
      <dc:creator>Nishant Mittal</dc:creator>
      <pubDate>Wed, 16 Jun 2021 19:35:45 +0000</pubDate>
      <link>https://dev.to/nishantwrp/reasons-why-django-is-the-best-web-framework-3f4h</link>
      <guid>https://dev.to/nishantwrp/reasons-why-django-is-the-best-web-framework-3f4h</guid>
      <description>&lt;p&gt;Choosing a web framework is hard especially now when there are a lot of frameworks on the market, each designed to address different project needs. Here is why I think that Django is the best choice in most cases.&lt;/p&gt;

&lt;h1&gt;
  
  
  What is Django?
&lt;/h1&gt;

&lt;blockquote&gt;
&lt;p&gt;Django - The web framework for perfectionists with deadlines.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://www.djangoproject.com/"&gt;Django&lt;/a&gt; is an open source and powerful web framework written in Python that encourages rapid development and clean, pragmatic design. It takes care of much of the hassle of Web development, so you can focus on writing your app without needing to reinvent the wheel.&lt;/p&gt;

&lt;p&gt;It is being used by a lot of companies including &lt;em&gt;Instagram, Pinterest, Spotify, Disqus, Dropbox, Mozilla, Reddit&lt;/em&gt; which makes it obvious that the applications built with this framework are &lt;strong&gt;exceedingly scalable&lt;/strong&gt;.&lt;/p&gt;

&lt;h1&gt;
  
  
  What can you do with Django?
&lt;/h1&gt;

&lt;p&gt;If you are a beginner, you'll love the approach the platform takes for making web development easier. If you want to make robust web apps with a minimal amount of coding, you will appreciate what Django framework has to offer.&lt;/p&gt;

&lt;p&gt;You can do anything web-based using Django. From building e-commerce systems, CRM Systems, Email Systems to developing a REST/GraphQL based API server for your frontend application there's nothing that you can't do using Django.&lt;/p&gt;

&lt;p&gt;The most awesome thing about Django that I'll talk about later too in this article is it's large community. Most of the times the features you need are already present in Django. However, if there not there's a very high probability that you'll find a Django plugin or package developed by the community that does that task for you.&lt;/p&gt;

&lt;h1&gt;
  
  
  Features
&lt;/h1&gt;

&lt;p&gt;There are a lot of things about Django that I like. I won't be able to write about all of them, So, here are some of the most awesome features among them.&lt;/p&gt;

&lt;h2&gt;
  
  
  Batteries Included
&lt;/h2&gt;

&lt;p&gt;You don’t need to code basic stuff, it comes pre-packaged. These packages were developed by professional developers, so you won’t need to spend time making sure they work correctly. Some of the features included in this framework are as follows.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It has a very &lt;strong&gt;powerful ORM&lt;/strong&gt;. Once you’ve created your data models, Django automatically gives you a database-abstraction API that lets you create, retrieve, update and delete objects.&lt;/li&gt;
&lt;li&gt;It makes handling the &lt;strong&gt;database migrations easy&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;It has in-built &lt;strong&gt;Session handling&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;It also handles &lt;strong&gt;URL Routing&lt;/strong&gt; for you along with dynamic URLs.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Admin panel
&lt;/h2&gt;

&lt;p&gt;Django has an customizable admin interface, so you can manage data using basic CRUD operations. It’s a very useful feature so you can start your project right away, without having to code this functionality. The admin panel can also be configured to have customized filters, or the data can be grouped using a particular field.&lt;/p&gt;

&lt;h2&gt;
  
  
  Template System
&lt;/h2&gt;

&lt;p&gt;Django has it's own in-built templating system also known as Django template language (DTL). However, if you want you can also use any other template engine like &lt;em&gt;Jinja2&lt;/em&gt;. Moreover, you also have an option to write your own custom template system. How cool is that?&lt;/p&gt;

&lt;p&gt;Your template can be divided into further re-useable components, which also alignes with one of Django’s core template design principles and it’s a design pattern that stands for Don’t-Repeat-Yourself (DRY). It’s exactly what it sounds like, it means that you shouldn’t, at least in most cases, by copying and pasting the code. Your template, can be divided into reusable components such as the side navigation bar, the main navigation bar, the header of the page, the footer of the page and so on. This minimizes repetition and makes for writing efficient and cleaner code.&lt;/p&gt;

&lt;h2&gt;
  
  
  Super Customizable
&lt;/h2&gt;

&lt;p&gt;You can tackle just about any web app development project, whether it is a basic website or a high-end web app. It is also compatible with all major databases and even works with multiple database management systems at the same time like &lt;em&gt;PostgreSQL, SQLite, Oracle, etc&lt;/em&gt;. It’s fully loaded with extras and scalable, so you can make applications that handle heavy traffic and large volumes of information. &lt;/p&gt;

&lt;p&gt;Django offers a large amount of custom web development options. Since Django is built around Python, the design rules of the coding language dictate that web development time needs to be optimized. You can get your custom apps developed in a much smaller time frame than any other framework would allow you to.&lt;/p&gt;

&lt;h2&gt;
  
  
  Security
&lt;/h2&gt;

&lt;p&gt;Django takes security seriously and helps developers avoid many common security mistakes. You do not have to implement security features manually to keep web development going. he framework has protection against XSS and CSRF attacks, SQL injections, clickjacking, etc. A Django web application is fully secured with industry-standard user authentication systems.&lt;/p&gt;

&lt;h2&gt;
  
  
  Scalable and Reliable
&lt;/h2&gt;

&lt;p&gt;As said above, some of the largest web applications like &lt;em&gt;Instagram, Reddit, Spotify&lt;/em&gt; use Django as a backend framework, we can agree that it's both scalable and reliable.  If you’re just starting, Django provides the functionality that enables you to create a small project and scale it as needed. You can handle more user requests and greater volumes of data if your web app goes through a growth spurt.&lt;/p&gt;

&lt;h2&gt;
  
  
  Community
&lt;/h2&gt;

&lt;p&gt;Django has been around for a while now, and its large community makes the platform even better.  As it's an open source project, Django is supported by active volunteers who constantly work on stabilizing and improving the framework. It has about &lt;em&gt;58k&lt;/em&gt; Github stars.&lt;/p&gt;

&lt;p&gt;Apart from the developers that directly contribute to Django, there are people in the community who develop great plugins to make app development easier for budding developers.&lt;/p&gt;

&lt;h2&gt;
  
  
  Documentation
&lt;/h2&gt;

&lt;p&gt;As a result of super huge community, Django has a suberb documentation. It has detailed quick-start guides, detailed release notes, backward-compatible changes. There are dedicated websites for the platform where you can find help for any issues that you may run into. If you need help with your projects, the community support can always be banked on.&lt;/p&gt;




&lt;p&gt;That's it for this article. I would love to know what do you think about Django and this article. Please feel free to comment below or reach out. Thanks for reading!&lt;/p&gt;

</description>
      <category>django</category>
      <category>codenewbie</category>
      <category>webdev</category>
      <category>python</category>
    </item>
    <item>
      <title>What is the best place to discuss dev project ideas?</title>
      <dc:creator>Nishant Mittal</dc:creator>
      <pubDate>Sat, 23 Jan 2021 23:05:35 +0000</pubDate>
      <link>https://dev.to/nishantwrp/what-is-the-best-place-to-discuss-dev-project-ideas-4gpn</link>
      <guid>https://dev.to/nishantwrp/what-is-the-best-place-to-discuss-dev-project-ideas-4gpn</guid>
      <description>&lt;p&gt;Wanted to ask the community about what is the best place to discuss side project / in general dev project ideas to see if users are really interested in the idea.&lt;/p&gt;

</description>
      <category>discuss</category>
      <category>watercooler</category>
      <category>help</category>
    </item>
    <item>
      <title>Add github based comments on your gridsome blog</title>
      <dc:creator>Nishant Mittal</dc:creator>
      <pubDate>Thu, 07 Jan 2021 12:43:35 +0000</pubDate>
      <link>https://dev.to/nishantwrp/add-github-based-comments-on-your-gridsome-blog-o69</link>
      <guid>https://dev.to/nishantwrp/add-github-based-comments-on-your-gridsome-blog-o69</guid>
      <description>&lt;h2&gt;
  
  
  Overview
&lt;/h2&gt;

&lt;p&gt;This is a guide on how you can add GitHub based comments on your Gridsome powered blog like shown in the picture below.&lt;/p&gt;

&lt;p&gt;&lt;a href="//images.ctfassets.net/7xvuet8e2li4/4zAyUeUg8yjPh3wqN8aqjP/99fc74f8e27bd2911660b00e12dc3bab/Unnamed.jpg" class="article-body-image-wrapper"&gt;&lt;img src="//images.ctfassets.net/7xvuet8e2li4/4zAyUeUg8yjPh3wqN8aqjP/99fc74f8e27bd2911660b00e12dc3bab/Unnamed.jpg" alt="Gitalk Demo"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We will use a component named &lt;code&gt;Gitalk&lt;/code&gt; in this article. All the comments are stored in a github issue. So, you don't need a seperate database for storing the comments.&lt;/p&gt;

&lt;h2&gt;
  
  
  Let's Start
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Create a GitHub OAuth application
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Go to your &lt;a href="https://github.com/settings/apps"&gt;Github App Settings&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Go to OAuth Apps.&lt;/li&gt;
&lt;li&gt;Create new OAuth application.&lt;/li&gt;
&lt;li&gt;Fill in all the required details. In the &lt;code&gt;Authorization callback URL&lt;/code&gt; fill in the &lt;code&gt;URL&lt;/code&gt; where your site will be deployed.&lt;/li&gt;
&lt;li&gt;Copy the &lt;u&gt;Client ID&lt;/u&gt; and &lt;u&gt;Client Secret&lt;/u&gt; from your OAuth App.&lt;/li&gt;
&lt;/ul&gt;



&lt;h3&gt;
  
  
  Configure your Gridsome app
&lt;/h3&gt;

&lt;p&gt;First of all, install the gitalk gridsome plugin.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;yarn add gridsome-plugin-gitalk
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;p&gt;Now, in your &lt;code&gt;gridsome.config.js&lt;/code&gt; add the following block to your plugins.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;exports&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="p"&gt;...,&lt;/span&gt;
  &lt;span class="na"&gt;plugins&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="p"&gt;...,&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;use&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;gridsome-plugin-gitalk&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;options&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;clientID&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;kuy78h87gg87g8g89&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// The client id you copied earlier.&lt;/span&gt;
        &lt;span class="na"&gt;clientSecret&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;r248hf924hfhh8fh8a2&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// The client secret you copied earlier.&lt;/span&gt;
        &lt;span class="na"&gt;repo&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;nishantwrp-website&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// The name of the github repo where the comments should be stored.&lt;/span&gt;
        &lt;span class="na"&gt;owner&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;nishantwrp&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// The username of the owner of the github repository.&lt;/span&gt;
        &lt;span class="na"&gt;admin&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;nishantwrp&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="c1"&gt;// The usernames of the admins of the repository.&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;p&gt;Now, you're all set. You can just use the gitalk component in your &lt;code&gt;Vue&lt;/code&gt; files like below.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;Gitalk&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  That's all
&lt;/h2&gt;

&lt;p&gt;If you did everything correctly, the comments and github authentication should work correctly when you deploy it. For further advanced configurations please refer to the &lt;a href="https://github.com/nishantwrp/gridsome-plugin-gitalk"&gt;plugin docs&lt;/a&gt;. Thanks!&lt;/p&gt;




&lt;p&gt;Hi, I'm Nishant Mittal. Thanks for reading this post. Feel free to comment or reach out on &lt;a href="https://twitter.com/nishantwrp"&gt;Twitter&lt;/a&gt; in case of any queries. You can also find me on &lt;a href="https://github.com/nishantwrp"&gt;Github&lt;/a&gt;, &lt;a href="https://www.linkedin.com/in/nishantwrp/"&gt;Linkedin&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>vue</category>
      <category>javascript</category>
      <category>codenewbie</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Finding an organization for google summer of code</title>
      <dc:creator>Nishant Mittal</dc:creator>
      <pubDate>Sun, 27 Dec 2020 18:17:49 +0000</pubDate>
      <link>https://dev.to/nishantwrp/finding-an-organization-for-google-summer-of-code-537d</link>
      <guid>https://dev.to/nishantwrp/finding-an-organization-for-google-summer-of-code-537d</guid>
      <description>&lt;h2&gt;
  
  
  Google Summer of Code
&lt;/h2&gt;

&lt;p&gt;For those who don't know about Google Summer of Code, it is one of the most popular program for college students. It is an international annual program in which Google awards stipends to students who successfully complete a free and open-source software coding project during the summer.&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem
&lt;/h2&gt;

&lt;p&gt;It is a common practice that the students start contributing to open source organizations that have high chances of appearing in GSoC a lot before the organizations are announced. It gives you an edge over other applicants because you would be much experienced with the project's codebase, in case you've started contributing early which in turn increases your chances of your proposal getting selected.&lt;/p&gt;

&lt;p&gt;The people who've tried to find an organization by going to official GSoC archives would know the struggle of finding the open-source project that meets your interests. This is because in the official GSoC archive you can only see the organizations that appeared in a particular year at once and they can be filtered by only one parameter i.e. Category.&lt;/p&gt;

&lt;h2&gt;
  
  
  The solution
&lt;/h2&gt;

&lt;p&gt;Here's a tool that could help make your work easier. It's known as &lt;b&gt;&lt;u&gt;GSoC Organizations&lt;/u&gt;&lt;/b&gt;.&lt;/p&gt;

&lt;p&gt;This tool solves all the problems that were there in the official GSoC archive like&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;See the organizations which participated in different years on the same page.&lt;/li&gt;
&lt;li&gt;Filtering the organizations by various factors like Years of participation, categories, technologies, and topics.&lt;/li&gt;
&lt;li&gt;You can view the number of completed projects in the organizations in various years in form of a graph.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Here are some screenshots. &lt;/p&gt;

&lt;p&gt;&lt;a href="//images.ctfassets.net/7xvuet8e2li4/szIXU2XRABeaQMOlkWKs3/84535eded359a3fee4c58c0d7e4651ef/Screenshot_2020-12-27_GSoC_Organizations.png" class="article-body-image-wrapper"&gt;&lt;img src="//images.ctfassets.net/7xvuet8e2li4/szIXU2XRABeaQMOlkWKs3/84535eded359a3fee4c58c0d7e4651ef/Screenshot_2020-12-27_GSoC_Organizations.png" alt="GSoC Organizations Home Page"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="//images.ctfassets.net/7xvuet8e2li4/Et92tvQB0fbQklUEAYfHE/aafc831d862596d3aca853496cd81338/Screenshot_2020-12-27_Oppia_Foundation_GSoC_Organizations.png" class="article-body-image-wrapper"&gt;&lt;img src="//images.ctfassets.net/7xvuet8e2li4/Et92tvQB0fbQklUEAYfHE/aafc831d862596d3aca853496cd81338/Screenshot_2020-12-27_Oppia_Foundation_GSoC_Organizations.png" alt="GSoC Organizations Organization Page"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here is the link to this tool - &lt;a href="https://www.gsocorganizations.dev"&gt;https://www.gsocorganizations.dev&lt;/a&gt;&lt;br&gt;
At last, may the source be with you!&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>showdev</category>
      <category>codenewbie</category>
      <category>discuss</category>
    </item>
    <item>
      <title>Strapi vs Netlify CMS</title>
      <dc:creator>Nishant Mittal</dc:creator>
      <pubDate>Wed, 18 Nov 2020 17:41:40 +0000</pubDate>
      <link>https://dev.to/nishantwrp/strapi-vs-netlify-cms-41ec</link>
      <guid>https://dev.to/nishantwrp/strapi-vs-netlify-cms-41ec</guid>
      <description>&lt;p&gt;I currently use Contentful for my blogging site (&lt;a href="https://github.com/nishantwrp/nishantwrp-website"&gt;https://github.com/nishantwrp/nishantwrp-website&lt;/a&gt;). But now I wanted to migrate to an Open Source, self hosted CMS. I have two options&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Netlify CMS&lt;/li&gt;
&lt;li&gt;Strapi&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I wanted to know which one of these would be best in my case and why?&lt;/p&gt;

</description>
      <category>help</category>
      <category>codenewbie</category>
      <category>discuss</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Google APIs OAuth in Django</title>
      <dc:creator>Nishant Mittal</dc:creator>
      <pubDate>Fri, 09 Oct 2020 00:06:57 +0000</pubDate>
      <link>https://dev.to/nishantwrp/google-apis-oauth-in-django-17ch</link>
      <guid>https://dev.to/nishantwrp/google-apis-oauth-in-django-17ch</guid>
      <description>&lt;p&gt;Making an authentication system with google sign-in is a relatively simpler task to do. It can be easily done using Firebase authentication. But the problem comes when we need to access Google APIs of our users such as Google Calendar, Gmail, Drive etc. The main problem is getting the user tokens and storing them. So, that our application can access the Google APIs of the user once they've granted the access and not asking them to authenticate again and again.&lt;/p&gt;

&lt;p&gt;So, here is how you can integrate Google OAuth with your Django application and retrieve, store the user tokens. Which can be used to create authenticated requests to Google APIs through &lt;code&gt;google-api-python-client&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Objective
&lt;/h2&gt;

&lt;p&gt;In this article, I am going to show you how you can integrate Google OAuth with your Django application and store the user tokens for future use, accessing the Upcoming Events in the user's Google Calendar using the stored credentials.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;p&gt;I'm going to assume that you've already created a project in &lt;a href="https://console.developers.google.com/"&gt;Google API Console&lt;/a&gt;, enabled the Google Calendar API for your project, setup an OAuth consent screen and you have a &lt;code&gt;client_id.json&lt;/code&gt; file.&lt;/p&gt;

&lt;p&gt;I'm also assuming that you have already initialized a django application.&lt;/p&gt;

&lt;h2&gt;
  
  
  Let's Start
&lt;/h2&gt;

&lt;p&gt;First of all, you need to install &lt;code&gt;google-apis-oauth-django&lt;/code&gt; to setup oauth and &lt;code&gt;google-api-python-client&lt;/code&gt; to access Google APIs using the following command.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;google-apis-oauth-django google-api-python-client
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;First of all create a &lt;code&gt;Sign In With Google&lt;/code&gt; button that redirects users to an url say &lt;code&gt;google_oauth/redirect/&lt;/code&gt;. First you need to create a view for redirecting users. In your &lt;code&gt;views.py&lt;/code&gt; add the following code.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;os&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;google_apis_oauth&lt;/span&gt;

&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;django.shortcuts&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;HttpResponseRedirect&lt;/span&gt;

&lt;span class="c1"&gt;# The url where the google oauth should redirect
# after a successful login.
&lt;/span&gt;&lt;span class="n"&gt;REDIRECT_URI&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;'http://localhost:8000/google_oauth/callback/'&lt;/span&gt;

&lt;span class="c1"&gt;# Authorization scopes required
&lt;/span&gt;&lt;span class="n"&gt;SCOPES&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;'https://www.googleapis.com/auth/calendar'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="c1"&gt;# Path of the "client_id.json" file
&lt;/span&gt;&lt;span class="n"&gt;JSON_FILEPATH&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;getcwd&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="s"&gt;'client_id.json'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;RedirectOauthView&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;oauth_url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;google_apis_oauth&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_authorization_url&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;JSON_FILEPATH&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;SCOPES&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;REDIRECT_URI&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;HttpResponseRedirect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;oauth_url&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now in your &lt;code&gt;urls.py&lt;/code&gt;, You can include this view by doing something like&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;urlpatterns&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="p"&gt;...,&lt;/span&gt;
    &lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'google_oauth/redirect/'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;RedirectOauthView&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now when a user clicks on that &lt;code&gt;Sign In With Google&lt;/code&gt; button they would be redirected to a google oauth screen. After a successful login they would be redirected to the &lt;code&gt;REDIRECT_URI&lt;/code&gt; that we have specified above i.e. &lt;code&gt;google_oauth/callback/&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;So, we need to write a view for that as well. In that view we can now successfully retreive the user credentials as they are successfully authenticated by doing something like this.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;CallbackView&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="c1"&gt;# Get user credentials
&lt;/span&gt;        &lt;span class="n"&gt;credentials&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;google_apis_oauth&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_crendentials_from_callback&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;JSON_FILEPATH&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;SCOPES&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;REDIRECT_URI&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="c1"&gt;# Stringify credentials for storing them in the DB
&lt;/span&gt;        &lt;span class="n"&gt;stringified_token&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;google_apis_oauth&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;stringify_credentials&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;credentials&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="c1"&gt;# Store the credentials safely in the DB
&lt;/span&gt;        &lt;span class="p"&gt;...&lt;/span&gt;

        &lt;span class="c1"&gt;# Now that you have stored the user credentials you
&lt;/span&gt;        &lt;span class="c1"&gt;# can redirect user to your main application.
&lt;/span&gt;        &lt;span class="p"&gt;...&lt;/span&gt;
    &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="n"&gt;exceptions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;InvalidLoginException&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="c1"&gt;# This exception is raised when there is an inavlid
&lt;/span&gt;        &lt;span class="c1"&gt;# request to this callback uri.
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Adding this view in the &lt;code&gt;urls.py&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;urlpatterns&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="p"&gt;...,&lt;/span&gt;
    &lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'google_oauth/callback/'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;CallbackView&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, as you have the user's credentials. You can access the Google APIs by the following method.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;google_apis_oauth&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;googleapiclient.discovery&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;build&lt;/span&gt;

&lt;span class="c1"&gt;# Load the stored credentials in a variable say 'stringigied_token'
&lt;/span&gt;
&lt;span class="c1"&gt;# Load the credentials object using the stringified token.
&lt;/span&gt;&lt;span class="n"&gt;creds&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;google_apis_oauth&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;load_credentials&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;stringified_token&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Using credentials to access Upcoming Events
&lt;/span&gt;&lt;span class="n"&gt;service&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;build&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'calendar'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;'v3'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;credentials&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;creds&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;now&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;datetime&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;utcnow&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="n"&gt;isoformat&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s"&gt;'Z'&lt;/span&gt;
&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'Getting the upcoming 10 events'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;events_result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;service&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;events&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;calendarId&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;'primary'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;timeMin&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;now&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;maxResults&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;singleEvents&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;orderBy&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;'startTime'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;execute&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;events&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;events_result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'items'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[])&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;events&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'No upcoming events found.'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;event&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;events&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;start&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;'start'&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'dateTime'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;'start'&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'date'&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;start&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;'summary'&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's it! Similarly you can use these credentials to access other Google APIs as well.&lt;/p&gt;

</description>
      <category>django</category>
      <category>webdev</category>
      <category>python</category>
      <category>codenewbie</category>
    </item>
    <item>
      <title>Google Summer of Code 2020 with Oppia</title>
      <dc:creator>Nishant Mittal</dc:creator>
      <pubDate>Tue, 08 Sep 2020 14:56:26 +0000</pubDate>
      <link>https://dev.to/nishantwrp/google-summer-of-code-2020-with-oppia-28f</link>
      <guid>https://dev.to/nishantwrp/google-summer-of-code-2020-with-oppia-28f</guid>
      <description>&lt;p&gt;Oppia is a platform that enables anyone to learn and teach anything they want in an effective and enjoyable way. &lt;/p&gt;

&lt;h2&gt;
  
  
  About the project
&lt;/h2&gt;

&lt;p&gt;Oppia was initially written in AngularJs (1.X) but as Angular was released, it was decided to migrate the application to Angular. Also, as Angular uses TypeScript instead of JavaScript all the content of JavaScript files was copied as it is. But as the main feature of TypeScript is &lt;code&gt;static typing&lt;/code&gt;. A part of my project was to ensure type safety in the &lt;code&gt;ts&lt;/code&gt; files with writing relevant unit tests and adding CI checks to ensure that this convention is followed in the future.&lt;/p&gt;

&lt;p&gt;The other part of my project was related to webpack. In particular, the goal was to make the webpack build faster and moving some libraries currently imported using script imports to webpack&lt;/p&gt;

&lt;h2&gt;
  
  
  Milestone 1
&lt;/h2&gt;

&lt;p&gt;In particular, the work done in milestone 1 was&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Write type definitions for the third party libraries that didn’t have those.&lt;/li&gt;
&lt;li&gt;Coming up with a convention for declaring the types.&lt;/li&gt;
&lt;li&gt;Declare types for about 50% of the TypeScript files.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This also involved writing lint checks to ensure that the third party libs have type definitions and when a contributor upgrades the version of a library, they would also have to update the types if relevant.&lt;/p&gt;

&lt;p&gt;The convention that was decided for naming i.e. camelCase and snake_case was the following two things&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;HTTP requests should only be made only with the files suffixed with &lt;code&gt;backend-api-service.ts&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;All the HTTP backend api services should return domain objects instead of a backend dict.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So, in this milestone I covered the first part and also writing a lint check for ensuring that this convention is not broken.&lt;/p&gt;

&lt;h3&gt;
  
  
  PRs involved
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/oppia/oppia/pull/9257"&gt;Milestone 1.1: Add a check restricting defining type as any&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/oppia/oppia/pull/9266"&gt;Milestone 1.2: Type definitions for midi, skulpt, math expressions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/oppia/oppia/pull/9278"&gt;Milestone 1.3.1: Type definitions for guppy, removed blobbuilder&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/oppia/oppia/pull/9279"&gt;Milestone 1.3.2: Import WaveSurfer using yarn and add typedefs for it&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/oppia/oppia/pull/9293"&gt;Milestone 1.4.1: Remove some any types from typings directory&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/oppia/oppia/pull/9298"&gt;Milestone 1.4.2: Split ICustomScope to respective directives&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/oppia/oppia/pull/9307"&gt;Milestone 1.4.3: Add type definitions for __fixtures__ &lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/oppia/oppia/pull/9310"&gt;Milestone 1.5: Add a check for checking the version of third party type defs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/oppia/oppia/pull/9334"&gt;Added typescript checks to pre push hook&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/oppia/oppia/pull/9345"&gt;Add type definitions in some object factories&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/oppia/oppia/pull/9349"&gt;Remove any types from some object factories - II&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/oppia/oppia/pull/9365"&gt;Remove any from RuleObjectFactory and introduce TypeChangeService&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/oppia/oppia/pull/9370"&gt;Remove any from some object factories - III&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/oppia/oppia/pull/9371"&gt;Add WARNING_TYPE to interaction validation spec files&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/oppia/oppia/pull/9433"&gt;Remove http requests from the files that are not backend api services&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/oppia/oppia/pull/9463"&gt;Add types for Customization Args&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/oppia/oppia/pull/9482"&gt;Disallow using eslint disable statement for camelcase&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/oppia/oppia/pull/9544"&gt;Remove some more any types&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Milestone 2
&lt;/h2&gt;

&lt;p&gt;The work done in milestone 2 was&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Add types for other TypeScript files.&lt;/li&gt;
&lt;li&gt;Http backend api services should return domain objects instead of a backend dict.&lt;/li&gt;
&lt;li&gt;Write documentation on various TypeScript conventions used.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Along with these goals we also realised that the use of &lt;code&gt;ts-ignore&lt;/code&gt; shoould also be restricted. So, I also added a lint check that restricted the use of &lt;code&gt;ts-ignore&lt;/code&gt; and using &lt;code&gt;ts-expect-error&lt;/code&gt; at relevant places.&lt;/p&gt;

&lt;p&gt;Also, as the types would be in place I added the checks ensuring that &lt;code&gt;any&lt;/code&gt; type is not used anymore.&lt;/p&gt;

&lt;h3&gt;
  
  
  PRs involved
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/oppia/oppia/pull/9742"&gt;Refactor interaction type defs and some more remove any types&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/oppia/oppia/pull/9754"&gt;Remove some more any types&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/oppia/oppia/pull/9798"&gt;Refactor backend api services to return domain objects&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/oppia/oppia/pull/9831"&gt;Upgrade version of wavesurfer and use type defs from DefinitelyTyped&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/oppia/oppia/pull/9854"&gt;Remove some more any types&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/oppia/oppia/pull/9883"&gt;Return a domain object in backend api services&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/oppia/oppia/pull/9917"&gt;Refactor backend-api services to return domain objects&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/oppia/oppia/pull/9990"&gt;Remove remaining any types and move any check to eslint&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/oppia/oppia/pull/10054"&gt;Refactor backend api services and remove remaining any types&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/oppia/oppia/pull/10088"&gt;Add a lint check for ts-ignore&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Documentation
&lt;/h3&gt;

&lt;p&gt;I wrote a guide on defining types and published it in Oppia wiki. You can read it &lt;a href="https://github.com/oppia/oppia/wiki/Google-Summer-of-Code-2020"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Milestone 3
&lt;/h2&gt;

&lt;p&gt;The work done in this milestone is&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Integrate dependencies into webpack.&lt;/li&gt;
&lt;li&gt;Increase the webpack compilation speed.&lt;/li&gt;
&lt;li&gt;Documentation on webpack config.&lt;/li&gt;
&lt;li&gt;Enable more TypeScript eslint rules.&lt;/li&gt;
&lt;li&gt;Setup strict type checks.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The main changes in webpack config for getting more speed were introducing &lt;code&gt;cache-loader&lt;/code&gt; and use faster devtools in webpack. Also, I introduced a flag in the scripts so that developers would be still able to build using &lt;code&gt;source-maps&lt;/code&gt; in webpack. The compilation time in production was reduced from around &lt;code&gt;600s&lt;/code&gt; to around &lt;code&gt;300s&lt;/code&gt; in Travis CI (production build). Also the compilation time for development build is less than &lt;code&gt;30s&lt;/code&gt;. Due to &lt;code&gt;cache-loader&lt;/code&gt; consecutive builds in both production and development evironment now take around &lt;code&gt;20s&lt;/code&gt; only.&lt;/p&gt;

&lt;p&gt;Also we thought that it would be nice to enable &lt;code&gt;strict&lt;/code&gt; type checks in the TypeScript config. But the problem was the huge number of errors due to that. So, we decided to implement this rule gradually file by file. I set up that strict config and we plan to make this a &lt;code&gt;good first issue&lt;/code&gt;. &lt;/p&gt;

&lt;h3&gt;
  
  
  PRs involved
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/oppia/oppia/pull/10132"&gt;Rename all .scripts.ts files to .import.ts&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/oppia/oppia/pull/10093"&gt;Remove unneeded optional properties&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/oppia/oppia/pull/10141"&gt;Move scripts imports in header to webpack&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/oppia/oppia/pull/10155"&gt;Use cache-loader in webpack&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/oppia/oppia/pull/10187"&gt;Introduce new eslint checks&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/oppia/oppia/pull/10223"&gt;Loads libraries in manifest.json using webpack, Add a seperate light module for karma&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/oppia/oppia/pull/10228"&gt;Use faster devtools in webpack&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/oppia/oppia/pull/10377"&gt;Introduce more eslint checks&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/oppia/guppy/pull/1"&gt;Modifications so that guppy can be loaded using webpack&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/oppia/MIDI.js/pull/1"&gt;Modifications so that MIDI can be loaded using webpack&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/oppia/oppia/pull/10388"&gt;Move libraries used for interactions to webpack&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/oppia/oppia/pull/10414"&gt;Add some more eslint checks&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/oppia/oppia/pull/10433"&gt;Add a new config for strict typescript checks&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/oppia/oppia/pull/10455"&gt;Introduce new eslint rules&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Documentation
&lt;/h3&gt;

&lt;p&gt;There was documentation on webpack already. I extended it to explain how our webpack config works. You can read it &lt;a href="https://github.com/oppia/oppia/wiki/Webpack"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Issues / Bugs found
&lt;/h2&gt;

&lt;p&gt;I was also a part of release testing team in Oppia. Here are the various issues found by me while release testing and developing Oppia.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/oppia/oppia/issues/10180"&gt;Drag and drop interaction doesn't work in skill preview tab&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/oppia/oppia/issues/10167"&gt;Replace ngAudio with wavesurfer&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/oppia/oppia/issues/9982"&gt;Irregularity in errorCallback in backend-api services&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/oppia/oppia/issues/9853"&gt;Collection Editor doesn't show up correct messages&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/oppia/oppia/issues/9708"&gt;Tweet has wrong text&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/oppia/oppia/issues/10385"&gt;Music interaction doesn't work&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/oppia/oppia/issues/10120"&gt;Question creation doesn't work&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/oppia/oppia/issues/9914"&gt;Profile page doesn't sort the explorations correctly&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/oppia/oppia/issues/9797"&gt;Subscriptions sort in learners dashboard doesn't work correctly&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/oppia/oppia/issues/9537"&gt;Notification in preferences page&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/oppia/oppia/issues/9487"&gt;Red text cannot be read in a collection when it overlaps the explo name&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/oppia/oppia/issues/9480"&gt;Error while selecting to one of in param changes&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;This was an awesome learning experience working with Oppia this summer. Special thanks to &lt;a href="https://www.linkedin.com/in/vojtechjelinek/"&gt;Vojtěch Jelínek&lt;/a&gt; who was my mentor for helping me whenever I faced any problem in completing this project. I would also like to thank Oppia for giving me this opportunity.&lt;/p&gt;

&lt;p&gt;I would also like to acknowledge the help from other members of the community, who were always available whenever needed, just a small chat away. I strongly intend to continue contributing to Oppia.&lt;/p&gt;

&lt;p&gt;Also, thanks to Google for this amazing program.&lt;/p&gt;



&lt;h3&gt;
  
  
  External Links
&lt;/h3&gt;

&lt;p&gt;GSoC Project -&amp;gt; &lt;a href="https://summerofcode.withgoogle.com/projects/#4778102950985728"&gt;https://summerofcode.withgoogle.com/projects/#4778102950985728&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Oppia Lightning Talks -&amp;gt; &lt;a href="https://www.youtube.com/watch?v=9BEjYLbVyDs"&gt;https://www.youtube.com/watch?v=9BEjYLbVyDs&lt;/a&gt;&lt;/p&gt;

</description>
      <category>gsoc</category>
      <category>opensource</category>
      <category>typescript</category>
      <category>webpack</category>
    </item>
    <item>
      <title>How to clean scraped data?</title>
      <dc:creator>Nishant Mittal</dc:creator>
      <pubDate>Mon, 03 Aug 2020 22:50:10 +0000</pubDate>
      <link>https://dev.to/nishantwrp/how-to-clean-scraped-data-20ml</link>
      <guid>https://dev.to/nishantwrp/how-to-clean-scraped-data-20ml</guid>
      <description>&lt;p&gt;Is there a python library which can help to clean the data I got after scraping?&lt;/p&gt;

</description>
      <category>help</category>
      <category>discuss</category>
    </item>
    <item>
      <title>Completing the first milestone of my GSoC Project with Oppia</title>
      <dc:creator>Nishant Mittal</dc:creator>
      <pubDate>Sat, 11 Jul 2020 12:48:24 +0000</pubDate>
      <link>https://dev.to/nishantwrp/completing-the-first-milestone-of-my-gsoc-project-with-oppia-306</link>
      <guid>https://dev.to/nishantwrp/completing-the-first-milestone-of-my-gsoc-project-with-oppia-306</guid>
      <description>&lt;p&gt;I have passed the first milestone of Google Summer of Code 2020. It was a wonderful experience working with &lt;a href="https://www.oppia.org/"&gt;Oppia&lt;/a&gt;. I wrote this post to share the things I've learnt during these awesome four weeks.&lt;/p&gt;

&lt;p&gt;So first of all let me tell you a bit about my work.&lt;/p&gt;

&lt;p&gt;The Oppia's codebase is being migrated to Angular from AngularJs and is currently in a hybrid state. Due to that the codebase shifted from Javascript to Typescript. When the javascript files were being converted to Typescript. In some places the &lt;em&gt;types&lt;/em&gt; were not declared and were left as &lt;em&gt;any&lt;/em&gt;. There were many reasons to that one of them being the absence for proper conventions for the types.&lt;/p&gt;

&lt;p&gt;Also, there were some third party libraries that didn't have type definitions. So, to be precise my work in the first milestone was to&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Write type definitions for the third party libraries that didn't have those.&lt;/li&gt;
&lt;li&gt;Coming up with a convention for declaring the types.&lt;/li&gt;
&lt;li&gt;Declare types for about 50% of the typescript files.&lt;/li&gt;
&lt;/ul&gt;



&lt;p&gt;Writing definitions for the third party libraries was a bit time consuming but was not too difficult. The one thing that I learnt about typescript during this task was &lt;a href="https://www.typescriptlang.org/docs/handbook/namespaces.html"&gt;Namespaces&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Initally, I planned to camelize the response of all the API endpoints. So, that the typescript files could have everything in camelCase. But soon realized that it was not feasible. Then after discussion with my mentor and Oppia core mantainers we decided to restrict the use of snake_case to certain typescript files. I learnt how important conventions were to ensure a &lt;strong&gt;readable&lt;/strong&gt; and &lt;strong&gt;maintainable&lt;/strong&gt; code.&lt;/p&gt;

&lt;p&gt;After the conventions were finalized it was not hard to declare types in other places in codebase. But in some places where the types could be complex. I learnt some awesome things about typescript like &lt;a href="https://www.typescriptlang.org/docs/handbook/advanced-types.html#union-types"&gt;Union Types&lt;/a&gt;, &lt;a href="https://www.typescriptlang.org/docs/handbook/advanced-types.html#type-guards-and-differentiating-types"&gt;Type Guards&lt;/a&gt;, &lt;a href="https://www.typescriptlang.org/docs/handbook/advanced-types.html#discriminated-unions"&gt;Discriminated Unions&lt;/a&gt;, &lt;a href="https://www.typescriptlang.org/docs/handbook/advanced-types.html#conditional-types"&gt;Conditional Types&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;I was able to complete the above tasks well before time (because I started the work bit early than the official date ;))&lt;/p&gt;

&lt;p&gt;Summing up, it was a month full of learning and I am looking forward to working on the second milestone of my project.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/oppia/oppia/pulls/nishantwrp"&gt;My Pull Requests To Oppia&lt;/a&gt;&lt;br&gt;
&lt;a href="https://summerofcode.withgoogle.com/projects/#4778102950985728"&gt;GSoC Project&lt;/a&gt;&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>webdev</category>
      <category>typescript</category>
      <category>showdev</category>
    </item>
    <item>
      <title>How do you put data for other people to use?</title>
      <dc:creator>Nishant Mittal</dc:creator>
      <pubDate>Thu, 09 Jul 2020 22:41:18 +0000</pubDate>
      <link>https://dev.to/nishantwrp/how-do-you-put-data-for-other-people-to-use-4h2m</link>
      <guid>https://dev.to/nishantwrp/how-do-you-put-data-for-other-people-to-use-4h2m</guid>
      <description>&lt;p&gt;Suppose you have scraped data from a site in &lt;code&gt;JSON&lt;/code&gt; format which can be also used by other people. How do you expose it? &lt;br&gt;
Do you make a url directly give out that &lt;code&gt;JSON&lt;/code&gt; data? Or there is a better way. I was thinking of something like a GraphQl server. What do you guys think?&lt;/p&gt;

</description>
      <category>discuss</category>
      <category>help</category>
    </item>
  </channel>
</rss>
