<?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: Igor Perepilitsyn</title>
    <description>The latest articles on DEV Community by Igor Perepilitsyn (@kazauwa).</description>
    <link>https://dev.to/kazauwa</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%2F885012%2F312014e5-41c5-47ff-9675-af7b59d4d6f9.jpg</url>
      <title>DEV Community: Igor Perepilitsyn</title>
      <link>https://dev.to/kazauwa</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/kazauwa"/>
    <language>en</language>
    <item>
      <title>Intro to HTTP</title>
      <dc:creator>Igor Perepilitsyn</dc:creator>
      <pubDate>Thu, 08 Sep 2022 08:36:51 +0000</pubDate>
      <link>https://dev.to/kazauwa/intro-to-http-17p</link>
      <guid>https://dev.to/kazauwa/intro-to-http-17p</guid>
      <description>&lt;p&gt;Hypertext Transfer Protocol is a set of rules for sending data across the internet. It was invented to standardize communication, e.g., how browsers should request data from servers and how servers should respond. HTTP is very widespread, so as a web developer you will interact with the protocol a lot.&lt;/p&gt;

&lt;h2&gt;
  
  
  The basic request
&lt;/h2&gt;

&lt;p&gt;It’s a text protocol, so a human can easily read it. Here is a simplified version of a message that a browser generates to ask for the main page of &lt;a href="https://dev.to"&gt;dev.to&lt;/a&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;GET / HTTP/1.1
Host: dev.to
User-Agent: Chrome/102.26.590.728
Accept-Language: en-US
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The first line, called the request line, contains the request. We tell the server that we want to read (&lt;code&gt;GET&lt;/code&gt;) a resource at the root page &lt;code&gt;/&lt;/code&gt; (as in &lt;code&gt;dev.to/&lt;/code&gt;). The line ends with version (&lt;code&gt;1.1&lt;/code&gt;) of the HTTP protocol.&lt;/p&gt;

&lt;h3&gt;
  
  
  Headers
&lt;/h3&gt;

&lt;p&gt;The second and the following lines contain additional information called headers. They are technical bits of data needed for communication to work out correctly. A header consists of a name and a value separated by a colon. One line holds precisely one header, and there is no limit to their number, apart from the max request size a server can handle.&lt;/p&gt;

&lt;p&gt;Headers are optional, except for &lt;code&gt;Host&lt;/code&gt;, which specifies the domain of the requested resource. The last two headers in the example above specify our browser and preferred language.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers"&gt;The complete list&lt;/a&gt; of all available headers is long, and you don’t really need to know all of them. Among other reasons, a browser will handle them for you in most cases.&lt;/p&gt;

&lt;h3&gt;
  
  
  Response
&lt;/h3&gt;

&lt;p&gt;And here’s how a simplified HTTP response may look:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;HTTP/1.1 200 OK
Content-Type: text/html
Content-Length: 31890
Content-Encoding: gzip
&amp;lt;response body&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The first line consists of an HTTP version and a status code, which briefly describes the request result. Same as in requests, the following lines contain headers. For instance, the server tells our browser that the response has an HTML page (&lt;code&gt;Content-Type: text/html&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;An HTTP response can have a response body: a file (a bunch of bytes), an HTML page, or it can be empty. That’s what we see when our browser renders this information on our screen.&lt;/p&gt;

&lt;p&gt;That’s it for the basic layout of an HTTP message.&lt;/p&gt;

&lt;h3&gt;
  
  
  Cookies
&lt;/h3&gt;

&lt;p&gt;Cookies — are small pieces of information that persist across requests. They are used to “remember” a user on a website. For example, your login information is saved in cookies. That’s why you don’t authenticate each time you visit some website. That is also the reason you see targeted ads. Cookies are stored in your browser and sent to the server with every request. &lt;/p&gt;

&lt;p&gt;In terms of HTTP, cookies are headers. They are initially sent with the response:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Set-Cookie: &amp;lt;cookie-name&amp;gt;=&amp;lt;cookie-value&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If browser has saved cookies, it will pass them in subsequent requests as headers:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Cookie: name=value
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Methods
&lt;/h2&gt;

&lt;p&gt;Methods or HTTP verbs describe which action we want to perform on a resource. An action is executed on a server-side; hence methods are only used in requests. There are 9 methods as defined in &lt;a href="https://www.rfc-editor.org/rfc/rfc9110.html"&gt;the standard&lt;/a&gt;. Some of them may seem identical, but there are 3 properties to help us determine the difference between them:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Safety&lt;/strong&gt; — action only reads the resource and does not change it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Idempotence&lt;/strong&gt; — doing the same action repeatedly will produce the same result.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cacheability&lt;/strong&gt; — the response can be saved somewhere and retrieved for later use.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Now, let’s have a look at each method. I’ll leave out &lt;code&gt;CONNECT&lt;/code&gt; and &lt;code&gt;TRACE&lt;/code&gt; because they are pretty rare.&lt;/p&gt;

&lt;h3&gt;
  
  
  GET
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Safety&lt;/th&gt;
&lt;th&gt;Idempotence&lt;/th&gt;
&lt;th&gt;Cacheability&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;+&lt;/td&gt;
&lt;td&gt;+&lt;/td&gt;
&lt;td&gt;+&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;code&gt;GET&lt;/code&gt; is the most frequently used method on the internet. It is used to read a resource. When navigating a website in a browser, we make a &lt;code&gt;GET&lt;/code&gt; request.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;GET / HTTP/1.1
Host: httpbin.org
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;HTTP/1.1 200 OK
Content-Type: text/html; charset=utf-8
Content-Length: 9593
&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang="en"&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;meta charset="UTF-8"&amp;gt;
&amp;lt;title&amp;gt;httpbin.org&amp;lt;/title&amp;gt;
...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  POST
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Safety&lt;/th&gt;
&lt;th&gt;Idempotence&lt;/th&gt;
&lt;th&gt;Cacheability&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;sometimes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;code&gt;POST&lt;/code&gt; method sends data to the server. That data is placed in the request body, which works the same way as in an HTTP response. &lt;code&gt;POST&lt;/code&gt; method alters resource state, often creating a new instance of something. It is the second most frequently used type of request on the internet. If you submit a form on a website, your browser will send a &lt;code&gt;POST&lt;/code&gt; request.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;POST /post HTTP/1.1
Host: httpbin.org
Content-Type: multipart/form-data; boundary=--------------------------878806948835616453637143
Content-Length: 285

----------------------------878806948835616453637143
Content-Disposition: form-data; name="login"
kazauwa
----------------------------878806948835616453637143
Content-Disposition: form-data; name="password"
supersecret
----------------------------878806948835616453637143–
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  PUT
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Safety&lt;/th&gt;
&lt;th&gt;Idempotence&lt;/th&gt;
&lt;th&gt;Cacheability&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;+&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;code&gt;PUT&lt;/code&gt; is like &lt;code&gt;POST&lt;/code&gt;, but idempotent. That is, subsequent &lt;code&gt;PUT&lt;/code&gt; requests will produce the same result. &lt;code&gt;POST&lt;/code&gt;, in contrast, can lead to unexpected effects. Imagine submitting a registration form multiple times and creating multiple identical users. &lt;/p&gt;

&lt;h3&gt;
  
  
  PATCH
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Safety&lt;/th&gt;
&lt;th&gt;Idempotence&lt;/th&gt;
&lt;th&gt;Cacheability&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Also known as partial &lt;code&gt;PUT&lt;/code&gt;. Unlike &lt;code&gt;POST&lt;/code&gt;, it cannot be used in forms. &lt;code&gt;PATCH&lt;/code&gt; is meant to send only partial changes to a resource (say, we only want to change a username), but in reality, not many servers implement it.&lt;/p&gt;

&lt;h3&gt;
  
  
  DELETE
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Safety&lt;/th&gt;
&lt;th&gt;Idempotence&lt;/th&gt;
&lt;th&gt;Cacheability&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;+&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;code&gt;DELETE&lt;/code&gt; is used to delete a resource. It is allowed to send data in the request body but is not required. As with &lt;code&gt;PUT&lt;/code&gt;, it should produce the same result for subsequent requests. After all, you can’t delete something twice.&lt;/p&gt;

&lt;h3&gt;
  
  
  HEAD
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Safety&lt;/th&gt;
&lt;th&gt;Idempotence&lt;/th&gt;
&lt;th&gt;Cacheability&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;+&lt;/td&gt;
&lt;td&gt;+&lt;/td&gt;
&lt;td&gt;+&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;code&gt;HEAD&lt;/code&gt; works almost like &lt;code&gt;GET&lt;/code&gt;, except that the response should not have a body. If it is present, it must be ignored. &lt;code&gt;HEAD&lt;/code&gt; is used to fetch headers that can be used to plan the subsequent request. For instance, if we want to download a file, it may be a good idea to check its size (&lt;code&gt;Content-Length&lt;/code&gt; header) and see if we can save it.&lt;/p&gt;

&lt;h3&gt;
  
  
  OPTIONS
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Safety&lt;/th&gt;
&lt;th&gt;Idempotence&lt;/th&gt;
&lt;th&gt;Cacheability&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;+&lt;/td&gt;
&lt;td&gt;+&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;code&gt;OPTIONS&lt;/code&gt; asks a server which methods can be performed on a resource. They can be found inside &lt;code&gt;Allow&lt;/code&gt; header in the response. You probably won’t use it directly, but it is used by a browser sometimes. Not many servers implement this method.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;OPTIONS / HTTP/1.1
Host: httpbin.org
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;HTTP/1.1 200 OK
Allow: OPTIONS, HEAD, GET
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Status codes
&lt;/h2&gt;

&lt;p&gt;Every HTTP response has a status code, a 3-digit number that indicates whether it was successful or not. They are divided into 5 groups:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;1хх&lt;/strong&gt; — informational&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;2хх&lt;/strong&gt; — successful&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;3хх&lt;/strong&gt; — redirection&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;4хх&lt;/strong&gt; — client errors&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;5хх&lt;/strong&gt; — server errors&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Let’s take a look at some of the common codes. The complete list is available &lt;a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Status"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  1хх
&lt;/h3&gt;

&lt;p&gt;Informational codes notify a client of an intermediate status of their request. You probably won’t ever see them.&lt;/p&gt;

&lt;h3&gt;
  
  
  2xx
&lt;/h3&gt;

&lt;p&gt;Status codes from this group indicate that the request was accepted and successfully processed by a server:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;200 OK&lt;/strong&gt; — success. Most of the time, you will see this status code.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;201 Created&lt;/strong&gt; — request resulted in creating a new resource. It is usually sent in response to &lt;code&gt;POST&lt;/code&gt; and &lt;code&gt;PUT&lt;/code&gt; requests.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;202 Accepted&lt;/strong&gt; — request is accepted but not yet processed. For example, the operation takes a long time to finish and is handled by some other application that runs once a day.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;204 No Content&lt;/strong&gt; — the body is empty, but headers may be useful. You may see it in response to a &lt;code&gt;HEAD&lt;/code&gt; request. It can also be used with idempotent and unsafe requests to indicate that the state wasn’t altered.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3xx
&lt;/h3&gt;

&lt;p&gt;These codes indicate that a client needs to take action to finish the request.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;301 Moved Permanently&lt;/strong&gt; — The URL of a resource was changed. The new one is in the response.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;302 Found&lt;/strong&gt; — similar to the previous, except the change is temporary. For example, search engines won’t change the old URL to a new one in the results.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;304 Not Modified&lt;/strong&gt; — resource contents are cached and haven’t changed since the last request. It is safe to stop the current request there and use the cached data.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4xx
&lt;/h3&gt;

&lt;p&gt;Status codes from this group indicate that there was a mistake in the request:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;400 Bad Request&lt;/strong&gt; — the request is malformed, and the server cannot process it. There may be many reasons for that, but the error is often somewhere in the request body.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;401 Unauthorized&lt;/strong&gt; — authentication is required to proceed&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;403 Forbidden&lt;/strong&gt; — user is authenticated but unauthorized to proceed to the resource.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;404 Not Found&lt;/strong&gt; — the famous “page not found” code. Indicates that resource doesn’t exist. Some websites may return 404 instead of 403 to hide the existence of some pages from unauthorized users.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;405 Method Not Allowed&lt;/strong&gt; — resource does not support the request method. Remember the &lt;code&gt;OPTIONS&lt;/code&gt; method? You’ll see this status code if the requested method is not among those listed in the &lt;code&gt;Allow&lt;/code&gt; header.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;429 Too Many Requests&lt;/strong&gt; — there are too many requests from the client, and they are being rate-limited. Used against DDoS and brute-force attacks.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  5xx
&lt;/h3&gt;

&lt;p&gt;These status codes indicate that the server has encountered errors during request processing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;500 Internal Server Error&lt;/strong&gt; — unhandled error on the server side. Usually happen due to bugs in the application.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;503 Service Unavailable&lt;/strong&gt; — server is not ready to process the request. The response may have a hint on when it will become available.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;If you have any questions, feel free to ask them in the &lt;br&gt;
comments.&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>programming</category>
      <category>tutorial</category>
      <category>webdev</category>
    </item>
    <item>
      <title>9 shell tools for productivity</title>
      <dc:creator>Igor Perepilitsyn</dc:creator>
      <pubDate>Sun, 04 Sep 2022 18:38:22 +0000</pubDate>
      <link>https://dev.to/kazauwa/9-shell-tools-for-productivity-4i6d</link>
      <guid>https://dev.to/kazauwa/9-shell-tools-for-productivity-4i6d</guid>
      <description>&lt;p&gt;So recently, I spent a few days trying to recreate my usual environment on a new laptop. Many of the tools I use became so natural that I forgot that they weren't there in the first place. After a couple of days of intense memory exercises, I finally managed to get everything together. At first, this post was a memo to save my future self from more brain push-ups. But then I thought that it could be helpful to someone else. Behold, community, this is the list of the tools I use daily:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. &lt;a href="https://ohmyz.sh/" rel="noopener noreferrer"&gt;Oh My Zsh&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;I use &lt;code&gt;zsh&lt;/code&gt; shell because it's &lt;del&gt;the default option on macOS&lt;/del&gt; really powerful. But there is a way to take it to the next level — &lt;code&gt;oh-my-zsh&lt;/code&gt;. It comes with a &lt;a href="https://github.com/ohmyzsh/ohmyzsh/wiki/Cheatsheet" rel="noopener noreferrer"&gt;bunch of handy commands&lt;/a&gt; and a powerful way to configure and extend your shell with &lt;a href="https://github.com/ohmyzsh/ohmyzsh/wiki/Plugins" rel="noopener noreferrer"&gt;plugins&lt;/a&gt;. There are also &lt;a href="https://github.com/ohmyzsh/ohmyzsh/wiki/Themes" rel="noopener noreferrer"&gt;themes&lt;/a&gt; if you want a different shell flavor.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. &lt;a href="https://github.com/romkatv/powerlevel10k" rel="noopener noreferrer"&gt;powerlevel10k theme&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft84purm6h3s0nwbf4xvg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft84purm6h3s0nwbf4xvg.png" alt="Theme preview"&gt;&lt;/a&gt;&lt;br&gt;
I really like how it looks, but I also like how fast it is. P10K can magically skip a lag between you hitting an &lt;code&gt;enter&lt;/code&gt; key and a prompt appearing on the screen. It also works during shell startup, e.g., if it suffers from plugin bloat. Speaking of which, powerlevel10k natively &lt;a href="https://github.com/romkatv/powerlevel10k#batteries-included" rel="noopener noreferrer"&gt;integrates with many of them&lt;/a&gt;. For example, it can detect your current Python virtual environment or AWS user and display them in the shell prompt.&lt;/p&gt;
&lt;h3&gt;
  
  
  3. &lt;a href="https://github.com/t413/zsh-background-notify" rel="noopener noreferrer"&gt;bgnotify&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmaodoxt9vo3jnbhly81g.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmaodoxt9vo3jnbhly81g.png" alt="bgnotify notification"&gt;&lt;/a&gt;&lt;br&gt;
This small tool fires notifications when a command finishes executing in a terminal. No more switching between windows every 5 seconds to check on rust compilation!&lt;/p&gt;
&lt;h3&gt;
  
  
  4. &lt;a href="https://direnv.net/" rel="noopener noreferrer"&gt;direnv&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fngi0oieju9ajy3nb7qdp.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fngi0oieju9ajy3nb7qdp.gif" alt="Direnv demo"&gt;&lt;/a&gt;&lt;br&gt;
A must-have if you use environment variables a lot. You export them in a &lt;code&gt;.envrc&lt;/code&gt; file and place it in the root directory of your project. Then those variables are automatically loaded upon entering that directory. Direnv also provides &lt;a href="https://direnv.net/man/direnv-stdlib.1.html#stdlib" rel="noopener noreferrer"&gt;handy functions&lt;/a&gt; for &lt;code&gt;.envrc&lt;/code&gt; file, and it can load envs from &lt;code&gt;.env&lt;/code&gt;!&lt;/p&gt;
&lt;h3&gt;
  
  
  5. &lt;a href="https://github.com/junegunn/fzf" rel="noopener noreferrer"&gt;fzf&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3zk7lne96royd12dmikw.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3zk7lne96royd12dmikw.gif" alt="fzf demo"&gt;&lt;/a&gt;&lt;br&gt;
Command-line fuzzy finder. I use it mainly with reverse search by command history. Outputs a list of results and has an &lt;a href="https://github.com/junegunn/fzf#search-syntax" rel="noopener noreferrer"&gt;extended syntax&lt;/a&gt; for searching.&lt;/p&gt;
&lt;h3&gt;
  
  
  6. &lt;a href="https://github.com/pyenv/pyenv" rel="noopener noreferrer"&gt;pyenv&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Falmhto7k2yi6sax5yhz9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Falmhto7k2yi6sax5yhz9.png" alt="pyenv"&gt;&lt;/a&gt;&lt;br&gt;
Pyenv lets you install different versions of python on your system simultaneously, without breaking a thing. You can switch between any of them in &lt;a href="https://github.com/pyenv/pyenv#switch-between-python-versions" rel="noopener noreferrer"&gt;one command&lt;/a&gt;. You can also bind a specific version to a directory, which will activate every time you enter it. There is an &lt;a href="https://github.com/pyenv/pyenv-virtualenv" rel="noopener noreferrer"&gt;extension&lt;/a&gt; that adds support for virtual environments.&lt;/p&gt;
&lt;h3&gt;
  
  
  7. &lt;a href="https://github.com/jesseduffield/lazygit" rel="noopener noreferrer"&gt;lazygit&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;Lazygit is a terminal UI for git. It's less wordy than the CLI and not as bloated as a GUI tool or an IDE plugin. I like it because it has most of the information I need on a single screen and provides many shortcuts for frequently used commands. Here is a video that shows more interesting things Lazygit can do.&lt;br&gt;
&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/CPLdltN7wgE"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h3&gt;
  
  
  8. &lt;a href="https://github.com/rupa/z" rel="noopener noreferrer"&gt;z script&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;A simple script that gathers statistics on your filesystem tree "movements" and uses it to teleport you to the most "frecent" directories. For example, if you frequently navigate to your project directory cd &lt;code&gt;~/work/company/myapp&lt;/code&gt;, you can use &lt;code&gt;z myapp&lt;/code&gt; to jump right in.&lt;/p&gt;

&lt;h3&gt;
  
  
  9. &lt;a href="https://github.com/asciimoo/wuzz" rel="noopener noreferrer"&gt;wuzz&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F657q522pf1zlcehccj2z.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F657q522pf1zlcehccj2z.gif" alt="Wuzz demo"&gt;&lt;/a&gt;&lt;br&gt;
A useful tool for exploring HTTP requests. Unfortunately, it's rarely updated, but it does the basic stuff.&lt;/p&gt;




&lt;p&gt;And that wraps things up. If you know other amazing tools that help you be more productive, share them in the comments!&lt;/p&gt;

</description>
      <category>programming</category>
      <category>productivity</category>
      <category>opensource</category>
      <category>devjournal</category>
    </item>
  </channel>
</rss>
