<?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: Kapil Bansal</title>
    <description>The latest articles on DEV Community by Kapil Bansal (@devkapilbansal).</description>
    <link>https://dev.to/devkapilbansal</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%2F492891%2F180548e4-a835-4261-a700-404e03244cb4.jpeg</url>
      <title>DEV Community: Kapil Bansal</title>
      <link>https://dev.to/devkapilbansal</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/devkapilbansal"/>
    <language>en</language>
    <item>
      <title>OpenWRT OpenWISP Monitoring</title>
      <dc:creator>Kapil Bansal</dc:creator>
      <pubDate>Sat, 21 Aug 2021 16:31:23 +0000</pubDate>
      <link>https://dev.to/devkapilbansal/openwrt-openwisp-monitoring-2bmj</link>
      <guid>https://dev.to/devkapilbansal/openwrt-openwisp-monitoring-2bmj</guid>
      <description>&lt;p&gt;After spending the last few months on discussion, implementation, and testing, OpenWRT packages are ready for the OpenWISP monitoring module.&lt;br&gt;
Google Summer of Code helps a lot getting in things done.&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/9VxNnvkCo14"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

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

&lt;p&gt;This project aims to:-&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Convert script used for getting NetJSON Device Monitoring data in an OpenWRT package(netjson-monitoring), including testing and documentation.&lt;/li&gt;
&lt;li&gt;Create a package for OpenWISP Monitoring that collects information from the &lt;code&gt;netjson-monitoring&lt;/code&gt; package and sends it to the server.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The primary goal of this project is to make the process more robust and resilient with easy-to-understand instructions.&lt;/p&gt;

&lt;p&gt;Fascinating, Let's go through the project in more detail.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is OpenWISP Monitoring
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/openwisp/openwisp-monitoring" rel="noopener noreferrer"&gt;OpenWISP Monitoring&lt;/a&gt; module allows monitoring devices in real-time using various charts and notifies users of any unusual behaviour.&lt;/p&gt;

&lt;p&gt;Data is collected from multiple devices and sent in &lt;a href="https://netjson.org/" rel="noopener noreferrer"&gt;NetJSON&lt;/a&gt; format to the server periodically after some intervals. This data is then saved in a time-series database and then used to draw visuals.&lt;/p&gt;

&lt;h2&gt;
  
  
  Need for Packaging OpenWISP Monitoring
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Previously, this was implemented using cron jobs, which is inadvisable.&lt;/li&gt;
&lt;li&gt;Configuration templates were deployed that gets created with the the database migration.&lt;/li&gt;
&lt;li&gt;Also, after any change, the templates need to be manually updated.&lt;/li&gt;
&lt;li&gt;There were many  problems like readability, hard dependencies, logging, error handling and less flexibility.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;OpenWRT OpenWISP Monitoring solves all of these problems.&lt;/p&gt;

&lt;p&gt;Including this, we clean and format the code, add some more features and fix bugs.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjhb1kjdzvm05vys3e7c2.png" alt="OpenWISP Monitoring Package Installation"&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;|&lt;b&gt; OpenWISP Monitoring Package Installation &lt;/b&gt;|&lt;/p&gt;

&lt;h2&gt;
  
  
  Significant Features
&lt;/h2&gt;

&lt;p&gt;Here are some highlights of the project, complete work can be found in &lt;a href="https://github.com/orgs/openwisp/projects/19" rel="noopener noreferrer"&gt;Project Board&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Converting into an OpenWRT Package
&lt;/h3&gt;

&lt;p&gt;As the project name suggests, this was the main goal of this project. As I was not much familiar with OpenWRT and MakeFile, a major time was utilized to understand them. Although, the critical and constructive feedback helped a lot to push the work forward.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Related work&lt;/em&gt; :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/openwisp/openwrt-openwisp-monitoring/pull/25" rel="noopener noreferrer"&gt;Convert into an OpenWRT Package&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/openwisp/openwisp-monitoring/pull/302" rel="noopener noreferrer"&gt;Remove migration script&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Testing NetJSON Monitoring
&lt;/h3&gt;

&lt;p&gt;An important issue indeed. This will ensure that if any change is done or a new feature is added, previously functionalities do not suffer speeding up the process and saving a lot of time.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmb8g20x3ilcxizntb0ks.png" alt="Lua Tests"&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt; Testing NetJSON Monitoring &lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;em&gt;Related Work&lt;/em&gt; :- &lt;a href="https://github.com/openwisp/openwrt-openwisp-monitoring/pull/26" rel="noopener noreferrer"&gt;Lua Tests&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Verbose Mode
&lt;/h3&gt;

&lt;p&gt;During testing, some bugs were found that made us realize the need for easy debugging. With verbose mode, a user (or a developer) can easily find what is happening behind the scenes. This also enables us to remove a lot of noise by just disabling the verbose mode. By default, &lt;code&gt;verbose_mode&lt;/code&gt; is disabled but can be re-enabled using the&lt;code&gt;openwisp_monitoring&lt;/code&gt; config.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Related Work&lt;/em&gt;:- &lt;a href="https://github.com/openwisp/openwrt-openwisp-monitoring/pull/42" rel="noopener noreferrer"&gt;Fix errors and improve debugging&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Configurable Interval
&lt;/h3&gt;

&lt;p&gt;Previously, automated scripts were invoked after every 5 minutes. But what if a user wants a longer interval? That's why an option is added to make this happen easily.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://github.com/openwisp/openwrt-openwisp-monitoring/tree/master#collecting-vs-sending" rel="noopener noreferrer"&gt;Collecting and Sending data&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/9VxNnvkCo14"&gt;
&lt;/iframe&gt;
&lt;br&gt;
This is the most important feature of the package. Previously, data can be sent in real-time only and data gets lost if the connection between server and device is lost.&lt;br&gt;
By storing data temporarily and sending it when the connection is reestablished ensures that all the data is sent to time-series data. The file is deleted once data is sent successfully to the server.&lt;br&gt;
Important highlights of this feature are:-&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Temporarily storing data only if &lt;code&gt;required_memory&lt;/code&gt; is available&lt;/strong&gt;: An option is added so that the user can provide the required percentage of available memory before storing data. This ensures that the device doesn't get filled with data if the connection is broken for a long time.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Storing data with UTC timestamp&lt;/strong&gt;: While working on this feature, I found that the timezones of the device and the server are different which results in saving data with the wrong time in the database. To solve this problem, I converted the time in the UTC timezone and ensures that the monitoring module treats it the same way.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Breaking the process in two services&lt;/strong&gt;: While reviewing the work, my mentor points to a major problem with this implementation. More the data. more time it will need to send. This can result in a skip in saving the data. For this, the monitoring is broken into two procd services, one for collecting the data, other to send the data. An additional parameter mode is used to distinguish between the two.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sending data as soon as it is collected&lt;/strong&gt;: User-defined signals are used to send the latest data to the server as soon as it is collected.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Specify time of received time-series data&lt;/strong&gt;: Timestamp received from the device via URL is used to save the data. Some signals are also updated to let users know the time when metrics were taken.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Related Work&lt;/em&gt; :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/openwisp/openwrt-openwisp-monitoring/pull/34" rel="noopener noreferrer"&gt;Temporarily store and send data&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/openwisp/openwisp-monitoring/pull/316" rel="noopener noreferrer"&gt;Allow specify time of received timeseries data&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Retry Mechanism:-
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Both agents (collecting agent and sending agent) get restarted by procd service in case of failure of max 5 times. &lt;/li&gt;
&lt;li&gt;Agent for collecting data tries 5 times to collect data after waiting for 5 seconds between retries.&lt;/li&gt;
&lt;li&gt;Exponential backoff algorithm is used while sending data to ensure the agent doesn't keep retrying unnecessarily in case of a connection breakdown. This used the &lt;code&gt;max_retries&lt;/code&gt; option to define the maximum number of retries in case of failure. Once the &lt;code&gt;maximum retries are reached&lt;/code&gt;, the agent will try sending data in the next cycle.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Experience
&lt;/h2&gt;

&lt;p&gt;One of the best projects I worked on, with a lot of learning. Personal projects that I made are either used by me only or my friends. But the code written by me this summer will be used by a lot of people around the globe is no less than achievement on its own. &lt;/p&gt;

&lt;p&gt;As soon as the projects were announced, I start exploring them in depth. Although I was not sure, I decided to go with this project as I want to explore more about Networks.&lt;/p&gt;

&lt;p&gt;All thanks to my mentors, &lt;a href="https://github.com/nemesisdesign" rel="noopener noreferrer"&gt;Federico Capoano&lt;/a&gt;, &lt;a href="https://github.com/pandafy" rel="noopener noreferrer"&gt;Gagan Deep&lt;/a&gt;, &lt;a href="https://github.com/nickberry17" rel="noopener noreferrer"&gt;Nicholas Smith&lt;/a&gt; and &lt;a href="https://github.com/feckert" rel="noopener noreferrer"&gt;Florian Eckert&lt;/a&gt; who try to ensure that project moves in the right direction by continuously providing reviews and suggestions. Warm regards to &lt;a href="https://www.telcoantennas.com.au/" rel="noopener noreferrer"&gt;TelcoAntennas&lt;/a&gt; too, who provides access to a staging instance for testing the work.&lt;/p&gt;

&lt;p&gt;with this project, I learned about Lua, OpenWRT, NetJSON and MakeFile.&lt;/p&gt;

&lt;p&gt;Some of the key learnings from this projects are:-&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Ask a lot&lt;/strong&gt;:- Getting your queries resolved and having a clear image in mind is a necessity to work. Do ask them and try to get all answers before working. This is also important since it saves a lot of time. I too encountered a lot of doubts from the very beginning since I start looking at the project ideas to their implementation. I asked them on &lt;a href="https://gitter.im/openwisp/gsoc2021-ow-monitoring-openwrt-package" rel="noopener noreferrer"&gt;IM channel&lt;/a&gt; to get clarifications. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Small Achievable Goals&lt;/strong&gt;:- This is what Federico suggests to do. As soon as the selected students' list was announced, we were asked to create issues ensuring all the deliverables mentioned in the proposal are covered and each issue has a description that outlines the plan for that issue.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Keep Testing&lt;/strong&gt;:- In small personal projects this may be skipped but in a project that will be used by a lot of users, testing is important. If any change is done, it should be tested. &lt;strong&gt;Test your code, test your docs and also test your tests.&lt;/strong&gt; Ensure there are automated tests where they can, yet try to keep testing things manually to ensure everything will work as it should.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Managing time is the Key&lt;/strong&gt;:- Although in middle I failed to do that, it is indeed important. One should not get stuck by a blocker and keep working. I will not emphasize it more as there are a lot of articles already for that.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Be Ready to Debug&lt;/strong&gt;:- Nothing is 100% bug-free. Bugs can come from nowhere. So, one should be prepared to debug their code. I spent the last two weeks on this. Although I was not doing it alone. For this, we have a &lt;a href="https://github.com/openwisp/openwrt-openwisp-monitoring/tree/master#debugging" rel="noopener noreferrer"&gt;dedicated section for debugging&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  What's Next?
&lt;/h2&gt;

&lt;p&gt;Some things are that are discussed recently and we will work on them. Also, some of the pull requests are in the progress column that to should be completed before releasing the first version of this project.&lt;br&gt;
Also, I plan to start looking in other modules too (mainly the work done by my peers during GSOC) so that I can learn more about OpenWISP and its working.&lt;/p&gt;

</description>
      <category>openwrt</category>
      <category>opensource</category>
      <category>openwisp</category>
      <category>networks</category>
    </item>
    <item>
      <title>My Journey to GSoC</title>
      <dc:creator>Kapil Bansal</dc:creator>
      <pubDate>Thu, 27 May 2021 17:59:16 +0000</pubDate>
      <link>https://dev.to/devkapilbansal/my-journey-to-gsoc-1a50</link>
      <guid>https://dev.to/devkapilbansal/my-journey-to-gsoc-1a50</guid>
      <description>&lt;p&gt;If you are reading this blog, then you probably know about GSoC already.&lt;br&gt;
If not, then Google Summer of Code, abbreviated as GSoC is a 10 week global summer program administrated by Google which mainly focuses on bringing student developers into the field of Open Source and work on something useful.&lt;br&gt;
The main aim of this program remains the same, i.e. promoting Open Source. It is a kind of mentorship program where Open Source Organizations come forward with their project ideas. Students are then allowed to make proposals on any of those ideas or propose a new one. Accepted students work closely with their mentors and learn about best practices in Software Development.&lt;br&gt;
It is a win-win situation for everyone. Students get a chance to learn from their mentors and earn real world exposure. Sometimes, the syllabus taught in Colleges may be obsolete preventing students to learn about the current tech stack prevailing in the market. Open Source programs like GSoC try to bridge that gap. Organizations also get some good contributors to make their project better.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Open Source?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--4-v1BF_v--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/e2q34d6oiqzbmz5tffuo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--4-v1BF_v--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/e2q34d6oiqzbmz5tffuo.png" alt="Open Source Word Cloud"&gt;&lt;/a&gt;&lt;br&gt;
Before knowing why, you should know what, i.e. *&lt;em&gt;What is Open Source? *&lt;/em&gt;&lt;br&gt;
A google search may reveal better results but here are two points that I will reshare.&lt;br&gt;
In Open Source,&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You can access, modify and resue it freely.&lt;/li&gt;
&lt;li&gt;Its source code can be inspected, modified and enhanced by anyone in the world.
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--KYawNOUQ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/x9med2rlwhovskwpm3ht.png" alt="Quote by Linus Torvalds"&gt;
Open Source is one of the best things in software industry as Open Source technologies die hard. And what I believe is, Open Source is the easiest way to learn and grow.
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Zr6W1X19--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/wep1pnzz8ycmn6c49pdl.jpeg" alt="why open source"&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"Okay, I understand that I should contribute to Open Source. I too want to, but how? That codebase is already big and a lot of contributors with more experience than me are working. Then why will they need me? Also, I don't know exactly what is happening in the code?"&lt;/em&gt;  -  If you  too have some similar feelings, then you are not alone. Almost everyone got intimated.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;To everyone already indulge in it, whenever I ask these questions, reply remains same, "Just get started". No matter if you understand it clearly or not, if you have relevant experience, just start. You will learn as time passes. Be consistent and try to learn.&lt;/p&gt;

&lt;h2&gt;
  
  
  How To Get Started?
&lt;/h2&gt;

&lt;p&gt;At first, you should know what the software is trying to do. Try to follow instructions, setup the project locally and play with it. Almost every Open Source organization documents how newcomers can help them. Go through that documentation and try to follow the same.&lt;/p&gt;

&lt;p&gt;You may stuck at points, but it is fine. Ask your doubts in community. You can find communication channel too easily, it may be a mailing list, or any other messaging service.&lt;/p&gt;

&lt;p&gt;There is no harm in solving beginner friendly issues first, doing 2–3 lines changes will work too. Once you feel good, you can move forward to other issues.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;a href="https://openwisp.io/docs/general/values.html#what-is-openwisp"&gt;OpenWISP&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;OpenWISP is a software platform designed to ease and automate the management of networks, with a special focus on wireless networks, mainly used in public wifi, mesh networks, community networks and IoT scenarios.&lt;/p&gt;

&lt;p&gt;OpenWISP is built with Django, using its features like modularity and extendability. It's lot easier to customise it for your use case.&lt;/p&gt;

&lt;p&gt;My application is selected with OpenWISP this year. I will be working on Packaging the code on OpenWRT this GSoC. &lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--FZA7oE3B--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/b1ysazbaje53vuchgnmu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--FZA7oE3B--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/b1ysazbaje53vuchgnmu.png" alt="GSoC"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Why OpenWISP?
&lt;/h2&gt;

&lt;p&gt;My main reason for choosing is my familiarity with Django. Also, OpenWISP deals with something that I am keen to learn, i.e. Networks. Although I was not able to understand anything while starting but OpenWISP community helps me with each step.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://openwisp.org"&gt;OpenWISP&lt;/a&gt; is a good choice for anyone interested in Computer Networks.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to apply for GSoC?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://summerofcode.withgoogle.com/how-it-works/#timeline"&gt;GSoC timeline&lt;/a&gt; is announced at year end. You can check eligibility, and if you are they you can apply. Accepted organizations are announced usually in February. But, you need not to wait for this. You can start contributing now. Have a look at GSoC archive where you can have a list of previously selected GSoC organizations. Although, your focus should be to learn and contribute. Organizations may have some more rules to take part in GSoC with them, for which you should communicate with the community.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Missed GSoC, you need not to worry.&lt;/strong&gt; There are a lot of other opportunities too. &lt;/p&gt;

&lt;p&gt;At last, remember "Open Source is for Everyone" and "Open Source is about Collaboration, not Competition."&lt;/p&gt;

&lt;h2&gt;
  
  
  My first PR got merged
&lt;/h2&gt;

&lt;p&gt;I contribute in OpenWISP in August, when I was sitting idle waiting for next semester to start. As I learned Git just a month or two ago, and that was the only prerequisite I heard of, I decided to contribute. Luckily, I found an &lt;a href="https://github.com/openwisp/django-rest-framework-gis/issues/230"&gt;easy issue related to formatting&lt;/a&gt;. Although it was an issue easy it took a week for the &lt;a href="https://github.com/openwisp/django-rest-framework-gis/pull/231"&gt;PR to get ready for merge&lt;/a&gt;. Here, I learned about flake8 and other formatters for the first time.&lt;br&gt;
Getting my first PR merged, was no less than an achievement for me. After that, I start looking for an issue that I understand and try to solve it.&lt;br&gt;
I learned a lot more things in the journey. Docker, decorators, RST syntax, continuos intergration are some of them.  &lt;/p&gt;

&lt;p&gt;Further Reading&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://medium.com/code-for-cause/i-got-selected-for-gsoc-9ef5510bfa97"&gt;I got selected for GSoC by @pandafy &lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=dDE3tOa4JUs"&gt;20 Open Source Programs &amp;amp; Paid Virtual Internships You Can Apply to!&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>gsoc</category>
      <category>openwisp</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
