<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="https://blog.rajnath.dev/feed.xml" rel="self" type="application/atom+xml" /><link href="https://blog.rajnath.dev/" rel="alternate" type="text/html" /><updated>2025-05-01T10:20:52+00:00</updated><id>https://blog.rajnath.dev/feed.xml</id><title type="html">Home</title><subtitle>Technology, tutorial, experience, mistakes and learnings.</subtitle><author><name>Raj Nath Sah</name></author><entry><title type="html">CI/CD Using Github</title><link href="https://blog.rajnath.dev/ci-cd-github/" rel="alternate" type="text/html" title="CI/CD Using Github" /><published>2025-05-01T00:00:00+00:00</published><updated>2025-05-01T00:00:00+00:00</updated><id>https://blog.rajnath.dev/ci-cd-github</id><content type="html" xml:base="https://blog.rajnath.dev/ci-cd-github/"><![CDATA[<h1 id="continuous-integration-and-continuous-deployment">Continuous integration and continuous deployment</h1>

<p>Continuous Integration (CI) and Continuous Deployment (CD) are key practices in modern software development that streamline the release process. CI involves frequently integrating code changes into a central repository and running automated tests to catch issues early. 
CD, on the other hand, focuses on the automated release of code changes to production after they pass through the CI process.</p>

<p>We will explore the concept with sample example and easy to follow steps.</p>

<h2 id="prerequisites">Prerequisites</h2>
<ul>
  <li>Basic understanding of Git and GitHub</li>
  <li>Familiarity with Python programming language</li>
  <li>A GitHub account</li>
  <li>A basic understanding of CI/CD concepts</li>
  <li>A sample Python project (can be a simple FastAPI, Flask or Django app)</li>
  <li>A CI/CD tool (e.g., GitHub Actions, Travis CI, CircleCI) for automation</li>
  <li>Basic knowledge of Docker (optional, but recommended for containerization)</li>
</ul>

<h2 id="step-1-set-up-your-github-repository">Step 1: Set Up Your GitHub Repository</h2>
<ol>
  <li>Create a new repository on GitHub for your Python project.</li>
  <li>Clone the repository to your local machine using Git.
    <div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code> git clone &lt;repository_url&gt;
 <span class="nb">cd</span> &lt;repository_name&gt;
</code></pre></div>    </div>
  </li>
  <li>Create a new branch for your CI/CD setup.
    <div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code> git checkout <span class="nt">-b</span> ci-cd-setup
</code></pre></div>    </div>
  </li>
  <li>Add your Python project files to the repository.
    <div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code> git add <span class="nb">.</span>
 git commit <span class="nt">-m</span> <span class="s2">"Add Python project files"</span>
 git push origin ci-cd-setup
</code></pre></div>    </div>
  </li>
  <li>Create a pull request to merge the <code class="language-plaintext highlighter-rouge">ci-cd-setup</code> branch into the <code class="language-plaintext highlighter-rouge">main</code> branch.</li>
  <li>Review and merge the pull request on GitHub.</li>
</ol>

<h2 id="step-2-create-a-cicd-configuration-file">Step 2: Create a CI/CD Configuration File</h2>
<ol>
  <li>In the root of your repository, create a directory named <code class="language-plaintext highlighter-rouge">.github/workflows</code>.</li>
  <li>Inside the <code class="language-plaintext highlighter-rouge">workflows</code> directory, create a YAML file (e.g., <code class="language-plaintext highlighter-rouge">ci-cd.yml</code>) for your CI/CD configuration.</li>
  <li>For this example, we will use GitHub Actions as our CI/CD tool. The YAML file will define the workflow for building, testing, creating release and deploying your Python application.</li>
  <li>Add the following sample configuration to the YAML file:
    <div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code> <span class="na">name</span><span class="pi">:</span> <span class="s">Python application CI, Build, Release, and Containerize</span>

 <span class="na">on</span><span class="pi">:</span>
 <span class="na">push</span><span class="pi">:</span>
     <span class="na">branches</span><span class="pi">:</span> <span class="pi">[</span><span class="s2">"</span><span class="s">main"</span><span class="pi">]</span>
 <span class="na">pull_request</span><span class="pi">:</span>
     <span class="na">branches</span><span class="pi">:</span> <span class="pi">[</span><span class="s2">"</span><span class="s">main"</span><span class="pi">]</span>

 <span class="na">permissions</span><span class="pi">:</span>
 <span class="na">contents</span><span class="pi">:</span> <span class="s">write</span> <span class="c1"># Need write permission to create releases/tags and upload artifacts</span>
 <span class="na">packages</span><span class="pi">:</span> <span class="s">write</span> <span class="c1"># Need write permission to push to GHCR</span>

 <span class="na">jobs</span><span class="pi">:</span>
 <span class="c1"># --- Build and Test Job ---</span>
 <span class="na">build_and_test</span><span class="pi">:</span>
     <span class="na">runs-on</span><span class="pi">:</span> <span class="s">ubuntu-latest</span>
     <span class="na">steps</span><span class="pi">:</span>
     <span class="pi">-</span> <span class="na">name</span><span class="pi">:</span> <span class="s">Checkout code</span>
         <span class="s">uses</span><span class="err">:</span> <span class="s">actions/checkout@v4</span>

     <span class="pi">-</span> <span class="na">name</span><span class="pi">:</span> <span class="s">Set up Python </span><span class="m">3.10</span>
         <span class="na">uses</span><span class="pi">:</span> <span class="s">actions/setup-python@v5</span>
         <span class="na">with</span><span class="pi">:</span>
         <span class="na">python-version</span><span class="pi">:</span> <span class="s2">"</span><span class="s">3.10"</span>
         <span class="na">cache</span><span class="pi">:</span> <span class="s2">"</span><span class="s">pip"</span>

     <span class="pi">-</span> <span class="na">name</span><span class="pi">:</span> <span class="s">Install Test Dependencies</span>
         <span class="s">run</span><span class="err">:</span> <span class="pi">|</span>
         <span class="s">python -m pip install --upgrade pip</span>
         <span class="s">if [ -f requirements.txt ]; then</span>
             <span class="s">pip install -r requirements.txt</span>
         <span class="s">else</span>
             <span class="s">echo "Dependency file not found!"</span>
             <span class="s">exit 1</span>
         <span class="s">fi</span>

     <span class="pi">-</span> <span class="na">name</span><span class="pi">:</span> <span class="s">Test with pytest and check coverage</span>
         <span class="s">run</span><span class="err">:</span> <span class="pi">|</span>
         <span class="s">pytest --cov=src --cov=. --cov-report=term-missing --cov-report=xml --cov-fail-under=80    </span>

 <span class="c1"># --- Build and Push Docker Image Job ---</span>
 <span class="na">build_and_push_docker</span><span class="pi">:</span>
     <span class="na">needs</span><span class="pi">:</span> <span class="s">build_and_test</span>
     <span class="na">runs-on</span><span class="pi">:</span> <span class="s">ubuntu-latest</span>
     <span class="na">steps</span><span class="pi">:</span>
     <span class="pi">-</span> <span class="na">name</span><span class="pi">:</span> <span class="s">Checkout code</span>
         <span class="s">uses</span><span class="err">:</span> <span class="s">actions/checkout@v4</span>

     <span class="pi">-</span> <span class="na">name</span><span class="pi">:</span> <span class="s">Log in to GitHub Container Registry</span>
         <span class="s">uses</span><span class="err">:</span> <span class="s">docker/login-action@v2</span>
         <span class="s">with</span><span class="err">:</span>
         <span class="na">registry</span><span class="pi">:</span> <span class="s">ghcr.io</span>
         <span class="na">username</span><span class="pi">:</span> <span class="s">$</span>
         <span class="na">password</span><span class="pi">:</span> <span class="s">$</span>

     <span class="pi">-</span> <span class="na">name</span><span class="pi">:</span> <span class="s">Build Docker Image</span>
         <span class="s">run</span><span class="err">:</span> <span class="pi">|</span>
         <span class="s">docker build -t ghcr.io/$/$:latest .</span>

     <span class="pi">-</span> <span class="na">name</span><span class="pi">:</span> <span class="s">Push Docker Image</span>
         <span class="s">run</span><span class="err">:</span> <span class="pi">|</span>
         <span class="s">docker push ghcr.io/$/$:latest</span>

     <span class="pi">-</span> <span class="na">name</span><span class="pi">:</span> <span class="s">Output Docker Image Details</span>
         <span class="s">id</span><span class="err">:</span> <span class="s">docker_meta</span>
         <span class="s">run</span><span class="err">:</span> <span class="pi">|</span>
         <span class="s">echo "image_tag=ghcr.io/$/$:latest" &gt;&gt; $GITHUB_ENV</span>
         <span class="s">echo "image_digest=$(docker inspect --format='' ghcr.io/$/$:latest)" &gt;&gt; $GITHUB_ENV</span>
         <span class="s">env:</span>
         <span class="s">GITHUB_ENV: $GITHUB_ENV</span>

 <span class="c1"># --- Create Release Job ---</span>
 <span class="na">create_release</span><span class="pi">:</span>
     <span class="na">needs</span><span class="pi">:</span> <span class="s">build_and_push_docker</span>
     <span class="na">runs-on</span><span class="pi">:</span> <span class="s">ubuntu-latest</span>
     <span class="na">steps</span><span class="pi">:</span>
     <span class="pi">-</span> <span class="na">name</span><span class="pi">:</span> <span class="s">Checkout code</span>
         <span class="s">uses</span><span class="err">:</span> <span class="s">actions/checkout@v4</span>

     <span class="pi">-</span> <span class="na">name</span><span class="pi">:</span> <span class="s">Create Release</span>
         <span class="s">uses</span><span class="err">:</span> <span class="s">actions/create-release@v1</span>
         <span class="s">env</span><span class="err">:</span>
         <span class="na">GITHUB_TOKEN</span><span class="pi">:</span> <span class="s">$</span>
         <span class="na">with</span><span class="pi">:</span>
         <span class="na">tag_name</span><span class="pi">:</span> <span class="s2">"</span><span class="s">v$"</span>
         <span class="na">release_name</span><span class="pi">:</span> <span class="s2">"</span><span class="s">Release</span><span class="nv"> </span><span class="s">v$"</span>
         <span class="na">body</span><span class="pi">:</span> <span class="pi">|</span>
             <span class="s">Automated release created by CI/CD workflow.</span>
             <span class="s">- Docker Image: ghcr.io/$/$:latest</span>
         <span class="na">draft</span><span class="pi">:</span> <span class="no">false</span>
         <span class="na">prerelease</span><span class="pi">:</span> <span class="no">false</span>

 <span class="c1"># --- Deploy Job ---</span>
 <span class="na">deploy</span><span class="pi">:</span>
     <span class="na">needs</span><span class="pi">:</span> <span class="s">build_and_push_docker</span>
     <span class="na">runs-on</span><span class="pi">:</span> <span class="s">self-hosted</span>
     <span class="na">steps</span><span class="pi">:</span>
     <span class="pi">-</span> <span class="na">name</span><span class="pi">:</span> <span class="s">Checkout code</span>
         <span class="s">uses</span><span class="err">:</span> <span class="s">actions/checkout@v4</span>

     <span class="pi">-</span> <span class="na">name</span><span class="pi">:</span> <span class="s">Deploy Code to Runner</span>
         <span class="s">run</span><span class="err">:</span> <span class="pi">|</span>
         <span class="s">mkdir -p /home/user/deployed_app</span>
         <span class="s">rsync -av --progress ./ /home/user/deployed_app --exclude .git --exclude .github --exclude .gitignore</span>
         <span class="s">nohup fastapi run --reload &amp;</span>
         <span class="s">echo "Code deployed to /home/user/deployed_app"</span>
</code></pre></div>    </div>
  </li>
  <li>This configuration defines two jobs: <code class="language-plaintext highlighter-rouge">build_and_test</code>, <code class="language-plaintext highlighter-rouge">build_and_push_docker</code>, <code class="language-plaintext highlighter-rouge">create_release</code> and <code class="language-plaintext highlighter-rouge">deploy</code>. The <code class="language-plaintext highlighter-rouge">build_and_test</code> job installs dependencies and runs tests, <code class="language-plaintext highlighter-rouge">build_and_push_docker</code> job build docker image and push it to github container registry by tagging with gitrepo, <code class="language-plaintext highlighter-rouge">create_release</code> creates release with autogenerated version number and image details, and <code class="language-plaintext highlighter-rouge">deploy</code> deploys the application to production using github runner.</li>
  <li>Github runner is a self-hosted runner that you need to set up on your server. You can follow the <a href="https://docs.github.com/en/actions/hosting-your-own-runners/about-self-hosted-runners">GitHub documentation</a> to set up a self-hosted runner.</li>
  <li>Customize the deployment step according to your deployment strategy (e.g., SSH, Docker, etc.).</li>
</ol>

<h2 id="step-3-commit-and-push-changes">Step 3: Commit and Push Changes</h2>
<ol>
  <li>Commit the changes to your <code class="language-plaintext highlighter-rouge">.github/workflows/ci-cd.yml</code> file.
    <div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>git add .github/workflows/ci-cd.yml
git commit <span class="nt">-m</span> <span class="s2">"Add CI/CD configuration"</span>
git push origin main
</code></pre></div>    </div>
  </li>
  <li>This will trigger the CI/CD pipeline defined in the YAML file.</li>
  <li>You can monitor the progress of the pipeline in the “Actions” tab of your GitHub repository.</li>
</ol>

<h2 id="step-4-monitor-and-debug">Step 4: Monitor and Debug</h2>
<ol>
  <li>If the pipeline fails, check the logs for each step to identify the issue.</li>
  <li>Common issues may include missing dependencies, test failures, or deployment errors.</li>
  <li>Fix the issues in your code and commit the changes to trigger the pipeline again.</li>
  <li>Once the pipeline succeeds, your application will be deployed to production automatically.</li>
</ol>

<h2 id="conclusion">Conclusion</h2>
<p>In this tutorial, we explored how to set up a CI/CD pipeline using GitHub Actions for a Python project. We created a GitHub repository, configured the CI/CD pipeline, and monitored its execution. By automating the build, test, and deployment processes, we can ensure that our code is always in a deployable state, leading to faster and more reliable software releases. Sample code along with the configuration file is provided for reference and can be accessed <a href="https://github.com/rajnathsah/learncicdrelease">here</a></p>

<h2 id="additional-resources">Additional Resources</h2>
<ul>
  <li><a href="https://docs.github.com/en/actions">GitHub Actions Documentation</a></li>
  <li><a href="https://www.atlassian.com/continuous-delivery/ci-cd">Continuous Integration and Continuous Deployment</a></li>
  <li><a href="https://docs.python.org/3/library/unittest.html">Python Testing Documentation</a></li>
  <li><a href="https://docs.docker.com/">Docker Documentation</a></li>
  <li><a href="https://fastapi.tiangolo.com/">FastAPI Documentation</a></li>
  <li><a href="https://flask.palletsprojects.com/">Flask Documentation</a></li>
  <li><a href="https://www.djangoproject.com/">Django Documentation</a></li>
  <li><a href="https://docs.travis-ci.com/">Travis CI Documentation</a></li>
  <li><a href="https://circleci.com/docs/">CircleCI Documentation</a></li>
  <li><a href="https://git-scm.com/doc">Git Documentation</a></li>
  <li><a href="https://docs.github.com/en">GitHub Documentation</a></li>
  <li><a href="https://docs.python.org/3/">Python Documentation</a></li>
  <li><a href="https://github.com/marketplace?type=actions">GitHub Actions Marketplace</a></li>
  <li><a href="https://github.com/actions">GitHub Actions Examples</a></li>
  <li>
    <h2 id="github-actions-cicd"><a href="https://github.com/actions">GitHub Actions CI/CD</a></h2>
  </li>
</ul>]]></content><author><name>Raj Nath Sah</name></author><category term="CI/CD" /><category term="Github" /><category term="Python" /><summary type="html"><![CDATA[Continuous integration and continuous deployment using Github]]></summary></entry><entry><title type="html">Python Learning Path - 1</title><link href="https://blog.rajnath.dev/python/" rel="alternate" type="text/html" title="Python Learning Path - 1" /><published>2024-10-15T00:00:00+00:00</published><updated>2024-10-15T00:00:00+00:00</updated><id>https://blog.rajnath.dev/python</id><content type="html" xml:base="https://blog.rajnath.dev/python/"><![CDATA[<h1 id="python">Python</h1>

<p>Thinking of learning Python or planing to change career track to be Python developer.</p>

<p>Let us start with few job profile where Python developers are in demand: <em>Python Developer, Data Analyst, Automation Engineer, Full Stack Python Developer, Backend Engineer, Data Engineer, Machine Learning Engineer</em></p>

<p>All right! then let us start the journey of learning Python.</p>

<h1 id="basic-python-learning-plan">Basic Python Learning Plan</h1>
<ol>
  <li>Introduction to Python
    <ul>
      <li>Python installation and setup</li>
      <li>Basic syntax and data types</li>
      <li>Variables and operators</li>
      <li>Links
        <ul>
          <li>https://docs.python.org/3/tutorial/</li>
          <li>ttps://www.w3schools.com/python/</li>
        </ul>
      </li>
    </ul>
  </li>
  <li>Control Flow
    <ul>
      <li>Conditional statements (if, elif, else)</li>
      <li>Loops (for, while)</li>
      <li>Break and continue statements</li>
      <li>Links
        <ul>
          <li>https://realpython.com/python-conditional-statements/</li>
          <li>https://www.learnpython.org/en/Loops</li>
        </ul>
      </li>
    </ul>
  </li>
  <li>Functions
    <ul>
      <li>Defining and calling functions</li>
      <li>Function arguments and return values</li>
      <li>Lambda functions</li>
      <li>Links
        <ul>
          <li>https://realpython.com/defining-your-own-python-function/</li>
          <li>https://www.w3schools.com/python/python_lambda.asp</li>
        </ul>
      </li>
    </ul>
  </li>
  <li>Data Structures
    <ul>
      <li>List, tuples, sets and dictionaries</li>
      <li>List comprehensions</li>
      <li>Dictionary comprehensions</li>
      <li>Links
        <ul>
          <li>https://docs.python.org/3/tutorial/datastructures.html</li>
          <li>https://realpython.com/python-data-structures/</li>
        </ul>
      </li>
    </ul>
  </li>
  <li>File Handling
    <ul>
      <li>Reading and writing files</li>
      <li>Working with different file formats (Csv, Json, Excel)</li>
      <li>Links
        <ul>
          <li>https://realpython.com/read-write-files-python/</li>
          <li>https://realpython.com/python-csv/</li>
        </ul>
      </li>
    </ul>
  </li>
  <li>Modules and Packages
    <ul>
      <li>Importing modules</li>
      <li>Creating and using packages</li>
      <li>Standard library review</li>
      <li>Links
        <ul>
          <li>https://docs.python.org/3/tutorial/modules.html</li>
          <li>https://realpython.com/python-modules-packages/</li>
        </ul>
      </li>
    </ul>
  </li>
  <li>Error and Exception Handling
    <ul>
      <li>Try, except and finally block</li>
      <li>Handling different type of exceptions</li>
      <li>Raising exceptions</li>
      <li>Links
        <ul>
          <li>https://docs.python.org/3/tutorial/errors.html</li>
          <li>https://realpython.com/python-exceptions/</li>
        </ul>
      </li>
    </ul>
  </li>
  <li>Basic Object Oriented Programming
    <ul>
      <li>Classes and objects</li>
      <li>Methods and attributes</li>
      <li>Inheritance and polymorphism</li>
      <li>Links
        <ul>
          <li>https://realpython.com/python3-object-oriented-programming/</li>
          <li>https://docs.python.org/3/tutorial/classes.html</li>
        </ul>
      </li>
    </ul>
  </li>
</ol>

<h1 id="learning-materials">Learning Materials</h1>

<ul>
  <li><a href="https://automatetheboringstuff.com/">Automate the Boring Stuff with Python</a></li>
  <li><a href="https://www.python-course.eu/python_tkinter.php">tkinter</a></li>
  <li><a href="https://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-i-hello-world">Flask</a></li>
  <li><a href="https://www.youtube.com/user/schafer5">Corey Schafer YouTube Channel</a></li>
  <li><a href="https://indianpythonista.wordpress.com/2018/01/04/how-python-runs/">How Python Runs</a></li>
</ul>

<h1 id="books-for-reference-and-concept">Books for reference and concept</h1>
<p>Go through the books listed <a href="https://realpython.com/best-python-books/#python-cookbook">here</a> and based on your level of understanding, take any book and start reading it. In case you did not understand any topic or example of the book, don’t stop and spend too much time on it. You can always come back later and go through again.</p>

<h1 id="try-online-programming-challege">Try online programming challege</h1>
<p>Login to <a href="https://www.codewars.com/">codewars.com</a> and try some programming challege whenever you get sometime. It helps in mastering algorithm and python skill.</p>

<h1 id="desktop-application-development">Desktop application development</h1>
<ul>
  <li>Tkinter (https://docs.python.org/3/library/tkinter.html)</li>
  <li>PyQt (https://www.riverbankcomputing.com/static/Docs/PyQt5/)</li>
  <li>Kivy (https://kivy.org/doc/stable/)</li>
</ul>

<h1 id="web-application-and-api-development">Web application and API development</h1>
<ul>
  <li>Flask (https://flask.palletsprojects.com/)</li>
  <li>FastAPI (https://fastapi.tiangolo.com/)</li>
  <li>Django (https://www.djangoproject.com/)</li>
</ul>

<h1 id="learn-python-by-building-some-useful-projects">Learn Python by building some useful projects</h1>

<ul>
  <li>Build small window application using tkinter. Think of any problem which you want to solve, if you are not able to find then take any existing product where desktop application is used and develop application for it. This application should have login functionality, it should have main window with menus. To start with, you can use <a href="https://www.sqlite.org/index.html">sqlite</a> database. You can refer <a href="https://www.youtube.com/watch?v=pd-0G0MigUA">Python Sqlite</a> video to start with.
You can refer tkinter <a href="https://github.com/rajnathsah/tkinterwindowapp">demo</a>.</li>
  <li>Write script to scrape data from any website. You can refer <a href="https://realpython.com/beautiful-soup-web-scraper-python/">Beautiful-Soup web scraper</a></li>
  <li>Develop portfolio website with CRUD and REST API functionality. You can start with Flask framework.</li>
</ul>

<p>To be continued…</p>]]></content><author><name>Raj Nath Sah</name></author><category term="Python" /><category term="Tkinter" /><category term="FastAPI" /><category term="Flask" /><category term="Django" /><summary type="html"><![CDATA[Curated learning path to be a Python developer. Starting from basic to advance concepts and followed by DIY approach. Follow this post and keep learning.]]></summary></entry><entry><title type="html">Python Learning Path - 2</title><link href="https://blog.rajnath.dev/advance-python/" rel="alternate" type="text/html" title="Python Learning Path - 2" /><published>2024-10-15T00:00:00+00:00</published><updated>2024-10-15T00:00:00+00:00</updated><id>https://blog.rajnath.dev/advance-python</id><content type="html" xml:base="https://blog.rajnath.dev/advance-python/"><![CDATA[<h1 id="python">Python</h1>
<p>In this post, we will continue our learning from basic to advance topics of python.</p>

<ol>
  <li>Deep Dive into Data Structures:
    <ul>
      <li>Understand advanced data structures like heaps, linked lists, and trees.</li>
      <li>Learn about collections module (e.g., deque, Counter, defaultdict).</li>
      <li>Resources:
        <ul>
          <li><a href="https://docs.python.org/3/tutorial/datastructures.html">Python Data Structures</a></li>
          <li><a href="https://docs.python.org/3/library/collections.html">Collections Module</a></li>
        </ul>
      </li>
    </ul>
  </li>
  <li>Advanced Functions:
    <ul>
      <li>Master higher-order functions, lambda functions, and functional programming concepts.</li>
      <li>Explore decorators and their use cases.</li>
      <li>Resources:
        <ul>
          <li><a href="https://realpython.com/primer-on-python-decorators/">Python Decorators</a></li>
          <li><a href="https://realpython.com/python-functional-programming/">Functional Programming in Python</a></li>
        </ul>
      </li>
    </ul>
  </li>
  <li>Iterators and Generators:
    <ul>
      <li>Learn about iterators and the iterator protocol.</li>
      <li>Understand generators and generator expressions for efficient looping.</li>
      <li>Resources:
        <ul>
          <li><a href="https://realpython.com/python-itertools/">Iterators and Iterables</a></li>
          <li><a href="https://realpython.com/introduction-to-python-generators/">Generators</a></li>
        </ul>
      </li>
    </ul>
  </li>
  <li>Context Managers:
    <ul>
      <li>Use context managers to manage resources with with statements.</li>
      <li>Create custom context managers using contextlib.</li>
      <li>Resources:
        <ul>
          <li><a href="https://realpython.com/python-with-statement/">Context Managers and the with Statement</a></li>
          <li><a href="https://docs.python.org/3/library/contextlib.html">Contextlib Module</a></li>
        </ul>
      </li>
    </ul>
  </li>
  <li>Metaprogramming:
    <ul>
      <li>Understand metaclasses and their applications.</li>
      <li>Explore dynamic code generation and manipulation.</li>
      <li>Resources:
        <ul>
          <li><a href="https://realpython.com/python-metaclasses/">Metaclasses in Python</a></li>
          <li><a href="https://realpython.com/python-code-generation/">Dynamic Code Generation</a></li>
        </ul>
      </li>
    </ul>
  </li>
  <li>Concurrency and Parallelism:
    <ul>
      <li>Learn about threading, multiprocessing, and asynchronous programming with asyncio.</li>
      <li>Understand the Global Interpreter Lock (GIL) and its implications.</li>
      <li>Resources:
        <ul>
          <li><a href="https://realpython.com/python-concurrency/">Concurrency in Python</a></li>
          <li><a href="https://docs.python.org/3/library/asyncio.html">Asyncio</a></li>
        </ul>
      </li>
    </ul>
  </li>
  <li>Networking and Web Development:
    <ul>
      <li>Dive into network programming with socket and asyncio.</li>
      <li>Explore web frameworks like Flask, Django, and FastAPI for building web applications.</li>
      <li>Resources:
        <ul>
          <li><a href="https://realpython.com/python-sockets/">Network Programming</a></li>
          <li><a href="https://flask.palletsprojects.com/">Flask</a></li>
          <li><a href="https://www.djangoproject.com/">Django</a></li>
          <li><a href="https://fastapi.tiangolo.com/">FastAPI</a></li>
        </ul>
      </li>
    </ul>
  </li>
  <li>Testing and Debugging:
    <ul>
      <li>Write unit tests using unittest and pytest.</li>
      <li>Learn advanced debugging techniques and tools.</li>
      <li>Resources:
        <ul>
          <li><a href="https://realpython.com/python-testing/">Unit Testing</a></li>
          <li><a href="https://docs.pytest.org/en/stable/">Pytest</a></li>
          <li><a href="https://realpython.com/python-debugging-pdb/">Debugging Techniques</a></li>
        </ul>
      </li>
    </ul>
  </li>
  <li>Performance Optimization:
    <ul>
      <li>Profile and optimize code for performance using cProfile, timeit, and other tools.</li>
      <li>Understand memory management and garbage collection.</li>
      <li>Resources:
        <ul>
          <li><a href="https://realpython.com/python-performance/">Profiling and Optimization</a></li>
          <li><a href="https://realpython.com/python-memory-management/">Memory Management</a></li>
        </ul>
      </li>
    </ul>
  </li>
  <li>
    <p>Interfacing with C/C++:
    *  Use ctypes and cffi to interface with C libraries.
    *  Explore writing Python extensions in C for performance-critical code.
    *  Resources:
    *   <a href="https://docs.python.org/3/library/ctypes.html">Ctypes</a>
    *   <a href="https://cffi.readthedocs.io/en/latest/">CFFI</a>
    *   <a href="https://docs.python.org/3/extending/extending.html">Python Extensions in C</a></p>
  </li>
  <li>
    <p>Deployment and Distribution:
    *  Learn about packaging and distributing Python applications with setuptools and pip.
    *  Explore containerization with Docker and deployment on cloud platforms.
    *  Resources:
    *   <a href="https://setuptools.pypa.io/en/latest/">Setuptools</a>
    *   <a href="https://www.docker.com/">Docker</a>
    *   <a href="https://realpython.com/deploying-a-python-web-application/">Deploying Python Applications</a></p>
  </li>
  <li>Security:
    *  Understand common security practices and vulnerabilities.
    *  Learn about cryptography and secure coding practices.
    *  Resources:
    *   <a href="https://realpython.com/python-security/">Python Security</a>
    *   <a href="https://cryptography.io/en/latest/">Cryptography</a></li>
</ol>]]></content><author><name>Raj Nath Sah</name></author><category term="Python" /><category term="Tkinter" /><category term="FastAPI" /><category term="Flask" /><category term="Django" /><summary type="html"><![CDATA[Curated learning path to be a Python developer. Starting from basic to advance concepts and followed by DIY approach. Follow this post and keep learning.]]></summary></entry><entry><title type="html">Project Ideas to Learn Python [DIY Approach]</title><link href="https://blog.rajnath.dev/project-ideas/" rel="alternate" type="text/html" title="Project Ideas to Learn Python [DIY Approach]" /><published>2024-10-15T00:00:00+00:00</published><updated>2024-10-15T00:00:00+00:00</updated><id>https://blog.rajnath.dev/project-ideas</id><content type="html" xml:base="https://blog.rajnath.dev/project-ideas/"><![CDATA[<h1 id="basic-project-ideas">Basic Project Ideas</h1>

<ol>
  <li>
    <p>Basic Calculator:<br />
Create a simple calculator that can perform basic arithmetic operations like addition, subtraction, multiplication, and division.</p>
  </li>
  <li>
    <p>To-Do List:<br />
Build a command-line or GUI-based to-do list application where users can add, remove, and mark tasks as completed.</p>
  </li>
  <li>
    <p>Weather App:<br />
Develop a weather application that fetches and displays weather information for a given location using an API like OpenWeatherMap.</p>
  </li>
  <li>
    <p>Quiz Game:<br />
Create a quiz game that asks users multiple-choice questions and keeps track of their score.</p>
  </li>
  <li>
    <p>Currency Converter:<br />
Build a currency converter that fetches real-time exchange rates and converts amounts between different currencies.</p>
  </li>
  <li>
    <p>Simple Chatbot:<br />
Develop a basic chatbot that can respond to user inputs with predefined responses.</p>
  </li>
  <li>
    <p>Password Generator:<br />
Create a password generator that generates strong, random passwords based on user-specified criteria (length, use of special characters, etc.).</p>
  </li>
  <li>
    <p>Number Guessing Game:<br />
Build a number guessing game where the computer randomly selects a number, and the user has to guess it within a certain number of attempts.</p>
  </li>
  <li>
    <p>File Organizer:<br />
Develop a script that organizes files in a directory based on their file types (e.g., move all images to an “Images” folder).</p>
  </li>
  <li>
    <p>Expense Tracker:<br />
    Create an expense tracker that allows users to log their expenses and view summaries of their spending.</p>
  </li>
  <li>
    <p>Contact Book:<br />
    Build a contact book application where users can add, remove, and search for contacts.</p>
  </li>
  <li>
    <p>Simple Web Scraper:<br />
    Develop a web scraper that extracts information from a website and saves it to a file.</p>
  </li>
  <li>
    <p>BMI Calculator:<br />
    Create a Body Mass Index (BMI) calculator that takes a user’s weight and height and calculates their BMI.</p>
  </li>
  <li>
    <p>Rock, Paper, Scissors Game:<br />
    Develop a simple Rock, Paper, Scissors game where the user plays against the computer.</p>
  </li>
  <li>
    <p>Mad Libs Game:<br />
    Create a Mad Libs game where the user inputs words, and the program generates a funny story using those words.</p>
  </li>
  <li>
    <p>Hangman Game:<br />
    Build a Hangman game where the user guesses letters to figure out a hidden word.</p>
  </li>
  <li>
    <p>Tic-Tac-Toe Game:<br />
    Develop a Tic-Tac-Toe game that can be played between two players or against the computer.</p>
  </li>
  <li>
    <p>Flashcard App:<br />
    Create a flashcard application for studying vocabulary or other subjects.</p>
  </li>
  <li>
    <p>Unit Converter:<br />
    Build a unit converter that converts between different units of measurement (e.g., length, weight, temperature).</p>
  </li>
  <li>
    <p>Simple Alarm Clock:<br />
    Develop a simple alarm clock that allows users to set an alarm and notifies them when the time is reached.</p>
  </li>
</ol>]]></content><author><name>Raj Nath Sah</name></author><category term="Python" /><category term="Tkinter" /><category term="FastAPI" /><category term="Flask" /><category term="Django" /><category term="Projects" /><category term="Ideas" /><summary type="html"><![CDATA[Curated list of projects for learning Python by developing small applications. These are some of ideas for those who have started learning Python.]]></summary></entry><entry><title type="html">Download large files faster and unzip it</title><link href="https://blog.rajnath.dev/file-download/" rel="alternate" type="text/html" title="Download large files faster and unzip it" /><published>2024-05-31T00:00:00+00:00</published><updated>2024-05-31T00:00:00+00:00</updated><id>https://blog.rajnath.dev/file-download</id><content type="html" xml:base="https://blog.rajnath.dev/file-download/"><![CDATA[<h2 id="file-download">File Download</h2>
<p>Downloading file from internet can be time consuming work, especially when file to be downloaded are large files. During my project work i come across a situation where i had to download some files from internet and unzip it. Using request library with normal approach it was taking hours. After lot of search i found an arcticle which helped me downloading file faster.</p>

<h3 id="file-download-code">File Download Code</h3>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="nn">asyncio</span>
<span class="kn">import</span> <span class="nn">os.path</span>
<span class="kn">import</span> <span class="nn">shutil</span>
<span class="kn">from</span> <span class="nn">random</span> <span class="kn">import</span> <span class="n">randint</span>
<span class="kn">from</span> <span class="nn">time</span> <span class="kn">import</span> <span class="n">sleep</span>
<span class="kn">import</span> <span class="nn">random</span>
<span class="kn">import</span> <span class="nn">time</span>

<span class="kn">import</span> <span class="nn">aiofiles</span>
<span class="kn">import</span> <span class="nn">aiohttp</span>
<span class="kn">from</span> <span class="nn">urllib.parse</span> <span class="kn">import</span> <span class="n">urlparse</span>
<span class="kn">from</span> <span class="nn">tempfile</span> <span class="kn">import</span> <span class="n">TemporaryDirectory</span>


<span class="c1"># File Download class
</span><span class="k">class</span> <span class="nc">FileDownloader</span><span class="p">:</span>
    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">urls</span><span class="p">,</span> <span class="n">filename</span><span class="p">,</span> <span class="n">download_path</span><span class="p">):</span>
        <span class="bp">self</span><span class="p">.</span><span class="n">urls</span> <span class="o">=</span> <span class="n">urls</span>
        <span class="bp">self</span><span class="p">.</span><span class="n">filename</span> <span class="o">=</span> <span class="n">filename</span>
        <span class="bp">self</span><span class="p">.</span><span class="n">download_path</span> <span class="o">=</span> <span class="n">download_path</span>
        <span class="bp">self</span><span class="p">.</span><span class="n">fast_download</span> <span class="o">=</span> <span class="bp">None</span>

    <span class="k">async</span> <span class="k">def</span> <span class="nf">get_content_length</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">url</span><span class="p">):</span>
        <span class="k">async</span> <span class="k">with</span> <span class="n">aiohttp</span><span class="p">.</span><span class="n">ClientSession</span><span class="p">()</span> <span class="k">as</span> <span class="n">session</span><span class="p">:</span>
            <span class="k">async</span> <span class="k">with</span> <span class="n">session</span><span class="p">.</span><span class="n">head</span><span class="p">(</span><span class="n">url</span><span class="p">)</span> <span class="k">as</span> <span class="n">request</span><span class="p">:</span>
                <span class="k">return</span> <span class="n">request</span><span class="p">.</span><span class="n">content_length</span>


    <span class="k">def</span> <span class="nf">parts_generator</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">size</span><span class="p">,</span> <span class="n">start</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">part_size</span><span class="o">=</span><span class="mi">50</span> <span class="o">*</span> <span class="mi">1024</span> <span class="o">**</span> <span class="mi">2</span><span class="p">):</span>
        <span class="k">while</span> <span class="n">size</span> <span class="o">-</span> <span class="n">start</span> <span class="o">&gt;</span> <span class="n">part_size</span><span class="p">:</span>
            <span class="k">yield</span> <span class="n">start</span><span class="p">,</span> <span class="n">start</span> <span class="o">+</span> <span class="n">part_size</span>
            <span class="n">start</span> <span class="o">+=</span> <span class="n">part_size</span>
        <span class="k">yield</span> <span class="n">start</span><span class="p">,</span> <span class="n">size</span>


    <span class="k">async</span> <span class="k">def</span> <span class="nf">download</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">url</span><span class="p">,</span> <span class="n">headers</span><span class="p">,</span> <span class="n">save_path</span><span class="p">,</span> <span class="n">attempt</span><span class="o">=</span><span class="mi">0</span><span class="p">):</span>
        <span class="c1"># attempt = 0
</span>        <span class="n">max_attempts</span> <span class="o">=</span> <span class="mi">10</span>
        <span class="n">timeout</span> <span class="o">=</span> <span class="n">aiohttp</span><span class="p">.</span><span class="n">ClientTimeout</span><span class="p">(</span><span class="n">total</span><span class="o">=</span><span class="mi">6000</span><span class="p">)</span>
        <span class="k">try</span><span class="p">:</span>
            <span class="k">async</span> <span class="k">with</span> <span class="n">aiohttp</span><span class="p">.</span><span class="n">ClientSession</span><span class="p">(</span><span class="n">headers</span><span class="o">=</span><span class="n">headers</span><span class="p">,</span> <span class="n">timeout</span><span class="o">=</span><span class="n">timeout</span><span class="p">)</span> <span class="k">as</span> <span class="n">session</span><span class="p">:</span>
                <span class="k">await</span> <span class="n">asyncio</span><span class="p">.</span><span class="n">sleep</span><span class="p">(</span><span class="mi">1</span> <span class="o">+</span> <span class="n">random</span><span class="p">.</span><span class="n">randint</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">9</span><span class="p">))</span>
                <span class="k">async</span> <span class="k">with</span> <span class="n">session</span><span class="p">.</span><span class="n">get</span><span class="p">(</span><span class="n">url</span><span class="p">)</span> <span class="k">as</span> <span class="n">request</span><span class="p">:</span>
                    <span class="nb">file</span> <span class="o">=</span> <span class="k">await</span> <span class="n">aiofiles</span><span class="p">.</span><span class="nb">open</span><span class="p">(</span><span class="n">save_path</span><span class="p">,</span> <span class="s">'wb'</span><span class="p">)</span>
                    <span class="k">await</span> <span class="nb">file</span><span class="p">.</span><span class="n">write</span><span class="p">(</span><span class="k">await</span> <span class="n">request</span><span class="p">.</span><span class="n">content</span><span class="p">.</span><span class="n">read</span><span class="p">())</span>
        <span class="k">except</span> <span class="p">(</span><span class="n">aiohttp</span><span class="p">.</span><span class="n">ClientOSError</span><span class="p">,</span>
        <span class="n">aiohttp</span><span class="p">.</span><span class="n">ServerDisconnectedError</span><span class="p">):</span>
            <span class="k">if</span> <span class="n">attempt</span> <span class="o">&lt;</span> <span class="n">max_attempts</span><span class="p">:</span>
                <span class="k">print</span><span class="p">(</span><span class="sa">f</span><span class="s">'Attempt </span><span class="si">{</span><span class="n">attempt</span><span class="si">}</span><span class="s"> failed, trying again'</span><span class="p">)</span>
                <span class="k">await</span> <span class="n">asyncio</span><span class="p">.</span><span class="n">sleep</span><span class="p">(</span><span class="mi">3</span> <span class="o">+</span> <span class="n">random</span><span class="p">.</span><span class="n">randint</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">9</span><span class="p">))</span>
                <span class="k">await</span> <span class="bp">self</span><span class="p">.</span><span class="n">download</span><span class="p">(</span><span class="n">url</span><span class="p">,</span> <span class="n">headers</span><span class="p">,</span> <span class="n">save_path</span><span class="p">,</span> <span class="n">attempt</span> <span class="o">+</span> <span class="mi">1</span><span class="p">)</span>
            <span class="k">else</span><span class="p">:</span>
                <span class="k">raise</span>


    <span class="k">async</span> <span class="k">def</span> <span class="nf">process</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">url</span><span class="p">):</span>
        <span class="n">filename</span> <span class="o">=</span> <span class="n">os</span><span class="p">.</span><span class="n">path</span><span class="p">.</span><span class="n">basename</span><span class="p">(</span><span class="n">urlparse</span><span class="p">(</span><span class="n">url</span><span class="p">).</span><span class="n">path</span><span class="p">)</span>
        <span class="c1"># tmp_dir = TemporaryDirectory(prefix=filename, dir=os.path.abspath('.'), ignore_cleanup_errors=False)
</span>        <span class="n">tmp_dir</span> <span class="o">=</span> <span class="n">TemporaryDirectory</span><span class="p">(</span><span class="n">prefix</span><span class="o">=</span><span class="n">filename</span><span class="p">,</span> <span class="nb">dir</span><span class="o">=</span><span class="bp">self</span><span class="p">.</span><span class="n">download_path</span><span class="p">)</span>
        <span class="n">size</span> <span class="o">=</span> <span class="k">await</span> <span class="bp">self</span><span class="p">.</span><span class="n">get_content_length</span><span class="p">(</span><span class="n">url</span><span class="p">)</span>
        <span class="n">tasks</span> <span class="o">=</span> <span class="p">[]</span>
        <span class="n">file_parts</span> <span class="o">=</span> <span class="p">[]</span>
        <span class="k">for</span> <span class="n">number</span><span class="p">,</span> <span class="n">sizes</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="bp">self</span><span class="p">.</span><span class="n">parts_generator</span><span class="p">(</span><span class="n">size</span><span class="p">)):</span>
            <span class="n">part_file_name</span> <span class="o">=</span> <span class="n">os</span><span class="p">.</span><span class="n">path</span><span class="p">.</span><span class="n">join</span><span class="p">(</span><span class="n">tmp_dir</span><span class="p">.</span><span class="n">name</span><span class="p">,</span> <span class="sa">f</span><span class="s">'</span><span class="si">{</span><span class="n">filename</span><span class="si">}</span><span class="s">.part</span><span class="si">{</span><span class="n">number</span><span class="si">}</span><span class="s">'</span><span class="p">)</span>
            <span class="n">file_parts</span><span class="p">.</span><span class="n">append</span><span class="p">(</span><span class="n">part_file_name</span><span class="p">)</span>            
            <span class="n">tasks</span><span class="p">.</span><span class="n">append</span><span class="p">(</span><span class="bp">self</span><span class="p">.</span><span class="n">download</span><span class="p">(</span><span class="n">url</span><span class="p">,</span> <span class="p">{</span><span class="s">'Range'</span><span class="p">:</span> <span class="sa">f</span><span class="s">'bytes=</span><span class="si">{</span><span class="n">sizes</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="si">}</span><span class="s">-</span><span class="si">{</span><span class="n">sizes</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="o">-</span><span class="mi">1</span><span class="si">}</span><span class="s">'</span><span class="p">},</span> <span class="n">part_file_name</span><span class="p">))</span>
        <span class="k">await</span> <span class="n">asyncio</span><span class="p">.</span><span class="n">gather</span><span class="p">(</span><span class="o">*</span><span class="n">tasks</span><span class="p">)</span>
        <span class="n">download_filename</span> <span class="o">=</span> <span class="n">os</span><span class="p">.</span><span class="n">path</span><span class="p">.</span><span class="n">join</span><span class="p">(</span><span class="bp">self</span><span class="p">.</span><span class="n">download_path</span><span class="p">,</span> <span class="n">filename</span><span class="p">)</span>

        <span class="c1"># delete if there is existing zip file
</span>        <span class="k">if</span> <span class="n">os</span><span class="p">.</span><span class="n">path</span><span class="p">.</span><span class="n">exists</span><span class="p">(</span><span class="n">download_filename</span><span class="p">):</span>
            <span class="n">os</span><span class="p">.</span><span class="n">remove</span><span class="p">(</span><span class="n">download_filename</span><span class="p">)</span>

        <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">download_filename</span><span class="p">,</span> <span class="s">'wb'</span><span class="p">)</span> <span class="k">as</span> <span class="n">wfd</span><span class="p">:</span>
            <span class="k">for</span> <span class="n">f</span> <span class="ow">in</span> <span class="n">file_parts</span><span class="p">:</span>
                <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">f</span><span class="p">,</span> <span class="s">'rb'</span><span class="p">)</span> <span class="k">as</span> <span class="n">fd</span><span class="p">:</span>
                    <span class="n">shutil</span><span class="p">.</span><span class="n">copyfileobj</span><span class="p">(</span><span class="n">fd</span><span class="p">,</span> <span class="n">wfd</span><span class="p">)</span>

    <span class="k">def</span> <span class="nf">download_file</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
        <span class="k">print</span><span class="p">(</span><span class="s">'slow download'</span><span class="p">)</span>
        <span class="n">download_file</span> <span class="o">=</span> <span class="n">os</span><span class="p">.</span><span class="n">path</span><span class="p">.</span><span class="n">join</span><span class="p">(</span><span class="bp">self</span><span class="p">.</span><span class="n">download_path</span><span class="p">,</span> <span class="bp">self</span><span class="p">.</span><span class="n">filename</span><span class="p">)</span>
        <span class="k">with</span> <span class="n">requests</span><span class="p">.</span><span class="n">get</span><span class="p">(</span><span class="bp">self</span><span class="p">.</span><span class="n">urls</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">stream</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span> <span class="k">as</span> <span class="n">r</span><span class="p">:</span>
            <span class="n">r</span><span class="p">.</span><span class="n">raise_for_status</span><span class="p">()</span>
            <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">download_file</span><span class="p">,</span> <span class="s">'wb'</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
                <span class="k">for</span> <span class="n">chunk</span> <span class="ow">in</span> <span class="n">r</span><span class="p">.</span><span class="n">iter_content</span><span class="p">(</span><span class="n">chunk_size</span><span class="o">=</span><span class="mi">8192</span><span class="p">):</span>
                    <span class="n">f</span><span class="p">.</span><span class="n">write</span><span class="p">(</span><span class="n">chunk</span><span class="p">)</span> 


    <span class="k">async</span> <span class="k">def</span> <span class="nf">main</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">fast_download</span><span class="o">=</span><span class="bp">True</span><span class="p">):</span>
        <span class="k">if</span> <span class="n">fast_download</span><span class="p">:</span>
            <span class="k">await</span> <span class="n">asyncio</span><span class="p">.</span><span class="n">gather</span><span class="p">(</span><span class="o">*</span><span class="p">[</span><span class="bp">self</span><span class="p">.</span><span class="n">process</span><span class="p">(</span><span class="n">url</span><span class="p">)</span> <span class="k">for</span> <span class="n">url</span> <span class="ow">in</span> <span class="bp">self</span><span class="p">.</span><span class="n">urls</span><span class="p">])</span>
        <span class="k">else</span><span class="p">:</span>
            <span class="bp">self</span><span class="p">.</span><span class="n">download_file</span><span class="p">()</span>

<span class="k">if</span> <span class="n">__name__</span> <span class="o">==</span> <span class="s">'__main__'</span><span class="p">:</span>    
    <span class="n">url</span> <span class="o">=</span> <span class="s">"&lt;file url&gt;"</span>
    <span class="n">start_code</span> <span class="o">=</span> <span class="n">time</span><span class="p">.</span><span class="n">monotonic</span><span class="p">()</span>
    <span class="n">loop</span> <span class="o">=</span> <span class="n">asyncio</span><span class="p">.</span><span class="n">get_event_loop</span><span class="p">()</span>    
    <span class="n">fileDownloader</span> <span class="o">=</span> <span class="n">FileDownloader</span><span class="p">(</span><span class="n">urls</span><span class="o">=</span><span class="p">[</span><span class="n">url</span><span class="p">],</span> <span class="n">filename</span><span class="o">=</span><span class="s">'file.txt.gz'</span><span class="p">,</span> <span class="n">download_path</span><span class="o">=</span><span class="s">'/tmp'</span><span class="p">)</span>
    <span class="n">loop</span><span class="p">.</span><span class="n">run_until_complete</span><span class="p">(</span><span class="n">fileDownloader</span><span class="p">.</span><span class="n">main</span><span class="p">())</span>
    <span class="k">print</span><span class="p">(</span><span class="sa">f</span><span class="s">'</span><span class="si">{</span><span class="n">time</span><span class="p">.</span><span class="n">monotonic</span><span class="p">()</span> <span class="o">-</span> <span class="n">start_code</span><span class="si">}</span><span class="s"> seconds!'</span><span class="p">)</span>
</code></pre></div></div>

<h3 id="file-unzip-code">File Unzip Code</h3>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="nn">os</span>
<span class="kn">import</span> <span class="nn">gzip</span>
<span class="kn">import</span> <span class="nn">time</span>

<span class="c1"># file unzip class
</span><span class="k">class</span> <span class="nc">FileUnzip</span><span class="p">:</span>
    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">filename</span><span class="p">,</span> <span class="n">file_path</span><span class="p">,</span> <span class="n">unzip_path</span><span class="p">):</span>
        <span class="bp">self</span><span class="p">.</span><span class="n">filename</span> <span class="o">=</span> <span class="n">filename</span>
        <span class="bp">self</span><span class="p">.</span><span class="n">file_path</span> <span class="o">=</span> <span class="n">file_path</span>
        <span class="bp">self</span><span class="p">.</span><span class="n">unzip_path</span> <span class="o">=</span> <span class="n">unzip_path</span>
        <span class="bp">self</span><span class="p">.</span><span class="n">chunk_size</span> <span class="o">=</span> <span class="mi">100</span><span class="o">*</span><span class="mi">1024</span><span class="o">*</span><span class="mi">1024</span> <span class="c1"># 100MB
</span>
    <span class="k">def</span> <span class="nf">unzip</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
        <span class="n">zip_file</span> <span class="o">=</span> <span class="n">os</span><span class="p">.</span><span class="n">path</span><span class="p">.</span><span class="n">join</span><span class="p">(</span><span class="bp">self</span><span class="p">.</span><span class="n">file_path</span><span class="p">,</span> <span class="bp">self</span><span class="p">.</span><span class="n">filename</span><span class="p">)</span>
        <span class="n">unzip_file</span> <span class="o">=</span> <span class="n">os</span><span class="p">.</span><span class="n">path</span><span class="p">.</span><span class="n">join</span><span class="p">(</span><span class="bp">self</span><span class="p">.</span><span class="n">unzip_path</span><span class="p">,</span> <span class="bp">self</span><span class="p">.</span><span class="n">filename</span><span class="p">.</span><span class="n">replace</span><span class="p">(</span><span class="s">'.gz'</span><span class="p">,</span> <span class="s">''</span><span class="p">))</span>

        <span class="c1"># delete if there is existing zip file
</span>        <span class="k">if</span> <span class="n">os</span><span class="p">.</span><span class="n">path</span><span class="p">.</span><span class="n">exists</span><span class="p">(</span><span class="n">unzip_file</span><span class="p">):</span>
            <span class="n">os</span><span class="p">.</span><span class="n">remove</span><span class="p">(</span><span class="n">unzip_file</span><span class="p">)</span>

        <span class="k">with</span> <span class="n">gzip</span><span class="p">.</span><span class="nb">open</span><span class="p">(</span><span class="n">zip_file</span><span class="p">,</span> <span class="s">'rb'</span><span class="p">)</span> <span class="k">as</span> <span class="n">f_in</span><span class="p">:</span>
            <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">unzip_file</span><span class="p">,</span> <span class="s">'wb'</span><span class="p">)</span> <span class="k">as</span> <span class="n">f_out</span><span class="p">:</span>
                <span class="n">chunk</span> <span class="o">=</span> <span class="n">f_in</span><span class="p">.</span><span class="n">read</span><span class="p">(</span><span class="bp">self</span><span class="p">.</span><span class="n">chunk_size</span><span class="p">)</span>
                <span class="k">while</span> <span class="n">chunk</span><span class="p">:</span>
                    <span class="n">f_out</span><span class="p">.</span><span class="n">write</span><span class="p">(</span><span class="n">chunk</span><span class="p">)</span>
                    <span class="n">chunk</span> <span class="o">=</span> <span class="n">f_in</span><span class="p">.</span><span class="n">read</span><span class="p">(</span><span class="bp">self</span><span class="p">.</span><span class="n">chunk_size</span><span class="p">)</span>

<span class="k">if</span> <span class="n">__name__</span> <span class="o">==</span> <span class="s">'__main__'</span><span class="p">:</span>
    <span class="n">start_code</span> <span class="o">=</span> <span class="n">time</span><span class="p">.</span><span class="n">monotonic</span><span class="p">()</span>
    <span class="n">fileUnzip</span> <span class="o">=</span> <span class="n">FileUnzip</span><span class="p">(</span><span class="n">filename</span><span class="o">=</span><span class="s">'file.txt.gz'</span><span class="p">,</span> <span class="n">file_path</span><span class="o">=</span><span class="s">'/tmp'</span><span class="p">,</span> <span class="n">unzip_path</span><span class="o">=</span><span class="s">'/tmp'</span><span class="p">)</span>
    <span class="n">fileUnzip</span><span class="p">.</span><span class="n">unzip</span><span class="p">()</span>
    <span class="k">print</span><span class="p">(</span><span class="sa">f</span><span class="s">'</span><span class="si">{</span><span class="n">time</span><span class="p">.</span><span class="n">monotonic</span><span class="p">()</span> <span class="o">-</span> <span class="n">start_code</span><span class="si">}</span><span class="s"> seconds!'</span><span class="p">)</span>

</code></pre></div></div>]]></content><author><name>Raj Nath Sah</name></author><category term="Python" /><category term="File Download" /><category term="Unzip" /><summary type="html"><![CDATA[Download file faster using python and unzip it.]]></summary></entry><entry><title type="html">Bulk Data Load in Redshift using Pentaho</title><link href="https://blog.rajnath.dev/redshift-pentaho/" rel="alternate" type="text/html" title="Bulk Data Load in Redshift using Pentaho" /><published>2022-01-22T00:00:00+00:00</published><updated>2022-01-22T00:00:00+00:00</updated><id>https://blog.rajnath.dev/redshift-pentaho</id><content type="html" xml:base="https://blog.rajnath.dev/redshift-pentaho/"><![CDATA[<h2 id="redshift">Redshift</h2>
<p>Redshift database is a cloud based, data warehouse solution offered by Amazon. It provides storage system that stores petabytes of data in easy-to-access clusters. Redshift is based on Postgres 8.0.2 and it supports sql syntax. Support for sql like query language makes it easy to analyze data for different kind of use cases.</p>

<h2 id="pentaho-data-integration">Pentaho Data Integration</h2>
<p>Pentaho Data Integration eliminates coding and complexity, and puts data from any source at the fingertips of business users.</p>

<h2 id="bulk-load-into-amazon-redshift">Bulk load into Amazon Redshift</h2>]]></content><author><name>Raj Nath Sah</name></author><category term="AWS" /><category term="Redshift" /><category term="Pentaho" /><summary type="html"><![CDATA[Redshift database is a cloud based, data warehouse solution offered by Amazon. It provides storage system that stores petabytes of data in easy-to-access clusters. Pentaho Data Integration eliminates coding and complexity, and puts data from any source at the fingertips of business users. Using pentaho bulk data can be loaded quickly in Redshift for analysis and reporting.]]></summary></entry><entry><title type="html">Q&amp;amp;A for Python interview</title><link href="https://blog.rajnath.dev/python-questions/" rel="alternate" type="text/html" title="Q&amp;amp;A for Python interview" /><published>2021-11-23T00:00:00+00:00</published><updated>2021-11-23T00:00:00+00:00</updated><id>https://blog.rajnath.dev/python-questions</id><content type="html" xml:base="https://blog.rajnath.dev/python-questions/"><![CDATA[<p>Important topics in Q&amp;A format is based on my experience. Feel free to update me in case of any observation or you want to add anything.</p>

<!--more-->

<h5 id="1-how-to-debug-pip-installation-error">1. How to debug pip installation error?</h5>
<p>For debugging purpose, pip displays some installation message on console. It also offers ways to control console level log by -v,–verbose, -q and –quiet. Full log can be saved by providing –log option with file path, it will have complete installation log. There are cases where currupt download also creates issues at the time of installation, in that case try –no-cache-dir. If that also does not work then you can always try the installation from source file.</p>

<h5 id="2-difference-between-list-and-dictionary">2. Difference between list and dictionary?</h5>
<h6 id="list">List</h6>
<ul>
  <li>List in Python is a heterogeneous container for items.</li>
  <li>Elements present in List maintain their order.</li>
  <li>The elements present in list can be of any type (int, float, string, tuple etc.).</li>
  <li>Elements are accessed through their index values.</li>
  <li>If you have a collection of data that does not need random access, use List.</li>
  <li>Where you have to deal with values which can be changed, use List.
    <div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">mylist</span><span class="o">=</span><span class="p">[</span><span class="mi">1</span><span class="p">,</span><span class="mi">2</span><span class="p">,</span><span class="mi">3</span><span class="p">,</span><span class="s">'4'</span><span class="p">,</span><span class="s">'sample'</span><span class="p">]</span>
</code></pre></div>    </div>
  </li>
</ul>

<h6 id="dictionary">Dictionary</h6>
<ul>
  <li>Dictionary is an unordered collection of key-value pairs.</li>
  <li>Dictionaries are used to handle large amount of data.</li>
  <li>Every element is having a key-value pair.</li>
  <li>Elements are accessed by using it’s key value.</li>
  <li>When you are dealing with unique keys and you are mapping values to the keys, use Dictionary.
    <div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">mydict</span> <span class="o">=</span> <span class="p">{</span><span class="mi">1</span><span class="p">:</span><span class="s">'Python'</span><span class="p">}</span>
</code></pre></div>    </div>
  </li>
</ul>

<h5 id="3-how-to-read-10-characters-from-a-file">3. How to read 10 characters from a file?</h5>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">f</span> <span class="o">=</span> <span class="nb">open</span><span class="p">(</span><span class="s">'&lt;file name&gt;'</span><span class="p">,</span><span class="s">'r'</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="n">f</span><span class="p">.</span><span class="n">read</span><span class="p">(</span><span class="mi">10</span><span class="p">))</span>
</code></pre></div></div>

<h5 id="4-what-are-membership-operators-in-python-write-an-example-to-explain-both">4. What are membership operators in Python? Write an example to explain both.</h5>
<p>There are 2 types of membership operators in Python:<br />
in: If the value is found in a sequence, then the result becomes true else false<br />
not in: If the value is not found in a sequence, then the result becomes true else false</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">a</span><span class="o">=</span><span class="mi">15</span>
<span class="n">b</span><span class="o">=</span><span class="mi">30</span>
<span class="nb">list</span> <span class="o">=</span> <span class="p">[</span><span class="mi">3</span><span class="p">,</span><span class="mi">6</span><span class="p">,</span><span class="mi">15</span><span class="p">,</span><span class="mi">20</span><span class="p">,</span><span class="mi">25</span><span class="p">]</span>

<span class="k">if</span> <span class="p">(</span><span class="n">a</span> <span class="ow">in</span> <span class="nb">list</span><span class="p">):</span>
	<span class="k">print</span><span class="p">(</span><span class="s">'a is available in given list'</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
	<span class="k">print</span><span class="p">(</span><span class="s">'a is not available in given list'</span><span class="p">)</span>

 
<span class="k">if</span> <span class="p">(</span> <span class="n">b</span> <span class="ow">not</span> <span class="ow">in</span> <span class="nb">list</span> <span class="p">):</span>
	<span class="k">print</span><span class="p">(</span><span class="s">'b is not available in given list'</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
	<span class="k">print</span><span class="p">(</span><span class="s">'b is available in given list'</span><span class="p">)</span>
</code></pre></div></div>

<h5 id="5-command-to-get-all-keys-from-the-dictionary">5. Command to get all keys from the dictionary.</h5>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">mydict</span> <span class="o">=</span> <span class="p">{</span><span class="mi">1</span><span class="p">:</span><span class="s">'Raj'</span><span class="p">,</span><span class="mi">2</span><span class="p">:</span><span class="s">'Som'</span><span class="p">}</span>
<span class="k">print</span><span class="p">(</span><span class="n">mydict</span><span class="p">.</span><span class="n">keys</span><span class="p">())</span>
</code></pre></div></div>

<h5 id="6-what-is-monkey-patching">6. What is monkey patching?</h5>
<p>Monkey patching means adding a new variable or method to a class or module after it’s been defined.<br />
Example: We define a class A as</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">class</span> <span class="nc">A</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">num</span><span class="p">):</span>
        <span class="bp">self</span><span class="p">.</span><span class="n">num</span> <span class="o">=</span> <span class="n">num</span>

    <span class="k">def</span> <span class="nf">__add__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">other</span><span class="p">):</span>
        <span class="k">return</span> <span class="n">A</span><span class="p">(</span><span class="bp">self</span><span class="p">.</span><span class="n">num</span> <span class="o">+</span> <span class="n">other</span><span class="p">.</span><span class="n">num</span><span class="p">)</span>
</code></pre></div></div>
<p>But now we want to add another function later in the code like below.</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">get_num</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
    <span class="k">return</span> <span class="bp">self</span><span class="p">.</span><span class="n">num</span>	
</code></pre></div></div>
<p>To do this as method of class A at runtime, we assign the function to class like below.</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">A</span><span class="p">.</span><span class="n">get_num</span> <span class="o">=</span> <span class="n">get_num</span>
</code></pre></div></div>
<p>At runtime, assign the new method and use new methos like below.</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">foo</span> <span class="o">=</span> <span class="n">A</span><span class="p">(</span><span class="mi">42</span><span class="p">)</span>
<span class="n">A</span><span class="p">.</span><span class="n">get_num</span> <span class="o">=</span> <span class="n">get_num</span>
<span class="n">bar</span> <span class="o">=</span> <span class="n">A</span><span class="p">(</span><span class="mi">6</span><span class="p">);</span>
<span class="n">foo</span><span class="p">.</span><span class="n">get_num</span><span class="p">()</span> <span class="c1"># 42
</span><span class="n">bar</span><span class="p">.</span><span class="n">get_num</span><span class="p">()</span> <span class="c1"># 6
</span></code></pre></div></div>

<h5 id="7-what-are-args-and-kwargs">7. What are *args and **kwargs?</h5>
<p>The special syntax, <em>args and *</em>kwargs in function definitions is used to pass a variable number of arguments to a function. The single asterisk form (*args) is used to pass a non-keyworded, variable-length argument list, and the double asterisk form is used to pass a keyworded, variable-length argument list.<br />
*args example :</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">test_var_args</span><span class="p">(</span><span class="n">farg</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">):</span>
    <span class="k">print</span><span class="p">(</span><span class="s">'formal arg:{}'</span><span class="p">.</span><span class="nb">format</span><span class="p">(</span><span class="n">farg</span><span class="p">))</span>
    <span class="k">for</span> <span class="n">arg</span> <span class="ow">in</span> <span class="n">args</span><span class="p">:</span>
        <span class="k">print</span><span class="p">(</span><span class="s">'another arg:{}'</span><span class="p">.</span><span class="nb">format</span><span class="p">(</span><span class="n">arg</span><span class="p">)</span>

<span class="n">test_var_args</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="s">"two"</span><span class="p">,</span> <span class="mi">3</span><span class="p">)</span>
</code></pre></div></div>
<p>Output</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">formal</span> <span class="n">arg</span><span class="p">:</span> <span class="mi">1</span>
<span class="n">another</span> <span class="n">arg</span><span class="p">:</span> <span class="n">two</span>
<span class="n">another</span> <span class="n">arg</span><span class="p">:</span> <span class="mi">3</span>
</code></pre></div></div>
<p>**kwargs example</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">test_var_kwargs</span><span class="p">(</span><span class="n">farg</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
    <span class="k">print</span><span class="p">(</span><span class="s">'formal arg:{}'</span><span class="p">.</span><span class="nb">format</span><span class="p">(</span><span class="n">farg</span><span class="p">))</span>
    <span class="k">for</span> <span class="n">key</span> <span class="ow">in</span> <span class="n">kwargs</span><span class="p">:</span>
        <span class="k">print</span><span class="p">(</span><span class="s">'another keyword arg: {}: {}'</span><span class="p">.</span><span class="nb">format</span><span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="n">kwargs</span><span class="p">[</span><span class="n">key</span><span class="p">]))</span>

<span class="n">test_var_kwargs</span><span class="p">(</span><span class="n">farg</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span> <span class="n">myarg2</span><span class="o">=</span><span class="s">"two"</span><span class="p">,</span> <span class="n">myarg3</span><span class="o">=</span><span class="mi">3</span><span class="p">)</span>
</code></pre></div></div>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">formal</span> <span class="n">arg</span><span class="p">:</span> <span class="mi">1</span>
<span class="n">another</span> <span class="n">keyword</span> <span class="n">arg</span><span class="p">:</span> <span class="n">myarg2</span><span class="p">:</span> <span class="n">two</span>
<span class="n">another</span> <span class="n">keyword</span> <span class="n">arg</span><span class="p">:</span> <span class="n">myarg3</span><span class="p">:</span> <span class="mi">3</span>
</code></pre></div></div>

<h5 id="8-what-is-iterables-in-python">8. What is Iterables in python?</h5>
<p>When you create a list, you can read its items one by one. Reading its items one by one is called iteration:</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">mylist</span> <span class="o">=</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">]</span>
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="n">mylist</span><span class="p">:</span>
	<span class="k">print</span><span class="p">(</span><span class="n">i</span><span class="p">)</span>
</code></pre></div></div>
<p>Output</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="mi">1</span>
<span class="mi">2</span>
<span class="mi">3</span>
</code></pre></div></div>
<p>mylist is an iterable. When you use a list comprehension, you create a list, and so an iterable:</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">mylist</span> <span class="o">=</span> <span class="p">[</span><span class="n">x</span><span class="o">*</span><span class="n">x</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">3</span><span class="p">)]</span>
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="n">mylist</span><span class="p">:</span>
	<span class="k">print</span><span class="p">(</span><span class="n">i</span><span class="p">)</span>
</code></pre></div></div>
<p>Output</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="mi">0</span>
<span class="mi">1</span>
<span class="mi">4</span>
</code></pre></div></div>
<p>Everything you can use “for… in…” on is an iterable; lists, strings, files…<br />
These iterables are handy because you can read them as much as you wish, but you store all the values in memory and this is not always what you want when you have a lot of values.</p>

<h5 id="9-what-is-generators-in-python">9. What is Generators in python?</h5>
<p>Generators are iterators, a kind of iterable <strong>you can only iterate over once</strong>. Generators do not store all the values in memory, <strong>they generate the values on the fly</strong>:</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">mygenerator</span> <span class="o">=</span> <span class="p">(</span><span class="n">x</span><span class="o">*</span><span class="n">x</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">3</span><span class="p">))</span>
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="n">mygenerator</span><span class="p">:</span>
	<span class="k">print</span><span class="p">(</span><span class="n">i</span><span class="p">)</span>
</code></pre></div></div>
<p>Output</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="mi">0</span>
<span class="mi">1</span>
<span class="mi">4</span>
</code></pre></div></div>
<p>It is just the same except you used () instead of []. BUT, you cannot perform for i in mygenerator a second time since generators can only be used once: they calculate 0, then forget about it and calculate 1, and end calculating 4, one by one.</p>

<h5 id="10-what-does-the-yield-keyword-do">10. What does the “yield” keyword do?</h5>
<p>yield is a keyword that is used like return, except the function will return a generator.<br />
Example:</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">createGenerator</span><span class="p">():</span>
  <span class="n">mylist</span> <span class="o">=</span> <span class="nb">range</span><span class="p">(</span><span class="mi">3</span><span class="p">)</span>
  <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="n">mylist</span><span class="p">:</span>
    <span class="k">yield</span> <span class="n">i</span><span class="o">*</span><span class="n">i</span>

<span class="c1"># create a generator
</span><span class="n">mygenerator</span> <span class="o">=</span> <span class="n">createGenerator</span><span class="p">()</span>
<span class="c1"># print generator object
</span><span class="k">print</span><span class="p">(</span><span class="n">mygenerator</span><span class="p">)</span>
<span class="c1"># print value
</span><span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="n">mygenerator</span><span class="p">:</span>
  <span class="k">print</span><span class="p">(</span><span class="n">i</span><span class="p">)</span>
</code></pre></div></div>
<p>Output</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="mi">0</span>
<span class="mi">1</span>
<span class="mi">4</span>
</code></pre></div></div>

<p>This is a simple example, but it’s handy when you know your function will return a huge set of values that you will only need to read once. To master yield, you must understand that when you call the function, the code you have written in the function body does not run. The function only returns the generator object. Then, your code will continue from where it left off each time for uses the generator.</p>

<p>The first time the for calls the generator object created from your function, it will run the code in your function from the beginning until it hits yield, then it’ll return the first value of the loop. Then, each other call will run the loop you have written in the function one more time, and return the next value until there is no value to return.</p>

<p>The generator is considered empty once the function runs, but does not hit yield anymore. It can be because the loop had come to an end, or because you do not satisfy an “if/else” anymore.</p>

<h5 id="11-what-is-class-in-python">11. What is class in Python?</h5>
<p>Like any other language classes in Python are also a piece of code that descibe how to produce an object. That is true for python as well.</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">class</span> <span class="nc">ObjectCreator</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
  <span class="k">pass</span>

<span class="n">my_object</span> <span class="o">=</span> <span class="n">ObjectCreator</span><span class="p">()</span>
<span class="k">print</span><span class="p">(</span><span class="n">my_object</span><span class="p">)</span>
</code></pre></div></div>
<p>Output</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="o">&lt;</span><span class="n">__main__</span><span class="p">.</span><span class="n">ObjectCreator</span> <span class="nb">object</span> <span class="n">at</span> <span class="mh">0x7f3d86c186d0</span><span class="o">&gt;</span>
</code></pre></div></div>
<p>But classes are more than that in Python. Classes are objects too.
As soon as you use the keyword class, Python executes it and creates an OBJECT. The instruction</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">class</span> <span class="nc">ObjectCreator</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
  <span class="k">pass</span>
</code></pre></div></div>
<p>creates in memory an object with the name “ObjectCreator”.<br />
<strong>This object (the class) is itself capable of creating objects (the instances), and this is why it’s a class.</strong>
But still, it’s an object, and therefore:</p>
<ul>
  <li>you can assign it to a variable</li>
  <li>you can copy it</li>
  <li>you can add attributes to it</li>
  <li>you can pass it as a function parameter<br />
Example:<br />
```python
class ObjectCreator(object):
pass</li>
</ul>

<h3 id="you-can-print-a-class-because-its-an-object">you can print a class because it’s an object</h3>
<p>print(ObjectCreator)</p>

<p>def echo(o):
  print(o)</p>

<h3 id="you-can-pass-a-class-as-a-parameter">you can pass a class as a parameter</h3>
<p>echo(ObjectCreator)</p>

<p>print(hasattr(ObjectCreator, ‘new_attribute’))</p>

<h3 id="you-can-add-attributes-to-a-class">you can add attributes to a class</h3>
<p>ObjectCreator.new_attribute = ‘foo’</p>

<p>print(hasattr(ObjectCreator, ‘new_attribute’))</p>

<p>print(ObjectCreator.new_attribute)</p>

<h3 id="you-can-assign-a-class-to-a-variable">you can assign a class to a variable</h3>
<p>ObjectCreatorMirror = ObjectCreator 
print(ObjectCreatorMirror.new_attribute)</p>

<p>print(ObjectCreatorMirror())</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Output
```python
&lt;class '__main__.ObjectCreator'&gt;
&lt;class '__main__.ObjectCreator'&gt;
False
True
foo
foo
&lt;__main__.ObjectCreator object at 0x7f455006b810&gt;
</code></pre></div></div>
<p>Since classes are objects, you can create them on the fly, like any object. But it’s not so dynamic, since you still have to write the whole class yourself. For more details, Please refer <a href="https://stackoverflow.com/questions/100003/what-are-metaclasses-in-python/6581949#6581949">link</a>.</p>

<h5 id="12-what-are-metaclasses-in-python">12. What are metaclasses in Python?</h5>
<p>Metaclasses are the ‘stuff’ that creates classes, i.e. metaclasses are what create these objects. They are the classes’ classes.</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">MyClass</span> <span class="o">=</span> <span class="n">MetaClass</span><span class="p">()</span>
<span class="n">my_object</span> <span class="o">=</span> <span class="n">MyClass</span><span class="p">()</span>
</code></pre></div></div>
<p>type is the metaclass Python uses to create all classes behind the scenes.<br />
Everything is an object in Python. That includes ints, strings, functions and classes. All of them are objects. And all of them have been created from a class:</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="o">&gt;&gt;&gt;</span> <span class="n">age</span> <span class="o">=</span> <span class="mi">35</span>
<span class="o">&gt;&gt;&gt;</span> <span class="n">age</span><span class="p">.</span><span class="n">__class__</span>
<span class="o">&lt;</span><span class="nb">type</span> <span class="s">'int'</span><span class="o">&gt;</span>
<span class="o">&gt;&gt;&gt;</span> <span class="n">name</span> <span class="o">=</span> <span class="s">'bob'</span>
<span class="o">&gt;&gt;&gt;</span> <span class="n">name</span><span class="p">.</span><span class="n">__class__</span>
<span class="o">&lt;</span><span class="nb">type</span> <span class="s">'str'</span><span class="o">&gt;</span>
<span class="o">&gt;&gt;&gt;</span> <span class="k">def</span> <span class="nf">foo</span><span class="p">():</span> <span class="k">pass</span>
<span class="o">&gt;&gt;&gt;</span> <span class="n">foo</span><span class="p">.</span><span class="n">__class__</span>
<span class="o">&lt;</span><span class="nb">type</span> <span class="s">'function'</span><span class="o">&gt;</span>
<span class="o">&gt;&gt;&gt;</span> <span class="k">class</span> <span class="nc">Bar</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span> <span class="k">pass</span>
<span class="o">&gt;&gt;&gt;</span> <span class="n">b</span> <span class="o">=</span> <span class="n">Bar</span><span class="p">()</span>
<span class="o">&gt;&gt;&gt;</span> <span class="n">b</span><span class="p">.</span><span class="n">__class__</span>
<span class="o">&lt;</span><span class="k">class</span> <span class="err">'</span><span class="nc">__main__</span><span class="p">.</span><span class="n">Bar</span><span class="s">'&gt;
</span></code></pre></div></div>
<p>Now, what is the <strong>class</strong> of any <strong>class</strong> ?</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="o">&gt;&gt;&gt;</span> <span class="n">age</span><span class="p">.</span><span class="n">__class__</span><span class="p">.</span><span class="n">__class__</span>
<span class="o">&lt;</span><span class="nb">type</span> <span class="s">'type'</span><span class="o">&gt;</span>
<span class="o">&gt;&gt;&gt;</span> <span class="n">name</span><span class="p">.</span><span class="n">__class__</span><span class="p">.</span><span class="n">__class__</span>
<span class="o">&lt;</span><span class="nb">type</span> <span class="s">'type'</span><span class="o">&gt;</span>
<span class="o">&gt;&gt;&gt;</span> <span class="n">foo</span><span class="p">.</span><span class="n">__class__</span><span class="p">.</span><span class="n">__class__</span>
<span class="o">&lt;</span><span class="nb">type</span> <span class="s">'type'</span><span class="o">&gt;</span>
<span class="o">&gt;&gt;&gt;</span> <span class="n">b</span><span class="p">.</span><span class="n">__class__</span><span class="p">.</span><span class="n">__class__</span>
<span class="o">&lt;</span><span class="nb">type</span> <span class="s">'type'</span><span class="o">&gt;</span>
</code></pre></div></div>
<p>type is the built-in metaclass Python uses, but there is a way to create own metaclasses by defining metaclass attribute.<br />
Python 2 syntax for creating metaclass:</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">class</span> <span class="nc">Foo</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
    <span class="n">__metaclass__</span> <span class="o">=</span> <span class="n">something</span><span class="p">...</span>
    <span class="p">[...]</span>
</code></pre></div></div>
<p>Python 3 syntax for creating metaclass:</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">class</span> <span class="nc">Foo</span><span class="p">(</span><span class="nb">object</span><span class="p">,</span> <span class="n">metaclass</span><span class="o">=</span><span class="n">something</span><span class="p">):</span>
    <span class="p">...</span>    
</code></pre></div></div>
<p>You write class Foo(object) first, but the class object Foo is not created in memory yet.<br />
Python will look for <strong>metaclass</strong> in the class definition. If it finds it, it will use it to create the object class Foo. If it doesn’t, it will use type to create the class.<br />
For detail explaination please refer stackoverflow <a href="https://stackoverflow.com/questions/100003/what-are-metaclasses-in-python/6581949#6581949">link</a>.</p>

<h5 id="13-how-to-merge-two-dictionaries-in-single-expression">13. How to merge two dictionaries in single expression?</h5>
<p>In Python 3.5 and above to mearge two dictionaries x and y below syntax is used.</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">z</span> <span class="o">=</span> <span class="p">{</span><span class="o">**</span><span class="n">x</span><span class="p">,</span> <span class="o">**</span><span class="n">y</span><span class="p">}</span>
</code></pre></div></div>
<p>In Python 2, (or 3.4 or lower) write a function:</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">merge_two_dicts</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">):</span>
    <span class="n">z</span> <span class="o">=</span> <span class="n">x</span><span class="p">.</span><span class="n">copy</span><span class="p">()</span>   <span class="c1"># start with x's keys and values
</span>    <span class="n">z</span><span class="p">.</span><span class="n">update</span><span class="p">(</span><span class="n">y</span><span class="p">)</span>    <span class="c1"># modifies z with y's keys and values &amp; returns None
</span>    <span class="k">return</span> <span class="n">z</span>
    
<span class="n">z</span> <span class="o">=</span> <span class="n">merge_two_dicts</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">)</span>   
</code></pre></div></div>
<p>For dictionaries x and y, z becomes a shallowly merged dictionary with values from y replacing those from x.</p>

<h5 id="14-how-to-print-without-new-line">14. How to print without new line?</h5>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">print</span><span class="p">(</span><span class="s">'.'</span><span class="p">,</span> <span class="n">end</span><span class="o">=</span><span class="s">''</span><span class="p">)</span>
</code></pre></div></div>

<h5 id="15-what-is-decorators-in-python">15. What is Decorators in Python?</h5>
<p>Decorators are functions which modify the functionality of other functions. In another word decorators wrap a function, modifying its behavior. Let us start with simple example:</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">my_decorator</span><span class="p">(</span><span class="n">func</span><span class="p">):</span>
    <span class="k">def</span> <span class="nf">wrapper</span><span class="p">():</span>
        <span class="k">print</span><span class="p">(</span><span class="s">"Something is happening before the function is called."</span><span class="p">)</span>
        <span class="n">func</span><span class="p">()</span>
        <span class="k">print</span><span class="p">(</span><span class="s">"Something is happening after the function is called."</span><span class="p">)</span>
    <span class="k">return</span> <span class="n">wrapper</span>

<span class="k">def</span> <span class="nf">say_whee</span><span class="p">():</span>
    <span class="k">print</span><span class="p">(</span><span class="s">"Whee!"</span><span class="p">)</span>

<span class="n">say_whee</span> <span class="o">=</span> <span class="n">my_decorator</span><span class="p">(</span><span class="n">say_whee</span><span class="p">)</span>

<span class="n">say_whee</span><span class="p">()</span>
</code></pre></div></div>
<p>Output</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">Something</span> <span class="ow">is</span> <span class="n">happening</span> <span class="n">before</span> <span class="n">the</span> <span class="n">function</span> <span class="ow">is</span> <span class="n">called</span><span class="p">.</span>
<span class="n">Whee</span><span class="err">!</span>
<span class="n">Something</span> <span class="ow">is</span> <span class="n">happening</span> <span class="n">after</span> <span class="n">the</span> <span class="n">function</span> <span class="ow">is</span> <span class="n">called</span><span class="p">.</span>
</code></pre></div></div>
<p>In the above code, decoration happened at line.</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">say_whee</span> <span class="o">=</span> <span class="n">my_decorator</span><span class="p">(</span><span class="n">say_whee</span><span class="p">)</span>
</code></pre></div></div>
<p>The way you decorated say_whee() above is a little clunky.Python allows you to use decorators in a simpler way with the @ symbol.<br />
Same code can be re-written.</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">my_decorator</span><span class="p">(</span><span class="n">func</span><span class="p">):</span>
    <span class="k">def</span> <span class="nf">wrapper</span><span class="p">():</span>
        <span class="k">print</span><span class="p">(</span><span class="s">"Something is happening before the function is called."</span><span class="p">)</span>
        <span class="n">func</span><span class="p">()</span>
        <span class="k">print</span><span class="p">(</span><span class="s">"Something is happening after the function is called."</span><span class="p">)</span>
    <span class="k">return</span> <span class="n">wrapper</span>

<span class="o">@</span><span class="n">my_decorator</span>
<span class="k">def</span> <span class="nf">say_whee</span><span class="p">():</span>
    <span class="k">print</span><span class="p">(</span><span class="s">"Whee!"</span><span class="p">)</span>
</code></pre></div></div>
<p>Output</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">Something</span> <span class="ow">is</span> <span class="n">happening</span> <span class="n">before</span> <span class="n">the</span> <span class="n">function</span> <span class="ow">is</span> <span class="n">called</span><span class="p">.</span>
<span class="n">Whee</span><span class="err">!</span>
<span class="n">Something</span> <span class="ow">is</span> <span class="n">happening</span> <span class="n">after</span> <span class="n">the</span> <span class="n">function</span> <span class="ow">is</span> <span class="n">called</span><span class="p">.</span>
</code></pre></div></div>
<p>For more details, Please refer the <a href="https://realpython.com/primer-on-python-decorators/#simple-decorators">link</a>.</p>

<h5 id="16-what-does-if-name--main-do-in-python">16. What does if <strong>name</strong> == “<strong>main</strong>”: do in Python?</h5>
<p>Whenever the Python interpreter reads a source file, it does two things:</p>
<ul>
  <li>it sets a few special variables like <strong>name</strong>, and then</li>
  <li>it executes all of the code found in the file.
For detailed explaination, please refer <a href="https://stackoverflow.com/questions/419163/what-does-if-name-main-do/419185#419185">link</a></li>
</ul>

<h5 id="17-what-is-the-meaning-of-a-single-and-a-double-underscore-before-an-object-name">17. What is the meaning of a single and a double underscore before an object name?</h5>
<ul>
  <li>Single Underscore<br />
Names, in a class, with a leading underscore are simply to indicate to other programmers that the attribute or method is intended to be private.</li>
  <li>Double Underscore<br />
Any identifier of the form __spam (at least two leading underscores, at most one trailing underscore) is textually replaced with _classname__spam, where classname is the current class name with leading underscore(s) stripped. This mangling is done without regard to the syntactic position of the identifier, so it can be used to define class-private instance and class variables, methods, variables stored in globals, and even variables stored in instances. private to this class on instances of other classes.<br />
Example:
    <div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="o">&gt;&gt;&gt;</span> <span class="k">class</span> <span class="nc">MyClass</span><span class="p">():</span>
<span class="p">...</span>     <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="p">...</span>             <span class="bp">self</span><span class="p">.</span><span class="n">__superprivate</span> <span class="o">=</span> <span class="s">"Hello"</span>
<span class="p">...</span>             <span class="bp">self</span><span class="p">.</span><span class="n">_semiprivate</span> <span class="o">=</span> <span class="s">", world!"</span>
<span class="p">...</span>
<span class="o">&gt;&gt;&gt;</span> <span class="n">mc</span> <span class="o">=</span> <span class="n">MyClass</span><span class="p">()</span>
<span class="o">&gt;&gt;&gt;</span> <span class="k">print</span> <span class="n">mc</span><span class="p">.</span><span class="n">__superprivate</span>
<span class="n">Traceback</span> <span class="p">(</span><span class="n">most</span> <span class="n">recent</span> <span class="n">call</span> <span class="n">last</span><span class="p">):</span>
<span class="n">File</span> <span class="s">"&lt;stdin&gt;"</span><span class="p">,</span> <span class="n">line</span> <span class="mi">1</span><span class="p">,</span> <span class="ow">in</span> <span class="o">&lt;</span><span class="n">module</span><span class="o">&gt;</span>
<span class="nb">AttributeError</span><span class="p">:</span> <span class="n">myClass</span> <span class="n">instance</span> <span class="n">has</span> <span class="n">no</span> <span class="n">attribute</span> <span class="s">'__superprivate'</span>
<span class="o">&gt;&gt;&gt;</span> <span class="k">print</span> <span class="n">mc</span><span class="p">.</span><span class="n">_semiprivate</span>
<span class="p">,</span> <span class="n">world</span><span class="err">!</span>
<span class="o">&gt;&gt;&gt;</span> <span class="k">print</span> <span class="n">mc</span><span class="p">.</span><span class="n">__dict__</span>
<span class="p">{</span><span class="s">'_MyClass__superprivate'</span><span class="p">:</span> <span class="s">'Hello'</span><span class="p">,</span> <span class="s">'_semiprivate'</span><span class="p">:</span> <span class="s">', world!'</span><span class="p">}</span>
</code></pre></div>    </div>
  </li>
</ul>

<h5 id="18-what-is-numpy">18. What is NumPy?</h5>
<p>NumPy is the fundamental package for scientific computing in Python. It is a Python library that provides a multidimensional array object, various derived objects (such as masked arrays and matrices), and an assortment of routines for fast operations on arrays, including mathematical, logical, shape manipulation, sorting, selecting, I/O, discrete Fourier transforms, basic linear algebra, basic statistical operations, random simulation and much more. For more details please refer <a href="https://docs.scipy.org/doc/numpy/user/whatisnumpy.html">numpy</a>.</p>

<h5 id="19-what-is-pandas">19. What is pandas?</h5>
<p>pandas is a Python package providing fast, flexible, and expressive data structures designed to make working with “relational” or “labeled” data both easy and intuitive. It aims to be the fundamental high-level building block for doing practical, real world data analysis in Python.<br />
pandas is well suited for many different kinds of data:</p>
<ul>
  <li>Tabular data with heterogeneously-typed columns, as in an SQL table or Excel spreadsheet</li>
  <li>Ordered and unordered (not necessarily fixed-frequency) time series data.</li>
  <li>Arbitrary matrix data (homogeneously typed or heterogeneous) with row and column labels</li>
  <li>Any other form of observational / statistical data sets. The data actually need not be labeled at all to be placed into a pandas data structure</li>
</ul>

<p>For getting started with basic pandas, Please refer <a href="https://pandas.pydata.org/pandas-docs/stable/getting_started/10min.html">10 minutes to pandas</a></p>

<h5 id="20-how-to-iterate-over-pandas-dataframe-rows">20. How to iterate over pandas dataframe rows?</h5>
<p>Using DataFrame.iterrows (generator) which yields both index and row.</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="nn">pandas</span> <span class="k">as</span> <span class="n">pd</span>

<span class="n">df</span> <span class="o">=</span> <span class="n">pd</span><span class="p">.</span><span class="n">DataFrame</span><span class="p">([{</span><span class="s">'c1'</span><span class="p">:</span><span class="mi">10</span><span class="p">,</span> <span class="s">'c2'</span><span class="p">:</span><span class="mi">100</span><span class="p">},</span> <span class="p">{</span><span class="s">'c1'</span><span class="p">:</span><span class="mi">11</span><span class="p">,</span><span class="s">'c2'</span><span class="p">:</span><span class="mi">110</span><span class="p">},</span> <span class="p">{</span><span class="s">'c1'</span><span class="p">:</span><span class="mi">12</span><span class="p">,</span><span class="s">'c2'</span><span class="p">:</span><span class="mi">120</span><span class="p">}])</span>

<span class="k">for</span> <span class="n">index</span><span class="p">,</span> <span class="n">row</span> <span class="ow">in</span> <span class="n">df</span><span class="p">.</span><span class="n">iterrows</span><span class="p">():</span>
    <span class="k">print</span><span class="p">(</span><span class="n">row</span><span class="p">[</span><span class="s">'c1'</span><span class="p">],</span> <span class="n">row</span><span class="p">[</span><span class="s">'c2'</span><span class="p">])</span>

<span class="n">Output</span><span class="p">:</span> 
   <span class="mi">10</span> <span class="mi">100</span>
   <span class="mi">11</span> <span class="mi">110</span>
   <span class="mi">12</span> <span class="mi">120</span>
</code></pre></div></div>

<h5 id="21-how-to-handle-large-data-files-in-pandas">21. How to handle large data files in pandas?</h5>
<p>Data files which does not fit into memory can be ready in chunk sizes. Pandas has option to define chunk size while reading the data file.</p>
<ul>
  <li>Option 1: Spefify chunksize to read_csv, doing so will return an iterable object of type TextFileReader
```python
reader = pd.read_csv(‘tmp.sv’, sep=’|’, chunksize=4)</li>
</ul>

<p>for chunk in reader:
	print(chunk)</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>* Option 2: Specify iterator=True to read_csv, it also return an iterable object of type TextFileReader.
```sql
reader = pd.read_csv('tmp.sv', sep='|', iterator=True)
reader.get_chunk(5)
</code></pre></div></div>

<h5 id="22-what-is-intance-class-and-static-method-in-python">22. What is intance, class and static method in python?</h5>
<p>Instance method: Method associated with instance, such method first parameter is self. It is used for handling instance related variables.<br />
Class method: Method associate with class and declared by using classmethod decorator. It is used for handling class related variables.<br />
Static method: Method that is part of class but not related to instance or class variable, it is declared using staticmethod decorator.</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="nn">datetime</span>

<span class="k">class</span> <span class="nc">Employee</span><span class="p">:</span>

    <span class="c1"># class variable
</span>    <span class="n">num_of_emps</span> <span class="o">=</span> <span class="mi">0</span>
    <span class="n">raise_amt</span> <span class="o">=</span> <span class="mf">1.04</span>
    <span class="c1"># instantiate employee class
</span>    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">first</span><span class="p">,</span> <span class="n">last</span><span class="p">,</span> <span class="n">pay</span><span class="p">):</span>
        <span class="bp">self</span><span class="p">.</span><span class="n">first</span> <span class="o">=</span> <span class="n">first</span>
        <span class="bp">self</span><span class="p">.</span><span class="n">last</span> <span class="o">=</span> <span class="n">last</span>        
        <span class="bp">self</span><span class="p">.</span><span class="n">pay</span> <span class="o">=</span> <span class="n">pay</span>

        <span class="n">Employee</span><span class="p">.</span><span class="n">num_of_emps</span> <span class="o">+=</span> <span class="mi">1</span>

    <span class="c1"># instance method
</span>    <span class="k">def</span> <span class="nf">fullname</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
        <span class="k">return</span> <span class="s">'{} {}'</span><span class="p">.</span><span class="nb">format</span><span class="p">(</span><span class="bp">self</span><span class="p">.</span><span class="n">first</span><span class="p">,</span> <span class="bp">self</span><span class="p">.</span><span class="n">last</span><span class="p">)</span>

    <span class="c1"># instance method
</span>    <span class="k">def</span> <span class="nf">apply_raise</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
        <span class="bp">self</span><span class="p">.</span><span class="n">pay</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="bp">self</span><span class="p">.</span><span class="n">pay</span> <span class="o">*</span> <span class="bp">self</span><span class="p">.</span><span class="n">raise_amt</span><span class="p">)</span>
    
    <span class="c1"># instance method
</span>    <span class="k">def</span> <span class="nf">apply_raise2</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">amt</span><span class="p">):</span>
        <span class="bp">self</span><span class="p">.</span><span class="n">pay</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="bp">self</span><span class="p">.</span><span class="n">pay</span> <span class="o">*</span> <span class="n">amt</span><span class="p">)</span>

    <span class="c1"># class method
</span>    <span class="o">@</span><span class="nb">classmethod</span>
    <span class="k">def</span> <span class="nf">set_raise_amt</span><span class="p">(</span><span class="n">cls</span><span class="p">,</span> <span class="n">amount</span><span class="p">):</span>
        <span class="n">cls</span><span class="p">.</span><span class="n">raise_amt</span> <span class="o">=</span> <span class="n">amount</span>

    <span class="c1"># class method
</span>    <span class="o">@</span><span class="nb">classmethod</span>
    <span class="k">def</span> <span class="nf">from_string</span><span class="p">(</span><span class="n">cls</span><span class="p">,</span> <span class="n">emp_str</span><span class="p">):</span>
        <span class="n">first</span><span class="p">,</span> <span class="n">last</span><span class="p">,</span> <span class="n">pay</span> <span class="o">=</span> <span class="n">emp_str</span><span class="p">.</span><span class="n">split</span><span class="p">(</span><span class="s">'-'</span><span class="p">)</span>
        <span class="k">return</span> <span class="n">cls</span><span class="p">(</span><span class="n">first</span><span class="p">,</span> <span class="n">last</span><span class="p">,</span> <span class="n">pay</span><span class="p">)</span>

    <span class="c1"># static method
</span>    <span class="o">@</span><span class="nb">staticmethod</span>
    <span class="k">def</span> <span class="nf">is_workday</span><span class="p">(</span><span class="n">day</span><span class="p">):</span>
        <span class="k">if</span> <span class="n">day</span><span class="p">.</span><span class="n">weekday</span><span class="p">()</span> <span class="o">==</span> <span class="mi">5</span> <span class="ow">or</span> <span class="n">day</span><span class="p">.</span><span class="n">weekday</span><span class="p">()</span> <span class="o">==</span> <span class="mi">6</span><span class="p">:</span>
            <span class="k">return</span> <span class="bp">False</span>
        <span class="k">return</span> <span class="bp">True</span>

<span class="c1"># create employee class instance with value
</span><span class="n">emp_1</span> <span class="o">=</span> <span class="n">Employee</span><span class="p">(</span><span class="s">'Raj'</span><span class="p">,</span> <span class="s">'Nath'</span><span class="p">,</span> <span class="mi">100</span><span class="p">)</span>
<span class="n">emp_2</span> <span class="o">=</span> <span class="n">Employee</span><span class="p">(</span><span class="s">'Som'</span><span class="p">,</span> <span class="s">'Nath'</span><span class="p">,</span> <span class="mi">200</span><span class="p">)</span>

<span class="c1"># print employee 1 name
</span><span class="k">print</span><span class="p">(</span><span class="n">emp_1</span><span class="p">.</span><span class="n">fullname</span><span class="p">())</span>
<span class="k">print</span><span class="p">(</span><span class="n">emp_1</span><span class="p">.</span><span class="n">pay</span><span class="p">)</span>
<span class="c1"># print employee 2 name
</span><span class="k">print</span><span class="p">(</span><span class="n">emp_2</span><span class="p">.</span><span class="n">fullname</span><span class="p">())</span>
<span class="k">print</span><span class="p">(</span><span class="n">emp_2</span><span class="p">.</span><span class="n">pay</span><span class="p">)</span>

<span class="c1"># raise employee 2 pay by 10% using instance method
</span><span class="n">emp_2</span><span class="p">.</span><span class="n">apply_raise2</span><span class="p">(</span><span class="mf">1.10</span><span class="p">)</span>

<span class="c1"># print employee pay
</span><span class="k">print</span><span class="p">(</span><span class="n">emp_1</span><span class="p">.</span><span class="n">pay</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="n">emp_2</span><span class="p">.</span><span class="n">pay</span><span class="p">)</span>

<span class="c1"># set employee raise pay to 5% using class method
</span><span class="n">Employee</span><span class="p">.</span><span class="n">set_raise_amt</span><span class="p">(</span><span class="mf">1.05</span><span class="p">)</span>

<span class="k">print</span><span class="p">(</span><span class="n">Employee</span><span class="p">.</span><span class="n">raise_amt</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="n">emp_1</span><span class="p">.</span><span class="n">raise_amt</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="n">emp_2</span><span class="p">.</span><span class="n">raise_amt</span><span class="p">)</span>

<span class="n">emp_str_3</span> <span class="o">=</span> <span class="s">'Sonia-Dhawan-300'</span>

<span class="n">emp_3</span> <span class="o">=</span> <span class="n">Employee</span><span class="p">.</span><span class="n">from_string</span><span class="p">(</span><span class="n">emp_str_3</span><span class="p">)</span>

<span class="k">print</span><span class="p">(</span><span class="n">emp_3</span><span class="p">.</span><span class="n">first</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="n">emp_3</span><span class="p">.</span><span class="n">pay</span><span class="p">)</span>

<span class="n">my_date</span> <span class="o">=</span> <span class="n">datetime</span><span class="p">.</span><span class="n">date</span><span class="p">(</span><span class="mi">2016</span><span class="p">,</span> <span class="mi">7</span><span class="p">,</span> <span class="mi">11</span><span class="p">)</span>

<span class="k">print</span><span class="p">(</span><span class="n">Employee</span><span class="p">.</span><span class="n">is_workday</span><span class="p">(</span><span class="n">my_date</span><span class="p">))</span>

</code></pre></div></div>

<h5 id="23-difference-between-list-and-tuple">23. Difference between list and tuple?</h5>
<p>List is mutable, i.e. list can be modified after declaring it.</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">mylist</span> <span class="o">=</span><span class="p">[</span><span class="mi">1</span><span class="p">,</span><span class="mi">2</span><span class="p">,</span><span class="mi">3</span><span class="p">]</span>
<span class="k">print</span><span class="p">(</span><span class="n">mylist</span><span class="p">)</span>
<span class="c1"># prints [1,2,3]
</span><span class="n">mylist</span><span class="p">.</span><span class="n">append</span><span class="p">(</span><span class="mi">4</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="n">mylist</span><span class="p">)</span>
<span class="c1"># prints [1,2,3,4]
</span></code></pre></div></div>
<p>Tuple is immutable, i.e. tuple can not be modified after declaring it.</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">mytuple</span> <span class="o">=</span> <span class="p">(</span><span class="mi">1</span><span class="p">,</span><span class="mi">2</span><span class="p">,</span><span class="mi">3</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="n">mytuple</span><span class="p">)</span>
</code></pre></div></div>

<h5 id="24-what-is-module-and-package-in-python">24. What is module and package in python?</h5>
<p>Module : File containing Python definition and statements. For more details refer <a href="https://docs.python.org/3/tutorial/modules.html">module</a>.<br />
Package : Packages are way of structuring Python’s module namespace by using “dotted module name”. For more details refer <a href="https://docs.python.org/3/tutorial/modules.html#packages">package</a>.</p>

<h5 id="25-how-to-declare-global-variable-to-used-accross-module">25. How to declare global variable to used accross module?</h5>
<p>By defining variable in config.py file and importing it accross different modules.</p>

<h5 id="26-what-is-the-return-type-of-range-function">26. What is the return type of range function?</h5>
<p>range function return a range object.</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">r</span> <span class="o">=</span> <span class="nb">range</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span><span class="mi">3</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="n">r</span><span class="p">)</span>
<span class="c1"># print range(1, 4)
</span><span class="k">print</span><span class="p">(</span><span class="nb">type</span><span class="p">(</span><span class="n">r</span><span class="p">))</span>
<span class="c1"># print &lt;class 'range'&gt;
</span></code></pre></div></div>

<h5 id="27-how-to-show-all-files-recursively-of-a-directory">27. How to show all files recursively of a directory?</h5>
<p>Using os.walk, all directory, sub directory and files can be listed.</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="nn">os</span>

<span class="n">rootdir</span> <span class="o">=</span> <span class="n">os</span><span class="p">.</span><span class="n">getcwd</span><span class="p">()</span>

<span class="k">for</span> <span class="n">folder</span><span class="p">,</span> <span class="n">subs</span><span class="p">,</span> <span class="n">files</span> <span class="ow">in</span> <span class="n">os</span><span class="p">.</span><span class="n">walk</span><span class="p">(</span><span class="n">rootdir</span><span class="p">):</span>    
    <span class="k">print</span><span class="p">(</span><span class="n">files</span><span class="p">)</span>
</code></pre></div></div>

<h5 id="28-what-is-deepcopy-shallow-copy-and-reference-copy">28. What is deepcopy, shallow copy and reference copy?</h5>
<p>deep copy and shallow copy can be created using copy class method. Reference copy can be created by assign reference to another variable.</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="nn">copy</span>

<span class="n">lst</span> <span class="o">=</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span><span class="mi">2</span><span class="p">,</span><span class="mi">3</span><span class="p">]</span>

<span class="k">print</span><span class="p">(</span><span class="s">'List: {}'</span><span class="p">.</span><span class="nb">format</span><span class="p">(</span><span class="n">lst</span><span class="p">))</span>

<span class="c1"># deepcopy which will create another copy
</span><span class="n">d_copy</span> <span class="o">=</span> <span class="n">copy</span><span class="p">.</span><span class="n">deepcopy</span><span class="p">(</span><span class="n">lst</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="s">'New copy: {}'</span><span class="p">.</span><span class="nb">format</span><span class="p">(</span><span class="n">d_copy</span><span class="p">))</span>

<span class="c1"># any operation on this copy will not change original list
</span><span class="n">d_copy</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="mi">123</span>
<span class="k">print</span><span class="p">(</span><span class="s">'After update (new_copy): {}'</span><span class="p">.</span><span class="nb">format</span><span class="p">(</span><span class="n">d_copy</span><span class="p">))</span>
<span class="k">print</span><span class="p">(</span><span class="s">'Original list: {}'</span><span class="p">.</span><span class="nb">format</span><span class="p">(</span><span class="n">lst</span><span class="p">))</span>

<span class="c1">#shallow copy
</span><span class="n">s_copy</span> <span class="o">=</span> <span class="n">copy</span><span class="p">.</span><span class="n">copy</span><span class="p">(</span><span class="n">lst</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="s">'After shallow copy: {}'</span><span class="p">.</span><span class="nb">format</span><span class="p">(</span><span class="n">s_copy</span><span class="p">))</span>

<span class="c1"># operation on this copy data will not change original
</span><span class="n">s_copy</span><span class="p">.</span><span class="n">append</span><span class="p">(</span><span class="mi">123</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="s">'Shallo copy after update: {}'</span><span class="p">.</span><span class="nb">format</span><span class="p">(</span><span class="n">s_copy</span><span class="p">))</span>
<span class="k">print</span><span class="p">(</span><span class="s">'Original list : {}'</span><span class="p">.</span><span class="nb">format</span><span class="p">(</span><span class="n">lst</span><span class="p">))</span>

<span class="c1"># reference copy
</span><span class="n">r_copy</span> <span class="o">=</span> <span class="n">lst</span>
<span class="k">print</span><span class="p">(</span><span class="s">'reference copy: {}'</span><span class="p">.</span><span class="nb">format</span><span class="p">(</span><span class="n">r_copy</span><span class="p">))</span>
<span class="n">r_copy</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="o">=</span><span class="mi">123</span>
<span class="k">print</span><span class="p">(</span><span class="s">'reference copy: {}'</span><span class="p">.</span><span class="nb">format</span><span class="p">(</span><span class="n">r_copy</span><span class="p">))</span>
<span class="k">print</span><span class="p">(</span><span class="s">'original copy: {}'</span><span class="p">.</span><span class="nb">format</span><span class="p">(</span><span class="n">lst</span><span class="p">))</span>
</code></pre></div></div>
<p>Output</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">List</span><span class="p">:</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">]</span>
<span class="n">New</span> <span class="n">copy</span><span class="p">:</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">]</span>
<span class="n">After</span> <span class="n">update</span> <span class="p">(</span><span class="n">new_copy</span><span class="p">):</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">123</span><span class="p">,</span> <span class="mi">3</span><span class="p">]</span>
<span class="n">Original</span> <span class="nb">list</span><span class="p">:</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">]</span>
<span class="n">After</span> <span class="n">shallow</span> <span class="n">copy</span><span class="p">:</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">]</span>
<span class="n">Shallo</span> <span class="n">copy</span> <span class="n">after</span> <span class="n">update</span><span class="p">:</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">123</span><span class="p">]</span>
<span class="n">Original</span> <span class="nb">list</span> <span class="p">:</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">]</span>
<span class="n">reference</span> <span class="n">copy</span><span class="p">:</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">]</span>
<span class="n">reference</span> <span class="n">copy</span><span class="p">:</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">123</span><span class="p">,</span> <span class="mi">3</span><span class="p">]</span>
<span class="n">original</span> <span class="n">copy</span><span class="p">:</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">123</span><span class="p">,</span> <span class="mi">3</span><span class="p">]</span>
</code></pre></div></div>

<h5 id="29-how-to-perform-operaton-on-list-and-tuple-values">29. How to perform operaton on list and tuple values?</h5>
<p>Operation can be performed on list and tuple, but it behaves differently when we try normally. In below example when multiplied by 2, it prints same list 2 times, which is not intended. In order to get intended result, try list comprehension or other option such map function.</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># operation of list
</span><span class="n">lst</span> <span class="o">=</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span><span class="mi">2</span><span class="p">,</span><span class="mi">3</span><span class="p">,</span><span class="mi">4</span><span class="p">]</span> <span class="c1"># list
</span><span class="n">tpl</span> <span class="o">=</span> <span class="p">(</span><span class="mi">1</span><span class="p">,</span><span class="mi">2</span><span class="p">,</span><span class="mi">3</span><span class="p">,</span><span class="mi">4</span><span class="p">)</span> <span class="c1"># tuple
</span>
<span class="n">lm</span> <span class="o">=</span> <span class="k">lambda</span> <span class="n">x</span> <span class="p">:</span> <span class="n">x</span><span class="o">*</span><span class="mi">2</span> <span class="c1"># lambda function
</span>
<span class="k">print</span><span class="p">(</span><span class="s">'Original list: {}'</span><span class="p">.</span><span class="nb">format</span><span class="p">(</span><span class="n">lst</span><span class="p">))</span>
<span class="k">print</span><span class="p">(</span><span class="s">'After multiplication with 2: {}'</span><span class="p">.</span><span class="nb">format</span><span class="p">(</span><span class="n">lst</span><span class="o">*</span><span class="mi">2</span><span class="p">))</span>
<span class="k">print</span><span class="p">(</span><span class="s">'Multiplication using list comprehension'</span><span class="p">)</span>
<span class="k">print</span><span class="p">([</span><span class="n">i</span><span class="o">*</span><span class="mi">2</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="n">lst</span><span class="p">])</span>
<span class="k">print</span><span class="p">(</span><span class="s">'Original list: {}'</span><span class="p">.</span><span class="nb">format</span><span class="p">(</span><span class="n">lst</span><span class="p">))</span>
<span class="k">print</span><span class="p">(</span><span class="s">'Multiplication using list comprehension with lmbda function'</span><span class="p">)</span>
<span class="k">print</span><span class="p">([</span><span class="n">lm</span><span class="p">(</span><span class="n">x</span><span class="p">)</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">lst</span><span class="p">])</span>
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">map</span><span class="p">(</span><span class="n">lm</span><span class="p">,</span><span class="n">lst</span><span class="p">):</span>
    <span class="k">print</span><span class="p">(</span><span class="n">i</span><span class="p">)</span>

<span class="c1"># operation over tuple
</span><span class="k">print</span><span class="p">(</span><span class="s">'Original tuple: {}'</span><span class="p">.</span><span class="nb">format</span><span class="p">(</span><span class="n">tpl</span><span class="p">))</span>
<span class="k">print</span><span class="p">(</span><span class="s">'After muplication with 2: {}'</span><span class="p">.</span><span class="nb">format</span><span class="p">(</span><span class="n">tpl</span><span class="o">*</span><span class="mi">2</span><span class="p">))</span>
<span class="k">print</span><span class="p">(</span><span class="s">'Multiplication using list comprehension'</span><span class="p">)</span>
<span class="k">print</span><span class="p">([</span><span class="n">i</span><span class="o">*</span><span class="mi">2</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="n">tpl</span><span class="p">])</span>
<span class="k">print</span><span class="p">(</span><span class="s">'Multiplication using list comprehension with lmbda function'</span><span class="p">)</span>
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="p">(</span><span class="n">lm</span><span class="p">(</span><span class="n">x</span><span class="p">)</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">tpl</span><span class="p">):</span>
    <span class="k">print</span><span class="p">(</span><span class="n">i</span><span class="p">)</span>
</code></pre></div></div>
<p>Output</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">Original</span> <span class="nb">list</span><span class="p">:</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">4</span><span class="p">]</span>
<span class="n">After</span> <span class="n">multiplication</span> <span class="k">with</span> <span class="mi">2</span><span class="p">:</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">4</span><span class="p">]</span>
<span class="n">Multiplication</span> <span class="n">using</span> <span class="nb">list</span> <span class="n">comprehension</span>
<span class="p">[</span><span class="mi">2</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">6</span><span class="p">,</span> <span class="mi">8</span><span class="p">]</span>
<span class="n">Original</span> <span class="nb">list</span><span class="p">:</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">4</span><span class="p">]</span>
<span class="n">Multiplication</span> <span class="n">using</span> <span class="nb">list</span> <span class="n">comprehension</span> <span class="k">with</span> <span class="n">lmbda</span> <span class="n">function</span>
<span class="p">[</span><span class="mi">2</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">6</span><span class="p">,</span> <span class="mi">8</span><span class="p">]</span>
<span class="mi">2</span>
<span class="mi">4</span>
<span class="mi">6</span>
<span class="mi">8</span>
<span class="n">Original</span> <span class="nb">tuple</span><span class="p">:</span> <span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">4</span><span class="p">)</span>
<span class="n">After</span> <span class="n">muplication</span> <span class="k">with</span> <span class="mi">2</span><span class="p">:</span> <span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">4</span><span class="p">)</span>
<span class="n">Multiplication</span> <span class="n">using</span> <span class="nb">list</span> <span class="n">comprehension</span>
<span class="p">[</span><span class="mi">2</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">6</span><span class="p">,</span> <span class="mi">8</span><span class="p">]</span>
<span class="n">Multiplication</span> <span class="n">using</span> <span class="nb">list</span> <span class="n">comprehension</span> <span class="k">with</span> <span class="n">lmbda</span> <span class="n">function</span>
<span class="mi">2</span>
<span class="mi">4</span>
<span class="mi">6</span>
<span class="mi">8</span>
</code></pre></div></div>

<h5 id="30-how-to-make-python-script-executable-from-anywhere-in-linux">30. How to make python script executable from anywhere in linux?</h5>
<p>Adding below line as first link in python script, makes it executable from anywhere.<br />
#!/usr/bin/env python3</p>

<h5 id="31-how-to-calculate-total-unique-duration-given-a-list-of-tupple-passed-as-input">31. How to calculate total unique duration given a list of tupple passed as input?</h5>
<p>Let us take a case of YouTube, a user logged in and started watching video and watched from 0-10 min, later logged in again and watched same video from 15-20 min and 18-25 min. In this case total duration of viewer is 10+6+8 = 24 min but if we remove the timing where user watched same content, then total duration would be 10+6+5 = 21 min.</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># Input
</span><span class="n">input_list</span> <span class="o">=</span> <span class="p">[(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">10</span><span class="p">),</span> <span class="p">(</span><span class="mi">10</span><span class="p">,</span><span class="mi">16</span><span class="p">)]</span>

<span class="c1"># Output
</span><span class="n">output_list</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">for</span> <span class="n">lst</span> <span class="ow">in</span> <span class="n">input_list</span><span class="p">:</span>
    <span class="n">output_list</span> <span class="o">=</span> <span class="n">output_list</span> <span class="o">+</span> <span class="nb">list</span><span class="p">(</span><span class="nb">range</span><span class="p">(</span><span class="n">lst</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">lst</span><span class="p">[</span><span class="mi">1</span><span class="p">]))</span>

<span class="c1"># Total duration after removing duplicates
</span><span class="n">total_duration</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="nb">list</span><span class="p">(</span><span class="nb">set</span><span class="p">(</span><span class="n">output_list</span><span class="p">)))</span>

<span class="c1"># Total time
</span><span class="k">print</span><span class="p">(</span><span class="n">total_duration</span><span class="p">)</span>
</code></pre></div></div>

<h5 id="32-how-to-check-if-a-string-is-palindrome">32. How to check if a string is palindrome?</h5>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># Input data
</span><span class="n">str1</span> <span class="o">=</span> <span class="s">'raR'</span>

<span class="k">if</span> <span class="n">str1</span><span class="p">.</span><span class="n">lower</span><span class="p">()</span> <span class="o">==</span> <span class="n">str1</span><span class="p">[::</span><span class="o">-</span><span class="mi">1</span><span class="p">].</span><span class="n">lower</span><span class="p">():</span>
    <span class="k">print</span><span class="p">(</span><span class="s">'Palindrome.'</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
    <span class="k">print</span><span class="p">(</span><span class="s">'Not a Palindrome.'</span><span class="p">)</span>
</code></pre></div></div>

<h5 id="33-what-is-context-manager">33. What is context manager?</h5>
<p>Context manager is used to manage resources correctly. Using context manager one can eliminate the chances of keeping resources such a file and database connections opened when it is no longer needed. Although as programmer it is expected to write code, taking care of releasing resources once that is no longer needed. Using context manager, it can be automated and resources can be released automatically. Most common use of inbuilt context manager is the function to open file.<br />
Let us understand with example by creating our own custom function for handling file.</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">from</span> <span class="nn">contextlib</span> <span class="kn">import</span> <span class="n">contextmanager</span>


<span class="o">@</span><span class="n">contextmanager</span>
<span class="k">def</span> <span class="nf">open_file</span><span class="p">(</span><span class="n">file_name</span><span class="p">,</span> <span class="n">mode</span><span class="p">):</span>
    <span class="k">try</span><span class="p">:</span>
        <span class="n">f</span> <span class="o">=</span> <span class="nb">open</span><span class="p">(</span><span class="n">file_name</span><span class="p">,</span> <span class="n">mode</span><span class="p">)</span>
        <span class="k">yield</span> <span class="n">f</span>
    <span class="k">finally</span><span class="p">:</span>
        <span class="n">f</span><span class="p">.</span><span class="n">close</span><span class="p">()</span>


<span class="k">with</span> <span class="n">open_file</span><span class="p">(</span><span class="s">'log_a.txt'</span><span class="p">,</span> <span class="s">'w'</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
    <span class="n">f</span><span class="p">.</span><span class="n">append</span><span class="p">(</span><span class="s">'Hello'</span><span class="p">)</span>
    <span class="k">print</span><span class="p">(</span><span class="n">f</span><span class="p">.</span><span class="n">closed</span><span class="p">)</span>

<span class="k">print</span><span class="p">(</span><span class="n">f</span><span class="p">.</span><span class="n">closed</span><span class="p">)</span>
</code></pre></div></div>
<p>On running above code sniplets, it will open file and write a word and print status of file as False (file is not closed) and then when code is out of context, it print status as True (file is closed).</p>

<p>There is another option of using classes.</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">class</span> <span class="nc">File</span><span class="p">():</span>

    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">filename</span><span class="p">,</span> <span class="n">mode</span><span class="p">):</span>
        <span class="bp">self</span><span class="p">.</span><span class="n">filename</span> <span class="o">=</span> <span class="n">filename</span>
        <span class="bp">self</span><span class="p">.</span><span class="n">mode</span> <span class="o">=</span> <span class="n">mode</span>

    <span class="k">def</span> <span class="nf">__enter__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
        <span class="bp">self</span><span class="p">.</span><span class="n">open_file</span> <span class="o">=</span> <span class="nb">open</span><span class="p">(</span><span class="bp">self</span><span class="p">.</span><span class="n">filename</span><span class="p">,</span> <span class="bp">self</span><span class="p">.</span><span class="n">mode</span><span class="p">)</span>
        <span class="k">return</span> <span class="bp">self</span><span class="p">.</span><span class="n">open_file</span>

    <span class="k">def</span> <span class="nf">__exit__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">):</span>
        <span class="bp">self</span><span class="p">.</span><span class="n">open_file</span><span class="p">.</span><span class="n">close</span><span class="p">()</span>

<span class="n">files</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">for</span> <span class="n">_</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">10000</span><span class="p">):</span>
    <span class="k">with</span> <span class="n">File</span><span class="p">(</span><span class="s">'foo.txt'</span><span class="p">,</span> <span class="s">'w'</span><span class="p">)</span> <span class="k">as</span> <span class="n">infile</span><span class="p">:</span>
        <span class="n">infile</span><span class="p">.</span><span class="n">write</span><span class="p">(</span><span class="s">'foo'</span><span class="p">)</span>
        <span class="n">files</span><span class="p">.</span><span class="n">append</span><span class="p">(</span><span class="n">infile</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="n">f</span><span class="p">.</span><span class="n">closed</span><span class="p">)</span>
</code></pre></div></div>
<p>Above also does same, when code is out of context, it print status of file as closed.</p>

<h5 id="34-how-to-pass-parameter-to-remote-python-code-execution-over-ssh">34. How to pass parameter to remote python code execution over ssh?</h5>
<p>In case of distributed system where different systems are involved in executing different parts, we often execute piece of code on different server. In such cases if you want to return some complex data structure like dictionary or list on the fly which is really needed in case of small data sets, thing become complex with no details around it. I found very good peice of code online to solve this problem.</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># Parse data for sending as argument
</span><span class="kn">import</span> <span class="nn">urllib.parse</span>
<span class="kn">import</span> <span class="nn">json</span>
<span class="n">dict1_j</span> <span class="o">=</span> <span class="n">urllib</span><span class="p">.</span><span class="n">parse</span><span class="p">.</span><span class="n">quote</span><span class="p">(</span><span class="n">json</span><span class="p">.</span><span class="n">dumps</span><span class="p">(</span><span class="n">dict1</span><span class="p">))</span>

<span class="c1"># Unparse at receiving end
</span><span class="kn">import</span> <span class="nn">json</span> 
<span class="kn">import</span> <span class="nn">urllib.parse</span> 
<span class="n">dict1</span> <span class="o">=</span> <span class="n">json</span><span class="p">.</span><span class="n">loads</span><span class="p">(</span><span class="n">urllib</span><span class="p">.</span><span class="n">parse</span><span class="p">.</span><span class="n">unquote</span><span class="p">(</span><span class="n">sys</span><span class="p">.</span><span class="n">argv</span><span class="p">[</span><span class="mi">1</span><span class="p">]))</span>
</code></pre></div></div>

<h5 id="35-complete-the-code-sniplet-to-generate-true-random-password-using-alphabet-number-and-symbols">35. Complete the code sniplet to generate true random password using alphabet, number and symbols.</h5>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">#Password Generator
</span><span class="n">letters</span> <span class="o">=</span> <span class="p">[</span><span class="s">'a'</span><span class="p">,</span> <span class="s">'b'</span><span class="p">,</span> <span class="s">'c'</span><span class="p">,</span> <span class="s">'d'</span><span class="p">,</span> <span class="s">'e'</span><span class="p">,</span> <span class="s">'f'</span><span class="p">,</span> <span class="s">'g'</span><span class="p">,</span> <span class="s">'h'</span><span class="p">,</span> <span class="s">'i'</span><span class="p">,</span> <span class="s">'j'</span><span class="p">,</span> <span class="s">'k'</span><span class="p">,</span> <span class="s">'l'</span><span class="p">,</span> <span class="s">'m'</span><span class="p">,</span> <span class="s">'n'</span><span class="p">,</span> <span class="s">'o'</span><span class="p">,</span> <span class="s">'p'</span><span class="p">,</span> <span class="s">'q'</span><span class="p">,</span> <span class="s">'r'</span><span class="p">,</span> <span class="s">'s'</span><span class="p">,</span> <span class="s">'t'</span><span class="p">,</span> <span class="s">'u'</span><span class="p">,</span> <span class="s">'v'</span><span class="p">,</span> <span class="s">'w'</span><span class="p">,</span> <span class="s">'x'</span><span class="p">,</span> <span class="s">'y'</span><span class="p">,</span> <span class="s">'z'</span><span class="p">,</span> <span class="s">'A'</span><span class="p">,</span> <span class="s">'B'</span><span class="p">,</span> <span class="s">'C'</span><span class="p">,</span> <span class="s">'D'</span><span class="p">,</span> <span class="s">'E'</span><span class="p">,</span> <span class="s">'F'</span><span class="p">,</span> <span class="s">'G'</span><span class="p">,</span> <span class="s">'H'</span><span class="p">,</span> <span class="s">'I'</span><span class="p">,</span> <span class="s">'J'</span><span class="p">,</span> <span class="s">'K'</span><span class="p">,</span> <span class="s">'L'</span><span class="p">,</span> <span class="s">'M'</span><span class="p">,</span> <span class="s">'N'</span><span class="p">,</span> <span class="s">'O'</span><span class="p">,</span> <span class="s">'P'</span><span class="p">,</span> <span class="s">'Q'</span><span class="p">,</span> <span class="s">'R'</span><span class="p">,</span> <span class="s">'S'</span><span class="p">,</span> <span class="s">'T'</span><span class="p">,</span> <span class="s">'U'</span><span class="p">,</span> <span class="s">'V'</span><span class="p">,</span> <span class="s">'W'</span><span class="p">,</span> <span class="s">'X'</span><span class="p">,</span> <span class="s">'Y'</span><span class="p">,</span> <span class="s">'Z'</span><span class="p">]</span>
<span class="n">numbers</span> <span class="o">=</span> <span class="p">[</span><span class="s">'0'</span><span class="p">,</span> <span class="s">'1'</span><span class="p">,</span> <span class="s">'2'</span><span class="p">,</span> <span class="s">'3'</span><span class="p">,</span> <span class="s">'4'</span><span class="p">,</span> <span class="s">'5'</span><span class="p">,</span> <span class="s">'6'</span><span class="p">,</span> <span class="s">'7'</span><span class="p">,</span> <span class="s">'8'</span><span class="p">,</span> <span class="s">'9'</span><span class="p">]</span>
<span class="n">symbols</span> <span class="o">=</span> <span class="p">[</span><span class="s">'!'</span><span class="p">,</span> <span class="s">'#'</span><span class="p">,</span> <span class="s">'$'</span><span class="p">,</span> <span class="s">'%'</span><span class="p">,</span> <span class="s">'&amp;'</span><span class="p">,</span> <span class="s">'('</span><span class="p">,</span> <span class="s">')'</span><span class="p">,</span> <span class="s">'*'</span><span class="p">,</span> <span class="s">'+'</span><span class="p">]</span>

<span class="k">print</span><span class="p">(</span><span class="s">"Welcome to the PyPassword Generator!"</span><span class="p">)</span>
<span class="n">nr_letters</span><span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="nb">input</span><span class="p">(</span><span class="s">"How many letters would you like in your password?</span><span class="se">\n</span><span class="s">"</span><span class="p">))</span> 
<span class="n">nr_numbers</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="nb">input</span><span class="p">(</span><span class="sa">f</span><span class="s">"How many numbers would you like?</span><span class="se">\n</span><span class="s">"</span><span class="p">))</span>
<span class="n">nr_symbols</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="nb">input</span><span class="p">(</span><span class="sa">f</span><span class="s">"How many symbols would you like?</span><span class="se">\n</span><span class="s">"</span><span class="p">))</span>
</code></pre></div></div>

<p>Using python random module choices and shuffle method, random password can be generated easily.</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">password_list</span> <span class="o">=</span> <span class="n">random</span><span class="p">.</span><span class="n">choices</span><span class="p">(</span><span class="n">letters</span><span class="p">,</span><span class="n">k</span><span class="o">=</span><span class="n">nr_letters</span><span class="p">)</span> <span class="o">+</span> <span class="n">random</span><span class="p">.</span><span class="n">choices</span><span class="p">(</span><span class="n">symbols</span><span class="p">,</span><span class="n">k</span><span class="o">=</span><span class="n">nr_symbols</span><span class="p">)</span> <span class="o">+</span> <span class="n">random</span><span class="p">.</span><span class="n">choices</span><span class="p">(</span><span class="n">numbers</span><span class="p">,</span><span class="n">k</span><span class="o">=</span><span class="n">nr_numbers</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="n">password_list</span><span class="p">)</span>
<span class="n">random</span><span class="p">.</span><span class="n">shuffle</span><span class="p">(</span><span class="n">password_list</span><span class="p">)</span>
<span class="n">password</span> <span class="o">=</span> <span class="s">''</span><span class="p">.</span><span class="n">join</span><span class="p">(</span><span class="n">password_list</span><span class="p">)</span>

<span class="k">print</span><span class="p">(</span><span class="s">'Random generated password :{}'</span><span class="p">.</span><span class="nb">format</span><span class="p">(</span><span class="n">new_password</span><span class="p">))</span>
</code></pre></div></div>

<h5 id="36-restriction-on-dictionary-key-data-type">36. Restriction on dictionary key data type.</h5>
<p>Python dictionary key can be of any data type but it can not have mutable object/data type as key. In other a dictionary can not have a list or dict as key.</p>

<h5 id="37-what-is-patch-in-rest-api">37. What is patch in rest api?</h5>

<h5 id="38-difference-between-filter-and-reduce">38. Difference between filter and reduce.</h5>

<h5 id="39-data-caching-in-flask-api">39. Data caching in flask api.</h5>

<h5 id="40-ashnchronous-request-in-flask">40. Ashnchronous request in flask.</h5>

<h5 id="41-how-to-create-singleton-class-in-python">41. How to create singleton class in Python?</h5>

<h5 id="42-describe-solid-coding-priciple-with-example">42. Describe SOLID coding priciple with example.</h5>

<h5 id="42-find-sum-of-n-numbers-without-using-any-loop-or-in-built-functions">42. Find sum of n numbers without using any loop or in-built functions.</h5>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">sum</span><span class="p">(</span><span class="n">n</span><span class="p">):</span>
    <span class="k">if</span> <span class="n">n</span> <span class="o">&lt;=</span> <span class="mi">1</span><span class="p">:</span>
        <span class="k">return</span> <span class="n">n</span>
    <span class="k">else</span><span class="p">:</span>
        <span class="k">return</span> <span class="n">n</span> <span class="o">+</span> <span class="nb">sum</span><span class="p">(</span><span class="n">n</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span>
</code></pre></div></div>

<h5 id="43-check-balanced-parentheses-in-python">43. Check balanced parentheses in Python.</h5>]]></content><author><name>Raj Nath Sah</name></author><category term="Python" /><category term="Flask" /><summary type="html"><![CDATA[Important topics in Q&amp;A format is based on my experience. Feel free to update me in case of any observation or you want to add anything.]]></summary></entry><entry><title type="html">Automate airflow scheduler log cleanup</title><link href="https://blog.rajnath.dev/airflow-sh-logs/" rel="alternate" type="text/html" title="Automate airflow scheduler log cleanup" /><published>2021-10-06T00:00:00+00:00</published><updated>2021-10-06T00:00:00+00:00</updated><id>https://blog.rajnath.dev/airflow-sh-logs</id><content type="html" xml:base="https://blog.rajnath.dev/airflow-sh-logs/"><![CDATA[<h1 id="airflow">Airflow</h1>
<p>Airflow is a platform created by the community to programmatically author, schedule and monitor workflows.</p>

<h1 id="scheduler-logs">Scheduler Logs</h1>
<p>Airflow scheduler run continuously in background and generates lots of logs and it fills the file system. These logs needs to be clean up periodically to free space.</p>

<h1 id="command-to-clean-up-log">Command to clean up log</h1>
<p>find $AIRFLOW_HOME/logs/scheduler -type f -mtime +5 -delete</p>

<h1 id="dag-for-running-command-daily">Dag for running command daily</h1>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">from</span> <span class="nn">datetime</span> <span class="kn">import</span> <span class="n">datetime</span><span class="p">,</span> <span class="n">timedelta</span>

<span class="kn">from</span> <span class="nn">airflow.models</span> <span class="kn">import</span> <span class="n">DAG</span>
<span class="kn">from</span> <span class="nn">airflow.operators.bash_operator</span> <span class="kn">import</span> <span class="n">BashOperator</span>


<span class="n">main_dag_id</span> <span class="o">=</span> <span class="s">'scheduler_cleanup'</span>


<span class="n">args</span> <span class="o">=</span> <span class="p">{</span>
    <span class="s">'owner'</span><span class="p">:</span> <span class="s">'Airflow'</span><span class="p">,</span>
    <span class="s">'start_date'</span><span class="p">:</span> <span class="n">datetime</span><span class="p">(</span><span class="mi">2021</span><span class="p">,</span> <span class="mi">7</span><span class="p">,</span> <span class="mi">21</span><span class="p">),</span>
    <span class="s">'provide_context'</span><span class="p">:</span> <span class="bp">True</span>
<span class="p">}</span>



<span class="k">with</span> <span class="n">DAG</span><span class="p">(</span>
        <span class="n">main_dag_id</span><span class="p">,</span>        
        <span class="n">catchup</span><span class="o">=</span><span class="bp">False</span><span class="p">,</span>
        <span class="n">concurrency</span><span class="o">=</span><span class="mi">4</span><span class="p">,</span>
        <span class="n">schedule_interval</span><span class="o">=</span><span class="s">'@daily'</span><span class="p">,</span>
        <span class="n">default_args</span><span class="o">=</span><span class="n">args</span><span class="p">)</span> <span class="k">as</span> <span class="n">dag</span><span class="p">:</span>

        <span class="n">clean_scheduler_logs</span> <span class="o">=</span> <span class="n">BashOperator</span><span class="p">(</span><span class="n">task_id</span><span class="o">=</span><span class="s">'clean_scheduler_logs'</span><span class="p">,</span>
                            <span class="n">bash_command</span><span class="o">=</span><span class="s">"find $AIRFLOW_HOME/logs/scheduler -type f -mtime +7 -delete"</span><span class="p">)</span>
       

        <span class="n">clean_scheduler_logs</span>
</code></pre></div></div>]]></content><author><name>Raj Nath Sah</name></author><category term="Apache Airflow" /><category term="Python" /><summary type="html"><![CDATA[Automate airflow scheduler log clean up using scheduler airflow dag.]]></summary></entry><entry><title type="html">Remote command execution over SSH using Python</title><link href="https://blog.rajnath.dev/ssh-python/" rel="alternate" type="text/html" title="Remote command execution over SSH using Python" /><published>2021-03-22T00:00:00+00:00</published><updated>2021-03-22T00:00:00+00:00</updated><id>https://blog.rajnath.dev/ssh-python</id><content type="html" xml:base="https://blog.rajnath.dev/ssh-python/"><![CDATA[<h1 id="ssh">SSH</h1>
<p>SSH or Secure Shell is a cryptographic network protocol for operating network services securely over an unsecured network.[1] Typical applications include remote command-line, login, and remote command execution, but any network service can be secured with SSH.</p>
<h1 id="remote-execution">Remote execution</h1>
<p>Python has many libraries for using SSH. I will discuss about the two libraries which i have used in my projects.</p>
<h2 id="paramiko">Paramiko</h2>
<p>Paramiko is a Python (2.7, 3.4+) implementation of the SSHv2 protocol [1], providing both client and server functionality. While it leverages a Python C extension for low level cryptography (Cryptography), Paramiko itself is a pure Python interface around SSH networking concepts.<br />
Let us look at example of paramiko.</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="nn">paramiko</span>

<span class="n">hostname</span> <span class="o">=</span> <span class="s">'localhost'</span>
<span class="n">username</span> <span class="o">=</span> <span class="s">'root'</span>
<span class="n">password</span> <span class="o">=</span> <span class="s">'password'</span>
<span class="n">script_path</span> <span class="o">=</span> <span class="s">"/root"</span>
<span class="n">command</span> <span class="o">=</span> <span class="s">"ls"</span>
<span class="n">pem</span> <span class="o">=</span> <span class="bp">None</span>

<span class="c1"># ssh client
</span><span class="n">client</span> <span class="o">=</span> <span class="n">paramiko</span><span class="p">.</span><span class="n">SSHClient</span><span class="p">()</span>
<span class="n">client</span><span class="p">.</span><span class="n">set_missing_host_key_policy</span><span class="p">(</span><span class="n">paramiko</span><span class="p">.</span><span class="n">AutoAddPolicy</span><span class="p">())</span>

<span class="c1"># connect to ssh server
</span><span class="n">client</span><span class="p">.</span><span class="n">connect</span><span class="p">(</span><span class="n">hostname</span> <span class="o">=</span><span class="n">hostname</span><span class="p">,</span>
                <span class="n">username</span><span class="o">=</span><span class="n">username</span><span class="p">,</span>
                <span class="n">password</span><span class="o">=</span><span class="n">password</span><span class="p">,</span>
                <span class="n">pkey</span><span class="o">=</span><span class="n">paramiko</span><span class="p">.</span><span class="n">RSAKey</span><span class="p">.</span><span class="n">from_private_key_file</span><span class="p">(</span><span class="n">pem</span><span class="p">)</span> <span class="k">if</span> <span class="n">pem</span> <span class="k">else</span> <span class="bp">None</span><span class="p">)</span>

<span class="c1"># run command
</span><span class="n">_</span><span class="p">,</span> <span class="n">stdout</span><span class="p">,</span> <span class="n">stderr</span> <span class="o">=</span> <span class="n">client</span><span class="p">.</span><span class="n">exec_command</span><span class="p">(</span><span class="s">'cd {} &amp;&amp; {}'</span><span class="p">.</span><span class="nb">format</span><span class="p">(</span><span class="n">script_path</span><span class="p">,</span> <span class="n">command</span><span class="p">))</span>

<span class="n">out</span> <span class="o">=</span> <span class="n">stdout</span><span class="p">.</span><span class="n">readlines</span><span class="p">()</span>
<span class="n">err</span> <span class="o">=</span> <span class="n">stderr</span><span class="p">.</span><span class="n">readlines</span><span class="p">()</span>
<span class="n">exit_code</span> <span class="o">=</span> <span class="n">stdout</span><span class="p">.</span><span class="n">channel</span><span class="p">.</span><span class="n">recv_exit_status</span><span class="p">()</span>
<span class="n">client</span><span class="p">.</span><span class="n">close</span><span class="p">()</span>
</code></pre></div></div>
<h2 id="asyncssh">Asyncssh</h2>
<p>AsyncSSH is a Python package which provides an asynchronous client and server implementation of the SSHv2 protocol on top of the Python 3.6+ asyncio framework. Lets look into one simple example to run command using asynssh.</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="nn">asyncio</span><span class="p">,</span> <span class="n">asyncssh</span><span class="p">,</span> <span class="n">sys</span>

<span class="n">hosts</span> <span class="o">=</span> <span class="s">'localhost'</span>
<span class="n">username</span> <span class="o">=</span> <span class="s">'username'</span>
<span class="n">password</span> <span class="o">=</span> <span class="s">'password'</span>

<span class="c1"># create connection
</span><span class="k">async</span> <span class="k">def</span> <span class="nf">run_client</span><span class="p">():</span>
    <span class="n">conn</span> <span class="o">=</span> <span class="k">await</span> <span class="n">asyncio</span><span class="p">.</span><span class="n">wait_for</span><span class="p">(</span><span class="n">asyncssh</span><span class="p">.</span><span class="n">connect</span><span class="p">(</span><span class="n">hosts</span><span class="p">,</span> <span class="n">username</span><span class="o">=</span><span class="n">username</span><span class="p">,</span> <span class="n">password</span><span class="o">=</span><span class="n">password</span><span class="p">,</span> <span class="n">known_hosts</span> <span class="o">=</span> <span class="bp">None</span><span class="p">),</span><span class="mi">10</span><span class="p">,)</span>
    <span class="k">return</span> <span class="n">conn</span>

<span class="c1"># run command
</span><span class="k">async</span> <span class="k">def</span> <span class="nf">run_command</span><span class="p">():</span>    
    <span class="k">try</span><span class="p">:</span>
        <span class="n">conn</span> <span class="o">=</span> <span class="k">await</span> <span class="n">run_client</span><span class="p">()</span>        
        <span class="n">result</span> <span class="o">=</span> <span class="k">await</span> <span class="n">conn</span><span class="p">.</span><span class="n">run</span><span class="p">(</span><span class="s">'ls'</span><span class="p">)</span>

        <span class="k">if</span> <span class="n">result</span><span class="p">.</span><span class="n">exit_status</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>            
            <span class="k">print</span><span class="p">(</span><span class="n">result</span><span class="p">.</span><span class="n">stdout</span><span class="p">,</span> <span class="n">end</span><span class="o">=</span><span class="s">''</span><span class="p">)</span>
        <span class="k">else</span><span class="p">:</span>
            <span class="k">print</span><span class="p">(</span><span class="n">result</span><span class="p">.</span><span class="n">stderr</span><span class="p">,</span> <span class="n">end</span><span class="o">=</span><span class="s">''</span><span class="p">,</span> <span class="nb">file</span><span class="o">=</span><span class="n">sys</span><span class="p">.</span><span class="n">stderr</span><span class="p">)</span>
            <span class="k">print</span><span class="p">(</span><span class="s">'Program exited with status %d'</span> <span class="o">%</span> <span class="n">result</span><span class="p">.</span><span class="n">exit_status</span><span class="p">,</span>
                <span class="nb">file</span><span class="o">=</span><span class="n">sys</span><span class="p">.</span><span class="n">stderr</span><span class="p">)</span>

    <span class="k">except</span> <span class="nb">Exception</span> <span class="k">as</span> <span class="n">ex</span><span class="p">:</span>
        <span class="k">print</span><span class="p">(</span><span class="n">ex</span><span class="p">)</span>      

<span class="k">async</span> <span class="k">def</span> <span class="nf">program</span><span class="p">():</span>
    <span class="k">await</span> <span class="n">asyncio</span><span class="p">.</span><span class="n">gather</span><span class="p">(</span><span class="n">run_command</span><span class="p">())</span>

<span class="c1"># Run our program until it is complete
</span><span class="k">try</span><span class="p">:</span>
    <span class="n">asyncio</span><span class="p">.</span><span class="n">get_event_loop</span><span class="p">().</span><span class="n">run_until_complete</span><span class="p">(</span><span class="n">program</span><span class="p">())</span>
<span class="k">except</span> <span class="p">(</span><span class="nb">OSError</span><span class="p">,</span> <span class="n">asyncssh</span><span class="p">.</span><span class="n">Error</span><span class="p">)</span> <span class="k">as</span> <span class="n">exc</span><span class="p">:</span>
    <span class="n">sys</span><span class="p">.</span><span class="nb">exit</span><span class="p">(</span><span class="s">'SSH connection failed: '</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">exc</span><span class="p">))</span>
</code></pre></div></div>
<h2 id="issue-with-long-running-commands">Issue with long running commands</h2>
<p>Above examples works well in most cases and it worked for me also, but in coporate network where everything is behind firewall, these firewalls causes issue in case of long running commands/scripts. Here firewall means the firewall software which are deployed on corporate networks. These firewall monitors network connections and if there is a long running idle sessions, then it disconnects automatically. It is a security measure but it can cause problems for programs which takes longer and there is communication between client and server. It looks simple but debugging this issue is bit tidious. For me it tooks weeks to come to this conclusion and then i started looking for solution. SSh has option to keep pinging after certain time but unfortunately, i could not find it anywhere.</p>
<h2 id="solutionworkaround">Solution/workaround</h2>
<p>Solution to this problem is very simple, We need to keep session alive by doing something during the long running idle session. Either you return something or pass something but bit tedius to implement. But ssh has very nice option to send ping after given interval, this helps in keeping the session active and alive. We see an example using paramiko where using transport, keep alive interval can be set.</p>
<ul>
  <li>Example using paramiko</li>
</ul>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="nn">paramiko</span>

<span class="c1"># Remote server details
</span><span class="n">hostname</span> <span class="o">=</span> <span class="s">'172.*.*.*'</span>
<span class="n">port</span> <span class="o">=</span> <span class="mi">22</span>
<span class="n">username</span> <span class="o">=</span> <span class="s">'root'</span> 
<span class="n">password</span> <span class="o">=</span> <span class="s">'password'</span>
<span class="c1"># script and path
</span><span class="n">script_path</span> <span class="o">=</span> <span class="s">"/root/raj/"</span>
<span class="n">command</span> <span class="o">=</span> <span class="s">"sh sleeptest.sh"</span>

<span class="c1"># set 60 sec interval to ping remote
</span><span class="n">client</span> <span class="o">=</span> <span class="n">paramiko</span><span class="p">.</span><span class="n">Transport</span><span class="p">((</span><span class="n">hostname</span><span class="p">,</span> <span class="n">port</span><span class="p">))</span>
<span class="n">client</span><span class="p">.</span><span class="n">set_keepalive</span><span class="p">(</span><span class="mi">60</span><span class="p">)</span>
<span class="n">client</span><span class="p">.</span><span class="n">connect</span><span class="p">(</span><span class="n">username</span><span class="o">=</span><span class="n">username</span><span class="p">,</span> <span class="n">password</span><span class="o">=</span><span class="n">password</span><span class="p">)</span>

<span class="n">stdout_data</span> <span class="o">=</span> <span class="p">[]</span>
<span class="n">stderr_data</span> <span class="o">=</span> <span class="p">[]</span>
<span class="n">session</span> <span class="o">=</span> <span class="n">client</span><span class="p">.</span><span class="n">open_channel</span><span class="p">(</span><span class="n">kind</span><span class="o">=</span><span class="s">'session'</span><span class="p">)</span>
<span class="n">session</span><span class="p">.</span><span class="n">exec_command</span><span class="p">(</span><span class="s">'cd {} &amp;&amp; {}'</span><span class="p">.</span><span class="nb">format</span><span class="p">(</span><span class="n">script_path</span><span class="p">,</span> <span class="n">command</span><span class="p">))</span>

<span class="n">stdout</span> <span class="o">=</span> <span class="n">session</span><span class="p">.</span><span class="n">makefile</span><span class="p">(</span><span class="s">'rb'</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">)</span>
<span class="n">stderr</span> <span class="o">=</span> <span class="n">session</span><span class="p">.</span><span class="n">makefile_stderr</span><span class="p">(</span><span class="s">'rb'</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">)</span>

<span class="k">print</span><span class="p">(</span><span class="s">'exit status: '</span><span class="p">,</span> <span class="n">session</span><span class="p">.</span><span class="n">recv_exit_status</span><span class="p">())</span>

<span class="n">out</span> <span class="o">=</span> <span class="n">stdout</span><span class="p">.</span><span class="n">readlines</span><span class="p">()</span>
<span class="n">err</span> <span class="o">=</span> <span class="n">stderr</span><span class="p">.</span><span class="n">readlines</span><span class="p">()</span>

<span class="n">session</span><span class="p">.</span><span class="n">close</span><span class="p">()</span>
<span class="n">client</span><span class="p">.</span><span class="n">close</span><span class="p">()</span>
</code></pre></div></div>

<ul>
  <li>Example using asyncssh</li>
</ul>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="nn">asyncio</span><span class="p">,</span> <span class="n">asyncssh</span><span class="p">,</span> <span class="n">sys</span>

<span class="k">async</span> <span class="k">def</span> <span class="nf">run_client</span><span class="p">():</span>
    <span class="n">conn</span> <span class="o">=</span> <span class="k">await</span> <span class="n">asyncio</span><span class="p">.</span><span class="n">wait_for</span><span class="p">(</span><span class="n">asyncssh</span><span class="p">.</span><span class="n">connect</span><span class="p">(</span><span class="s">'172.*.*.*'</span><span class="p">,</span> <span class="n">username</span><span class="o">=</span><span class="s">'root'</span><span class="p">,</span> <span class="n">password</span><span class="o">=</span><span class="s">'password'</span><span class="p">,</span> <span class="n">known_hosts</span> <span class="o">=</span> <span class="bp">None</span><span class="p">,</span>
                                                    <span class="n">keepalive_interval</span><span class="o">=</span><span class="mi">600</span><span class="p">,</span> <span class="n">keepalive_count_max</span><span class="o">=</span><span class="mi">10000</span><span class="p">),</span><span class="mi">10</span><span class="p">,)</span>

    <span class="k">return</span> <span class="n">conn</span>

<span class="k">async</span> <span class="k">def</span> <span class="nf">run_command</span><span class="p">():</span>    
    <span class="k">try</span><span class="p">:</span>
        <span class="n">conn</span> <span class="o">=</span> <span class="k">await</span> <span class="n">run_client</span><span class="p">()</span>        
        <span class="n">result</span> <span class="o">=</span> <span class="k">await</span> <span class="n">conn</span><span class="p">.</span><span class="n">run</span><span class="p">(</span><span class="s">'cd /root/raj &amp;&amp; sh sleeptest.sh'</span><span class="p">)</span>

        <span class="k">if</span> <span class="n">result</span><span class="p">.</span><span class="n">exit_status</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>            
            <span class="k">print</span><span class="p">(</span><span class="n">result</span><span class="p">.</span><span class="n">stdout</span><span class="p">,</span> <span class="n">end</span><span class="o">=</span><span class="s">''</span><span class="p">)</span>                        
        <span class="k">else</span><span class="p">:</span>
            <span class="k">print</span><span class="p">(</span><span class="n">result</span><span class="p">.</span><span class="n">stderr</span><span class="p">,</span> <span class="n">end</span><span class="o">=</span><span class="s">''</span><span class="p">,</span> <span class="nb">file</span><span class="o">=</span><span class="n">sys</span><span class="p">.</span><span class="n">stderr</span><span class="p">)</span>
            <span class="k">print</span><span class="p">(</span><span class="s">'Program exited with status %d'</span> <span class="o">%</span> <span class="n">result</span><span class="p">.</span><span class="n">exit_status</span><span class="p">,</span>
                <span class="nb">file</span><span class="o">=</span><span class="n">sys</span><span class="p">.</span><span class="n">stderr</span><span class="p">)</span>
    <span class="k">except</span> <span class="nb">Exception</span> <span class="k">as</span> <span class="n">ex</span><span class="p">:</span>
        <span class="k">print</span><span class="p">(</span><span class="n">ex</span><span class="p">)</span>      

<span class="k">async</span> <span class="k">def</span> <span class="nf">program</span><span class="p">():</span>
    <span class="c1"># Run both print method and wait for them to complete (passing in asyncState)    
</span>    <span class="k">await</span> <span class="n">asyncio</span><span class="p">.</span><span class="n">gather</span><span class="p">(</span><span class="n">run_command</span><span class="p">())</span>

<span class="c1"># Run our program until it is complete
</span><span class="n">loop</span> <span class="o">=</span> <span class="n">asyncio</span><span class="p">.</span><span class="n">get_event_loop</span><span class="p">()</span>
<span class="n">loop</span><span class="p">.</span><span class="n">run_until_complete</span><span class="p">(</span><span class="n">program</span><span class="p">())</span>
<span class="n">loop</span><span class="p">.</span><span class="n">close</span><span class="p">()</span>
</code></pre></div></div>
<p>Hope it will be helpful to anyone new to these library. Do let me know if you find this article useful and feel free to reach me using any medium to discuss on anything.<br />
Happy coding!</p>]]></content><author><name>Raj Nath Sah</name></author><category term="SSH" /><category term="Python" /><category term="Paramiko" /><category term="Asyncssh" /><summary type="html"><![CDATA[Execute command and script over SSH using python library.]]></summary></entry><entry><title type="html">Block diagram using Graphviz</title><link href="https://blog.rajnath.dev/graphviz/" rel="alternate" type="text/html" title="Block diagram using Graphviz" /><published>2020-12-28T00:00:00+00:00</published><updated>2020-12-28T00:00:00+00:00</updated><id>https://blog.rajnath.dev/graphviz</id><content type="html" xml:base="https://blog.rajnath.dev/graphviz/"><![CDATA[<h2 id="graphviz">Graphviz</h2>
<p>Graphviz facilitates the creation and rendering of graph descriptions in the DOT language of the Graphviz graph drawing software from Python.</p>

<h2 id="prerequisites">Prerequisites</h2>

<h2 id="installing-graphviz">Installing Graphviz</h2>
<ul>
  <li>Windows Executables<br />
Follow the blog for installating executables on window (Graphviz)[https://forum.graphviz.org/t/new-simplified-installation-procedure-on-windows/224]</li>
  <li>Ubuntu Package
    <div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">sudo </span>apt <span class="nb">install </span>graphviz
</code></pre></div>    </div>
  </li>
  <li>Install python library
    <div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>pip <span class="nb">install </span>graphviz
</code></pre></div>    </div>
  </li>
</ul>

<h2 id="example">Example</h2>
<ul>
  <li>Generate block diagram using python from data of dictionary dynamically.</li>
</ul>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">from</span> <span class="nn">graphviz</span> <span class="kn">import</span> <span class="n">Digraph</span>


<span class="n">dot</span> <span class="o">=</span> <span class="n">Digraph</span><span class="p">(</span><span class="n">comment</span><span class="o">=</span><span class="s">'The Round Table'</span><span class="p">)</span>
<span class="n">dot</span><span class="p">.</span><span class="nb">format</span> <span class="o">=</span> <span class="s">'png'</span>
<span class="n">dot</span><span class="p">.</span><span class="n">attr</span><span class="p">(</span><span class="n">rankdir</span><span class="o">=</span><span class="s">'LR'</span><span class="p">)</span>
<span class="n">dot</span><span class="p">.</span><span class="n">attr</span><span class="p">(</span><span class="s">'node'</span><span class="p">,</span> <span class="n">shape</span><span class="o">=</span><span class="s">'circle'</span><span class="p">)</span>

<span class="c1"># Sample data as dictionary
</span><span class="n">dict_data</span> <span class="o">=</span> <span class="p">{</span><span class="s">'test suite 1'</span><span class="p">:[{</span><span class="s">'test case 1'</span><span class="p">:[{</span><span class="s">'test 1'</span><span class="p">:</span><span class="s">'pass'</span><span class="p">},{</span><span class="s">'test 2'</span><span class="p">:</span><span class="s">'fail'</span><span class="p">}]},</span> <span class="p">{</span><span class="s">'test case 2'</span><span class="p">:[{</span><span class="s">'test 22'</span><span class="p">:</span><span class="s">'pass'</span><span class="p">},{</span><span class="s">'test 23'</span><span class="p">:</span><span class="s">'fail'</span><span class="p">}]}]}</span>

<span class="c1"># Node
</span><span class="k">for</span> <span class="n">d</span> <span class="ow">in</span> <span class="n">dict_data</span><span class="p">:</span>    
    <span class="n">dot</span><span class="p">.</span><span class="n">node</span><span class="p">(</span><span class="n">d</span><span class="p">,</span> <span class="n">d</span><span class="p">)</span>
    <span class="k">for</span> <span class="n">dd</span> <span class="ow">in</span> <span class="n">dict_data</span><span class="p">[</span><span class="n">d</span><span class="p">]:</span>            
        <span class="k">for</span> <span class="n">ddd</span> <span class="ow">in</span> <span class="n">dd</span><span class="p">:</span>            
            <span class="n">dot</span><span class="p">.</span><span class="n">node</span><span class="p">(</span><span class="n">ddd</span><span class="p">,</span> <span class="n">ddd</span><span class="p">)</span>                     
            <span class="k">for</span> <span class="n">dddd</span> <span class="ow">in</span> <span class="n">dd</span><span class="p">[</span><span class="n">ddd</span><span class="p">]:</span>                
                <span class="k">for</span> <span class="n">t</span> <span class="ow">in</span> <span class="n">dddd</span><span class="p">:</span>
                    <span class="k">if</span> <span class="n">dddd</span><span class="p">[</span><span class="n">t</span><span class="p">]</span> <span class="o">==</span> <span class="s">'pass'</span><span class="p">:</span>
                        <span class="n">dot</span><span class="p">.</span><span class="n">node</span><span class="p">(</span><span class="n">t</span><span class="p">,</span> <span class="n">t</span><span class="p">,</span> <span class="n">color</span><span class="o">=</span><span class="s">'green'</span><span class="p">)</span>
                    <span class="k">else</span><span class="p">:</span>
                        <span class="n">dot</span><span class="p">.</span><span class="n">node</span><span class="p">(</span><span class="n">t</span><span class="p">,</span> <span class="n">t</span><span class="p">,</span> <span class="n">color</span><span class="o">=</span><span class="s">'red'</span><span class="p">)</span>
<span class="c1"># Edge
</span><span class="k">for</span> <span class="n">d</span> <span class="ow">in</span> <span class="n">dict_data</span><span class="p">:</span>        
    <span class="k">for</span> <span class="n">dd</span> <span class="ow">in</span> <span class="n">dict_data</span><span class="p">[</span><span class="n">d</span><span class="p">]:</span>              
        <span class="k">for</span> <span class="n">ddd</span> <span class="ow">in</span> <span class="n">dd</span><span class="p">:</span>            
            <span class="n">dot</span><span class="p">.</span><span class="n">edge</span><span class="p">(</span><span class="n">d</span><span class="p">,</span> <span class="n">ddd</span><span class="p">)</span>
            <span class="k">for</span> <span class="n">dddd</span> <span class="ow">in</span> <span class="n">dd</span><span class="p">[</span><span class="n">ddd</span><span class="p">]:</span>                
                <span class="k">for</span> <span class="n">t</span> <span class="ow">in</span> <span class="n">dddd</span><span class="p">:</span>                    
                    <span class="n">dot</span><span class="p">.</span><span class="n">edge</span><span class="p">(</span><span class="n">ddd</span><span class="p">,</span> <span class="n">t</span><span class="p">)</span>         

<span class="n">dot</span><span class="p">.</span><span class="n">render</span><span class="p">(</span><span class="s">'round-table'</span><span class="p">,</span> <span class="n">view</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span> 
</code></pre></div></div>]]></content><author><name>Raj Nath Sah</name></author><category term="Graphviz" /><category term="Blockdaigram" /><category term="Python" /><summary type="html"><![CDATA[Generate dynamic block diagram using graphviz in windows/linux.]]></summary></entry></feed>