<?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: Anirudhan</title>
    <description>The latest articles on DEV Community by Anirudhan (@anirudhann).</description>
    <link>https://dev.to/anirudhann</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%2F512830%2F21fb94db-9ed5-4189-9b3f-ef7edeb4a85e.png</url>
      <title>DEV Community: Anirudhan</title>
      <link>https://dev.to/anirudhann</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/anirudhann"/>
    <language>en</language>
    <item>
      <title>Significant traits that differentiate a great leader from a good manager!</title>
      <dc:creator>Anirudhan</dc:creator>
      <pubDate>Fri, 17 Sep 2021 04:48:21 +0000</pubDate>
      <link>https://dev.to/anirudhann/significant-traits-that-differentiate-a-great-leader-from-a-good-manager-1eih</link>
      <guid>https://dev.to/anirudhann/significant-traits-that-differentiate-a-great-leader-from-a-good-manager-1eih</guid>
      <description>&lt;p&gt;In my brief career, I have had the opportunity to work under different types of managers. A good manager is someone who manages people and gets their work done. But have you ever considered becoming a great leader 🤴🏻?&lt;/p&gt;

&lt;p&gt;If this is the case, then read on for some useful hints to help you transform 😃!&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Personal well-being&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;They genuinely care about our well-being. They lend a hand 💪whenever and in whatever way they can, whether it's for physical or mental health issues, or any other personal or financial problems. They recognize that even the smallest relief from your personal strain can improve your comfort, which can have a substantial impact on your professional productivity.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Building Trust&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Trust is one of the most difficult things to gain from a person. It builds over time. Honesty is the most important aspect of establishing trust 🤞. They should always be honest and open with you about themselves, their team, and the company. If the leader has earned the employees' trust, the crew will simply follow in their footsteps.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Make us feel accountable&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;They will not impeach us 😇 for our bad performance or other concerns. Rather, they will raise awareness of the issue and hold us accountable. They help us comprehend the underlying problem and make us not repeat it.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Pros-Cons analysis&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;They clearly understand the pros 👍 and cons 👎 of each team member and provide feedback. They rarely criticize or point out flaws that bring you down. Even when you perform poorly and fall short of the expected standard, they focus on the positive aspects of your situation and make advice on how to improve the downsides.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Earns Respect&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;They are the ones who continually work hard, inspire others, and gain respect 🙇. They may not always appreciate us in front of the camera, but they constantly support us behind the scenes, particularly when it comes to other teams and management.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Loves to Uplift People&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;They enjoy elevating or uplifting 🚀 those around them, and they provide all of their subordinates with appropriate feedback. They assist us in bringing out the best in us and making us feel like a better version of ourselves. &lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Consistent Learner&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;They may be skilled in technical or managerial areas, but they will not be able to aid the team in the long run unless and until they improve themselves. They are aware of this, and as a result, they are constantly working 🚧 to expand their knowledge in a variety of areas.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Business goals vs. Employee ambitions&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;One of the hardest challenges to accomplish in today's fast-paced IT business is balancing the needs of the organization with the goals of the employees. Strong leaders, on the other hand, are more likely to strike 🎯 a reasonable compromise between both.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Accepts blame and distributes credit&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;When the team performs well, they applaud the team and its members 👏. Nevertheless, when a problem arises, they accept full responsibility and holds them accountable.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Sow the seeds&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Plant the idea 🌱 in our heads that when we are in charge, we want to emulate them. We wish to lead by example, as they did. The energy of outstanding leaders is contagious, and it provokes us to think in a similar fashion. We want to sow the same seeds in our juniors so that they can blossom into exceptional leaders.&lt;/p&gt;

&lt;p&gt;⏩ &lt;em&gt;Finally, they are the ones who are always encouraging, motivating, and never fail to inspire us 🏆 !&lt;/em&gt;&lt;/p&gt;




&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Special Credits&lt;/strong&gt;: My Manager - &lt;a class="mentioned-user" href="https://dev.to/srkama"&gt;@srkama&lt;/a&gt;
 ❤️, from whom I observed, experienced, and learned these leadership qualities.&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>leadership</category>
      <category>management</category>
      <category>qualities</category>
    </item>
    <item>
      <title>Data Validation Libraries - Analysis &amp; Comparison using Python</title>
      <dc:creator>Anirudhan</dc:creator>
      <pubDate>Sun, 04 Apr 2021 09:51:40 +0000</pubDate>
      <link>https://dev.to/anirudhann/data-validation-libraries-analysis-comparison-using-python-31a4</link>
      <guid>https://dev.to/anirudhann/data-validation-libraries-analysis-comparison-using-python-31a4</guid>
      <description>&lt;p&gt;Here, I have taken some of the leading data validation libraries in 2021 and I have analyzed and compared them using python which can be highly useful for your applications. &lt;/p&gt;

&lt;p&gt;All the data validations libraries that I have utilized are &lt;strong&gt;Open Source tools&lt;/strong&gt; and are mentioned below:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cerberus&lt;/li&gt;
&lt;li&gt;Colander&lt;/li&gt;
&lt;li&gt;Jsonschema&lt;/li&gt;
&lt;li&gt;Marshmellow&lt;/li&gt;
&lt;li&gt;Pydantic&lt;/li&gt;
&lt;li&gt;Schema&lt;/li&gt;
&lt;li&gt;Voluptuous&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Below are some of the &lt;strong&gt;basic requirements/checks&lt;/strong&gt; to choose the suitable tool for your applications:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Mandatory field check&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Whenever we give request to an API, we will have certain fields as mandatory and few others as optional. So, I have considered this check as the primary one. No surprise here that all the leading libraries have this feature.  &lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Data Validation Libraries&lt;/th&gt;
&lt;th&gt;Mandatory field check&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Cerberus&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Colander&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Jsonschema&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Marshmellow&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pydantic&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Schema&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Voluptuous&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;2. Data type check&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;We all know most libraries will have certain standard data types (like str, int, dict, etc...) Even though its always advisable to make use of the standard datatypes provided by the validation libraries but sometimes we may need to extend standard libraries or to create own custom data type checks.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Data Validation Libraries&lt;/th&gt;
&lt;th&gt;Data type check&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Cerberus&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Colander&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Jsonschema&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Marshmellow&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pydantic&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Schema&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Voluptuous&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;3. Min and Max option&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;As a kind of basic option, Field values should be validated for Minimum and Maximum characters/integers allowed. No wonder that most libraries have this option.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Data Validation Libraries&lt;/th&gt;
&lt;th&gt;Min and Max option&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Cerberus&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Colander&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Jsonschema&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Marshmellow&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pydantic&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Schema&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Voluptuous&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;4. Regex option&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If we want to allow certain special characters or accept specific patterns, then indisputably, regex is the way to go and its quite indeed that all the below validation libraries have this feature.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Data Validation Libraries&lt;/th&gt;
&lt;th&gt;Regex option&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Cerberus&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Colander&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Jsonschema&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Marshmellow&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pydantic&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Schema&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Voluptuous&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;5. Dynamic field validation based on another field&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;To validate the field based on the other dynamic field value given in the request. This check at times becomes significant for few applications.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Data Validation Libraries&lt;/th&gt;
&lt;th&gt;Field validation based on other Dynamic field&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Cerberus&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Colander&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Jsonschema&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Marshmellow&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pydantic&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Schema&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Voluptuous&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;6. Custom validation&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Option to extend standard validation or create custom validation for our own applications.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Data Validation Libraries&lt;/th&gt;
&lt;th&gt;Custom validation&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Cerberus&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Colander&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Jsonschema&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Marshmellow&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pydantic&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Schema&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Voluptuous&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;7. Error response for all fields&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If multiple invalid values passed for various fields in the request, then it has to capture and throw error for all the invalid fields.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Data Validation Libraries&lt;/th&gt;
&lt;th&gt;Error response for all fields&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Cerberus&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Colander&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Jsonschema&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Marshmellow&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pydantic&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Schema&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Voluptuous&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;8. Dynamic Alert message option based on error&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Though we have standard error definition for different types of errors applicable for each field. Sometimes we may require to configure custom error message for few fields in our applications.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Data Validation Libraries&lt;/th&gt;
&lt;th&gt;Dynamic alert message option&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Cerberus&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Colander&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Jsonschema&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Marshmellow&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pydantic&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Schema&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Voluptuous&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;9. Schema/Model Re-usability&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;On few occasions, we may need to extend or reuse necessary Schema/Model created for one of the API. This is nothing but class Inheritance.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Data Validation Libraries&lt;/th&gt;
&lt;th&gt;Schema/Model Re-usability&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Cerberus&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Colander&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Jsonschema&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Marshmellow&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pydantic&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Schema&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Voluptuous&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;10. Python support&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;We also need to consider latest python version compatibility &amp;amp; forum support for the chosen packages (considered till March 2021)&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Data Validation Libraries&lt;/th&gt;
&lt;th&gt;Python support&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Cerberus&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Colander&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Jsonschema&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Marshmellow&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pydantic&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Schema&lt;/td&gt;
&lt;td&gt;Support is less&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Voluptuous&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Libraries to Pick&lt;/strong&gt;&lt;br&gt;
Clearly, we could see that only four out of seven data validation libraries satisfies all our criteria's mentioned above.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Pydantic, &lt;/li&gt;
&lt;li&gt;Marshmallow, &lt;/li&gt;
&lt;li&gt;Jsonschema and &lt;/li&gt;
&lt;li&gt;Colander &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Performance comparison&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;We chose top three libraries from the above list and ran performance testing. &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Number of records given in the request vs Time taken (in seconds) to process the request&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Number of records&lt;/th&gt;
&lt;th&gt;Pydantic&lt;/th&gt;
&lt;th&gt;Marshmallow&lt;/th&gt;
&lt;th&gt;Jsonschema&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;0.0039&lt;/td&gt;
&lt;td&gt;0.033&lt;/td&gt;
&lt;td&gt;0.037&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1000 (1k)&lt;/td&gt;
&lt;td&gt;0.036&lt;/td&gt;
&lt;td&gt;0.41&lt;/td&gt;
&lt;td&gt;0.37&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10000 (10k)&lt;/td&gt;
&lt;td&gt;0.36&lt;/td&gt;
&lt;td&gt;3.36&lt;/td&gt;
&lt;td&gt;3.59&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;100000 (1L)&lt;/td&gt;
&lt;td&gt;3.60&lt;/td&gt;
&lt;td&gt;33.52&lt;/td&gt;
&lt;td&gt;35.84&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;1000000 (10L)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;50.52&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;644.06&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;797.40&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Clearly, we could see that &lt;strong&gt;Pydantic is 10X faster&lt;/strong&gt; than other leading data validation libraries like Marshmallow, Jsonschema. &lt;/p&gt;

&lt;p&gt;Hence &lt;strong&gt;Pydantic is an absolute winner&lt;/strong&gt; and seems to satisfy all our basic requirements with a lightening performance (processing 10L requests in a minute)&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Note: Please refer the attached link in my GitHub account for the sample python codebase for each of the libraries and how to effectively use the above functionalities or checks that I have briefly explained&lt;/code&gt; &lt;br&gt;
&lt;a href="https://github.com/Anirudhann/PoC_data_validation_libs_python/"&gt;PoC on data validation libraries python&lt;/a&gt;&lt;/p&gt;

</description>
      <category>python</category>
      <category>datavalidation</category>
      <category>validationlibraries</category>
      <category>pydantic</category>
    </item>
    <item>
      <title>SFTP server in Ubuntu</title>
      <dc:creator>Anirudhan</dc:creator>
      <pubDate>Thu, 03 Dec 2020 10:39:13 +0000</pubDate>
      <link>https://dev.to/anirudhann/sftp-server-in-ubuntu-4c7b</link>
      <guid>https://dev.to/anirudhann/sftp-server-in-ubuntu-4c7b</guid>
      <description>&lt;p&gt;As you all know, there are already multiple sites and blogs available in the internet for configuring SFTP server in Ubuntu. This is no difference from them in terms of content. Instead, I am just quickly summarizing the steps here and even giving little insights (with screenshots) for any reference in the future.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; Please use &lt;code&gt;sudo&lt;/code&gt; before each command if not &lt;code&gt;root&lt;/code&gt; user&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Verify SSH is installed in your ubuntu&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;systemctl status ssh&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="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%2Fi%2Fy22dgssy2bq7a9npynj2.JPG" class="article-body-image-wrapper"&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%2Fi%2Fy22dgssy2bq7a9npynj2.JPG" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If SSH not installed, please follow the below steps to install it&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Install it - &lt;code&gt;apt-get install openssh-server&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Enable the ssh service - &lt;code&gt;systemctl enable ssh&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Start the ssh service - &lt;code&gt;systemctl start ssh&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Now that SSH is installed and running on your Ubuntu system you can connect to it via SSH from any remote machine.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Try accessing the system using SSH - &lt;code&gt;ssh user@server-name&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you can't connect to remote machine using SSH, please make sure to enable firewall on that ubuntu system&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Check the status of the firewall - ufw status&lt;/li&gt;
&lt;li&gt;Open the SSH port in firewall - &lt;code&gt;ufw allow ssh&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Enable the firewall - &lt;code&gt;ufw enable&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Create a parent folder for sftp&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Once you connect sftp, this will be the parent folder. &lt;/p&gt;

&lt;p&gt;E.g. I have already created a folder named 'sftp' in the root ('/') directory as shown in the below diagram.&lt;/p&gt;

&lt;p&gt;&lt;a href="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%2Fi%2Ftirjprcd7he77uwqy2rt.JPG" class="article-body-image-wrapper"&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%2Fi%2Ftirjprcd7he77uwqy2rt.JPG" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Create a new group to access sftp server&lt;/strong&gt;
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;This step is optional. You can create a group and then add user to it or directly create a user too - To access sftp server&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;Create a new group - &lt;code&gt;addgroup sftpusers&lt;/code&gt; (&lt;strong&gt;sftpusers&lt;/strong&gt; is the group name)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="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%2Fi%2Fjnisoijt0w55bi3elocb.JPG" class="article-body-image-wrapper"&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%2Fi%2Fjnisoijt0w55bi3elocb.JPG" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Create a new user to access sftp server&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Create a new user - &lt;code&gt;useradd sftpuser&lt;/code&gt; (&lt;strong&gt;sftpuser&lt;/strong&gt; is the user name)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="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%2Fi%2Fo3xn2vkbaj1zz1mt9eoe.JPG" class="article-body-image-wrapper"&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%2Fi%2Fo3xn2vkbaj1zz1mt9eoe.JPG" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Verify the new user created - &lt;code&gt;less /etc/passwd | grep sftpuser&lt;/code&gt; (&lt;strong&gt;sftpuser&lt;/strong&gt; is the user that I have created)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="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%2Fi%2Fcp5fuwv0plshax8tes85.JPG" class="article-body-image-wrapper"&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%2Fi%2Fcp5fuwv0plshax8tes85.JPG" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Set the password for the new user created - &lt;code&gt;passwd sftpuser&lt;/code&gt; (Ensure to &lt;strong&gt;remember the password&lt;/strong&gt; for the created user)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="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%2Fi%2Fa97d3e96rmbfx12knvdl.JPG" class="article-body-image-wrapper"&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%2Fi%2Fa97d3e96rmbfx12knvdl.JPG" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Add this new user to the group created&lt;/strong&gt;
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;Please skip this step, if you didn't create a group and plan to access sftp server directly using the user&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;Add the new user to new group created - &lt;code&gt;usermod -a -G sftpusers sftpuser&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="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%2Fi%2Fg05j498yqf1oq5kbs0mi.JPG" class="article-body-image-wrapper"&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%2Fi%2Fg05j498yqf1oq5kbs0mi.JPG" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Verify the user is added to the group - &lt;code&gt;grep sftpusers /etc/group&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="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%2Fi%2F46vze7p9jd7qix8hbfic.JPG" class="article-body-image-wrapper"&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%2Fi%2F46vze7p9jd7qix8hbfic.JPG" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Create directories inside sftp folder&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Create a directory inside parent sftp directory (here inside /sftp)&lt;/p&gt;

&lt;p&gt;E.g. Creating couple of directories named uploads, downloads inside /sftp directory&lt;/p&gt;

&lt;p&gt;&lt;a href="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%2Fi%2Fehq7zqiyor0vnxklxgow.JPG" class="article-body-image-wrapper"&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%2Fi%2Fehq7zqiyor0vnxklxgow.JPG" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Set permission for the created directories inside sftp folder&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Give ownership and full permission for the root to access parent directory - &lt;code&gt;chown root:root /sftp&lt;/code&gt; and &lt;code&gt;chmod 755 /sftp&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="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%2Fi%2F4duifz8agwpaps1vsjrb.JPG" class="article-body-image-wrapper"&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%2Fi%2F4duifz8agwpaps1vsjrb.JPG" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Likewise, give ownership for the user/ group to the folders inside parent directory&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If group created - &lt;code&gt;chown sftpuser:sftpusers /sftp/uploads /sftp/downloads&lt;/code&gt; &lt;/li&gt;
&lt;li&gt;If user only created not group - &lt;code&gt;chown sftpuser /sftp/uploads /sftp/downloads&lt;/code&gt; [here &lt;code&gt;sftpuser&lt;/code&gt; is the user]&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Here &lt;code&gt;sftpuser&lt;/code&gt; is the username and &lt;code&gt;sftpusers&lt;/code&gt; is the groupname that we have created above&lt;/p&gt;
&lt;/blockquote&gt;


&lt;/li&gt;

&lt;li&gt;&lt;p&gt;Provide required permission to the folders inside parent directory - &lt;code&gt;chmod 775 /sftp/uploads /sftp/downloads&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;&lt;a href="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%2Fi%2Fvd1sa1y32ts9mc0pqymx.JPG" class="article-body-image-wrapper"&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%2Fi%2Fvd1sa1y32ts9mc0pqymx.JPG" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Modify the SSH server configuration file&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Open the SSH server configuration file - &lt;code&gt;sudo nano /etc/ssh/sshd_config&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Comment out the following line - &lt;code&gt;#Subsystem sftp /usr/lib/openssh/sftp-server&lt;/code&gt; (Highlighted in Yellow)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Also, add block of lines at the end of file to enable sftp (Highlighted in Yellow), then save the file&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="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%2Fi%2Fsjgfn1dqcgejqli68x5z.JPG" class="article-body-image-wrapper"&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%2Fi%2Fsjgfn1dqcgejqli68x5z.JPG" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;For the specification of parent folder created for SFTP and if only user created (not group) to access SFTP server - Refer the text (Highlighted in Red)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Restart the SSH service&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;To apply the configuration changes, restart the service - &lt;code&gt;systemctl restart sshd&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="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%2Fi%2Fgkjz2t52ambsfyr35orm.JPG" class="article-body-image-wrapper"&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%2Fi%2Fgkjz2t52ambsfyr35orm.JPG" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Verify the SFTP connection&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Now you can access SFTP server using the following command - &lt;code&gt;sftp username@hostname&lt;/code&gt; [here &lt;code&gt;sftp sftpuser@localhost&lt;/code&gt;]&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;After entering the password, it will go inside the sftp parent directory configured in the above step [here &lt;code&gt;/sftp&lt;/code&gt;] within which it will show the folders we have created [here two folders named &lt;code&gt;uploads&lt;/code&gt; and &lt;code&gt;downloads&lt;/code&gt; will be shown - which is created before]&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="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%2Fi%2F9fctlck9z597l6ds0uqz.JPG" class="article-body-image-wrapper"&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%2Fi%2F9fctlck9z597l6ds0uqz.JPG" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Hurray ! Now you have successfully configured SFTP server and accessed it&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; In real-time operating system, SFTP is configured in a particular server (or the even the whole server is used for SFTP purpose) and all the applications access the SFTP server by mentioning the respective hostname, port, username and password&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>sftp</category>
      <category>ssh</category>
      <category>ubuntu</category>
      <category>beginners</category>
    </item>
  </channel>
</rss>
