<?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: Mateusz Jarzyna</title>
    <description>The latest articles on DEV Community by Mateusz Jarzyna (@mateuszjarzyna).</description>
    <link>https://dev.to/mateuszjarzyna</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%2F165817%2F0a38ab51-4c85-4ee5-908f-c1cf40f13d52.jpeg</url>
      <title>DEV Community: Mateusz Jarzyna</title>
      <link>https://dev.to/mateuszjarzyna</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/mateuszjarzyna"/>
    <language>en</language>
    <item>
      <title>fkill - (imo) best way to kill processes // Cool GitHub projects</title>
      <dc:creator>Mateusz Jarzyna</dc:creator>
      <pubDate>Sat, 19 Sep 2020 18:53:57 +0000</pubDate>
      <link>https://dev.to/mateuszjarzyna/fkill-imo-best-way-to-kill-processes-cool-github-projects-878</link>
      <guid>https://dev.to/mateuszjarzyna/fkill-imo-best-way-to-kill-processes-cool-github-projects-878</guid>
      <description>&lt;p&gt;I will start with the biggest disadvantage of this app - &lt;code&gt;fkill&lt;/code&gt; is written in JS using Node.js. To be clear - JS is not my enemy, I'm not using that stack, so I had to install npm and so on.&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--vJ70wriM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://practicaldev-herokuapp-com.freetls.fastly.net/assets/github-logo-ba8488d21cd8ee1fee097b8410db9deaa41d0ca30b004c0c63de0a479114156f.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/sindresorhus"&gt;
        sindresorhus
      &lt;/a&gt; / &lt;a href="https://github.com/sindresorhus/fkill-cli"&gt;
        fkill-cli
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Fabulously kill processes. Cross-platform.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;h1&gt;

    &lt;br&gt;
    &lt;a rel="noopener noreferrer" href="https://camo.githubusercontent.com/45162532c5239c04f85a41740031eee03ca756d3/68747470733a2f2f63646e2e6a7364656c6976722e6e65742f67682f73696e647265736f726875732f666b696c6c40393133646365396165363730636431323431306636613634656166393464376535663530656436392f6d656469612f6c6f676f2e737667"&gt;&lt;img width="360" src="https://camo.githubusercontent.com/45162532c5239c04f85a41740031eee03ca756d3/68747470733a2f2f63646e2e6a7364656c6976722e6e65742f67682f73696e647265736f726875732f666b696c6c40393133646365396165363730636431323431306636613634656166393464376535663530656436392f6d656469612f6c6f676f2e737667" alt="fkill"&gt;&lt;/a&gt;
    &lt;br&gt;
    &lt;br&gt;
    &lt;br&gt;
&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;Fabulously kill processes. Cross-platform.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href="https://travis-ci.org/sindresorhus/fkill-cli" rel="nofollow"&gt;&lt;img src="https://camo.githubusercontent.com/a2ae3543c8f8ab29f32251c286e14bc93ba4129f/68747470733a2f2f7472617669732d63692e6f72672f73696e647265736f726875732f666b696c6c2d636c692e7376673f6272616e63683d6d6173746572" alt="Build Status"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Works on macOS, Linux, and Windows.&lt;/p&gt;
&lt;h2&gt;
Install&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;$ npm install --global fkill-cli
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;
Usage&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;$ fkill --help

  Usage
    $ fkill [&amp;lt;pid|name&amp;gt; …]

  Options
    --force -f    Force kill
    --verbose -v  Show process arguments
    --silent -s   Silently kill and always exit with code 0

  Examples
    $ fkill 1337
    $ fkill safari
    $ fkill :8080
    $ fkill 1337 safari :8080
    $ fkill

  To kill a port, prefix it with a colon. For example: :8080.

  Run without arguments to use the interactive interface.
  In interactive mode, 🚦n% indicates high CPU usage and 🐏n% indicates high memory usage.

  The process name is case insensitive.
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;
Interactive UI&lt;/h2&gt;
&lt;p&gt;Run &lt;code&gt;fkill&lt;/code&gt; without arguments to launch the interactive UI.&lt;/p&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://raw.githubusercontent.com/sindresorhus/fkill-cli/master/readme.md/screenshot.svg"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ziWPx3mE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/sindresorhus/fkill-cli/master/readme.md/screenshot.svg" alt=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
Related&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/sindresorhus/fkill"&gt;fkill&lt;/a&gt; - API for this module&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/SamVerschueren/alfred-fkill"&gt;alfred-fkill&lt;/a&gt; - Alfred workflow for this module&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
Maintainers&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://sindresorhus.com" rel="nofollow"&gt;Sindre Sorhus&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/coffeedoughnuts"&gt;Daniel Baker&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;



&lt;/div&gt;
&lt;br&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/sindresorhus/fkill-cli"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;
&lt;br&gt;


&lt;h2&gt;
  
  
  Install
&lt;/h2&gt;



&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm install --global fkill-cli
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



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

&lt;ul&gt;
&lt;li&gt;kill process by pid - &lt;code&gt;fkill 1337&lt;/code&gt; (nothing fancy)&lt;/li&gt;
&lt;li&gt;kill process by name - &lt;code&gt;fkill firefox&lt;/code&gt; (like &lt;code&gt;killall&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;kill process by port - &lt;code&gt;fkill :8080&lt;/code&gt; - will kill process which uses port 8080, super cool feature&lt;/li&gt;
&lt;li&gt;interactive mode - &lt;code&gt;fkill&lt;/code&gt; - shows all processes, search bar, ports used by each process, memory usage and CPU usage&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;-f&lt;/code&gt; to force kill&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--5AARgKHQ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/kd5izgjpxlglcnw1srq4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--5AARgKHQ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/kd5izgjpxlglcnw1srq4.png" alt="fkill"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>utility</category>
    </item>
    <item>
      <title>LazyGit - terminal UI for git commands // Cool GitHub projects </title>
      <dc:creator>Mateusz Jarzyna</dc:creator>
      <pubDate>Sat, 19 Sep 2020 12:19:57 +0000</pubDate>
      <link>https://dev.to/mateuszjarzyna/lazygit-terminal-ui-for-git-commands-cool-github-projects-4f74</link>
      <guid>https://dev.to/mateuszjarzyna/lazygit-terminal-ui-for-git-commands-cool-github-projects-4f74</guid>
      <description>&lt;p&gt;Are you sad when you are typing &lt;code&gt;git add shitty/long/path/to/file.exe&lt;/code&gt;, but you can't use SourceTree (or other GUI) because you are proud terminal user?&lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/dx4OSgpG6Gpzi/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/dx4OSgpG6Gpzi/giphy.gif" alt="infomercial"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I was too. But now I'm using &lt;a href="https://github.com/jesseduffield/lazygit" rel="noopener noreferrer"&gt;LazyGit&lt;/a&gt;!&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&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%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/jesseduffield" rel="noopener noreferrer"&gt;
        jesseduffield
      &lt;/a&gt; / &lt;a href="https://github.com/jesseduffield/lazygit" rel="noopener noreferrer"&gt;
        lazygit
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      simple terminal UI for git commands
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div&gt;
&lt;sup&gt;Special thanks to:&lt;/sup&gt;
&lt;br&gt;
&lt;br&gt;
&lt;a href="https://www.warp.dev/?utm_source=github&amp;amp;utm_medium=referral&amp;amp;utm_campaign=lazygit_20231023" rel="nofollow noopener noreferrer"&gt;
  &lt;div&gt;
    &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fjesseduffield%2Flazygit..%2Fassets%2Fwarp.png" width="230" alt="Warp"&gt;
  &lt;/div&gt;
  &lt;b&gt;Warp is a modern, Rust-based terminal with AI built in so you and your team can build great software, faster.&lt;/b&gt;
  &lt;div&gt;
    &lt;sup&gt;Visit warp.dev to learn more.&lt;/sup&gt;
  &lt;/div&gt;
&lt;/a&gt;
&lt;br&gt;

&lt;a href="https://www.subble.com" rel="nofollow noopener noreferrer"&gt;
  &lt;div&gt;
    &lt;img src="https://camo.githubusercontent.com/b0a3473870b98260ee8695517a3ce09ba426d97819c066dc30854f35b7d02673/68747470733a2f2f737562626c652d6d61726b6574696e672d706f7274616c2d6d656469612d73746f726167652e73332e616d617a6f6e6177732e636f6d2f696d616765732f737562626c652d626c61636b2d6e616d652d6c6f676f2e737667" width="230" alt="Subble"&gt;
  &lt;/div&gt;
  &lt;b&gt;I (Jesse) co-founded Subble to save your company time and money by helping you manage its software subscriptions. Check it out!&lt;/b&gt;
&lt;/a&gt;
&lt;br&gt;

&lt;/div&gt;
&lt;p&gt;
  &lt;a rel="noopener noreferrer nofollow" href="https://user-images.githubusercontent.com/8456633/174470852-339b5011-5800-4bb9-a628-ff230aa8cd4e.png"&gt;&lt;img width="536" src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fuser-images.githubusercontent.com%2F8456633%2F174470852-339b5011-5800-4bb9-a628-ff230aa8cd4e.png"&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;div&gt;
&lt;p&gt;A simple terminal UI for git commands
&lt;br&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/jesseduffield/lazygit/releases" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/92acce7b517d0c9ee6c8ba24c38931974fe1796bc8b69ceca8d6bc958f235569/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f646f776e6c6f6164732f6a657373656475666669656c642f6c617a796769742f746f74616c" alt="GitHub Releases"&gt;&lt;/a&gt; &lt;a href="https://goreportcard.com/report/github.com/jesseduffield/lazygit" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/669f10870a07666c3c61773cea530b78e63794d9de00574e23f58f10f121ef94/68747470733a2f2f676f7265706f7274636172642e636f6d2f62616467652f6769746875622e636f6d2f6a657373656475666669656c642f6c617a79676974" alt="Go Report Card"&gt;&lt;/a&gt; &lt;a href="https://app.codacy.com/gh/jesseduffield/lazygit/dashboard?utm_source=gh&amp;amp;utm_medium=referral&amp;amp;utm_content=&amp;amp;utm_campaign=Badge_grade" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/a37638ac3f52d90792937ee02bd17068184dacd66d338dc5c4f5592bffcda5c5/68747470733a2f2f6170702e636f646163792e636f6d2f70726f6a6563742f62616467652f47726164652f6634363431366237313564373436323238393536353739333566636164613231" alt="Codacy Badge"&gt;&lt;/a&gt; &lt;a href="https://app.codacy.com/gh/jesseduffield/lazygit/dashboard?utm_source=gh&amp;amp;utm_medium=referral&amp;amp;utm_content=&amp;amp;utm_campaign=Badge_coverage" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/799c517109eab18f6e3b295a3b8a6d772953d84bbaee96726b9b7b0778932f2f/68747470733a2f2f6170702e636f646163792e636f6d2f70726f6a6563742f62616467652f436f7665726167652f6634363431366237313564373436323238393536353739333566636164613231" alt="Codacy Badge"&gt;&lt;/a&gt; &lt;a href="https://golangci.com" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/c27af09dbec90af39d318b5ace0bd3f574858d9b695e87e06ccb91ebe9d4bed1/68747470733a2f2f676f6c616e6763692e636f6d2f6261646765732f6769746875622e636f6d2f6a657373656475666669656c642f6c617a796769742e737667" alt="GolangCI"&gt;&lt;/a&gt; &lt;a href="https://github.com/jesseduffield/lazygit/releases/latest" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/e45410f7ac29e57e7120b9ff41250353429e427f723997a335cad8b463d76889/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f7461672f6a657373656475666669656c642f6c617a796769742e737667" alt="GitHub tag"&gt;&lt;/a&gt; &lt;a href="https://github.com/Homebrew/homebrew-core/blob/master/Formula/lazygit.rb" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/15ea68da847ace7465483a71257059fc5a63576f75b42a1cb50f53d3dd3acd61/68747470733a2f2f696d672e736869656c64732e696f2f686f6d65627265772f762f6c617a79676974" alt="homebrew"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/jesseduffield/lazygit../assets/demo/commit_and_push-compressed.gif"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fjesseduffield%2Flazygit..%2Fassets%2Fdemo%2Fcommit_and_push-compressed.gif" alt="commit_and_push"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Sponsors&lt;/h2&gt;
&lt;/div&gt;

&lt;p&gt;
 Maintenance of this project is made possible by all the &lt;a href="https://github.com/jesseduffield/lazygit/graphs/contributors" rel="noopener noreferrer"&gt;contributors&lt;/a&gt; and &lt;a href="https://github.com/sponsors/jesseduffield" rel="noopener noreferrer"&gt;sponsors&lt;/a&gt;. If you'd like to sponsor this project and have your avatar or company logo appear below &lt;a href="https://github.com/sponsors/jesseduffield" rel="noopener noreferrer"&gt;click here&lt;/a&gt;. 💙
&lt;/p&gt;

&lt;p&gt;
&lt;a href="https://github.com/intabulas" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fintabulas.png" width="60px" alt="Mark Lussier"&gt;&lt;/a&gt;&lt;a href="https://github.com/peppy" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fpeppy.png" width="60px" alt="Dean Herbert"&gt;&lt;/a&gt;&lt;a href="https://github.com/piot" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fpiot.png" width="60px" alt="Peter Bjorklund"&gt;&lt;/a&gt;&lt;a href="https://github.com/rgwood" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Frgwood.png" width="60px" alt="Reilly Wood"&gt;&lt;/a&gt;&lt;a href="https://github.com/oliverguenther" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Foliverguenther.png" width="60px" alt="Oliver Günther"&gt;&lt;/a&gt;&lt;a href="https://github.com/pawanjay176" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fpawanjay176.png" width="60px" alt="Pawan Dhananjay"&gt;&lt;/a&gt;&lt;a href="https://github.com/bdach" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fbdach.png" width="60px" alt="Bartłomiej Dach"&gt;&lt;/a&gt;&lt;a href="https://github.com/carstengehling" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fcarstengehling.png" width="60px" alt="Carsten Gehling"&gt;&lt;/a&gt;&lt;a href="https://github.com/ceuk" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fceuk.png" width="60px" alt="CEUK"&gt;&lt;/a&gt;&lt;a href="https://github.com/akospwc" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fakospwc.png" width="60px" alt="Akos Putz"&gt;&lt;/a&gt;&lt;a href="https://github.com/Xetera" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2FXetera.png" width="60px" alt=""&gt;&lt;/a&gt;&lt;a href="https://github.com/HoldenLucas" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2FHoldenLucas.png" width="60px" alt="Holden Lucas"&gt;&lt;/a&gt;&lt;a href="https://github.com/nartc" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fnartc.png" width="60px" alt="Chau Tran"&gt;&lt;/a&gt;&lt;a href="https://github.com/matejcik" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fmatejcik.png" width="60px" alt="matejcik"&gt;&lt;/a&gt;&lt;a href="https://github.com/lucatume" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Flucatume.png" width="60px" alt="theAverageDev (Luca Tumedei)"&gt;&lt;/a&gt;&lt;a href="https://github.com/IvanZuy" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2FIvanZuy.png" width="60px" alt="Ivan Zaitsev"&gt;&lt;/a&gt;&lt;a href="https://github.com/nicholascloud" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fnicholascloud.png" width="60px" alt="Nicholas Cloud"&gt;&lt;/a&gt;&lt;a href="https://github.com/PhotonQuantum" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2FPhotonQuantum.png" width="60px" alt="LightQuantum"&gt;&lt;/a&gt;&lt;a href="https://github.com/GitSquared" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2FGitSquared.png" width="60px" alt="Gabriel Saillard"&gt;&lt;/a&gt;&lt;a href="https://github.com/ava1ar" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fava1ar.png" width="60px" alt="Aliaksandr Stelmachonak"&gt;&lt;/a&gt;&lt;a href="https://github.com/minidfx" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fminidfx.png" width="60px" alt="Burgy Benjamin"&gt;&lt;/a&gt;&lt;a href="https://github.com/JoeKlemmer" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2FJoeKlemmer.png" width="60px" alt="Joe Klemmer"&gt;&lt;/a&gt;&lt;a href="https://github.com/tobi" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Ftobi.png" width="60px" alt="Tobias Lütke"&gt;&lt;/a&gt;&lt;a href="https://github.com/benbfortis" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fbenbfortis.png" width="60px" alt="Ben Beaumont"&gt;&lt;/a&gt;&lt;a href="https://github.com/jakewarren" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fjakewarren.png" width="60px" alt=""&gt;&lt;/a&gt;&lt;a href="https://github.com/tgpholly" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Ftgpholly.png" width="60px" alt="Holly"&gt;&lt;/a&gt;&lt;a href="https://github.com/bitprophet" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fbitprophet.png" width="60px" alt="Jeff Forcier"&gt;&lt;/a&gt;&lt;a href="https://github.com/tayleighr" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Ftayleighr.png" width="60px" alt=""&gt;&lt;/a&gt;&lt;a href="https://github.com/Novakov" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2FNovakov.png" width="60px" alt="Maciej T. Nowak"&gt;&lt;/a&gt;&lt;a href="https://github.com/farzadmf" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Ffarzadmf.png" width="60px" alt="Farzad Majidfayyaz"&gt;&lt;/a&gt;&lt;a href="https://github.com/nekhaevskiy" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fnekhaevskiy.png" width="60px" alt="Yury"&gt;&lt;/a&gt;&lt;a href="https://github.com/reivilibre" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Freivilibre.png" width="60px" alt=""&gt;&lt;/a&gt;&lt;a href="https://github.com/andreaskurth" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fandreaskurth.png" width="60px" alt="Andreas Kurth"&gt;&lt;/a&gt;&lt;a href="https://github.com/BSteffaniak" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2FBSteffaniak.png" width="60px" alt="Braden Steffaniak"&gt;&lt;/a&gt;&lt;a href="https://github.com/jordan-gillard" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fjordan-gillard.png" width="60px" alt="Jordan Gillard"&gt;&lt;/a&gt;&lt;a href="https://github.com/smangels" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fsmangels.png" width="60px" alt="Sebastian"&gt;&lt;/a&gt;&lt;a href="https://github.com/George-Spanos" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2FGeorge-Spanos.png" width="60px" alt="George Spanos"&gt;&lt;/a&gt;&lt;a href="https://github.com/amslezak" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Famslezak.png" width="60px" alt="Andy Slezak"&gt;&lt;/a&gt;&lt;a href="https://github.com/mkock" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fmkock.png" width="60px" alt="Martin Kock"&gt;&lt;/a&gt;&lt;a href="https://github.com/illarionvk" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fillarionvk.png" width="60px" alt="Illarion Koperski"&gt;&lt;/a&gt;&lt;a href="https://github.com/jessealama" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fjessealama.png" width="60px" alt="Jesse Alama"&gt;&lt;/a&gt;&lt;a href="https://github.com/codacy" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fcodacy.png" width="60px" alt="Codacy"&gt;&lt;/a&gt;&lt;a href="https://github.com/colbr" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fcolbr.png" width="60px" alt="Brett"&gt;&lt;/a&gt;&lt;a href="https://github.com/heijmans" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fheijmans.png" width="60px" alt="Jan Heijmans"&gt;&lt;/a&gt;&lt;a href="https://github.com/Vesther" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2FVesther.png" width="60px" alt="Kevin Nowald"&gt;&lt;/a&gt;&lt;a href="https://github.com/sempruijs" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fsempruijs.png" width="60px" alt="sem pruijs"&gt;&lt;/a&gt;&lt;a href="https://github.com/omarluq" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fomarluq.png" width="60px" alt="Omar Luq "&gt;&lt;/a&gt;&lt;a href="https://github.com/arcanemachine" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Farcanemachine.png" width="60px" alt="Nicholas Moen"&gt;&lt;/a&gt;&lt;a href="https://github.com/ethanjli" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fethanjli.png" width="60px" alt="Ethan Li"&gt;&lt;/a&gt;&lt;a href="https://github.com/phubaba" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fphubaba.png" width="60px" alt=""&gt;&lt;/a&gt;&lt;a href="https://github.com/fomrat" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Ffomrat.png" width="60px" alt="Brian MacAskill"&gt;&lt;/a&gt;&lt;a href="https://github.com/canhazcodez" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fcanhazcodez.png" width="60px" alt="Maxi"&gt;&lt;/a&gt;&lt;a href="https://github.com/nikbrunner" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fnikbrunner.png" width="60px" alt="nbr"&gt;&lt;/a&gt;&lt;a href="https://github.com/mikybars" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fmikybars.png" width="60px" alt="Miguel Ibars"&gt;&lt;/a&gt;&lt;a href="https://github.com/neunkasulle" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fneunkasulle.png" width="60px" alt="Jan Zenkner"&gt;&lt;/a&gt;&lt;a href="https://github.com/ahkohd" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fahkohd.png" width="60px" alt="Victor Aremu"&gt;&lt;/a&gt;&lt;a href="https://github.com/RVxLab" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2FRVxLab.png" width="60px" alt=""&gt;&lt;/a&gt;&lt;a href="https://github.com/igor-ramazanov" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Figor-ramazanov.png" width="60px" alt="Igor Ramazanov"&gt;&lt;/a&gt;&lt;a href="https://github.com/glotchimo" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fglotchimo.png" width="60px" alt="Elliott Maguire"&gt;&lt;/a&gt;&lt;a href="https://github.com/n8nio" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fn8nio.png" width="60px" alt="n8n - Workflow Automation"&gt;&lt;/a&gt;&lt;a href="https://github.com/joshuadavidthomas" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fjoshuadavidthomas.png" width="60px" alt="Josh Thomas"&gt;&lt;/a&gt;&lt;a href="https://github.com/josephjacks" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fjosephjacks.png" width="60px" alt="JJ"&gt;&lt;/a&gt;&lt;a href="https://github.com/FrederickGeek8" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2FFrederickGeek8.png" width="60px" alt="Frederick Morlock"&gt;&lt;/a&gt;&lt;a href="https://github.com/agrippanux" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fagrippanux.png" width="60px" alt="Darren Craine"&gt;&lt;/a&gt;&lt;a href="https://github.com/ezdac" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fezdac.png" width="60px" alt="Maximilian Langenfeld"&gt;&lt;/a&gt;&lt;a href="https://github.com/sarzhann" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fsarzhann.png" width="60px" alt="Nurzhan"&gt;&lt;/a&gt;&lt;a href="https://github.com/dbuls" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fdbuls.png" width="60px" alt="Davis Buls"&gt;&lt;/a&gt;&lt;a href="https://github.com/lppassos" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Flppassos.png" width="60px" alt=""&gt;&lt;/a&gt;&lt;a href="https://github.com/chrisolsen" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fchrisolsen.png" width="60px" alt="Chris Olsen"&gt;&lt;/a&gt;&lt;a href="https://github.com/neilcode" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fneilcode.png" width="60px" alt="Neil Lambert"&gt;&lt;/a&gt;&lt;a href="https://github.com/dhh" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fdhh.png" width="60px" alt="David Heinemeier Hansson"&gt;&lt;/a&gt;&lt;a href="https://github.com/mmv08" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fmmv08.png" width="60px" alt="Mikhail"&gt;&lt;/a&gt;&lt;a href="https://github.com/macmiranda" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fmacmiranda.png" width="60px" alt="Marco Aurelio Caldas Miranda"&gt;&lt;/a&gt;&lt;a href="https://github.com/osarogie" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fosarogie.png" width="60px" alt="Emmanuel Nosakhare"&gt;&lt;/a&gt;&lt;a href="https://github.com/ethanfischer" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fethanfischer.png" width="60px" alt="Ethan Fischer"&gt;&lt;/a&gt;&lt;a href="https://github.com/poshboytl" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fposhboytl.png" width="60px" alt="Terry Tai"&gt;&lt;/a&gt;&lt;a href="https://github.com/a-jentleman" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fa-jentleman.png" width="60px" alt=""&gt;&lt;/a&gt;&lt;a href="https://github.com/roesnera" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Froesnera.png" width="60px" alt="Adam Roesner"&gt;&lt;/a&gt;&lt;a href="https://github.com/herdingdata" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fherdingdata.png" width="60px" alt="Andy Herd"&gt;&lt;/a&gt;&lt;a href="https://github.com/wassimk" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fwassimk.png" width="60px" alt="Wassim Metallaoui"&gt;&lt;/a&gt;&lt;a href="https://github.com/tornikegomareli" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Ftornikegomareli.png" width="60px" alt="Tornike Gomareli"&gt;&lt;/a&gt;&lt;a href="https://github.com/seven1m" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fseven1m.png" width="60px" alt="Tim Morgan"&gt;&lt;/a&gt;&lt;a href="https://github.com/sgoridotla1" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fsgoridotla1.png" width="60px" alt="Max Shypulniak"&gt;&lt;/a&gt;&lt;a href="https://github.com/meshanator" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fmeshanator.png" width="60px" alt="Meshan Naidoo"&gt;&lt;/a&gt;&lt;a href="https://github.com/kyu08" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fkyu08.png" width="60px" alt="kyu08"&gt;&lt;/a&gt;&lt;a href="https://github.com/piacsek" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fpiacsek.png" width="60px" alt="Felipe Piacsek"&gt;&lt;/a&gt;&lt;a href="https://github.com/dimaunx" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fdimaunx.png" width="60px" alt="dimaunx"&gt;&lt;/a&gt;&lt;a href="https://github.com/ADIX7" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2FADIX7.png" width="60px" alt="Kovács Ádám"&gt;&lt;/a&gt;&lt;a href="https://github.com/MatthewYe" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2FMatthewYe.png" width="60px" alt="叶博"&gt;&lt;/a&gt;&lt;a href="https://github.com/DusanLesan" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2FDusanLesan.png" width="60px" alt="Dusan Lesan"&gt;&lt;/a&gt;&lt;a href="https://github.com/iantanwx" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fiantanwx.png" width="60px" alt="Ian Tan"&gt;&lt;/a&gt;&lt;a href="https://github.com/maulik13" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fmaulik13.png" width="60px" alt="Maulik Kataria"&gt;&lt;/a&gt;&lt;a href="https://github.com/ChanhLy" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2FChanhLy.png" width="60px" alt="ChanhLy"&gt;&lt;/a&gt;&lt;a href="https://github.com/enzosterro" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fenzosterro.png" width="60px" alt="Enzo Sterro"&gt;&lt;/a&gt;&lt;a href="https://github.com/tfeldmann" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Ftfeldmann.png" width="60px" alt="Thomas Feldmann"&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Elevator Pitch&lt;/h2&gt;
&lt;/div&gt;

&lt;p&gt;Rant time: You've heard it before, git is &lt;em&gt;powerful&lt;/em&gt;, but what good is that power when everything is so damn hard to do? Interactive rebasing requires you to edit a goddamn TODO file in your editor? &lt;em&gt;Are you kidding me?&lt;/em&gt; To stage part of a file you need to use a command line program to step…&lt;/p&gt;
&lt;/div&gt;


&lt;/div&gt;
&lt;br&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/jesseduffield/lazygit" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;
&lt;br&gt;


&lt;h2&gt;
  
  
  Installation
&lt;/h2&gt;

&lt;p&gt;You can install it on MacOS using &lt;code&gt;brew&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;brew install jesseduffield/lazygit/lazygit
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;(Linux and Widows are also supported, just read the &lt;a href="https://github.com/jesseduffield/lazygit#installation" rel="noopener noreferrer"&gt;manual&lt;/a&gt;)&lt;/p&gt;

&lt;h2&gt;
  
  
  Configuration
&lt;/h2&gt;

&lt;p&gt;LazyGit, as every good terminal app, is &lt;a href="https://github.com/jesseduffield/lazygit/blob/master/docs/Config.md" rel="noopener noreferrer"&gt;configurable&lt;/a&gt;. Documentation is not the best, but good enough. For example, you can use it with white theme&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F3qmzc7gy4jqy3q86okvg.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%2Fi%2F3qmzc7gy4jqy3q86okvg.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  About series
&lt;/h4&gt;

&lt;p&gt;Cool GitHub projects is a blog posts series where I will share useful/fancy projects I found on GitHub&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>git</category>
    </item>
    <item>
      <title>10 Intellij Idea's plugins I'm using</title>
      <dc:creator>Mateusz Jarzyna</dc:creator>
      <pubDate>Tue, 09 Jun 2020 16:03:35 +0000</pubDate>
      <link>https://dev.to/mateuszjarzyna/intellij-idea-s-plugins-i-m-using-2d0d</link>
      <guid>https://dev.to/mateuszjarzyna/intellij-idea-s-plugins-i-m-using-2d0d</guid>
      <description>&lt;p&gt;&lt;sup&gt;Cover image: &lt;a href="https://pl.m.wikipedia.org/wiki/Plik:IntelliJIDEA_2016.3_Community.png" rel="noopener noreferrer"&gt;https://pl.m.wikipedia.org/wiki/Plik:IntelliJIDEA_2016.3_Community.png&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;

&lt;p&gt;Intellij Idea has &lt;a href="https://plugins.jetbrains.com/search?orderBy=downloads&amp;amp;products=idea" rel="noopener noreferrer"&gt;a lot of plugins&lt;/a&gt;, both paid and free (I'm using only free). Here is a list of my favorite, that I'm using daily.&lt;/p&gt;

&lt;p&gt;&lt;sup&gt;All images are from the official plugin's web page&lt;/sup&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  SonarLint
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F1v98i4d3inpg8r4zn9cs.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%2Fi%2F1v98i4d3inpg8r4zn9cs.png" alt="SonarLint"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://plugins.jetbrains.com/plugin/7973-sonarlint" rel="noopener noreferrer"&gt;SonarLint&lt;/a&gt; is a &lt;a href="https://en.wikipedia.org/wiki/Static_program_analysis" rel="noopener noreferrer"&gt;static code analyzer&lt;/a&gt;. Idea has build-in code analyzer, but SonarLint is able to find more issues in your Java code, so they work perfectly together. SonarLint can be connected to SonarQube server, but even in standalone is an interesting plugin.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://plugins.jetbrains.com/plugin/7973-sonarlint" rel="noopener noreferrer"&gt;SonarLint plugin page&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Rainbow Brackets
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Feu26vouys0g07qnpe90i.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%2Fi%2Feu26vouys0g07qnpe90i.png" alt="Rainbow Brackets"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://plugins.jetbrains.com/plugin/10080-rainbow-brackets" rel="noopener noreferrer"&gt;Rainbow Brackets&lt;/a&gt; is just an eye candy tool that makes brackets colorful. There is also &lt;a href="https://plugins.jetbrains.com/plugin/13308-indent-rainbow" rel="noopener noreferrer"&gt;Indent Rainbow&lt;/a&gt; but I'm not using it.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://plugins.jetbrains.com/plugin/10080-rainbow-brackets" rel="noopener noreferrer"&gt;Rainbow Brackets plugin page&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Code review tool
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fbqp8x01vpfg2wetqhv7n.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%2Fi%2Fbqp8x01vpfg2wetqhv7n.png" alt="Merge Request Integration CE - Code Review for GitLab"&gt;&lt;/a&gt;&lt;br&gt;
That's what I'm most happy about. Making code review in web browser is a pain, you can't see the full code, you can't go to method implementation in simply way, etc. Moving this process to the IDE was fantastic decision.&lt;/p&gt;

&lt;p&gt;In my company we're using the GitLab, so I'm using &lt;a href="https://plugins.jetbrains.com/plugin/13607-merge-request-integration-ce--code-review-for-gitlab" rel="noopener noreferrer"&gt;Merge Request Integration CE - Code Review for GitLab&lt;/a&gt;. But if you are using GitHub or BitBucket or other tool for code review - I'm sure that there is a good plugin for you, just search and test.&lt;/p&gt;
&lt;h2&gt;
  
  
  Extra Icons
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fq58vfr4ajzofurhly5w6.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%2Fi%2Fq58vfr4ajzofurhly5w6.png" alt="Extra Icons"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://plugins.jetbrains.com/plugin/11058-extra-icons" rel="noopener noreferrer"&gt;Extra Icons&lt;/a&gt; adds icons for popular tools that are not available in Idea by default.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://plugins.jetbrains.com/plugin/11058-extra-icons" rel="noopener noreferrer"&gt;Extra Icons plugin page&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  CSV Plugin
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fpgxef6qsjcfvvs09a4ki.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%2Fi%2Fpgxef6qsjcfvvs09a4ki.png" alt="CSV Plugin"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://plugins.jetbrains.com/plugin/10037-csv-plugin" rel="noopener noreferrer"&gt;CSV Plugin&lt;/a&gt; allows to open the &lt;code&gt;.csv&lt;/code&gt; files in tabular, excel-like view. Useful from time to time.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://plugins.jetbrains.com/plugin/10037-csv-plugin" rel="noopener noreferrer"&gt;CSV Plugin plugin page&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  CodeGlance
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F3wmwi476dqu96q5lrns1.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%2Fi%2F3wmwi476dqu96q5lrns1.png" alt="CodeGlance"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://plugins.jetbrains.com/plugin/7275-codeglance" rel="noopener noreferrer"&gt;CodeGlance&lt;/a&gt; adds a code mini map into the editor pane. Not very useful, just show yours code structure.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://plugins.jetbrains.com/plugin/7275-codeglance" rel="noopener noreferrer"&gt;CodeGlance plugin page&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  CamelCase
&lt;/h2&gt;

&lt;p&gt;[no picture]&lt;br&gt;
&lt;a href="https://plugins.jetbrains.com/plugin/7160-camelcase" rel="noopener noreferrer"&gt;CodeGlance&lt;/a&gt; allows switching easily between &lt;code&gt;kebab-case&lt;/code&gt;, &lt;code&gt;SNAKE_CASE&lt;/code&gt;, &lt;code&gt;PascalCase&lt;/code&gt;, &lt;code&gt;camelCase&lt;/code&gt;, &lt;code&gt;snake_case&lt;/code&gt; or &lt;code&gt;space case&lt;/code&gt;. I'm using it when renaming the variable after changing the scope.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://plugins.jetbrains.com/plugin/7160-camelcase" rel="noopener noreferrer"&gt;CodeGlance plugin page&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  AsciiDoc
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fbdo1oikgv2v5v7wz5ijx.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%2Fi%2Fbdo1oikgv2v5v7wz5ijx.png" alt="AsciiDoc"&gt;&lt;/a&gt;&lt;br&gt;
In my company we are using &lt;a href="https://spring.io/projects/spring-restdocs" rel="noopener noreferrer"&gt;Spring REST Docs&lt;/a&gt; to create technical documentation.  &lt;a href="https://plugins.jetbrains.com/plugin/7160-camelcase" rel="noopener noreferrer"&gt;AsciiDoc plugin&lt;/a&gt; just shows rendered preview of &lt;code&gt;.adoc&lt;/code&gt; files.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://plugins.jetbrains.com/plugin/7160-camelcase" rel="noopener noreferrer"&gt;AsciiDoc plugin page&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Request mapper
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fm0gyrowibc5ovy7g5f6l.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%2Fi%2Fm0gyrowibc5ovy7g5f6l.png" alt="Request mapper"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://plugins.jetbrains.com/plugin/9567-request-mapper" rel="noopener noreferrer"&gt;Request mapper&lt;/a&gt; is a tool that allows you to find a URL mapping declaration in your Spring/JAX-RS/Micronaut project. You can add &lt;code&gt;@RequestMapping&lt;/code&gt; annotation on both, class and method and the plugin still works fine and quick.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://plugins.jetbrains.com/plugin/9567-request-mapper" rel="noopener noreferrer"&gt;Request mapper plugin page&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  IDE Features Trainer
&lt;/h2&gt;

&lt;p&gt;I've used this plugin in the past. As the home page says:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Learn basic shortcuts and essential features interactively — right inside the IDE.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;You can learn the IDE in an easy, interactive way.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://plugins.jetbrains.com/plugin/8554-ide-features-trainer" rel="noopener noreferrer"&gt;IDE Features Trainer plugin page&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Bonus 1 - the font
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Funsmdlckv7as7u4qlwyj.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%2Fi%2Funsmdlckv7as7u4qlwyj.png" alt="Monaco font"&gt;&lt;/a&gt;&lt;br&gt;
I'm using the &lt;a href="https://www.cufonfonts.com/font/monaco" rel="noopener noreferrer"&gt;Monaco font&lt;/a&gt;. In my opinion it's really readable and clean. I love that font.&lt;/p&gt;
&lt;h2&gt;
  
  
  Bonus 2 - Live templates
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F9ebapzg1ubv8g220u697.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%2Fi%2F9ebapzg1ubv8g220u697.png" alt="test's live template"&gt;&lt;/a&gt;&lt;br&gt;
I'm using only one live template in my daily job - to create new JUnit test.&lt;br&gt;
To create that one, open &lt;code&gt;Preferences&lt;/code&gt; ⇾ &lt;code&gt;Editor&lt;/code&gt; ⇾ &lt;code&gt;Live Templates&lt;/code&gt;, then add new template and paste:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;@org.junit.jupiter.api.Test
public void $END$() throws Exception {

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

&lt;/div&gt;



&lt;h2&gt;
  
  
  Bonus 3 - skip Spring's classes when debugging
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F383z3ku30788gs5gjgkg.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%2Fi%2F383z3ku30788gs5gjgkg.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;br&gt;
I was really annoyed when I was debugging my application and saw infinite numbers of Spring's classes. So I've opened &lt;code&gt;Preferences&lt;/code&gt; ⇾ &lt;code&gt;Build, Execution, Deployment&lt;/code&gt; ⇾ &lt;code&gt;Debugger&lt;/code&gt; ⇾ &lt;code&gt;Stepping&lt;/code&gt; and added &lt;code&gt;org.springframework.*&lt;/code&gt; into the &lt;code&gt;Do not step into the clasess&lt;/code&gt; list. Really helpful trick ;)&lt;/p&gt;

&lt;p&gt;Share in comments yours favorite plugins and tricks.&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>java</category>
      <category>intellij</category>
      <category>tools</category>
    </item>
    <item>
      <title>MAKERbuino - solder your own game console and start making games</title>
      <dc:creator>Mateusz Jarzyna</dc:creator>
      <pubDate>Mon, 30 Mar 2020 17:57:07 +0000</pubDate>
      <link>https://dev.to/mateuszjarzyna/makerbuino-solder-your-own-game-console-and-start-making-games-5f0p</link>
      <guid>https://dev.to/mateuszjarzyna/makerbuino-solder-your-own-game-console-and-start-making-games-5f0p</guid>
      <description>&lt;p&gt;I've been the software developer for several years now. But in this profession there was sill an area in which I have exactly 0 experience - gamedev. I know I can watch tutorials about the Unity and build 3d games in two weeks. But to tell you the truth - it's not what I like. I like to know how &lt;em&gt;it&lt;/em&gt; exactly works, not only how to use the framework.&lt;br&gt;
Modern games engines are really, really too complicated to understand them. Even games from '90 are too complicated for me - especially when I have no experience in game development, and also too little in C language.&lt;br&gt;
So I decided to start with the basic. How the games works on yours old, two-color phone? Simple gameplay, low graphic, poor hardware - I think it's the good point to start the journey.&lt;/p&gt;
&lt;h1&gt;
  
  
  Soldering the MAKERbuino
&lt;/h1&gt;

&lt;p&gt;There is a toy on the market called &lt;a href="https://www.circuitmess.com/makerbuino/"&gt;MAKERbuino&lt;/a&gt;. Actuallt it's &lt;a href="https://gamebuino.com/gamebuino-classic"&gt;Gamebiono Classic&lt;/a&gt; that you can solder by yourself.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--nYvD8MHt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/cu9tdtbqcv404fmrxp1p.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--nYvD8MHt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/cu9tdtbqcv404fmrxp1p.jpeg" alt="marekbuino"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The box contains few resistors, some buttons, one old screen and so on.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--RYqKkTRW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/dfqn1fw90l7lmou92a1m.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--RYqKkTRW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/dfqn1fw90l7lmou92a1m.jpeg" alt="makerbuino's box"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I'm not sure why my console was delivered with connected battery, but well, doesn't matter, it works anyway.&lt;br&gt;
To be honest - I'm really hopeless in soldering. But hey, practice makes perfect!&lt;br&gt;
So I prepared all the necessary tool...&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--usy9AHtI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/mr2bgrfy74jq08fvf8ub.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--usy9AHtI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/mr2bgrfy74jq08fvf8ub.jpeg" alt="soldering tools"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;... and I started soldering&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--oFswb7K6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/vafx17ky67wl0xnul07z.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--oFswb7K6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/vafx17ky67wl0xnul07z.jpeg" alt="soldering makerbuino"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I'm such a noob I didn't realize I was soldering with the battery connected!&lt;br&gt;
The &lt;a href="https://www.circuitmess.com/makerbuino-build-guide/"&gt;official guide&lt;/a&gt; is really user-friendly. It says that it should take 5 hours, I've done it in 4.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--mB82gyEp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/u94u3lj2ggzotto8i3e7.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--mB82gyEp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/u94u3lj2ggzotto8i3e7.jpeg" alt="my soldering"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Not perfect, not terrible. The most important thing is that it works.&lt;br&gt;
Four hours and one liter of water later finally I've soldered the console. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--cmzNX1YP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/urertz3oqfwgcli1lfso.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--cmzNX1YP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/urertz3oqfwgcli1lfso.jpeg" alt="makerbuino"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--G6Rp25tV--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/e82tbgfyaf3ty039pho9.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--G6Rp25tV--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/e82tbgfyaf3ty039pho9.jpeg" alt="makerbuino"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Sound works, screen brightness works, old Nokia's screen works (and can display exactly one color, it's weird nowadays) works. The MAKERbuino comes with SD card (128 MB :), inside there were few build-in games.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--NSknFOAM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/5o4lg6dsugo6qb2cv92g.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--NSknFOAM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/5o4lg6dsugo6qb2cv92g.gif" alt="working makerbuino"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;WOW, everything works, I'm so proud of myself.&lt;br&gt;
There is only one big shortcoming - the "click" sound, it is sooo loud...&lt;/p&gt;
&lt;h1&gt;
  
  
  I'm game developer!
&lt;/h1&gt;

&lt;p&gt;ATmega328p-pu - 2kB of RAM and an 8-bit CPU at 16MHz. I've programmed few times on so poor computer (for example I made a 3d printed fish feeder with Adruino), but sill - nowadays it's a little challenge, I can't use a dozen of frameworks. Also, I have to use skills sightly forgotten by modern programmers - optimization.&lt;br&gt;
MAKERbuino is built on Arduino, so I had to configure my Arduino IDE. Fortunately &lt;a href="https://www.circuitmess.com/coding-getting-started/"&gt;official guide&lt;/a&gt; explains very well how to do it. Arduino IDE is not as good as Intellij Idea for example, it's very poor to be honest. But to create 100 lines of code it's good enough.&lt;/p&gt;

&lt;p&gt;So, how to create a game? I don't know. There is no tutorial, no API. But MAKERbuino is after all Gamebuino Classic. So I used the Gamebuino tutorials. Official &lt;a href="https://gamebuino.com/academy"&gt;Gabebuino Academy&lt;/a&gt; is nice place to start. But it uses the new Gamebuino - with colorful screen and little different API - so I had to forgot about coping-and-pasting. I read those tutorials to understand the process and start thinking like a game developer. I've also had to use &lt;a href="http://legacy.gamebuino.com/wiki/index.php?title=Reference"&gt;old reference&lt;/a&gt; to write the code.&lt;/p&gt;
&lt;h2&gt;
  
  
  Bouncing ball
&lt;/h2&gt;

&lt;p&gt;Uploading the game to the console is not the fastest process in the world. And that loud sound of clicking. Fortunately there is a &lt;a href="http://simbuino4web.ppl-pilot.com/"&gt;online emulator&lt;/a&gt;.&lt;br&gt;
One hour after reading the Academy I've made bouncing ball&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--iV8OJOpE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/ckgzksnfnloruz78ynky.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--iV8OJOpE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/ckgzksnfnloruz78ynky.gif" alt="bouncing ball"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I have no idea what is that weird sign in right-top corner, doesn't matter. The ball is bouncing!&lt;/p&gt;

&lt;p&gt;Full source code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight c"&gt;&lt;code&gt;&lt;span class="cp"&gt;#include &amp;lt;Gamebuino.h&amp;gt;
&lt;/span&gt;
&lt;span class="n"&gt;Gamebuino&lt;/span&gt; &lt;span class="n"&gt;gb&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;ballX&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;LCDWIDTH&lt;/span&gt;  &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;ballSpeedX&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;ballY&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;LCDHEIGHT&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;ballSpeedY&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;setup&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;gb&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;begin&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

  &lt;span class="n"&gt;gb&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;titleScreen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"bouncing ball"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;    

&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;loop&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;while&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;gb&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;update&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
  &lt;span class="n"&gt;gb&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;display&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;clear&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ballX&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;ballSpeedX&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ballX&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;LCDWIDTH&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;ballSpeedX&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ballY&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;ballSpeedY&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ballY&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;LCDHEIGHT&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;ballSpeedY&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="n"&gt;ballX&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;ballSpeedX&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="n"&gt;ballY&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;ballSpeedY&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="n"&gt;gb&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;display&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;fillRect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ballX&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ballY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Maybe I can optimize and refactor the code, but hey, it's my first "game" ever.&lt;/p&gt;

&lt;h2&gt;
  
  
  PONG
&lt;/h2&gt;

&lt;p&gt;One or two hours later I've made probably the simplest game ever - the PONG. With "Artificial Intelligence"! The CPU player is very simple of course&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;If ball is higher than paddle
   move up
If ball is lower than paddle
   move down
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ksDd8PKN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/80mirpqazimqwsmmf8j7.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ksDd8PKN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/80mirpqazimqwsmmf8j7.gif" alt="finall pong"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The ball was much bigger on the emulator.&lt;/p&gt;

&lt;p&gt;Full source code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight c"&gt;&lt;code&gt;&lt;span class="cp"&gt;#include &amp;lt;Gamebuino.h&amp;gt;
&lt;/span&gt;
&lt;span class="n"&gt;Gamebuino&lt;/span&gt; &lt;span class="n"&gt;gb&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;ballX&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;ballSpeedX&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;ballY&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;ballSpeedY&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;ballSize&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;paddleWidth&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;paddleHeight&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;playerPaddleY&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;playerPaddlePadding&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;cpuPaddleY&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;cpuPaddlePadding&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;LCDWIDTH&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;paddleWidth&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;playerScore&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;cpuScore&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;resetBall&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;ballX&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;LCDWIDTH&lt;/span&gt;  &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="n"&gt;ballY&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;LCDHEIGHT&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;random&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;ballSpeedX&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;ballSpeedX&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;random&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;ballSpeedY&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; 
  &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;ballSpeedY&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;setup&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;gb&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;begin&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

  &lt;span class="n"&gt;gb&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;titleScreen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"super gra"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="n"&gt;resetBall&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;    

&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;loop&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;while&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;gb&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;update&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
  &lt;span class="n"&gt;gb&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;display&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;clear&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ballX&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// player lose&lt;/span&gt;
    &lt;span class="n"&gt;cpuScore&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;resetBall&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ballX&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;LCDWIDTH&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;ballSize&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// cpu lose&lt;/span&gt;
    &lt;span class="n"&gt;playerScore&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;resetBall&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ballY&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;ballSpeedY&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ballY&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;LCDHEIGHT&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;ballSize&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;ballSpeedY&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ballX&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;playerPaddlePadding&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;paddleWidth&lt;/span&gt;
      &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;ballY&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="n"&gt;playerPaddleY&lt;/span&gt;
      &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;ballY&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="n"&gt;playerPaddleY&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;paddleHeight&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// touch player's paddle&lt;/span&gt;
    &lt;span class="n"&gt;ballSpeedX&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ballX&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;cpuPaddlePadding&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;ballSize&lt;/span&gt;
      &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;ballY&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="n"&gt;cpuPaddleY&lt;/span&gt;
      &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;ballY&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="n"&gt;cpuPaddleY&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;paddleHeight&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// touch cpu's paddle&lt;/span&gt;
    &lt;span class="n"&gt;ballSpeedX&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="n"&gt;ballX&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;ballSpeedX&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="n"&gt;ballY&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;ballSpeedY&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="n"&gt;gb&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;display&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;fillRect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ballX&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ballY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ballSize&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ballSize&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;


  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;gb&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;buttons&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;repeat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;BTN_UP&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;playerPaddleY&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;playerPaddleY&lt;/span&gt; &lt;span class="o"&gt;-=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;gb&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;buttons&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;repeat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;BTN_DOWN&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;playerPaddleY&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;LCDHEIGHT&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;paddleHeight&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;playerPaddleY&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;cpuPaddleCenter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cpuPaddleY&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;paddleHeight&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cpuPaddleCenter&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;ballY&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;cpuPaddleY&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;cpuPaddleY&lt;/span&gt;&lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cpuPaddleCenter&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;ballY&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;cpuPaddleY&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;LCDHEIGHT&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;paddleHeight&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;cpuPaddleY&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="n"&gt;gb&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;display&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;fillRect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;playerPaddlePadding&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;playerPaddleY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;paddleWidth&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;paddleHeight&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="n"&gt;gb&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;display&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;fillRect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cpuPaddlePadding&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cpuPaddleY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;paddleWidth&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;paddleHeight&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="n"&gt;gb&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;display&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cursorY&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="n"&gt;gb&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;display&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cursorX&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="n"&gt;gb&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;display&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;playerScore&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="n"&gt;gb&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;display&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cursorX&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;LCDWIDTH&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;13&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="n"&gt;gb&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;display&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cpuScore&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Now I see that I should refactor my code. But I'm satisfied and so proud of myself.&lt;/p&gt;

&lt;h1&gt;
  
  
  A lot of fun
&lt;/h1&gt;

&lt;p&gt;New experiences are always full of a fun, in this case a lot of fun. Soldering, making game from '70 - I had a nice time. Maybe it's not suitable for CV, but it's still a lot of experience.&lt;br&gt;
If you are a fan of electronic - I can recommend from the bottom of my heart. It's time to finish this post and finish "snake" game. And later maybe Micro Machines, who knows...&lt;/p&gt;

</description>
      <category>arduino</category>
      <category>gamedev</category>
      <category>hardware</category>
      <category>review</category>
    </item>
    <item>
      <title>Build your own HTTP server in Java in less than one hour (only GET method)</title>
      <dc:creator>Mateusz Jarzyna</dc:creator>
      <pubDate>Wed, 25 Mar 2020 22:07:29 +0000</pubDate>
      <link>https://dev.to/mateuszjarzyna/build-your-own-http-server-in-java-in-less-than-one-hour-only-get-method-2k02</link>
      <guid>https://dev.to/mateuszjarzyna/build-your-own-http-server-in-java-in-less-than-one-hour-only-get-method-2k02</guid>
      <description>&lt;h1&gt;
  
  
  One of the most frequency used protocol in the whole Internet *
&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;* In OSI model, layer 7&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Every time you visit a website your web browser uses the HTTP protocol to communicate with web server and fetch the page's content. Also, when you are implementing backend app and you have to communicate with other backend app - 80% (or more) of cases you will use the HTTP.&lt;/p&gt;

&lt;p&gt;Long story short - when you want to be a good software developer, you have to know how the HTTP protocol works. And wiring the HTTP server is pretty good way to understood, I think.&lt;/p&gt;

&lt;h1&gt;
  
  
  What a web browser sends to the web server?
&lt;/h1&gt;

&lt;p&gt;Good question. Of course, you can use "developer tools", let's do it.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fnirbu5zd2ht02n5z5y4v.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%2Fi%2Fnirbu5zd2ht02n5z5y4v.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Hmm... but what now? What exactly it means? We can see some URL, some method, some status, version (huh?), headers, and other stuff. Useful? Yes, but only to analyze the web app, when something is wrong. We still don't know how HTTP works.&lt;/p&gt;

&lt;h2&gt;
  
  
  Wireshark, my old friend
&lt;/h2&gt;

&lt;p&gt;The source of truth. Wireshark is application to analyze network traffic. You can use it to see each packet that is sent by your (or to your) PC.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fkzy95zlu6zk5gktg37uu.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%2Fi%2Fkzy95zlu6zk5gktg37uu.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;But to be honest - if you know how to use Wireshark - you probably know how HTTP and TCP works. It's pretty advanced program.&lt;/p&gt;

&lt;h2&gt;
  
  
  You are right - the specification
&lt;/h2&gt;

&lt;p&gt;Every good (I mean - used by more that 5 peoples) protocols should have specification. In this case it's called &lt;a href="https://en.wikipedia.org/wiki/Request_for_Comments" rel="noopener noreferrer"&gt;RFC&lt;/a&gt;. But don't lie - you will never read this, it's too long - &lt;a href="https://tools.ietf.org/html/rfc2616" rel="noopener noreferrer"&gt;https://tools.ietf.org/html/rfc2616&lt;/a&gt; . &lt;/p&gt;

&lt;h2&gt;
  
  
  Just run the server and test
&lt;/h2&gt;

&lt;p&gt;Joke? No. Probably you have installed on your PC very powerful tool called netcat, it's pretty advanced tool.&lt;br&gt;
One of the netcat features is TCP server. You can run the netcat to listen on specific port and print every thing what it gets. Netcat is a command line app.&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

nc &lt;span class="nt"&gt;-v&lt;/span&gt; &lt;span class="nt"&gt;-l&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; 8080


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

&lt;/div&gt;
&lt;p&gt;Netcat (&lt;em&gt;nc&lt;/em&gt;), please, listen (&lt;em&gt;-l&lt;/em&gt;) on port 8080 (&lt;em&gt;-p 8080&lt;/em&gt;) and print everything (&lt;em&gt;-v&lt;/em&gt;).&lt;/p&gt;

&lt;p&gt;Now open web browser and enter &lt;code&gt;http://localhost:8080/&lt;/code&gt;. Your browser will send the HTTP request to the server runned by netcat. Of course &lt;code&gt;nc&lt;/code&gt; will print the whole request and ignore it, browser will wait for the response (will timeout soon). To kill &lt;code&gt;nc&lt;/code&gt; press &lt;code&gt;ctrl+c&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://asciinema.org/a/313443" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fasciinema.org%2Fa%2F313443.svg" alt="asciicast"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So, finally, we have an HTTP request!&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: localhost:8080
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:74.0) Gecko/20100101 Firefox/74.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: keep-alive
Cookie: JSESSIONID=D3AF43EBFC0C9D92AD9C37823C4BB299
Upgrade-Insecure-Requests: 1



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

&lt;/div&gt;
&lt;p&gt;As you can see - it fully texts protocol. No bits to analyze, just plain text.&lt;/p&gt;
&lt;h1&gt;
  
  
  HTTP request
&lt;/h1&gt;

&lt;p&gt;It may be a little confusing. Maybe &lt;code&gt;nc&lt;/code&gt; parses the request before printing? HTTP protocol should be complicated, where is the sequence of 0 and 1? There aren't any. HTTP is really very simple &lt;em&gt;text&lt;/em&gt; protocol. There is only one, little trap (I will explain it at the end of this section).&lt;/p&gt;

&lt;p&gt;We can split the request to the 4 main parts:&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

GET / HTTP/1.1


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

&lt;/div&gt;
&lt;p&gt;This is the &lt;em&gt;main&lt;/em&gt; request.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;GET&lt;/code&gt; - this is the HTTP method. Probably you know &lt;a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods" rel="noopener noreferrer"&gt;there are a lot of methods&lt;/a&gt;.&lt;br&gt;
&lt;code&gt;GET&lt;/code&gt; means &lt;code&gt;give me&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;/&lt;/code&gt; - resource. &lt;code&gt;/&lt;/code&gt; means &lt;em&gt;default one&lt;/em&gt;. &lt;br&gt;
When you will open &lt;code&gt;localhost:8080/my_gf_nudes.html&lt;/code&gt;, the resource will be &lt;code&gt;/my_gf_nudes.html&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;HTTP/1.1&lt;/code&gt; - HTTP version. There are few versions, 1.1 is commonly used.&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

Host: localhost:8080


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

&lt;/div&gt;
&lt;p&gt;Host. One server can host many domains, using this field, the browser says which domain it wants exactly&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:74.0) Gecko/20100101 Firefox/74.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: keep-alive
Cookie: JSESSIONID=D3AF43EBFC0C9D92AD9C37823C4BB299
Upgrade-Insecure-Requests: 1


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

&lt;/div&gt;
&lt;p&gt;Headers. In short: some additional informations. But I'm sure that you know what headers are :)&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;




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

&lt;/div&gt;
&lt;p&gt;Surprise - empty line. It means: end of the request. In general - empty line in HTTP means &lt;em&gt;end of section&lt;/em&gt;.&lt;/p&gt;
&lt;h2&gt;
  
  
  The trap
&lt;/h2&gt;

&lt;p&gt;In HTTP every new line separator is a Window's new line. &lt;code&gt;\r\n&lt;/code&gt; &lt;strong&gt;not&lt;/strong&gt; &lt;code&gt;\n&lt;/code&gt;. Remember.&lt;/p&gt;
&lt;h1&gt;
  
  
  Response
&lt;/h1&gt;

&lt;p&gt;Ok. We have a request. How does response look like? Send a request to any server and see, there is nothing simpler.&lt;br&gt;
On your laptop you can find another very useful tool - &lt;code&gt;telnet&lt;/code&gt;. Using telenet you can open TCP connection, write something to server and print the response.&lt;br&gt;
Try to do it yourself. Run &lt;code&gt;telnet google.com 80&lt;/code&gt; (80 is the default HTTP port) and type request manually (you know how it should look like). To close connection press &lt;code&gt;ctrl+]&lt;/code&gt; than type &lt;code&gt;quit&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://asciinema.org/a/313466" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fasciinema.org%2Fa%2F313466.svg" alt="asciicast"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;OK. We have a response.&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

HTTP/1.1 301 Moved Permanently
Location: http://www.google.com/
Content-Type: text/html; charset=UTF-8
Date: Wed, 25 Mar 2020 18:53:12 GMT
Expires: Fri, 24 Apr 2020 18:53:12 GMT
Cache-Control: public, max-age=2592000
Server: gws
Content-Length: 219
X-XSS-Protection: 0
X-Frame-Options: SAMEORIGIN

&amp;lt;HTML&amp;gt;&amp;lt;HEAD&amp;gt;&amp;lt;meta http-equiv="content-type" content="text/html;charset=utf-8"&amp;gt;
&amp;lt;TITLE&amp;gt;301 Moved&amp;lt;/TITLE&amp;gt;&amp;lt;/HEAD&amp;gt;&amp;lt;BODY&amp;gt;
&amp;lt;H1&amp;gt;301 Moved&amp;lt;/H1&amp;gt;
The document has moved
&amp;lt;A HREF="http://www.google.com/"&amp;gt;here&amp;lt;/A&amp;gt;.
&amp;lt;/BODY&amp;gt;&amp;lt;/HTML&amp;gt;



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

&lt;/div&gt;
&lt;p&gt;We can split it to 4 sections&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

HTTP/1.1 301 Moved Permanently


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

&lt;/div&gt;
&lt;p&gt;&lt;code&gt;HTTP/1.1&lt;/code&gt; - version&lt;br&gt;
&lt;code&gt;301&lt;/code&gt; - &lt;a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Status" rel="noopener noreferrer"&gt;status code&lt;/a&gt;. I believe you are familiar with that&lt;br&gt;
&lt;code&gt;Moved Permanently&lt;/code&gt; - human-readable status code&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

Location: http://www.google.com/
Content-Type: text/html; charset=UTF-8
Date: Wed, 25 Mar 2020 18:53:12 GMT
Expires: Fri, 24 Apr 2020 18:53:12 GMT
Cache-Control: public, max-age=2592000
Server: gws
Content-Length: 219
X-XSS-Protection: 0
X-Frame-Options: SAMEORIGIN


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

&lt;/div&gt;
&lt;p&gt;Headers&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;




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

&lt;/div&gt;
&lt;p&gt;Empty line, it means that the content will be sent in next section.&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

&amp;lt;HTML&amp;gt;&amp;lt;HEAD&amp;gt;&amp;lt;meta http-equiv="content-type" content="text/html;charset=utf-8"&amp;gt;
&amp;lt;TITLE&amp;gt;301 Moved&amp;lt;/TITLE&amp;gt;&amp;lt;/HEAD&amp;gt;&amp;lt;BODY&amp;gt;
&amp;lt;H1&amp;gt;301 Moved&amp;lt;/H1&amp;gt;
The document has moved
&amp;lt;A HREF="http://www.google.com/"&amp;gt;here&amp;lt;/A&amp;gt;.
&amp;lt;/BODY&amp;gt;&amp;lt;/HTML&amp;gt;


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

&lt;/div&gt;
&lt;p&gt;Content, HTML or binary or something&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;




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

&lt;/div&gt;
&lt;p&gt;Empty line, means &lt;em&gt;end of request&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;REMEMBER: each new line is &lt;code&gt;\r\n&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;h1&gt;
  
  
  Time for programming!
&lt;/h1&gt;

&lt;p&gt;We know how request look like, we know how response look like, it's time to implement our server.&lt;/p&gt;
&lt;h2&gt;
  
  
  What we expect
&lt;/h2&gt;

&lt;p&gt;We want to get a very simple thing - to display an HTML page and a picture in a browser.&lt;br&gt;
Let's prepare two HTMLs files and one picture&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

❯ pwd
/tmp/www

❯ ls
gallery.html index.html   me.jpg

❯ cat index.html
&amp;lt;html&amp;gt;
  &amp;lt;header&amp;gt;
    &amp;lt;title&amp;gt;My homepage!&amp;lt;/title&amp;gt;
  &amp;lt;/header&amp;gt;
  &amp;lt;body&amp;gt;
    &amp;lt;h1&amp;gt;Welcome!&amp;lt;/h1&amp;gt;
    &amp;lt;p&amp;gt;&amp;lt;a href="gallery.html"&amp;gt;Here&amp;lt;/a&amp;gt; you can look at my pictures&amp;lt;/p&amp;gt;
  &amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;

❯ cat gallery.html
&amp;lt;html&amp;gt;
  &amp;lt;head&amp;gt;
    &amp;lt;title&amp;gt;Gallery&amp;lt;/title&amp;gt;
  &amp;lt;/head&amp;gt;
  &amp;lt;body&amp;gt;
    &amp;lt;h1&amp;gt;My sexi photos&amp;lt;h1&amp;gt;
    &amp;lt;img src="me.jpg" /&amp;gt;
  &amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;

❯


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

&lt;/div&gt;
&lt;h2&gt;
  
  
  The plan
&lt;/h2&gt;

&lt;p&gt;Plan is very simple:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open TCP socket and listen&lt;/li&gt;
&lt;li&gt;Accept the client and read request&lt;/li&gt;
&lt;li&gt;Parse the request&lt;/li&gt;
&lt;li&gt;Find requested resource on disk&lt;/li&gt;
&lt;li&gt;Send the response &lt;/li&gt;
&lt;li&gt;Test&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;
  
  
  Open TCP socket
&lt;/h2&gt;

&lt;p&gt;In this article we will use &lt;code&gt;ServerSocket&lt;/code&gt; class to handle TCP connection. As a homework you can reimplement the server to use the classes from the &lt;code&gt;nio&lt;/code&gt; packages.&lt;/p&gt;

&lt;p&gt;So, open your IDE and let's start.&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt; &lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="kd"&gt;throws&lt;/span&gt; &lt;span class="nc"&gt;Exception&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;ServerSocket&lt;/span&gt; &lt;span class="n"&gt;serverSocket&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;ServerSocket&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;8080&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
                &lt;span class="c1"&gt;// implement client handler here&lt;/span&gt;
            &lt;span class="o"&gt;}&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;


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

&lt;/div&gt;
&lt;p&gt;I want to keep the code concise and clean - it's why I &lt;code&gt;throws Exception&lt;/code&gt; instead of implementing good exception handling.&lt;br&gt;
So as I told, we have to open socket on port 8080 (why not 80? Because to use low port you need root privileges).&lt;br&gt;
We also need the infinity loop to 'pause the server'.&lt;/p&gt;

&lt;p&gt;User &lt;code&gt;telnet&lt;/code&gt; to test the socket:&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fj7o15563jz5wacqsiql2.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%2Fi%2Fj7o15563jz5wacqsiql2.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;br&gt;
Perfect, works.&lt;/p&gt;
&lt;h2&gt;
  
  
  Accept client connection
&lt;/h2&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;

        &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;ServerSocket&lt;/span&gt; &lt;span class="n"&gt;serverSocket&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;ServerSocket&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;8080&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
                &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Socket&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;serverSocket&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;accept&lt;/span&gt;&lt;span class="o"&gt;())&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
                    &lt;span class="n"&gt;handleClient&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
                &lt;span class="o"&gt;}&lt;/span&gt;
            &lt;span class="o"&gt;}&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;


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

&lt;/div&gt;
&lt;p&gt;To accept connection from client we have to call &lt;strong&gt;blocking&lt;/strong&gt; &lt;code&gt;accept()&lt;/code&gt; method. Java program will wait for a client on that line.&lt;/p&gt;

&lt;p&gt;Time to implement the client handler:&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;

    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;handleClient&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Socket&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="kd"&gt;throws&lt;/span&gt; &lt;span class="nc"&gt;IOException&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Debug: got new client "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;toString&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt;
        &lt;span class="nc"&gt;BufferedReader&lt;/span&gt; &lt;span class="n"&gt;br&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;BufferedReader&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;InputStreamReader&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getInputStream&lt;/span&gt;&lt;span class="o"&gt;()));&lt;/span&gt;

        &lt;span class="nc"&gt;StringBuilder&lt;/span&gt; &lt;span class="n"&gt;requestBuilder&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;StringBuilder&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
        &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="o"&gt;(!(&lt;/span&gt;&lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;br&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;readLine&lt;/span&gt;&lt;span class="o"&gt;()).&lt;/span&gt;&lt;span class="na"&gt;isBlank&lt;/span&gt;&lt;span class="o"&gt;())&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;requestBuilder&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;append&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s"&gt;"\r\n"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;

        &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;request&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requestBuilder&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;toString&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
        &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;


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

&lt;/div&gt;
&lt;p&gt;We have to read the request. How? Just read the input stream from the client's socket. In Java it's not so simple, that's why I made this ugly line &lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

new BufferedReader(new InputStreamReader(client.getInputStream()));


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

&lt;/div&gt;
&lt;p&gt;Well, Java.&lt;/p&gt;

&lt;p&gt;Request ends with one empty line (&lt;code&gt;\r\n&lt;/code&gt;), remember? Client will send empty line, but imputStream will be still open, we have to read it until one, empty line arrives.&lt;/p&gt;

&lt;p&gt;Run the server, go to &lt;code&gt;http://localhost:8080/&lt;/code&gt; and observe logs:&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fbrk5ufjsxg9slfexlcr2.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%2Fi%2Fbrk5ufjsxg9slfexlcr2.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;br&gt;
It works! We can log the whole request!&lt;/p&gt;
&lt;h2&gt;
  
  
  Parse the request
&lt;/h2&gt;

&lt;p&gt;Parsing the request is realy simple, I don't think there's any need for further explanation&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;

        &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;request&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requestBuilder&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;toString&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
        &lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;requestsLines&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;split&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"\r\n"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;requestLine&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requestsLines&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;].&lt;/span&gt;&lt;span class="na"&gt;split&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;" "&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;method&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requestLine&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;];&lt;/span&gt;
        &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requestLine&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;];&lt;/span&gt;
        &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;version&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requestLine&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;];&lt;/span&gt;
        &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;host&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requestsLines&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;].&lt;/span&gt;&lt;span class="na"&gt;split&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;" "&lt;/span&gt;&lt;span class="o"&gt;)[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;];&lt;/span&gt;

        &lt;span class="nc"&gt;List&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;headers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;ArrayList&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;gt;();&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;h&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; &lt;span class="n"&gt;h&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;requestsLines&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;length&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; &lt;span class="n"&gt;h&lt;/span&gt;&lt;span class="o"&gt;++)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;header&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requestsLines&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;h&lt;/span&gt;&lt;span class="o"&gt;];&lt;/span&gt;
            &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;add&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;header&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;

        &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;accessLog&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;format&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Client %s, method %s, path %s, version %s, host %s, headers %s"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
                &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;toString&lt;/span&gt;&lt;span class="o"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;method&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;version&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;host&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;toString&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt;
        &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;accessLog&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;


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

&lt;/div&gt;
&lt;p&gt;Just some splits. The only one thing that you may not understand is why we started the loop from 2? Because first line (index 0) is &lt;code&gt;GET / HTTP/1.1&lt;/code&gt;, second line is host. The headers start with the third line of the request&lt;/p&gt;
&lt;h2&gt;
  
  
  Send response
&lt;/h2&gt;

&lt;p&gt;We will send the response to the client's output stream.&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;

        &lt;span class="nc"&gt;OutputStream&lt;/span&gt; &lt;span class="n"&gt;clientOutput&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getOutputStream&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
        &lt;span class="n"&gt;clientOutput&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;write&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"HTTP/1.1 200 OK\r\n"&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getBytes&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt;
        &lt;span class="n"&gt;clientOutput&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;write&lt;/span&gt;&lt;span class="o"&gt;((&lt;/span&gt;&lt;span class="s"&gt;"ContentType: text/html\r\n"&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="na"&gt;getBytes&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt;
        &lt;span class="n"&gt;clientOutput&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;write&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"\r\n"&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getBytes&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt;
        &lt;span class="n"&gt;clientOutput&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;write&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"&amp;lt;b&amp;gt;It works!&amp;lt;/b&amp;gt;"&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getBytes&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt;
        &lt;span class="n"&gt;clientOutput&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;write&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"\r\n\r\n"&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getBytes&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt;
        &lt;span class="n"&gt;clientOutput&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;flush&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
        &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;close&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;


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

&lt;/div&gt;
&lt;p&gt;Do you remember how response should look like?&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

version status code
headers
(empty line)
content
(empty line)


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

&lt;/div&gt;
&lt;p&gt;Don't forget to close the output stream.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fsovsf8l7txub2sxksa8r.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%2Fi%2Fsovsf8l7txub2sxksa8r.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;br&gt;
Wow, it's really works&lt;/p&gt;
&lt;h2&gt;
  
  
  Find requested resource
&lt;/h2&gt;

&lt;p&gt;We have to implement two methods first&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;

    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="nf"&gt;guessContentType&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Path&lt;/span&gt; &lt;span class="n"&gt;filePath&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="kd"&gt;throws&lt;/span&gt; &lt;span class="nc"&gt;IOException&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;Files&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;probeContentType&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;filePath&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="nc"&gt;Path&lt;/span&gt; &lt;span class="nf"&gt;getFilePath&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;path&lt;/span&gt;&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="s"&gt;"/"&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;equals&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"/index.html"&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;Paths&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;get&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"/tmp/www"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;


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

&lt;/div&gt;
&lt;p&gt;&lt;code&gt;guessContentType&lt;/code&gt; - we have to tell to the browser what kind of content we are sending. It's callend &lt;code&gt;content type&lt;/code&gt;. Fortunately, there are built-in mechanisms in Java for this. We don't have to make a big switch block.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;getFilePath&lt;/code&gt; - Before we will return the file - we need to known it location.&lt;br&gt;
This condition deserves attention&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;

        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"/"&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;equals&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"/index.html"&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;


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

&lt;/div&gt;
&lt;p&gt;If user wants &lt;em&gt;default resource&lt;/em&gt; then return &lt;code&gt;index.html&lt;/code&gt;.&lt;/p&gt;
&lt;h2&gt;
  
  
  send the response
&lt;/h2&gt;

&lt;p&gt;Do you remember the code that sends response to the user (block of &lt;code&gt;clientOutput.write&lt;/code&gt;)? We need to move it to the method&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;

    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;sendResponse&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Socket&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;contentType&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;byte&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="kd"&gt;throws&lt;/span&gt; &lt;span class="nc"&gt;IOException&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;OutputStream&lt;/span&gt; &lt;span class="n"&gt;clientOutput&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getOutputStream&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
        &lt;span class="n"&gt;clientOutput&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;write&lt;/span&gt;&lt;span class="o"&gt;((&lt;/span&gt;&lt;span class="s"&gt;"HTTP/1.1 \r\n"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="na"&gt;getBytes&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt;
        &lt;span class="n"&gt;clientOutput&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;write&lt;/span&gt;&lt;span class="o"&gt;((&lt;/span&gt;&lt;span class="s"&gt;"ContentType: "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;contentType&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s"&gt;"\r\n"&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="na"&gt;getBytes&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt;
        &lt;span class="n"&gt;clientOutput&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;write&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"\r\n"&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getBytes&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt;
        &lt;span class="n"&gt;clientOutput&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;write&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;clientOutput&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;write&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"\r\n\r\n"&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getBytes&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt;
        &lt;span class="n"&gt;clientOutput&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;flush&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
        &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;close&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;


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

&lt;/div&gt;
&lt;p&gt;Ok, finally we can return the file&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;

        &lt;span class="nc"&gt;Path&lt;/span&gt; &lt;span class="n"&gt;filePath&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;getFilePath&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;path&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="nc"&gt;Files&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;exists&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;filePath&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="c1"&gt;// file exist&lt;/span&gt;
            &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;contentType&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;guessContentType&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;filePath&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
            &lt;span class="n"&gt;sendResponse&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"200 OK"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;contentType&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;Files&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;readAllBytes&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;filePath&lt;/span&gt;&lt;span class="o"&gt;));&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="c1"&gt;// 404&lt;/span&gt;
            &lt;span class="kt"&gt;byte&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;notFoundContent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"&amp;lt;h1&amp;gt;Not found :(&amp;lt;/h1&amp;gt;"&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getBytes&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
            &lt;span class="n"&gt;sendResponse&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"404 Not Found"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"text/html"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;notFoundContent&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;


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

&lt;/div&gt;
&lt;h1&gt;
  
  
  It works!
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fek7l4fb12a7j5u6pgbuc.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%2Fi%2Fek7l4fb12a7j5u6pgbuc.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;br&gt;
Finally, we can see html page served by our web server!&lt;/p&gt;
&lt;h1&gt;
  
  
  Homework
&lt;/h1&gt;

&lt;ol&gt;
&lt;li&gt;Make it multi-thread.

&lt;ol&gt;
&lt;li&gt;Create thread pool&lt;/li&gt;
&lt;li&gt;Move &lt;code&gt;handleClient&lt;/code&gt; method to separated class and run it in new thread&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;Rewrite it using non-blocking IO &lt;/li&gt;
&lt;li&gt;Implement POST method

&lt;ol&gt;
&lt;li&gt;Start netcat&lt;/li&gt;
&lt;li&gt;Send some HTML form&lt;/li&gt;
&lt;li&gt;Analyze request&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h1&gt;
  
  
  Full source code
&lt;/h1&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


</description>
      <category>java</category>
      <category>http</category>
    </item>
    <item>
      <title>Linux's commands and tricks I'm using in my daily job as a developer</title>
      <dc:creator>Mateusz Jarzyna</dc:creator>
      <pubDate>Mon, 11 Nov 2019 10:50:35 +0000</pubDate>
      <link>https://dev.to/mateuszjarzyna/linux-s-commands-and-tricks-i-m-using-in-my-daily-job-as-a-developer-4cle</link>
      <guid>https://dev.to/mateuszjarzyna/linux-s-commands-and-tricks-i-m-using-in-my-daily-job-as-a-developer-4cle</guid>
      <description>&lt;p&gt;This is not a post from the series of those describing the &lt;code&gt;cd&lt;/code&gt; command. It's just a list of commands and tricks I'm using (almost) every day.&lt;/p&gt;

&lt;h1&gt;
  
  
  Port forwarding
&lt;/h1&gt;

&lt;p&gt;Sometimes I have to connect to database and of course I prefer to use my GUI manager (JetBrains DataGrip).&lt;br&gt;
So, if security policy exist in your company and your database's port is not exposed you can execute&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ssh -L{port on your PC}:localhost:{database's port} root@{server IP}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;The command below will open port &lt;code&gt;3308&lt;/code&gt; on your laptop and everything will be forwarded to &lt;code&gt;192.168.1.2:3306&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ssh -L3308:localhost:3306 root@192.168.1.2
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;&lt;code&gt;localhost&lt;/code&gt; means that database is listening on &lt;code&gt;192.168.1.2&lt;/code&gt;. You can type for example &lt;code&gt;192.168.3.77&lt;/code&gt; and everything will be forwarded to &lt;code&gt;.3.77&lt;/code&gt; server via &lt;code&gt;.1.2&lt;/code&gt;.&lt;/p&gt;

&lt;h1&gt;
  
  
  Edit file in VIM without &lt;code&gt;sudo&lt;/code&gt;, but save with &lt;code&gt;sudo&lt;/code&gt;
&lt;/h1&gt;

&lt;p&gt;Have you ever edited some configs file and forgot to &lt;code&gt;sudo&lt;/code&gt;? Me too... There is a trick to save the file anyway, just type in VIM:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;:w !sudo tee %
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;&lt;a href="https://stackoverflow.com/a/7078429/1775344"&gt;Explanation&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Go to beggining/end of line in terminal
&lt;/h1&gt;

&lt;p&gt;If you wrote a very long command in the terminal it may take a long time before you return to the begging of the line to add missing &lt;code&gt;sudo&lt;/code&gt;. And back to the end to add some parameters.&lt;br&gt;
Press &lt;code&gt;crtl + a&lt;/code&gt; to move to the begging and &lt;code&gt;crtl + e&lt;/code&gt; to the end of the line in terminal.&lt;/p&gt;
&lt;h1&gt;
  
  
  ll
&lt;/h1&gt;

&lt;p&gt;Save few days in a year by typing &lt;code&gt;ll&lt;/code&gt; instead of &lt;code&gt;ls -la&lt;/code&gt;. Works on most Linux servers.&lt;/p&gt;
&lt;h1&gt;
  
  
  Execute command you executed in the past
&lt;/h1&gt;
&lt;h2&gt;
  
  
  Last command
&lt;/h2&gt;

&lt;p&gt;To execute last command over again you can of course press ↑ (arrow up) key. But you can also type &lt;code&gt;!!&lt;/code&gt;. So executing last command as a root is very easy&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo !!
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;To run the last command that started with &lt;code&gt;apt&lt;/code&gt; type &lt;code&gt;!apt&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Search history
&lt;/h2&gt;

&lt;p&gt;To find the command that contains &lt;code&gt;/tmp&lt;/code&gt; you have executed in the past press &lt;code&gt;ctrl + r&lt;/code&gt; and type &lt;code&gt;/tmp&lt;/code&gt;. Press &lt;code&gt;ctrl + r&lt;/code&gt; again for next result.&lt;br&gt;
To show all commands or to search using regular expression use&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;history | grep "/tmp"
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h1&gt;
  
  
  Agree for everything
&lt;/h1&gt;

&lt;p&gt;To say yes for each question you can use application called &lt;code&gt;yes&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;yes | yum install curl
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;use &lt;code&gt;yes no&lt;/code&gt; to say no and discard. &lt;/p&gt;




&lt;p&gt;&lt;strong&gt;WARNING&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;As &lt;a class="comment-mentioned-user" href="https://dev.to/patricnox"&gt;@patricnox&lt;/a&gt;
 notices in the comment - using &lt;code&gt;yes&lt;/code&gt; may do unexpected things. You can accidentally install 10 GB of dependencies or other things you don't want to do.&lt;/p&gt;




&lt;h1&gt;
  
  
  Run a long-lasting process in the background and close the terminal
&lt;/h1&gt;

&lt;p&gt;If you run a script that will end in 3 days, you don't have to wait with the terminal window open to end. You can run it using &lt;code&gt;nohup&lt;/code&gt; command&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;nohup wget http://large-files.com/10gb-super-movie.avi &amp;amp;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;&lt;code&gt;wget&lt;/code&gt; works in the background, output is saved to &lt;code&gt;nohup.out&lt;/code&gt; file in working directory.&lt;/p&gt;

&lt;h1&gt;
  
  
  Checking who has stolen your favourite port
&lt;/h1&gt;

&lt;p&gt;It's really annoying when you are trying to run nginx but you can't because there is already apache running and port 443 is busy.&lt;br&gt;
So, how to determinate which process is listening on port 80:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ netstat -tulpn | grep 80
tcp6       0      0 :::80                 :::*                   LISTEN     10177/java
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;&lt;code&gt;10177&lt;/code&gt; is a pid you are looking for. Now execute&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ps aux | grep 10177
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;for more details.&lt;/p&gt;

&lt;h1&gt;
  
  
  Reading logs
&lt;/h1&gt;

&lt;p&gt;Everyone knows that &lt;code&gt;less&lt;/code&gt; is a very good way to read a logs files. But you can also read gziped logs without extracting!&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;less /var/log/my-app/my-app.log.2015.12.14.gz
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h2&gt;
  
  
  Live reading
&lt;/h2&gt;



&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;tail -f /var/log/my-app/my-app.log | grep ERROR
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;The command above will show only new lines that contains &lt;code&gt;ERROR&lt;/code&gt;.&lt;/p&gt;

&lt;h1&gt;
  
  
  Sort process
&lt;/h1&gt;

&lt;p&gt;Show top 3 processes sorted by CPU usage&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ps aux --sort=-pcpu | head -n 4
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Show top 3 processes sorted by memory usage&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ps aux --sort=-rss | head -n 4
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h1&gt;
  
  
  Executing command every X seconds
&lt;/h1&gt;

&lt;p&gt;To print command's output every X seconds you can use &lt;code&gt;watch&lt;/code&gt; command. For example to create clock run&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;watch -n 1 date
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h1&gt;
  
  
  Quiet mode
&lt;/h1&gt;

&lt;p&gt;A lot of standards commands has quiet or silent mode. Very useful when you are creating some bash script. In most of the cases just add &lt;code&gt;-q&lt;/code&gt; or &lt;code&gt;-s&lt;/code&gt; (read &lt;code&gt;--help&lt;/code&gt; or &lt;code&gt;man&lt;/code&gt; or check on StackOverflow)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;zip -q archive.zip big-file.jpg
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;But sometimes (practically always with in-house scripts) you have to ignore the output (send to &lt;code&gt;/dev/null&lt;/code&gt;)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;./very-verbose.sh 1&amp;gt;/dev/null
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h1&gt;
  
  
  Create log files for scripts executed by crontab
&lt;/h1&gt;



&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;0 22 * * 1-5 /opt/scripts/send-report.sh 2&amp;gt;/var/log/scripts/report-error.log
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;So next time when your script will fail you won't lose the reason&lt;/p&gt;

</description>
      <category>linux</category>
      <category>productivity</category>
    </item>
  </channel>
</rss>
