<?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>Forem: Misha Shelemetyev</title>
    <description>The latest articles on Forem by Misha Shelemetyev (@mshel).</description>
    <link>https://forem.com/mshel</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%2F700%2F5b4c1d3c-7f62-4c66-a0fe-819afe2280ed.png</url>
      <title>Forem: Misha Shelemetyev</title>
      <link>https://forem.com/mshel</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/mshel"/>
    <language>en</language>
    <item>
      <title>sshOuroboros terminal multiplayer game written in goLang with ssh.</title>
      <dc:creator>Misha Shelemetyev</dc:creator>
      <pubDate>Wed, 05 Nov 2025 21:44:56 +0000</pubDate>
      <link>https://forem.com/mshel/sshouroboros-multiplayer-game-in-golang-with-ssh-and-the-story-1399</link>
      <guid>https://forem.com/mshel/sshouroboros-multiplayer-game-in-golang-with-ssh-and-the-story-1399</guid>
      <description>&lt;h2&gt;
  
  
  GIMME THE MEAT
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2FMShel%2FsshOuroboros%2Fmain%2Fstatic%2FgameRecord.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2FMShel%2FsshOuroboros%2Fmain%2Fstatic%2FgameRecord.gif" width="640" height="480"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;sshOurboros -- multiplayer game where snake eats itself and grows&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;To play go here &lt;code&gt;ssh web2u.org -p6996&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The Rules:&lt;/em&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;The goal is to claim the most space&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Secondary goal is to kill as many other Ourboroses as you can&lt;br&gt;
&lt;em&gt;The how:&lt;/em&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;To claim space you need to either eat your own tail or reach tiles you've already claimed,&lt;br&gt;
tiles that are enclosed when you do so become yours!&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;To kill other snakes you hit their tails&lt;br&gt;
&lt;em&gt;To watch out:&lt;/em&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Other players can kill you by hitting your exposed tail&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Other players can take your tiles.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The source: &lt;a href="https://github.com/MShel/sshOuroboros/tree/main" rel="noopener noreferrer"&gt;https://github.com/MShel/sshOuroboros/tree/main&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Walk through on how it works and why
&lt;/h2&gt;

&lt;p&gt;When you Sign Up to the game you are presented with 254 Ansi colors&lt;a href="https://github.com/MShel/sshOuroboros/blob/db5cd9fdc0d1e674d6fc56a9b3fc3ad0a863a8ef/internal/ui/SetupForm.go#L117-L124" rel="noopener noreferrer"&gt;or maybe less if there are active players in the game right now&lt;/a&gt;. &lt;br&gt;
Why 254? glad you asked! Thats what &lt;a href="https://en.wikipedia.org/wiki/ANSI_escape_code" rel="noopener noreferrer"&gt;we have in terminal&lt;/a&gt; - (void color + wall color).&lt;/p&gt;

&lt;p&gt;But now that you've signed up there are players there! What the heck? all the colors were available. Well that's bots -- we try to keep all 254 colors busy at all times sshOuroboroses never sleep as &lt;del&gt;cool&lt;/del&gt; kids say.&lt;/p&gt;

&lt;p&gt;You joining the world of sshOuroboros actually already caused drama and we had to kick the &lt;a href="https://github.com/MShel/sshOuroboros/blob/db5cd9fdc0d1e674d6fc56a9b3fc3ad0a863a8ef/internal/game/GameManager.go#L228-L230" rel="noopener noreferrer"&gt;bot with your color out&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Alright we are in and passing commands back and fro through your &lt;a href="https://github.com/MShel/sshOuroboros/blob/db5cd9fdc0d1e674d6fc56a9b3fc3ad0a863a8ef/internal/game/GameManager.go#L100-L102" rel="noopener noreferrer"&gt;players channel&lt;/a&gt;&lt;br&gt;
And that's fantastic but now we are getting to the meat of the game which is - how do we claim the territory? Well one AI would say its been solved bazzillion times you do flood fill by defining boundaries and calculating out of boundary tiles and swapping color for others....One would say that and it would not work? why-- because we have 254 bots that potentially need to scan &lt;a href="https://github.com/MShel/sshOuroboros/blob/main/internal/game/Config.go" rel="noopener noreferrer"&gt;350_000 tiles&lt;/a&gt; or cells on every 100ms move. That's going to be too slow.&lt;/p&gt;

&lt;p&gt;So here comes my concurrent simplistic implementation:&lt;br&gt;
Imagine your ouroboros it can hit a tail or base from only 4 different sides and most of the time from one side it would be the area to claim and from other- the area you don't need to touch, so we need to explore only those 2(its not exactly this logic but ~90% of it). Now we throw 2 goroutines if one of them exited before finding the wall we kill another and we are done! &lt;a href="https://github.com/MShel/sshOuroboros/blob/db5cd9fdc0d1e674d6fc56a9b3fc3ad0a863a8ef/internal/game/SpaceFiller.go#L53" rel="noopener noreferrer"&gt;link to code&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The bots, oh those pesky bots in my first implementation I had a separate ticker for the bot master and it would be responsible for moving them around, that worked great till I started testing with 250 of them now it did not work at all =D the amount of kills of players that were killed and claims for tiles by bots who were killed was astonishing so I've scrapped that and now we assign strategy directly to player and run bots strategies right in the main loop. &lt;a href="https://github.com/MShel/sshOuroboros/blob/db5cd9fdc0d1e674d6fc56a9b3fc3ad0a863a8ef/internal/game/GameManager.go#L213-L218" rel="noopener noreferrer"&gt;link&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Talking about bots when I started I had this plan of multiple strategies and random selection of strategy based on bot situation........but ain't got time for that so I have this little Default strategy file that is Actual If conditions all around with some &lt;a href="https://github.com/MShel/sshOuroboros/blob/db5cd9fdc0d1e674d6fc56a9b3fc3ad0a863a8ef/internal/game/DefaultStrategy.go#L9" rel="noopener noreferrer"&gt;ridiculous logic&lt;/a&gt;&lt;br&gt;
Now the nice part it is an implementation of interface that is used in &lt;code&gt;*Player&lt;/code&gt; which theoretically unblocks me from saying later -- yeahyeah its bad but I can throw it away and rewrite. Also that is one of the areas I see as future major change in this project(see whats next? section below)&lt;/p&gt;

&lt;p&gt;We have this 350_000 tile thing going on with 254 players on it how the heck do do we show it on the terminal you ask? well we cant -- not on most terminals, we need viewport of limited width and height and hopefully bother bubbletea(the rendering lib) update only with small portion of it. [here] we ask for chunk of map (&lt;a href="https://github.com/MShel/sshOuroboros/blob/db5cd9fdc0d1e674d6fc56a9b3fc3ad0a863a8ef/internal/game/GameManager.go#L304-L331" rel="noopener noreferrer"&gt;https://github.com/MShel/sshOuroboros/blob/db5cd9fdc0d1e674d6fc56a9b3fc3ad0a863a8ef/internal/game/GameManager.go#L304-L331&lt;/a&gt;) And &lt;a href="https://github.com/MShel/sshOuroboros/blob/db5cd9fdc0d1e674d6fc56a9b3fc3ad0a863a8ef/internal/ui/GameView.go#L233-L270" rel="noopener noreferrer"&gt;here&lt;/a&gt; we render it.&lt;br&gt;
This whole view function is kinda nasty and was a huge pain to write but it works most time anyway. &lt;/p&gt;

&lt;p&gt;So here you go that's the key parts of the game, there are  a lot more areas to cover but those are the most interesting ones IMHO(ask me about anything else and answer I will)&lt;/p&gt;

&lt;h2&gt;
  
  
  Whats In the Future
&lt;/h2&gt;

&lt;p&gt;Well here I need your dear Reader advice, I've got following ideas that I'm planning to think about next, but if something completely different comes to your mind(hopefully about the game) do let me know. Anyway, help me pick!&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;New game play as Bots strategy (add lua VM and allow strategy to be small executable lua script to be submitted by user)&lt;/li&gt;
&lt;li&gt;Variable ouroboros speed press &lt;code&gt;x&lt;/code&gt; to go real Fast type of situation&lt;/li&gt;
&lt;li&gt;More games -- we have one with 256 players we can easily provision many with 256, though my server will have to be improved(its 10$ on linode and its meh)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why did I write it?
&lt;/h2&gt;

&lt;p&gt;Well Ai and &lt;code&gt;terminal.shop&lt;/code&gt;... Ai is to blame for it, I &lt;del&gt;was&lt;/del&gt; am slightly depressed by on slot of claims that AI will take over everything I like and make me write documentation and that is my 2'd least favorite thing in this career(1't are useless meetings that only end up in more useless meetings).&lt;/p&gt;

&lt;p&gt;So hearing all that and watching Prime on youtube talking about how awesome ssh coffee stuff is I was like "lets try to write an ssh game cause its fun and be open minded about AI".&lt;/p&gt;

&lt;p&gt;Now the good -- I had an absolute blast working on it and will try to invest more time in random projects like that in the future to keep the sadness of news at bay&lt;/p&gt;

&lt;p&gt;-- Ai wont take my job for now and that's not only because I tend to be very openly opinionated about things but also because:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Flood fill -- it could not figure it out, it did provide classical algorithms that did not scale but it was of no help at the end&lt;/li&gt;
&lt;li&gt;Concurrency issues -- It can not figure those out like at all, the game had a lot of those in my original iterations, ai could not suggest any sort of fix that would address performance bottlenecks&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Also good'ish? -- Ai was good at helping me with code I did not want to write like view files, I just dont care about them enough&lt;br&gt;
Or the HighScore sqlite crud thingy, that also was pretty much all AI&lt;/p&gt;

&lt;p&gt;Now the bad -- I can write 250 more articles about how AI cant really replace anyone but it wont help the narrative been pushed by those weird AI CEO's :-(&lt;/p&gt;

</description>
      <category>programming</category>
      <category>go</category>
      <category>ssh</category>
      <category>gamedev</category>
    </item>
    <item>
      <title>Bring Some colors to your terminal!</title>
      <dc:creator>Misha Shelemetyev</dc:creator>
      <pubDate>Fri, 04 Oct 2019 16:32:36 +0000</pubDate>
      <link>https://forem.com/mshel/bring-some-colors-to-your-terminal-4cep</link>
      <guid>https://forem.com/mshel/bring-some-colors-to-your-terminal-4cep</guid>
      <description>&lt;p&gt;Its all started when I was driving to an office today,&lt;br&gt;
leaves changing color, sun shining down on different colored cars&lt;br&gt;
on the road, long story short it was super colorful.&lt;/p&gt;

&lt;p&gt;When I got my desk I was greeted by dark themed intellij with even darker terminal with lines and lines of super verbose Java. That made me want to escape somewhere... Perhaps Python would of been good, but to challenge myself I've decided something that remotely resembles of both of this languages(Java and Python3) and that is Rust(obviously resembles in terms of Syntax).&lt;/p&gt;

&lt;p&gt;So the story below is about me wondering in the land of Rust and the project&lt;br&gt;
that I came up with to bring some color to the dark life in terminal.&lt;/p&gt;

&lt;p&gt;The idea is pretty simple: modern terminals support 256 font and background colors, so why won't we generate ascii image previews for images in terminal, this way when you ssh'd to some weird server with some&lt;br&gt;
strange php(or any other language) code on it, you can at least find some joy looking at &lt;br&gt;
ascii representation of images that have been uploaded there :-) &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%2Fthepracticaldev.s3.amazonaws.com%2Fi%2F3vmiilgki8u8busl8ttb.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2F3vmiilgki8u8busl8ttb.jpg" alt="preview of termpic"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;TLDR: you can get the util here(it's compiled for macOs or 64bit liunux, if you run something else you can get cargo installed and do cargo run to play with):  &lt;a href="https://github.com/MShel/termpic/tree/master/bin" rel="noopener noreferrer"&gt;https://github.com/MShel/termpic/tree/master/bin&lt;/a&gt;&lt;br&gt;&lt;br&gt;
feel free to create PR for compiled util for windows or in general if you see that something is horribly(or not horribly) wrong out there :-)&lt;/p&gt;

&lt;p&gt;Then you can use it either by doing:&lt;br&gt;
cargo run {imageFilePath} or&lt;br&gt;
bin/termpic {imageFilePath}&lt;/p&gt;

&lt;p&gt;My first experience with Rust was very pleasant for number of reasons:&lt;/p&gt;
&lt;h2&gt;
  
  
  Reason 1
&lt;/h2&gt;

&lt;p&gt;It has quite a big collection of packages already, so most of the work was already done for me by crate &lt;a href="https://crates.io/crates/image" rel="noopener noreferrer"&gt;image&lt;/a&gt; and &lt;a href="https://crates.io/crates/terminal_size" rel="noopener noreferrer"&gt;terminal_size&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;
  
  
  Reason 2
&lt;/h2&gt;

&lt;p&gt;Rust syntax is simply awesome, just look at following code chunk, I think this one of the clearest way to define open file behaviour(sorta like Pythons with....). However it does take some time to adapt to the whole "taking care of burrowing and references situation". Don't think I'm quite there yet&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt; &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;image_result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;  &lt;span class="nn"&gt;image&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
    &lt;span class="k"&gt;match&lt;/span&gt; &lt;span class="n"&gt;image_result&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nf"&gt;Ok&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;unwrapped_image&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="k"&gt;mut&lt;/span&gt; &lt;span class="n"&gt;term_symbols_cache&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;HashMap&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
            &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;aciid_image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nb"&gt;String&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;turn_rgb_frame_to_ascii&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;unwrapped_image&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="k"&gt;mut&lt;/span&gt; &lt;span class="n"&gt;term_symbols_cache&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="nd"&gt;print!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"{}"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;aciid_image&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="nf"&gt;Err&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nd"&gt;println!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"{:?}"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;message&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Reason 3
&lt;/h2&gt;

&lt;p&gt;Its fast&lt;/p&gt;

&lt;h2&gt;
  
  
  How does it work?
&lt;/h2&gt;

&lt;p&gt;Well it's super simple:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Try to open the image with the code above.&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;If succeed we go to ascii_frame::turn_rgb_frame_to_ascii::turn_rgb_frame_to_ascii - that returns us ascii string which we simply dump in the terminal &lt;/p&gt;

&lt;p&gt;2.0 Before that^ we also initiate cache for ascii symbols with color there. Notice how we specify that hashmap is mutable so we allow ourself&lt;br&gt;
to later put items there, also notice how we don't have to specify type for it, that's because later in turn_rgb_frame_to_ascii definition will do that and rust will manage to infer that(awesome right?)&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;     &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="k"&gt;mut&lt;/span&gt; &lt;span class="n"&gt;term_symbols_cache&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;HashMap&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; 

     &lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;turn_rgb_frame_to_ascii&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;frame&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;DynamicImage&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;term_symbols_cache&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="k"&gt;mut&lt;/span&gt; &lt;span class="nn"&gt;std&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nn"&gt;collections&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;HashMap&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nn"&gt;image&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Rgba&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nb"&gt;u8&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;String&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;String&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

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


&lt;p&gt;2.1 In turn_rgb_frame_to_ascii first thing we do we call terminal_size to get size of terminal so we won't try to output millions of symbols for super small terminal window(so the smaller terminal screen the worst kind of quality you get while running the util)&lt;br&gt;
&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;        &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;size&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;terminal_size&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;resized_frame&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nf"&gt;Some&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nf"&gt;Width&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;w&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="nf"&gt;Height&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;h&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;size&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;resized_frame&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;frame&lt;/span&gt;&lt;span class="nf"&gt;.resize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;w&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nb"&gt;u32&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;h&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nb"&gt;u32&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nn"&gt;image&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nn"&gt;FilterType&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Nearest&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;resized_frame&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;frame&lt;/span&gt;&lt;span class="nf"&gt;.resize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;240&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;320&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nn"&gt;image&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nn"&gt;FilterType&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Nearest&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;&lt;br&gt;
 2.2 Then we go pixel by pixel in our resized image and get ascii value for each of them. Notice the match syntax for our hashMap(😍).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;        &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="k"&gt;mut&lt;/span&gt; &lt;span class="n"&gt;asciid_frame&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;String&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; 

        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;..&lt;/span&gt;&lt;span class="n"&gt;resized_frame&lt;/span&gt;&lt;span class="nf"&gt;.height&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="k"&gt;mut&lt;/span&gt; &lt;span class="n"&gt;ascii_row&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;String&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
            &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;column&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;..&lt;/span&gt;&lt;span class="n"&gt;resized_frame&lt;/span&gt;&lt;span class="nf"&gt;.width&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="k"&gt;mut&lt;/span&gt; &lt;span class="n"&gt;_ascii_symb&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;String&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
                &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;pixel&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;resized_frame&lt;/span&gt;&lt;span class="nf"&gt;.get_pixel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;column&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
                &lt;span class="k"&gt;match&lt;/span&gt; &lt;span class="n"&gt;term_symbols_cache&lt;/span&gt;&lt;span class="nf"&gt;.get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;pixel&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                    &lt;span class="nf"&gt;Some&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;symb&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;_ascii_symb&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;symb&lt;/span&gt;&lt;span class="nf"&gt;.to_string&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
                    &lt;span class="nb"&gt;None&lt;/span&gt; &lt;span class="k"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;_ascii_symb&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;get_ascii_symb_for_pixel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pixel&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;term_symbols_cache&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                &lt;span class="p"&gt;}&lt;/span&gt;
                &lt;span class="n"&gt;ascii_row&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;_ascii_symb&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
            &lt;span class="n"&gt;asciid_frame&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;ascii_row&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="n"&gt;asciid_frame&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&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;asciid_frame&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;br&gt;
2.3 Everything but one thing should be clear from the code above. Here is this one unclear thing bellow. The magic here is that function get_ascii_for_rgb_arr. Magic of it is explained &lt;a href="https://robertheaton.com/2018/06/12/programming-projects-for-advanced-beginners-ascii-art/" rel="noopener noreferrer"&gt;here&lt;/a&gt;. For the purpose of this article though we will avoid discussing details of it :-) And focus of how not hard it is to actually do all this thing in low level programming language&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;    &lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;get_ascii_symb_for_pixel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;pixel&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nn"&gt;image&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Rgba&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nb"&gt;u8&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;term_symbols_cache&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="k"&gt;mut&lt;/span&gt; &lt;span class="nn"&gt;std&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nn"&gt;collections&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;HashMap&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nn"&gt;image&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Rgba&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nb"&gt;u8&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nb"&gt;String&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;String&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;rgb_arr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;turn_pixel_to_arr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pixel&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="k"&gt;mut&lt;/span&gt; &lt;span class="n"&gt;ascii_symb&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;String&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;from&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\x1B&lt;/span&gt;&lt;span class="s"&gt;[48;2;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;ascii_symb&lt;/span&gt;&lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="nn"&gt;String&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;from&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nd"&gt;format!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"{};{};{}"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;pixel&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="n"&gt;pixel&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="n"&gt;pixel&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="n"&gt;ascii_symb&lt;/span&gt;&lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="nn"&gt;String&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;from&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"m"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;ascii_symb&lt;/span&gt;&lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="nf"&gt;get_ascii_for_rgb_arr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rgb_arr&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="nf"&gt;.to_string&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="n"&gt;ascii_symb&lt;/span&gt;&lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="nn"&gt;String&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;from&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\x1B&lt;/span&gt;&lt;span class="s"&gt;[0m"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;term_symbols_cache&lt;/span&gt;&lt;span class="nf"&gt;.insert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pixel&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ascii_symb&lt;/span&gt;&lt;span class="nf"&gt;.to_string&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
        &lt;span class="n"&gt;ascii_symb&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;turn_pixel_to_arr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rgb_pix&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nn"&gt;image&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Rgba&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nb"&gt;u8&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;f64&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;]{&lt;/span&gt;
        &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;rgb_pix&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nb"&gt;f64&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;rgb_pix&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="k"&gt;as&lt;/span&gt; &lt;span class="nb"&gt;f64&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;rgb_pix&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nb"&gt;f64&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="k"&gt;fn&lt;/span&gt;  &lt;span class="nf"&gt;get_ascii_for_rgb_arr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rgb_color&lt;/span&gt;&lt;span class="p"&gt;:[&lt;/span&gt;&lt;span class="nb"&gt;f64&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="k"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;char&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;char_vec&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nb"&gt;Vec&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nb"&gt;char&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"MNHQ$OC?7&amp;gt;!:-;. "&lt;/span&gt;&lt;span class="nf"&gt;.chars&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="nf"&gt;.collect&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;luminosity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nb"&gt;f64&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.21&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;rgb_color&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;+&lt;/span&gt; &lt;span class="mf"&gt;0.72&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;rgb_color&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mf"&gt;0.07&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;rgb_color&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="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;char_vec&lt;/span&gt;&lt;span class="p"&gt;[(&lt;/span&gt; &lt;span class="n"&gt;luminosity&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mf"&gt;256.0&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;char_vec&lt;/span&gt;&lt;span class="nf"&gt;.len&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nb"&gt;f64&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nb"&gt;usize&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;h2&gt;
  
  
  Have an awesome fall everyone!!!
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/MShel/termpic" rel="noopener noreferrer"&gt;https://github.com/MShel/termpic&lt;/a&gt;&lt;/p&gt;

</description>
      <category>rust</category>
      <category>ascii</category>
      <category>friday</category>
      <category>justforfun</category>
    </item>
    <item>
      <title>How do you measure code quality / engineering team performance?</title>
      <dc:creator>Misha Shelemetyev</dc:creator>
      <pubDate>Fri, 07 Jun 2019 14:56:59 +0000</pubDate>
      <link>https://forem.com/mshel/how-do-you-measure-code-quality-engineering-team-performance-cpl</link>
      <guid>https://forem.com/mshel/how-do-you-measure-code-quality-engineering-team-performance-cpl</guid>
      <description>&lt;p&gt;I've been looking into this problem for a while now and here are the few things that I came up with(however NaN of them feel quite right):&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Test code coverage&lt;/li&gt;
&lt;li&gt;Amount of bugs / Amount of features (%)&lt;/li&gt;
&lt;li&gt;AVG Page load time (assuming we talking about some sort of website)&lt;/li&gt;
&lt;li&gt;Cyclomatic complexity (spaghettines  of the code) should be small &lt;/li&gt;
&lt;li&gt;Essential Complexity (unnecessary loops and ifs)-should be small &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;So the question is how do you guys do it? and at what point (every 2weeks/ on the time of release/ every 1/2 year /every day/ every commit/ once in a blue moon)&lt;/p&gt;

</description>
      <category>help</category>
      <category>codequality</category>
      <category>teamwork</category>
      <category>discuss</category>
    </item>
  </channel>
</rss>
