<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Pratap kute</title>
    <description>The latest articles on DEV Community by Pratap kute (@pratapkute).</description>
    <link>https://dev.to/pratapkute</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F761783%2F43c6fb64-f900-4b64-bdc7-669fcfdef110.png</url>
      <title>DEV Community: Pratap kute</title>
      <link>https://dev.to/pratapkute</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/pratapkute"/>
    <language>en</language>
    <item>
      <title>Why I’d Never Let AI Rewrite It</title>
      <dc:creator>Pratap kute</dc:creator>
      <pubDate>Wed, 20 Aug 2025 05:47:40 +0000</pubDate>
      <link>https://dev.to/pratapkute/why-id-never-let-ai-rewrite-it-4f9p</link>
      <guid>https://dev.to/pratapkute/why-id-never-let-ai-rewrite-it-4f9p</guid>
      <description>&lt;h3&gt;
  
  
  Background – How I Landed the Task
&lt;/h3&gt;

&lt;p&gt;When I first joined Ozone, one of my first assignments was migrating &lt;strong&gt;node&lt;/strong&gt; &lt;strong&gt;services to Supervisord&lt;/strong&gt;. Soon after that, my CTO dropped a bigger challenge on my plate—something more open-ended: &lt;em&gt;"Why don't you build us a tool to validate the configs we generate?"&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Now, here’s the tricky part—each client has their own environment, which means their generated configuration files look different. Manually validating them is not very practical. What worked for one client would completely break for another. That’s when we needed custom tooling, tailored for this validation.&lt;/p&gt;

&lt;p&gt;And before we dive in—don’t worry, this isn’t going to be a deep dive into technical jargon. My goal here is to share the &lt;strong&gt;approach&lt;/strong&gt; I took to build it, the thinking process, and a few lessons (and scars 😆) I picked up along the way.&lt;/p&gt;

&lt;h3&gt;
  
  
  My Approach: From Scribbles to CLI
&lt;/h3&gt;

&lt;p&gt;Luckily, my CTO had drafted a rough idea of how this tool should behave. It was going to be a &lt;strong&gt;CLI tool&lt;/strong&gt;— simple, quick to test with and the priorities were:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;It should make writing tests painless.&lt;/li&gt;
&lt;li&gt;Proper reporting - reporting had to be meaningful&lt;/li&gt;
&lt;li&gt;Integration with our in-house tools&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The tool’s &lt;em&gt;soul&lt;/em&gt;, so to speak, was about detecting misconfiguration via a set of rules and tests.&lt;/p&gt;

&lt;p&gt;I began by documenting all the possible scenarios I could think of. Choosing a language was my first real roadblock. I explored &lt;strong&gt;Python, Go, shell scripting (yes, don't underestimate them!), and TS&lt;/strong&gt;. Since our team was heavily invested in Typescirpt already, I settled on that.&lt;/p&gt;

&lt;p&gt;What came next was the real grind. I struggled with defining inputs for the CLI. There were so many edge cases to think about that I almost lost track. But once I forced myself to diagram how the data should flow—what talks to what, which component owns which behavior—it finally clicked. That rough diagram became my roadmap. &lt;br&gt;
I leaned on patterns like &lt;strong&gt;strategy&lt;/strong&gt; and &lt;strong&gt;behavioral structures&lt;/strong&gt;, making sure the tool was more future-proof than a “just make it work” hack.&lt;/p&gt;

&lt;p&gt;About 2–3 months later, with some support (yep, I wasn’t a one-man army—though I’ll leave you to guess who had my back), I had a working tool. We cut the first release, gave stakeholders a proper demo, and even shared a neat internal doc to help folks use it effectively. That moment—watching people actually run my tool—was incredibly rewarding.&lt;/p&gt;

&lt;h3&gt;
  
  
  What I Gained From the Journey
&lt;/h3&gt;

&lt;h3&gt;
  
  
  1. Real Conversations With a &lt;strong&gt;Leadership&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;One of the best parts was working so closely with my CTO. He’s got this way of looking at problems very differently than most developers. While I’m neck-deep thinking about code dependencies, he’s laser-focused on &lt;strong&gt;the outcome&lt;/strong&gt;: &lt;em&gt;“Does this tool actually solve the problem for stakeholders?”&lt;/em&gt; That perspective really stuck with me—it’s not about the fanciest design; it’s about whether the product delivers value.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. The Feedback Loop
&lt;/h3&gt;

&lt;p&gt;If you’re building something internal, feedback is your compass. It’s not just about adding shiny features; it’s about asking: &lt;em&gt;“Are people actually using this? Is it solving their pain points?”&lt;/em&gt; And once you get that feedback—don’t get defensive. Use it. That’s how the tool got better with each iteration.&lt;/p&gt;

&lt;h3&gt;
  
  
  3.  &lt;strong&gt;If I Could Rewrite the Tool Today…&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Okay, confession: I did use AI tools (including ChatGPT) while building parts of it. They helped speed up the small stuff. But here’s the frustrating part—AI loves adding fluff, skipping business context, and suggesting shiny solutions that don’t make sense in the real world. It’s like asking directions in Pune and ending up in another city because the guy at the corner shop &lt;em&gt;sounded sure&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;If you ask me, “Would you rewrite this tool with AI help?” I’d say &lt;strong&gt;no.&lt;/strong&gt; Not because AI is useless—it absolutely gave me short-lived boosts—but because it robs you of the most valuable part: &lt;em&gt;learning how to think through problems yourself.&lt;/em&gt; &lt;br&gt;
The “pre-AI” era taught me patience, how to read real blog posts, and how to experiment my way toward an elegant solution. That mindset is what actually made this tool successful.&lt;/p&gt;

&lt;p&gt;So yes, I have mixed feelings about AI. I still use it, but carefully—like a seasoning. Too much, and the whole dish tastes off.&lt;/p&gt;

&lt;h3&gt;
  
  
  Closing Thoughts
&lt;/h3&gt;

&lt;p&gt;Looking back, that project wasn’t just about building a tool for me. It was about learning how to think at a product level, communicate with leaders, take criticism without sulking, and most importantly—trust my own problem-solving instincts. The fact that the tool actually lives on and helps real people? That’s the cherry on top.&lt;/p&gt;

</description>
      <category>typescript</category>
      <category>automation</category>
      <category>openai</category>
      <category>tooling</category>
    </item>
    <item>
      <title>The shell script</title>
      <dc:creator>Pratap kute</dc:creator>
      <pubDate>Sun, 13 Oct 2024 08:17:43 +0000</pubDate>
      <link>https://dev.to/pratapkute/the-thing-with-shell-script-3oah</link>
      <guid>https://dev.to/pratapkute/the-thing-with-shell-script-3oah</guid>
      <description>&lt;h2&gt;
  
  
  Index
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Journey of Shell Script (History) - Short&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;My Journey with Shell Scripting&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;My New Gig Experience&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;My Take on Shell Scripting&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  1. &lt;strong&gt;Shell Script History&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Shell scripting was born alongside Unix in the early 1970s, like peanut butter and jelly—meant to be together. The Thompson shell arrived in 1971, letting users chain commands like a pro. But it was the Bourne shell (sh) in 1977 that gave shell scripting its real mojo by adding scripting features and control structures. That shell was so popular that it led to the creation of Bash (Bourne Again Shell) in 1989, which was like sh, but on steroids. Since then, shells like zsh and fish have come along, each with their own quirks and features, but all paying homage to the OG shells. Today, shell scripting is still a favorite for system administration, automation, and scaring off people who don't like command lines.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Reference: &lt;a href="https://developer.ibm.com/tutorials/l-linux-shells/" rel="noopener noreferrer"&gt;IBM Developer&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  2. &lt;strong&gt;My Journey with Shell Scripting&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Let’s be honest: when I was first introduced to Linux, I was a total nerd about it. When I started my degree, I got sucked into the terminal world. My first experience? Bash. I thought I had mastered it—boy, was I wrong. I used to flex my “skills” (okay, they were super amateur) in front of my classmates. I was so busy making the terminal look pretty and playing with different command-line tools that I completely missed the point. Eventually, I got overwhelmed by all the options and tapped out.&lt;/p&gt;

&lt;p&gt;Fast forward to my first professional gig at a startup, where we were using Ubuntu 18. I felt like my old knowledge gave me an edge over my colleagues, but I quickly realized I was still a noob. Thankfully, my &lt;a href="https://www.linkedin.com/in/nitinbhide/?originalSubdomain=in" rel="noopener noreferrer"&gt;CTO Nitin Bhide&lt;/a&gt; and coworkers were incredibly supportive, helping me polish my shell skills. I started small—with basics like &lt;code&gt;ls&lt;/code&gt;, &lt;code&gt;pwd&lt;/code&gt;, and &lt;code&gt;cat&lt;/code&gt;. Oh, and don't get me started on text editors. I tried &lt;code&gt;vim&lt;/code&gt; first, but it gave me a headache, so I happily settled for Nano. From there, the ride was smooth.&lt;/p&gt;

&lt;p&gt;The point of this little flashback? Your professional experience shapes your understanding, and having good mentors along the way makes all the difference.&lt;/p&gt;

&lt;h3&gt;
  
  
  Use cases for shell scripts (as I see them):
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Automating repetitive small tasks&lt;/li&gt;
&lt;li&gt;Creating custom commands&lt;/li&gt;
&lt;li&gt;Analyzing system logs and generating reports&lt;/li&gt;
&lt;li&gt;Backing up config files and data&lt;/li&gt;
&lt;li&gt;Writing small build scripts&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Of course, there’s more, but I mostly use shell scripts for repetitive tasks and CI/CD pipeline tweaks. I haven't written any massive scripts, but you get the idea.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. My New Gig Experience
&lt;/h3&gt;

&lt;p&gt;In my current gig, shell scripts are everywhere. Small tools? Check. Big tools? Also check. Imagine my surprise—because I had no clue big tools could be built around shell scripts! Not only do we have scripts that deploy entire solutions on AWS, but we also have a full build pipeline designed in shell. We even have internal tools written in shell scripts. These aren’t just thrown together either; they’re meticulously crafted. I’ve seen syntax in shell scripting that I didn’t even know existed, like:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Associative Arrays
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Declare an associative array&lt;/span&gt;
&lt;span class="nb"&gt;declare&lt;/span&gt; &lt;span class="nt"&gt;-A&lt;/span&gt; FAMOUS_CITIES

&lt;span class="c"&gt;# Add elements to the associative array&lt;/span&gt;
FAMOUS_CITIES[Mumbai]&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"Gateway of India"&lt;/span&gt;
FAMOUS_CITIES[Delhi]&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"India Gate"&lt;/span&gt;
FAMOUS_CITIES[Bangalore]&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"Lalbagh Botanical Garden"&lt;/span&gt;

&lt;span class="c"&gt;# Print the value of a specific key&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;FAMOUS_CITIES&lt;/span&gt;&lt;span class="p"&gt;[Mumbai]&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt; &lt;span class="c"&gt;# Outputs: Gateway of India&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Functions and Recursion (Yes, really)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;To solve problems where loops might be insufficient.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;factorial&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="nv"&gt;$1&lt;/span&gt; &lt;span class="nt"&gt;-le&lt;/span&gt; 1 &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
    &lt;/span&gt;&lt;span class="nb"&gt;echo &lt;/span&gt;1
  &lt;span class="k"&gt;else
    &lt;/span&gt;&lt;span class="nv"&gt;prev&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;factorial &lt;span class="k"&gt;$((&lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="k"&gt;))&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;
    &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="k"&gt;$((&lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nv"&gt;$prev&lt;/span&gt;&lt;span class="k"&gt;))&lt;/span&gt;
  &lt;span class="k"&gt;fi&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Factorial of 5 is &lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;factorial 5&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Custom Logging Mechanisms
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;log&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;date&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;: &lt;/span&gt;&lt;span class="nv"&gt;$@&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; script.log
&lt;span class="o"&gt;}&lt;/span&gt;
log &lt;span class="s2"&gt;"Script started"&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We even built our own config parser and template generator in shell script. I quickly realized I had a lot to learn in this space! Here’s what I’ve picked up so far, thanks to my CTO:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Shell scripts are still super powerful and relevant, even for large tools.&lt;/li&gt;
&lt;li&gt;It’s ridiculously easy to integrate shell scripts with other tools.&lt;/li&gt;
&lt;li&gt;You can design a decent CLI tool with shell scripting.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Now, don’t ask me how we designed these scripts—it was all my CTO, who’s an absolute legend in leading open banking solutions. If you want to know more, check out his profile:  &lt;a href="https://www.linkedin.com/in/freddigyara/" rel="noopener noreferrer"&gt;Freddi Gyara&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  4. My Take on Shell Scripting
&lt;/h3&gt;

&lt;p&gt;I’ve learned a lot from these tools, but here’s the thing: shell scripting is amazing for small to medium-sized scripts (up to 1,500 lines, in my opinion). But if you try to push beyond that, the tool starts to crack. Why? Let me break it down:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Complexity&lt;/strong&gt;: The bigger the tool, the harder it becomes to add new features without breaking something.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tooling&lt;/strong&gt;: Shell scripting doesn’t have the fancy tooling modern programming languages provide.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dependencies&lt;/strong&gt;: You’ll likely end up reinventing the wheel for things like logging since there’s no easy way to manage dependencies.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Debugging and Error Handling&lt;/strong&gt;: Debugging shell scripts? It’s like pulling teeth. There’s no fancy breakpoint system, just the good old &lt;code&gt;set&lt;/code&gt; keyword.
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;set&lt;/span&gt; &lt;span class="nt"&gt;-e&lt;/span&gt;  &lt;span class="c"&gt;# Exit on error&lt;/span&gt;
&lt;span class="nb"&gt;set&lt;/span&gt; &lt;span class="nt"&gt;-x&lt;/span&gt;  &lt;span class="c"&gt;# Print commands as they are executed&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;So, here’s my final thought: use shell scripting for small utilities, but for anything bigger (or if your team grows beyond five or six people), switch to Python or in more language. It’ll save you a lot of headaches!&lt;/p&gt;

</description>
      <category>shell</category>
      <category>beginners</category>
      <category>bash</category>
    </item>
    <item>
      <title>Concourse a CI/CD tool</title>
      <dc:creator>Pratap kute</dc:creator>
      <pubDate>Mon, 01 Apr 2024 16:12:15 +0000</pubDate>
      <link>https://dev.to/pratapkute/concourse-a-cicd-tool-38ia</link>
      <guid>https://dev.to/pratapkute/concourse-a-cicd-tool-38ia</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;CI/CD: It's the Rockstar of software development – everyone's talking about it!  It's more than just a process, it's a whole way of life (well, maybe not that dramatic), but it definitely brings devs and ops together to ship awesomer software, faster and stronger . That's where Concourse comes in to be your CI/CD hero. Let's unpack this nifty tool and see how it makes your DevOps life a breeze.&lt;/p&gt;

&lt;h2&gt;
  
  
  why I choose concourse?
&lt;/h2&gt;

&lt;p&gt;Before I dive into Concourse, let me tell you why I chose it in the first place. We were using Buildbot previously, which is a great tool by the way (&lt;a href="https://buildbot.python.org" rel="noopener noreferrer"&gt;Python.org&lt;/a&gt; even uses it!). However, I found Buildbot lacking in two crucial areas: documentation and configuration as code&lt;/p&gt;

&lt;p&gt;Documentation: If you head over to the Buildbot docs, you'll find the API documentation isn't as descriptive as the Python docs themselves (maybe I'm wrong… 😅 ). This led to some less-than-ideal CI/CD workflow implementations by our old team.&lt;/p&gt;

&lt;p&gt;Configuration as YAML: Why YAML? It lets you focus on building the workflow itself, not writing tons of code. Buildbot gives you more control over how you build your CI/CD workflow, but it makes you focus more on the code itself rather than the tasks at hand. So, for configuration as code (like Ansible), I believe it's best.&lt;/p&gt;

&lt;p&gt;So, when I was tasked with building another workflow on Buildbot (being very new to CI/CD at the time), it was a disaster for me (don't worry, I was decent at Python!… 😜). I wrote the pipeline, but it took me a month and a half to wrap my head around the whole codebase. It was a pain to write and maintain new workflows&lt;/p&gt;

&lt;p&gt;We needed a simple solution for our CI/CD pipeline. We were already using Docker to ship our code, so our workflow mostly involved building images and compiling source code&lt;/p&gt;

&lt;p&gt;I explored several &lt;a href="https://github.com/ligurio/awesome-ci" rel="noopener noreferrer"&gt;open-source&lt;/a&gt;, self-hosted tools. Concourse stood out because of its ease of deployment and maintenance thanks to YAML. Now, I know Concourse might seem like overkill, but hey, if a future team  wants to use Kubernetes or other fancy stuff, Concourse can handle it all!.. 😏&lt;/p&gt;

&lt;h2&gt;
  
  
  Key Features of Concourse
&lt;/h2&gt;

&lt;p&gt;Concourse is known for its  expressive, versatile, safe and stateless architecture. It is designed around a few core principles: every task run in isolation, configuration as code, and having a declarative style. This means you describe your pipeline, and Concourse will figure out what needs to happen to get there. This approach greatly simplifies pipeline management and reduces the risk of errors.&lt;/p&gt;

&lt;p&gt;Configuration as code&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="nx"&gt;resources&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;booklit&lt;/span&gt;
  &lt;span class="nx"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;git&lt;/span&gt;
  &lt;span class="nx"&gt;source&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;uri&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://github.com/concourse/booklit&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nl"&gt;jobs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;unit&lt;/span&gt;
  &lt;span class="nx"&gt;plan&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="kd"&gt;get&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;booklit&lt;/span&gt;
    &lt;span class="nx"&gt;trigger&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
  &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;task&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;test&lt;/span&gt;
    &lt;span class="nx"&gt;file&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;booklit&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;ci&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;test&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;yml&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Visualize you pipeline&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbjo2betu5ohg9iue6qcp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbjo2betu5ohg9iue6qcp.png" alt="pipeline concourse CI/CD" width="800" height="162"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  why we switch to concourse?
&lt;/h2&gt;

&lt;p&gt;First up, Concourse is BFFs (Best Friends Forever 😝) with test-driven development (TDD) –   they practically speak the same language (well, robot framework at least ) Second, its fancy visualization makes your pipelines crystal clear at a glance, troubleshooting becomes a walk in the park. Third, it's all about containers,  meaning consistent builds and environments throughout the software lifecycle – a big win since we're basically living in Dockerland anyway.  Plus, bootstrapping with Concourse pipeline is a breeze compared to Buildbot – like night and day!&lt;/p&gt;

&lt;h2&gt;
  
  
  Cons… 😮‍💨
&lt;/h2&gt;

&lt;p&gt;Concourse ain't perfect, though . It can be a bit sluggish sometimes, especially with Docker builds because of those annoying volume creation drivers (there's a whole GitHub issue on that if you're curious ). There's also a bit of a learning curve, which can be a hurdle for new devs to jump over.&lt;/p&gt;

&lt;p&gt;All things considered, our pipelines take about 40% longer to run in Concourse compared to Buildbot – not ideal for speed demons. &lt;/p&gt;

&lt;p&gt;But hey, at least our code is way more streamlined now, right? 🤐  Plus, Concourse lets us dedicate workers for specific tasks like GPU build and CUP build, versioning and complex workflows – those little things add up! We're constantly learning and getting better at wrangling this beast of a tool, day by day.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Concourse: It's like the Swiss Army Knife of DevOps tools 🇨🇭. Packed with features and benefits, it fits right in with the whole DevOps thing . Need to pimp your CI/CD pipeline, boost transparency, and support TDD? Concourse could be your BFF . But remember, just like any fancy tool, It's all about using it right to achieve Moksha of DevOps !!&lt;/p&gt;

</description>
      <category>devops</category>
      <category>cicd</category>
    </item>
    <item>
      <title>HTML meta tags</title>
      <dc:creator>Pratap kute</dc:creator>
      <pubDate>Fri, 09 Feb 2024 07:58:28 +0000</pubDate>
      <link>https://dev.to/pratapkute/html-meta-tags-1n85</link>
      <guid>https://dev.to/pratapkute/html-meta-tags-1n85</guid>
      <description>&lt;h2&gt;
  
  
  An Introduction to HTML5 Meta Tags
&lt;/h2&gt;

&lt;p&gt;HTML5 Meta tags are an essential part of any web page's structure. They provide information about the web page to search engines, browsers, and social media platforms. This information includes the title, description, keywords, author, and other metadata that help users find your website and understand its content.&lt;/p&gt;

&lt;h3&gt;
  
  
  Understanding Meta Tags: The Labels of Webpages
&lt;/h3&gt;

&lt;p&gt;When I first started coding, I became familiar with webpages (HTML). I believe many developers had a similar experience, especially those who began after 2009. I often used it to save web pages, but I always wondered: what are meta tags?&lt;/p&gt;

&lt;p&gt;Meta tags are like labels that tell web browsers and search engines important information about a webpage. They help browsers understand how to display the page and tell search engines what the page is about. It's like putting a name tag on your school bag so everyone knows whose it is and what's inside.&lt;/p&gt;

&lt;p&gt;There are numerous things meta tags can accomplish for you. For instance, you can utilize them to perform tasks such as refreshing the page and setting the character encoding, without needing to write JavaScript.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;http-equiv=&lt;/span&gt;&lt;span class="s"&gt;"refresh"&lt;/span&gt; &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;"2500"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Isn't that convenient?”&lt;/p&gt;

&lt;h3&gt;
  
  
  What are HTML5 Meta Tags?
&lt;/h3&gt;

&lt;p&gt;HTML5 Meta tags are special bits of code you add to the head section of your webpage's code. They give extra info about your webpage, but people don't see them directly on the page. Instead, search engines and other tools use them to understand your webpage better.&lt;/p&gt;

&lt;p&gt;Here are some common types of meta tags:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;Title&lt;/code&gt;&lt;/strong&gt;: This tag sets the title of your webpage. It shows up in the browser's title bar and search engine results.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;Description&lt;/code&gt;&lt;/strong&gt;: This tag gives a summary of what your webpage is about. It also shows up in search results.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;Keywords&lt;/code&gt;&lt;/strong&gt;: This tag lists important words or phrases related to your webpage's content.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;Author&lt;/code&gt;&lt;/strong&gt;: This tag says who made the webpage.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;Viewport&lt;/code&gt;&lt;/strong&gt;: This tag controls how your webpage looks on mobile devices.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;Robots&lt;/code&gt;&lt;/strong&gt;: This tag tells search engines if they should index your webpage or follow its links.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Why do web developers need to care about Meta Tags?
&lt;/h3&gt;

&lt;p&gt;Meta tags are important bits of code you put in your website's HTML. They help search engines like Google understand what your page is about so they can rank it properly in search results.&lt;/p&gt;

&lt;p&gt;Think of it like this: when you meet someone new, you introduce yourself and give them some basic information about who you are, right? Meta tags do the same thing for your website. They tell search engines what your page is all about, so they can show it to people who are searching for that kind of information.&lt;/p&gt;

&lt;p&gt;Social media sites like Facebook and Twitter also use these meta tags to show a preview of your webpage when someone shares it. So if you don't have these tags, the social media platform might just guess what your page is about, and it might not look as good when someone shares it.&lt;/p&gt;

&lt;h3&gt;
  
  
  How to Use HTML5 Meta Tags?
&lt;/h3&gt;

&lt;p&gt;To use HTML5 Meta tags, you need to insert them into the head section of your web page. Here is an example of how to insert the title, description, and keywords meta tags:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;head&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;title&amp;gt;&lt;/span&gt;My Web Page Title&lt;span class="nt"&gt;&amp;lt;/title&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"description"&lt;/span&gt; &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;"This is a brief description of my web page content."&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"keywords"&lt;/span&gt; &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;"web page, HTML5, meta tags"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/head&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;There are many use cases for &lt;code&gt;meta&lt;/code&gt; tags. For more details, you can visit the &lt;a href="https://developer.mozilla.org/en-US/docs/Learn/HTML/Introduction_to_HTML/The_head_metadata_in_HTML#metadata_the_meta_element" rel="noopener noreferrer"&gt;MDN&lt;/a&gt; page &lt;/p&gt;

&lt;h3&gt;
  
  
  Conclusion
&lt;/h3&gt;

&lt;p&gt;HTML5 Meta tags are an essential part of any web page's structure. They provide additional information about the web page that is used by search engines, browsers, and social media platforms. By using meta tags correctly, you can improve your web page's search engine rankings and increase its visibility on social media platforms.&lt;/p&gt;

&lt;h3&gt;
  
  
  References
&lt;/h3&gt;

&lt;p&gt;Mozilla Developer Network (MDN)&lt;/p&gt;

&lt;p&gt;W3Schools&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>html</category>
      <category>beginners</category>
    </item>
    <item>
      <title>What is HTML</title>
      <dc:creator>Pratap kute</dc:creator>
      <pubDate>Mon, 09 Jan 2023 08:39:17 +0000</pubDate>
      <link>https://dev.to/pratapkute/what-is-html-4d6e</link>
      <guid>https://dev.to/pratapkute/what-is-html-4d6e</guid>
      <description>&lt;p&gt;HTML (HyperText Markup Language) is a markup language used to structure and present content on the World Wide Web. It consists of a series of elements, or tags, that define the structure and content of a web page.&lt;/p&gt;

&lt;p&gt;HTML is an accepted standard for structuring and displaying information on the World Wide Web. The fifth version, HTML 5, was issued in October 2014 by the World Wide Web Consortium (W3C).&lt;/p&gt;

&lt;h3&gt;
  
  
  How HTML page works
&lt;/h3&gt;

&lt;p&gt;In order to make an HTML page, you can make use of a text editor to write the HTML code, save it with a &lt;code&gt;.html&lt;/code&gt; suffix, and then open it in a web browser. The browser will interpret the HTML code and display the page based on the &lt;strong&gt;tags&lt;/strong&gt; and &lt;strong&gt;attributes&lt;/strong&gt; indicated.&lt;/p&gt;

&lt;p&gt;HTML tags are utilized to define the structure and contents of a website. They are written within &lt;strong&gt;angled brackets&lt;/strong&gt;, frequently in pairs, comprising of an opening and closing tag. For example, &lt;code&gt;&amp;lt;p&amp;gt;&lt;/code&gt; stands for a paragraph, while &lt;code&gt;&amp;lt;h1&amp;gt;&lt;/code&gt; denotes a heading.&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;Attributes offer additional details about an HTML element. They are situated within the opening tag, and contain a name and a value. For example, the &lt;code&gt;href&lt;/code&gt; attribute is used to define a link in an &lt;code&gt;&amp;lt;a&amp;gt;&lt;/code&gt; tag.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;a&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"https://www.Youtube.com/"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/a&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can also use CSS (Cascading Style Sheets) to style and layout your HTML page. CSS is a separate language that is used to define the appearance and layout of an HTML document. It can be used to change the font, color, size, and other style properties of HTML elements, as well as to control the layout of a page.&lt;/p&gt;

&lt;p&gt;In summary, HTML works by using &lt;strong&gt;tags&lt;/strong&gt; and &lt;strong&gt;attributes&lt;/strong&gt; to define the structure and content of a web page, and CSS is used to style and layout the page. Together, these technologies enable you to create rich and interactive web experiences.&lt;/p&gt;

&lt;h3&gt;
  
  
  What’s new in HTML 5
&lt;/h3&gt;

&lt;p&gt;HTML5 has brought about a great many feature when compared to its preceding versions. One of the most noteworthy changes is its incorporation of web standards, which has improved the compatibility of web pages across browsers and devices.&lt;/p&gt;

&lt;p&gt;Some of the notable features of HTML5 include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Improved support for audio and video: HTML5 introduced new elements for embedding audio and video content, such as the &lt;code&gt;&amp;lt;audio&amp;gt;&lt;/code&gt; and &lt;code&gt;&amp;lt;video&amp;gt;&lt;/code&gt; tags. This allows web developers to easily add multimedia content to their pages without the need for third-party plugins like Flash.&lt;/li&gt;
&lt;li&gt;Enhanced graphics capabilities: HTML5 introduces the &lt;code&gt;&amp;lt;canvas&amp;gt;&lt;/code&gt; element, which allows developers to create and manipulate graphics using JavaScript. This enables the creation of interactive graphics, games, and other visual content.&lt;/li&gt;
&lt;li&gt;Improved support for web forms: HTML5 introduces new form elements and attributes that make it easier for developers to create and style web forms. This includes new input types such as email, URL, and tel, as well as new attributes for input validation and autofocus.&lt;/li&gt;
&lt;li&gt;Enhanced semantic elements: HTML5 introduces new semantic elements that better reflect the content they contain. For example, the &lt;code&gt;&amp;lt;header&amp;gt;&lt;/code&gt; element is used to represent the header of a document or section, while the &lt;code&gt;&amp;lt;footer&amp;gt;&lt;/code&gt; element represents the footer. This helps search engines better understand the content of a page and improve its ranking in search results.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;HTML5 has been widely adopted by web developers and is supported by all modern web browsers. It has also played a significant role in the development of web-based applications and mobile applications, as it provides a powerful platform for creating rich and interactive experiences on the web.&lt;/p&gt;

</description>
      <category>gratitude</category>
      <category>webdev</category>
      <category>beginners</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Multiple services in a Docker container with supervisord</title>
      <dc:creator>Pratap kute</dc:creator>
      <pubDate>Sat, 10 Dec 2022 12:51:45 +0000</pubDate>
      <link>https://dev.to/pratapkute/multiple-services-in-a-docker-container-with-supervisord-2g13</link>
      <guid>https://dev.to/pratapkute/multiple-services-in-a-docker-container-with-supervisord-2g13</guid>
      <description>&lt;p&gt;Docker is mostly used for packing the application, the goal is generally that anyone could execute&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker run &amp;lt;containername&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;so how does docker know what to execute?  It uses &lt;strong&gt;ENTRYPOINT&lt;/strong&gt; or &lt;strong&gt;CMD&lt;/strong&gt; to start services, Both parameters are used to specify the programs/commands to execute while initializing a container from the docker image.&lt;/p&gt;

&lt;p&gt;The container's primary process is responsible for managing all operations that it starts which we define at &lt;strong&gt;ENTRYPOINT&lt;/strong&gt; or &lt;strong&gt;CMD&lt;/strong&gt; at the end of the &lt;strong&gt;Dockerfile&lt;/strong&gt;. Docker always recommends that your areas of concern be by using one service per container.&lt;/p&gt;

&lt;h3&gt;
  
  
  Supervisor A process control system
&lt;/h3&gt;

&lt;p&gt;A supervisor is a client/server system that allows its users to monitor and control many processes on UNIX-like operating systems.&lt;/p&gt;

&lt;p&gt;It is meant to be used to control processes related to a project or a customer and to start like any other program at boot time.&lt;/p&gt;

&lt;p&gt;I have detail explained about supervisord in this &lt;a href="https://dev.to/pratapkute/what-is-supervisord-1omf"&gt;article&lt;/a&gt;.  &lt;/p&gt;

&lt;h3&gt;
  
  
  Multiple services in a container
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Dockerfile &lt;strong&gt;CMD&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;CMD &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"supervisord"&lt;/span&gt;, &lt;span class="s2"&gt;"-c"&lt;/span&gt;, &lt;span class="s2"&gt;"/path/to_your_file/supervisor.conf"&lt;/span&gt;, &lt;span class="s2"&gt;"-n"&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Supervisor conf file sample&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[unix_http_server]
file=/tmp/supervisor.sock
chmod=0755               

[supervisord]
logfile=/tmp/supervisord.log
logfile_maxbytes=50MB        
logfile_backups=10           
loglevel=info               
pidfile=/tmp/supervisord.pid 
nodaemon=false               
minfds=1024                  
minprocs=200
;environment variables
environment=ENV="PROD",
            PATH="/path/../...",

[inet_http_server]         ; inet (TCP) server disabled by default
port=127.0.0.1:9001        ; (ip_address:port specifier, *:port for all iface)

[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface

[supervisorctl]
serverurl=unix:///tmp/supervisor.sock 

[program:redis-server]
command=redis-server
process_name=%(program_name)s
numprocs=1
directory=/home/path/to/location/
autostart=true
autorestart=true
startsecs=10
stopsignal=TERM
stopwaitsecs=5 ; max num secs to wait b4 SIGKILL (default 10)
user=root
priority=1
stopasgroup=true 
killasgroup=true

[program:logger]
command=/home/path/to/excutable/logger
process_name=%(program_name)s
numprocs=1
directory=/home/path/to/location/
autostart=true
autorestart=true
startsecs=10
stopsignal=TERM
stopwaitsecs=5
user=root
priority=30
stopasgroup=true 
killasgroup=true
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In the above config file, we have two services one is Redis-server and logger services running as root. Each service has priority to start services. for each config param refer to the supervised documentation &lt;/p&gt;

&lt;p&gt;In the &lt;strong&gt;command&lt;/strong&gt; section, You can also use a shell script to run your services but be aware of the zombie process created when you kill or restart the services.&lt;/p&gt;

</description>
      <category>docker</category>
      <category>beginners</category>
      <category>containerapps</category>
    </item>
    <item>
      <title>Docker How &amp; Why to Use?</title>
      <dc:creator>Pratap kute</dc:creator>
      <pubDate>Fri, 26 Aug 2022 11:04:00 +0000</pubDate>
      <link>https://dev.to/pratapkute/docker-how-why-to-use-3mmn</link>
      <guid>https://dev.to/pratapkute/docker-how-why-to-use-3mmn</guid>
      <description>&lt;h2&gt;
  
  
  How to use docker
&lt;/h2&gt;

&lt;p&gt;In my last article, I wrote about how &lt;a href="https://dev.to/pratapkute/docker-hello-world-23l6"&gt;Docker Hello world&lt;/a&gt; works. In that, I have explained about container and docker ecosystem &lt;/p&gt;

&lt;p&gt;Docker packs, ships, and runs the application as a lightweight containerization tool and builds an agile software delivery pipeline to ship new features faster. so let’s start using docker.&lt;/p&gt;

&lt;p&gt;I recommend you start with the docker command line (CLI) tool first, then go for the docker desktop. Now let's say you want your &lt;strong&gt;Dockerfile image&lt;/strong&gt; first, take a simple example&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Create a Dockerfile with no extension&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpmkj8fryomn046f8q51f.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpmkj8fryomn046f8q51f.png" alt="Dockerfile" width="800" height="125"&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="s"&gt; alpine&lt;/span&gt;
&lt;span class="k"&gt;CMD&lt;/span&gt;&lt;span class="s"&gt; ["echo", "Love from India"]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In the first line, we are using a &lt;strong&gt;base image&lt;/strong&gt; (A base image is an &lt;strong&gt;image that is used to create all of your container images&lt;/strong&gt; ) You can use multiple flavors of images, such as Ubuntu, Debian, etc., but &lt;strong&gt;alpine images&lt;/strong&gt; are &lt;strong&gt;small in size.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Dockerfile has FROM, COPY, RUN, CMD, etc &lt;a href="https://docs.docker.com/engine/reference/builder/#format" rel="noopener noreferrer"&gt;instructions&lt;/a&gt; which tell docker demon how to build an image. Each instruction is a &lt;strong&gt;layer&lt;/strong&gt; in the container. CMD is a special instruction that tells specifies what command to run within the container. &lt;a href="https://docs.docker.com/develop/develop-images/dockerfile_best-practices/" rel="noopener noreferrer"&gt;Best practices for writing Dockerfile&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffp8jtddka7lbbxnx3eru.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffp8jtddka7lbbxnx3eru.png" alt="Docker container layers" width="800" height="70"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Let’s build the image&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker build &lt;span class="nt"&gt;-t&lt;/span&gt; love:latest &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fk8jmdxoklhaubohp8tz1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fk8jmdxoklhaubohp8tz1.png" alt="Docker build" width="800" height="233"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://docs.docker.com/engine/reference/commandline/build/" rel="noopener noreferrer"&gt;Docker build&lt;/a&gt; is a command that builds Docker images from a Dockerfile and a “context”. In the above command, we used the &lt;code&gt;-t&lt;/code&gt; option as a tag in the 'name: tag' format, and &lt;code&gt;.&lt;/code&gt; is a reference to &lt;strong&gt;context&lt;/strong&gt; (The transfer of context from the local machine to the Docker daemon) and we have given the name &lt;code&gt;love:latest&lt;/code&gt; to our image.&lt;/p&gt;

&lt;p&gt;As you see in &lt;code&gt;step 1/2&lt;/code&gt; the image &lt;code&gt;alpine:latest&lt;/code&gt; image got pulled from the &lt;a href="https://hub.docker.com/search?q=" rel="noopener noreferrer"&gt;docker hub&lt;/a&gt; and in the second &lt;code&gt;step 2/2&lt;/code&gt; we have given instructions to &lt;code&gt;echo&lt;/code&gt; a string which is &lt;strong&gt;love from India.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkic1s05vr3mnpoi9ujlz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkic1s05vr3mnpoi9ujlz.png" alt="Docker images ls" width="698" height="65"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Running docker container&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker container run love
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;when you run the above command you will see the output to the terminal&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3zz79zmvfyxo5u1y18ut.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3zz79zmvfyxo5u1y18ut.png" alt="love from india" width="740" height="23"&gt;&lt;/a&gt;&lt;br&gt;
If you want just practice these commands without installing docker on your machine, head to &lt;a href="https://labs.play-with-docker.com/" rel="noopener noreferrer"&gt;https://labs.play-with-docker.com/&lt;/a&gt;  on this platform, you need a docker id and play with docker.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why is Docker useful?
&lt;/h2&gt;

&lt;p&gt;Docker allows you to exactly replicate your development environment which gives you leverage to distribute it QA team or in a production environment. It alleviates the problem of “it’s broken on my machine!”.&lt;/p&gt;

&lt;p&gt;If you want to add another server (Ex: Database) to your existing infrastructure you don't have to worry about configuring that server and reinstalling the dependency, just pull that particular image from the Docker hub.&lt;/p&gt;

&lt;p&gt;Docker is an easy tool to use when you get started using its daily development and OPS practices. with docker, you can run multiple separate containers with, a separate version of Python or any other language, app versions&lt;/p&gt;

&lt;p&gt;Docker makes running multiple servers very easy, especially with orchestration engines like &lt;a href="https://kubernetes.io/" rel="noopener noreferrer"&gt;Kubernetes&lt;/a&gt; and &lt;a href="https://docs.docker.com/engine/swarm/" rel="noopener noreferrer"&gt;Docker Swarm&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  When not to use Docker?
&lt;/h2&gt;

&lt;p&gt;By default docker container run as &lt;code&gt;root&lt;/code&gt; so every service in the container runs as root, it’s not the best implementation for the production environment.&lt;/p&gt;

&lt;p&gt;The size of your docker container application grows exponentially when new updates come in. &lt;/p&gt;

&lt;p&gt;Building, testing, managing, and distributing Large and complicated applications require a dedicated sysadmin or DevOps engineer team.&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>docker</category>
    </item>
    <item>
      <title>Docker Hello world</title>
      <dc:creator>Pratap kute</dc:creator>
      <pubDate>Tue, 16 Aug 2022 12:01:03 +0000</pubDate>
      <link>https://dev.to/pratapkute/docker-hello-world-23l6</link>
      <guid>https://dev.to/pratapkute/docker-hello-world-23l6</guid>
      <description>&lt;h3&gt;
  
  
  Docker
&lt;/h3&gt;

&lt;p&gt;Docker is an open-source &lt;strong&gt;containerisation&lt;/strong&gt; platform. It enables developers to package applications into containers standardized executable components combining application &lt;br&gt;
source code with the operating system (OS) libraries and dependencies required to run that code in any environment&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;containerisation:&lt;/strong&gt;  It’s Linux kernel virtualization where you run applications in isolated user spaces called containers that use the same shared operating system.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuuv1vr63co93cmtarle0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuuv1vr63co93cmtarle0.png" alt="Linux container" width="537" height="381"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Docker ecosystem
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Docker client&lt;/li&gt;
&lt;li&gt;Docker server&lt;/li&gt;
&lt;li&gt;Docker Machine&lt;/li&gt;
&lt;li&gt;Docker image&lt;/li&gt;
&lt;li&gt;Docker hub&lt;/li&gt;
&lt;li&gt;Docker compose&lt;/li&gt;
&lt;li&gt;Docker swarm&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyn8k4vyo20xaudxafsy3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyn8k4vyo20xaudxafsy3.png" alt="Docker CLI" width="472" height="231"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Note: To install docker on your machine follow these instructions.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.docker.com/desktop/install/windows-install/" rel="noopener noreferrer"&gt;Windows Docker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.docker.com/desktop/install/ubuntu/" rel="noopener noreferrer"&gt;Ubuntu Docker&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Hello world
&lt;/h3&gt;

&lt;p&gt;Now let's do hello world so when you type the following command in that &lt;strong&gt;hello-world&lt;/strong&gt; refers to image (docker image)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker run hello-world
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Docker CLI takes that command and passes it to the docker server. &lt;/p&gt;

&lt;p&gt;If that image is not on your computer (Image cache), it reaches out to the docker hub. docker pulls that image and creates a container out of it.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F70sojlxs7jy25bi1yjq0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F70sojlxs7jy25bi1yjq0.png" alt="Docker hello world" width="618" height="621"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Pay attention to what steps docker took to print the hello world.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm5zwkaxs4m7a06nezk9r.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm5zwkaxs4m7a06nezk9r.png" alt="Docker hello world cli" width="800" height="581"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Docker has revolutionized how we build, test and deploy the software, In the next article I will explain how to build your own Docker images and deploy them.&lt;/p&gt;

</description>
      <category>docker</category>
      <category>beginners</category>
      <category>devops</category>
    </item>
    <item>
      <title>Django cookiecutter</title>
      <dc:creator>Pratap kute</dc:creator>
      <pubDate>Mon, 08 Aug 2022 09:22:00 +0000</pubDate>
      <link>https://dev.to/pratapkute/django-cookiecutter-1o7</link>
      <guid>https://dev.to/pratapkute/django-cookiecutter-1o7</guid>
      <description>&lt;p&gt;Do you know, how to set up your production-ready Django project with all &lt;a href="https://12factor.net/" rel="noopener noreferrer"&gt;twelve-factor app&lt;/a&gt; standards within minutes? if your answer is no then use &lt;a href="https://cookiecutter-django.readthedocs.io/en/latest/index.html" rel="noopener noreferrer"&gt;Django-Cookiecutter&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5e0a1no40dx0au9skz18.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5e0a1no40dx0au9skz18.png" alt="cookiecutter" width="497" height="95"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A command-line utility that creates projects from &lt;strong&gt;cookiecutters&lt;/strong&gt;&lt;br&gt;
(project templates), e.g. creating a Python package project from a Python package project template.&lt;/p&gt;

&lt;p&gt;There are all types of cookie-cutters just search it on GitHub. Your life will be easier  &lt;/p&gt;

&lt;p&gt;Cookiecutter Django is a project template for jump-starting production-ready Django projects. The template offers several generation options&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/cookiecutter/cookiecutter-django" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub-link-card.s3.ap-northeast-1.amazonaws.com%2Fcookiecutter%2Fcookiecutter-django.png" width="800" height="266"&gt;&lt;/a&gt;  &lt;/p&gt;

&lt;p&gt;Note:- It’s only for a senior developer 😏 &lt;/p&gt;

</description>
      <category>productivity</category>
      <category>opensource</category>
      <category>django</category>
    </item>
    <item>
      <title>Which is the best CI/CD self-hosted open source tool?</title>
      <dc:creator>Pratap kute</dc:creator>
      <pubDate>Wed, 27 Jul 2022 10:00:00 +0000</pubDate>
      <link>https://dev.to/pratapkute/which-is-the-best-cicd-self-hosted-open-source-tool-55j0</link>
      <guid>https://dev.to/pratapkute/which-is-the-best-cicd-self-hosted-open-source-tool-55j0</guid>
      <description>&lt;p&gt;I have used python based CI tool &lt;a href="https://buildbot.net/" rel="noopener noreferrer"&gt;buildbot&lt;/a&gt; which is a great tool but we want to move away from buildbot only because in some scenarios we want to compile low-level micro-service which are in c++ to a different architecture. Buildbot doesn't have such a feature.&lt;/p&gt;

&lt;p&gt;So can you suggest one? Till now I looked at the &lt;a href="https://concourse-ci.org/" rel="noopener noreferrer"&gt;concourse&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>discuss</category>
    </item>
    <item>
      <title>What is supervisord?</title>
      <dc:creator>Pratap kute</dc:creator>
      <pubDate>Thu, 21 Jul 2022 08:33:00 +0000</pubDate>
      <link>https://dev.to/pratapkute/what-is-supervisord-1omf</link>
      <guid>https://dev.to/pratapkute/what-is-supervisord-1omf</guid>
      <description>&lt;ol&gt;
&lt;li&gt;A process control system&lt;/li&gt;
&lt;li&gt;what is supervisord&lt;/li&gt;
&lt;li&gt;why use supervisord&lt;/li&gt;
&lt;li&gt;sample file&lt;/li&gt;
&lt;/ol&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;A Process Control System&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;the process control system monitors and controls several processes on your system &lt;/p&gt;

&lt;p&gt;it handles the start/monitor/stop/restart of your services. if you are from Linx/UNIX world you will know that &lt;strong&gt;init&lt;/strong&gt; as “process id 1”&lt;/p&gt;

&lt;p&gt;The init process is the last step in the boot procedure and is identified by process id "1".   Init is responsible for starting system processes&lt;/p&gt;

&lt;p&gt;Init typically will start multiple instances of "Getty" which waits for console logins which spawn one's user shell process. Upon shutdown, init controls the sequence and processes for the shutdown.&lt;br&gt;
The init process is never shut down. It is a user process and not a kernel system process although it does run as root.&lt;/p&gt;

&lt;h3&gt;
  
  
  what is supervisord?
&lt;/h3&gt;

&lt;p&gt;It’s a process control tool which is written in pure python&lt;/p&gt;

&lt;p&gt;Supervisord is a client/server system that allows its users to monitor and control several processes on UNIX-like operating systems.&lt;/p&gt;

&lt;p&gt;It shares some of the same goals as programs like &lt;em&gt;launchd,daemontools&lt;/em&gt;, and &lt;em&gt;runit&lt;/em&gt;. Unlike some of these programs, &lt;strong&gt;it is not meant to be run as a substitute for init as “process id 1”. Instead it is meant to be used to control processes related to a project or a customer&lt;/strong&gt;, and is meant to start like any other program at boot time.&lt;/p&gt;

&lt;p&gt;Supervisor can be installed with pip install:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;pip install supervisor&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;details instruction to install &lt;a href="http://supervisord.org/installing.html" rel="noopener noreferrer"&gt;supervisord&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;supervisord uses configuration files so it’s easy to understand what each process is doing&lt;/p&gt;

&lt;p&gt;&lt;em&gt;supervisord.conf&lt;/em&gt; is a Windows-INI-style (Python ConfigParser) file.  It has sections (each denoted by a [header]) and key/value pairs within the sections.&lt;/p&gt;

&lt;h3&gt;
  
  
  why use supervisord?
&lt;/h3&gt;

&lt;p&gt;consider the scenario where you have written a hello world program and you want to start that particular program after booting up your OS in this kind of scenario where you can use supervisord.&lt;/p&gt;

&lt;p&gt;We use supervisord in docker to run multiple services (program). In the next blog, I will explain how to use supervisord in docker to control.&lt;/p&gt;

&lt;h3&gt;
  
  
  Sample file
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;; Sample supervisor config file.
;
; For more information on the config file, please see:
; http://supervisord.org/configuration.html
;
; Notes:
;  - Shell expansion ("~" or "$HOME") is not supported.  Environment
;    variables can be expanded using this syntax: "%(ENV_HOME)s".
;  - Quotes around values are not supported, except in the case of
;    the environment= options as shown below.
;  - Comments must have a leading space: "a=b ;comment" not "a=b;comment".
;  - Command will be truncated if it looks like a config file comment, e.g.
;    "command=bash -c 'foo ; bar'" will truncate to "command=bash -c 'foo ".
;
; Warning:
;  Paths throughout this example file use /tmp because it is available on most
;  systems.  You will likely need to change these to locations more appropriate
;  for your system.  Some systems periodically delete older files in /tmp.
;  Notably, if the socket file defined in the [unix_http_server] section below
;  is deleted, supervisorctl will be unable to connect to supervisord.

[unix_http_server]
file=/tmp/supervisor.sock   ; the path to the socket file
;chmod=0700                 ; socket file mode (default 0700)
;chown=nobody:nogroup       ; socket file uid:gid owner
;username=user              ; default is no username (open server)
;password=123               ; default is no password (open server)

; Security Warning:
;  The inet HTTP server is not enabled by default.  The inet HTTP server is
;  enabled by uncommenting the [inet_http_server] section below.  The inet
;  HTTP server is intended for use within a trusted environment only.  It
;  should only be bound to localhost or only accessible from within an
;  isolated, trusted network.  The inet HTTP server does not support any
;  form of encryption.  The inet HTTP server does not use authentication
;  by default (see the username= and password= options to add authentication).
;  Never expose the inet HTTP server to the public internet.

;[inet_http_server]         ; inet (TCP) server disabled by default
;port=127.0.0.1:9001        ; ip_address:port specifier, *:port for all iface
;username=user              ; default is no username (open server)
;password=123               ; default is no password (open server)

[supervisord]
logfile=/tmp/supervisord.log ; main log file; default $CWD/supervisord.log
logfile_maxbytes=50MB        ; max main logfile bytes b4 rotation; default 50MB
logfile_backups=10           ; # of main logfile backups; 0 means none, default 10
loglevel=info                ; log level; default info; others: debug,warn,trace
pidfile=/tmp/supervisord.pid ; supervisord pidfile; default supervisord.pid
nodaemon=false               ; start in foreground if true; default false
silent=false                 ; no logs to stdout if true; default false
minfds=1024                  ; min. avail startup file descriptors; default 1024
minprocs=200                 ; min. avail process descriptors;default 200
;umask=022                   ; process file creation umask; default 022
;user=supervisord            ; setuid to this UNIX account at startup; recommended if root
;identifier=supervisor       ; supervisord identifier, default is 'supervisor'
;directory=/tmp              ; default is not to cd during start
;nocleanup=true              ; don't clean up tempfiles at start; default false
;childlogdir=/tmp            ; 'AUTO' child log dir, default $TEMP
;environment=KEY="value"     ; key value pairs to add to environment
;strip_ansi=false            ; strip ansi escape codes in logs; def. false

; The rpcinterface:supervisor section must remain in the config file for
; RPC (supervisorctl/web interface) to work.  Additional interfaces may be
; added by defining them in separate [rpcinterface:x] sections.

[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface

; The supervisorctl section configures how supervisorctl will connect to
; supervisord.  configure it match the settings in either the unix_http_server
; or inet_http_server section.

[supervisorctl]
serverurl=unix:///tmp/supervisor.sock ; use a unix:// URL  for a unix socket
;serverurl=http://127.0.0.1:9001 ; use an http:// url to specify an inet socket
;username=chris              ; should be same as in [*_http_server] if set
;password=123                ; should be same as in [*_http_server] if set
;prompt=mysupervisor         ; cmd line prompt (default "supervisor")
;history_file=~/.sc_history  ; use readline history if available

; The sample program section below shows all possible program subsection values.
; Create one or more 'real' program: sections to be able to control them under
; supervisor.

;[program:theprogramname]
;command=/bin/cat              ; the program (relative uses PATH, can take args)
;process_name=%(program_name)s ; process_name expr (default %(program_name)s)
;numprocs=1                    ; number of processes copies to start (def 1)
;directory=/tmp                ; directory to cwd to before exec (def no cwd)
;umask=022                     ; umask for process (default None)
;priority=999                  ; the relative start priority (default 999)
;autostart=true                ; start at supervisord start (default: true)
;startsecs=1                   ; # of secs prog must stay up to be running (def. 1)
;startretries=3                ; max # of serial start failures when starting (default 3)
;autorestart=unexpected        ; when to restart if exited after running (def: unexpected)
;exitcodes=0                   ; 'expected' exit codes used with autorestart (default 0)
;stopsignal=QUIT               ; signal used to kill process (default TERM)
;stopwaitsecs=10               ; max num secs to wait b4 SIGKILL (default 10)
;stopasgroup=false             ; send stop signal to the UNIX process group (default false)
;killasgroup=false             ; SIGKILL the UNIX process group (def false)
;user=chrism                   ; setuid to this UNIX account to run the program
;redirect_stderr=true          ; redirect proc stderr to stdout (default false)
;stdout_logfile=/a/path        ; stdout log path, NONE for none; default AUTO
;stdout_logfile_maxbytes=1MB   ; max # logfile bytes b4 rotation (default 50MB)
;stdout_logfile_backups=10     ; # of stdout logfile backups (0 means none, default 10)
;stdout_capture_maxbytes=1MB   ; number of bytes in 'capturemode' (default 0)
;stdout_events_enabled=false   ; emit events on stdout writes (default false)
;stdout_syslog=false           ; send stdout to syslog with process name (default false)
;stderr_logfile=/a/path        ; stderr log path, NONE for none; default AUTO
;stderr_logfile_maxbytes=1MB   ; max # logfile bytes b4 rotation (default 50MB)
;stderr_logfile_backups=10     ; # of stderr logfile backups (0 means none, default 10)
;stderr_capture_maxbytes=1MB   ; number of bytes in 'capturemode' (default 0)
;stderr_events_enabled=false   ; emit events on stderr writes (default false)
;stderr_syslog=false           ; send stderr to syslog with process name (default false)
;environment=A="1",B="2"       ; process environment additions (def no adds)
;serverurl=AUTO                ; override serverurl computation (childutils)

; The sample eventlistener section below shows all possible eventlistener
; subsection values.  Create one or more 'real' eventlistener: sections to be
; able to handle event notifications sent by supervisord.

;[eventlistener:theeventlistenername]
;command=/bin/eventlistener    ; the program (relative uses PATH, can take args)
;process_name=%(program_name)s ; process_name expr (default %(program_name)s)
;numprocs=1                    ; number of processes copies to start (def 1)
;events=EVENT                  ; event notif. types to subscribe to (req'd)
;buffer_size=10                ; event buffer queue size (default 10)
;directory=/tmp                ; directory to cwd to before exec (def no cwd)
;umask=022                     ; umask for process (default None)
;priority=-1                   ; the relative start priority (default -1)
;autostart=true                ; start at supervisord start (default: true)
;startsecs=1                   ; # of secs prog must stay up to be running (def. 1)
;startretries=3                ; max # of serial start failures when starting (default 3)
;autorestart=unexpected        ; autorestart if exited after running (def: unexpected)
;exitcodes=0                   ; 'expected' exit codes used with autorestart (default 0)
;stopsignal=QUIT               ; signal used to kill process (default TERM)
;stopwaitsecs=10               ; max num secs to wait b4 SIGKILL (default 10)
;stopasgroup=false             ; send stop signal to the UNIX process group (default false)
;killasgroup=false             ; SIGKILL the UNIX process group (def false)
;user=chrism                   ; setuid to this UNIX account to run the program
;redirect_stderr=false         ; redirect_stderr=true is not allowed for eventlisteners
;stdout_logfile=/a/path        ; stdout log path, NONE for none; default AUTO
;stdout_logfile_maxbytes=1MB   ; max # logfile bytes b4 rotation (default 50MB)
;stdout_logfile_backups=10     ; # of stdout logfile backups (0 means none, default 10)
;stdout_events_enabled=false   ; emit events on stdout writes (default false)
;stdout_syslog=false           ; send stdout to syslog with process name (default false)
;stderr_logfile=/a/path        ; stderr log path, NONE for none; default AUTO
;stderr_logfile_maxbytes=1MB   ; max # logfile bytes b4 rotation (default 50MB)
;stderr_logfile_backups=10     ; # of stderr logfile backups (0 means none, default 10)
;stderr_events_enabled=false   ; emit events on stderr writes (default false)
;stderr_syslog=false           ; send stderr to syslog with process name (default false)
;environment=A="1",B="2"       ; process environment additions
;serverurl=AUTO                ; override serverurl computation (childutils)

; The sample group section below shows all possible group values.  Create one
; or more 'real' group: sections to create "heterogeneous" process groups.

;[group:thegroupname]
;programs=progname1,progname2  ; each refers to 'x' in [program:x] definitions
;priority=999                  ; the relative start priority (default 999)

; The [include] section can just contain the "files" setting.  This
; setting can list multiple files (separated by whitespace or
; newlines).  It can also contain wildcards.  The filenames are
; interpreted as relative to this file.  Included files *cannot*
; include files themselves.

;[include]
;files = relative/directory/*.ini
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>beginners</category>
      <category>productivity</category>
      <category>python</category>
    </item>
  </channel>
</rss>
