<?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: Ilja (ilya) Nevolin</title>
    <description>The latest articles on DEV Community by Ilja (ilya) Nevolin (@codr).</description>
    <link>https://dev.to/codr</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F375726%2Fafc6910d-df6c-476b-9ac8-95057fbace0a.jpg</url>
      <title>DEV Community: Ilja (ilya) Nevolin</title>
      <link>https://dev.to/codr</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/codr"/>
    <language>en</language>
    <item>
      <title>Kubernetes Resource Management Best Practices</title>
      <dc:creator>Ilja (ilya) Nevolin</dc:creator>
      <pubDate>Wed, 19 Aug 2026 21:24:48 +0000</pubDate>
      <link>https://dev.to/codr/kubernetes-resource-management-best-practices-2ki6</link>
      <guid>https://dev.to/codr/kubernetes-resource-management-best-practices-2ki6</guid>
      <description>&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; &lt;br&gt;
set &lt;code&gt;requests.cpu&lt;/code&gt;, &lt;code&gt;requests.memory&lt;/code&gt;, and &lt;code&gt;limits.memory&lt;/code&gt;, but remove &lt;code&gt;limits.cpu&lt;/code&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Always set memory limit == request. Never set CPU limit"&lt;br&gt;
~ Tim Hockin, Kubernetes co-founder (&lt;a href="https://x.com/thockin/status/1134193838841401345" rel="noopener noreferrer"&gt;source&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;Google's GKE docs say the same thing: for the CPU request, "specify the minimum CPU needed... according to your own SLOs," then "set an unbounded CPU limit" (&lt;a href="https://docs.cloud.google.com/kubernetes-engine/docs/how-to/vertical-pod-autoscaling" rel="noopener noreferrer"&gt;source&lt;/a&gt;).&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Disclaimer&lt;/strong&gt;: this post is a short version of the full analysis I posted on &lt;a href="https://github.com/inevolin/k8s-cpu-limits-analyzed" rel="noopener noreferrer"&gt;GitHub here&lt;/a&gt;. Some of the images below should be animated (but SVGs are blocked on DEV.to), so I highly recommend reading it there as well.&lt;/p&gt;




&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fm0ssbm57310lztbm55aq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fm0ssbm57310lztbm55aq.png" alt="K8s resource config best pratices" width="720" height="326"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Most teams still set a CPU limit anyway, then spend their time fighting the throttling that follows. This analysis explains why the advice is right, and why so many people still get it wrong. Most charts set two CPU numbers, a request and a limit, and people treat them like the same setting with a bit of headroom.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The request is how much CPU is reserved for your pod if it needs it.&lt;/li&gt;
&lt;li&gt;The limit is a hard cap: hit it and the kernel throttles the pod, even when the node still has spare CPU.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There are exceptional use cases for using CPU limits (they exist for a reason), but your situation is unlikely one of them, meaning you probably should NOT set CPU limits (&lt;a href="https://github.com/inevolin/k8s-cpu-limits-analyzed#conclusion-drop-cpu-limits-keep-requests" rel="noopener noreferrer"&gt;see conclusion&lt;/a&gt;).&lt;/p&gt;

&lt;h2&gt;
  
  
  Why CPU requests are enough
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Linux already shares a node's CPU fairly among pods. That sharing is called CFS (Completely Fair Scheduler).&lt;/strong&gt; A request is a weight in the cgroup, not a pinned core. If the node is busy, CFS splits time in proportion to those weights: a 16 CPU request gets about sixteen times the CPU of a 1 CPU request. If the other pods are idle, a pod can use the leftover; when they need CPU again, those cores go back. None of this requires a CPU limit.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F58sjnm4x5lt5275xvfup.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F58sjnm4x5lt5275xvfup.png" alt="K8s pods borrowing CPU" width="720" height="326"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A limit is a separate cap, also enforced by CFS. Every 100 ms the kernel gives your pod a budget of CPU time, and every thread in the pod shares that budget. When it is gone, the pod is throttled until the next 100 ms. The node can be idle and the pod still waits. A 1 CPU limit on a 32-core node can still run on all 32 cores for a few milliseconds, then sit out the rest of the window. Four threads working at once burn a 500m budget in about 12 milliseconds. It is an average, not a reserved core.&lt;/p&gt;

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

&lt;h1&gt;
  
  
  Grafana shows the CPU is fine! No, your metrics are lying.
&lt;/h1&gt;

&lt;p&gt;The CPU graph on your Kubernetes dashboard usually averages a minute. CPU throttling lasts a tenth of a second. So the graph can look fine while the app is being throttled all the time. Watch &lt;code&gt;container_cpu_cfs_throttled_periods_total&lt;/code&gt;, not average CPU.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9rphd2vkxiolzikxxtep.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9rphd2vkxiolzikxxtep.png" alt="CPU Utilization vs Throttling periods" width="800" height="330"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Two views of the same 30 seconds: an average CPU graph that looks flat and fine, next to a CPU throttling graph on the same window showing the pod repeatedly hitting its limit&lt;/p&gt;

&lt;p&gt;People put a limit on because they are afraid some other app will starve their pod. That is what the request is for. The app you care about is protected by its own request. A runaway next door can use leftover CPU, but it cannot take the share you reserved. If leftover on the node is huge, the requests are too small. If teams can deploy with no request at all, give them a default request instead of putting a CPU limit on whoever looks greedy.&lt;/p&gt;

&lt;p&gt;The same blindness poisons right-sizing. Usage recorded under a CPU limit can never go above the limit: the cap clips every burst, so the history shows what the kernel allowed, not what the app wanted. Size a request from that history and you copy the cap's distortion into the request. Drop the limit first, let the app run for a while, then measure and set requests from numbers that were free to move.&lt;/p&gt;

&lt;h2&gt;
  
  
  Proof: the same app with and without a CPU limit
&lt;/h2&gt;

&lt;p&gt;In a controlled burst test, adding a CPU limit took typical latency from 23 ms to roughly 87 ms (about 4x slower), with the limited pod throttled in half of all CFS windows, while the average CPU graph looked fine the whole time.&lt;/p&gt;

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

&lt;h2&gt;
  
  
  How CPU limits cause memory issues and OOMKills
&lt;/h2&gt;

&lt;p&gt;A service with any kind of in-memory queue: a consumer buffering messages from Kafka or RabbitMQ faster than it can process them, an unbounded channel between two components, a server holding request payloads while handlers run behind.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F5mw7tw59ftu6y8wozpyw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F5mw7tw59ftu6y8wozpyw.png" alt="OOMKilled due to CPU limits in k8s case 1" width="720" height="392"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Any kind of application that has a garbage collector (GC) is a potential victim. In my experiment: every request builds a reference-dense graph of 10,000 small objects (~1.5 MiB) and holds it only while doing real work; once the request finishes, the graph is garbage. Nothing is retained anywhere, on purpose. What runs short here is the garbage collector's own CPU budget: on the capped pod (limits.cpu: 100m, the same value as the production incident this test is based on), in-flight requests pile up, the live object count grows with them, each GC cycle gets more expensive, and the collector fights the workload for the same shrinking quota.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fjc1s7hm6uxbk4ditqsdd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fjc1s7hm6uxbk4ditqsdd.png" alt="OOMKilled due to CPU limits in k8s case 2" width="720" height="420"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Even a simple HTTP API server is not spared. As http requests come in, and each one is holding its memory. Nothing stops the pile-up: web frameworks (ASP.NET Core, Node, Go, and friends) do not cap how many requests may run at once, and the await hands the thread back but keeps the buffer, so the thread pool does not cap it either.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Frtc0w34v1ak5f2kaob5n.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Frtc0w34v1ak5f2kaob5n.png" alt="OOMKilled due to CPU limits in k8s case 3" width="720" height="412"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;All three shapes end the same way on a graph: memory climbing into the limit. It looks like a leak, the usual fix is a bigger memory limit, and the actual cause is the CPU limit. Check &lt;code&gt;container_cpu_cfs_throttled_periods_total&lt;/code&gt; before you blindly raise limits.memory.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion and FAQs
&lt;/h2&gt;

&lt;p&gt;Dropping limits.cpu moves a pod from Guaranteed to Burstable QoS. In practice this rarely matters: the kubelet evicts for memory pressure, not CPU, and it ranks pods by how far usage exceeds the request, not by QoS class alone. Keep requests.memory equal to limits.memory and eviction exposure barely moves. Full answer, with the eviction docs link, in the FAQ.&lt;/p&gt;

&lt;h3&gt;
  
  
  FAQ
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Should I set CPU limits in Kubernetes?&lt;/strong&gt; For most services, no. Keep requests.cpu so CFS reserves your share, keep limits.memory, and drop limits.cpu. The exceptions (benchmarks, pinned cores, per-customer billing) are listed in the conclusion (&lt;a href="https://github.com/inevolin/k8s-cpu-limits-analyzed#conclusion-drop-cpu-limits-keep-requests" rel="noopener noreferrer"&gt;read more&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Doesn't a limit stop a bad pod from eating the node?&lt;/strong&gt; Monopolizing a node is a myth. Spare CPU is borrowed, not taken: the moment another pod wants CPU, CFS pulls those cores back within milliseconds and splits time by request weights again. A limit on the busy pod only stops it using CPU that would otherwise sit idle. It does not give CPU to anyone else: the neighbor is protected by its request. If several pods burst at once, the leftover is not first come first served, CFS divides it in proportion to their requests. If leftover on the node is huge, the requests on that node are too small.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;After I drop limits, can a burster hurt the node itself?&lt;/strong&gt; Not the other pods, but kubelet, containerd, the CNI, and log shippers often run with tiny or no CPU reservation. A pod bursting into all spare CPU can delay exec probes and flap readiness. The fix is system-reserved and kube-reserved in the kubelet config, which carves out CPU for the node's own daemons. A per-pod CPU limit is the wrong tool for this.&lt;/p&gt;

</description>
      <category>k8s</category>
      <category>kubernetes</category>
      <category>containers</category>
      <category>performance</category>
    </item>
    <item>
      <title>A cli tool to be more organized and productive in 2026</title>
      <dc:creator>Ilja (ilya) Nevolin</dc:creator>
      <pubDate>Sun, 01 Feb 2026 19:12:04 +0000</pubDate>
      <link>https://dev.to/codr/use-in-cli-to-stay-organized-12fe</link>
      <guid>https://dev.to/codr/use-in-cli-to-stay-organized-12fe</guid>
      <description>&lt;p&gt;We all "love" microservices, allegedly. But you know what isn't fun? Realizing you need to bump a dependency, run a build, git pull and create PRs across 15 different repositories at the same time.&lt;/p&gt;

&lt;p&gt;You usually have two options (if you don't want to use AI agents):&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;The "Tab Hoarder" Strategy Manually open 15 terminal tabs, cd into each one, run the command, and pray you didn't miss one.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The "Unix Wizard" Strategy You try to construct a one-liner that iterates over directories. You start typing:&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   find &lt;span class="nb"&gt;.&lt;/span&gt; &lt;span class="nt"&gt;-maxdepth&lt;/span&gt; 1 &lt;span class="nt"&gt;-type&lt;/span&gt; d &lt;span class="nt"&gt;-exec&lt;/span&gt; sh &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="s1"&gt;'cd "{}" &amp;amp;&amp;amp; git pull'&lt;/span&gt; &lt;span class="se"&gt;\;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It works, but it's painfully slow because it runs serially (one at a time). So you switch to xargs to run it in parallel:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="k"&gt;*&lt;/span&gt;/ | xargs &lt;span class="nt"&gt;-P&lt;/span&gt; 4 &lt;span class="nt"&gt;-I&lt;/span&gt; &lt;span class="o"&gt;{}&lt;/span&gt; bash &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="s2"&gt;"cd {} &amp;amp;&amp;amp; pnpm update"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now you have a problem. xargs (by default) breaks on directory names with spaces. To fix it, you need to add -print0 to find and -0 to xargs, and suddenly your "quick one-liner" is 80 characters long and unreadable.&lt;/p&gt;

&lt;p&gt;Enter in-cli 🚀 &lt;a href="https://github.com/inevolin/in-cli" rel="noopener noreferrer"&gt;https://github.com/inevolin/in-cli&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Usage:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;OPTIONS] &lt;span class="o"&gt;[&lt;/span&gt;DIRECTORIES...] &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;--&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; COMMAND...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I got tired of typing those boilerplate loops. I wanted a tool that does one thing well: runs a command in every directory, fast. So I built in-cli. It’s a zero-dependency CLI (pure bash) that acts as a force multiplier for your shell.&lt;/p&gt;

&lt;h2&gt;
  
  
  How it actually works
&lt;/h2&gt;

&lt;p&gt;Instead of wrestling with pipes and flags, you just tell it what to do.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Scenario 1: The Morning Routine&lt;/strong&gt; You get to work and need to update all 20 repos in your ~/work folder.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Updates every repo in ~/work/ directory&lt;/span&gt;
&lt;span class="k"&gt;in&lt;/span&gt; ~/work/&lt;span class="k"&gt;*&lt;/span&gt; git pull
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Scenario 2: The "Critical Fix" Deployment&lt;/strong&gt; You need to trigger a build script across all your services right now.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Run 'make build' in parallel across all subdirectories&lt;/span&gt;
&lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="nt"&gt;-P&lt;/span&gt; 8 ~/work/&lt;span class="k"&gt;*&lt;/span&gt; make build
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Scenario 3: Dependency Hell&lt;/strong&gt; Need to update lodash in every service because of a CVE?&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="k"&gt;in&lt;/span&gt; ~/work/&lt;span class="k"&gt;*&lt;/span&gt; &lt;span class="s1"&gt;'pnpm update lodash &amp;amp;&amp;amp; git commit -am "updating lodash" &amp;amp;&amp;amp; git push'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You'll find +50 other real-world scenarios in the &lt;a href="https://github.com/inevolin/in-cli/blob/main/EXAMPLES.md" rel="noopener noreferrer"&gt;EXAMPLES.md&lt;/a&gt; file.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why use this?
&lt;/h2&gt;

&lt;p&gt;Stop wasting time on tooling boilerplate. If you're managing a monorepo or a folder full of microservices, stop writing throwaway scripts to manage them. Check it out on GitHub, and let me know if it saves you a few keystrokes (and your sanity).&lt;/p&gt;

&lt;p&gt;Enjoy!&lt;/p&gt;

</description>
      <category>microservices</category>
      <category>productivity</category>
      <category>tooling</category>
      <category>linux</category>
    </item>
    <item>
      <title>Speech-to-Text Discord bot written in Go</title>
      <dc:creator>Ilja (ilya) Nevolin</dc:creator>
      <pubDate>Sat, 27 Jan 2024 22:42:16 +0000</pubDate>
      <link>https://dev.to/codr/speech-to-text-discord-bot-written-in-go-eih</link>
      <guid>https://dev.to/codr/speech-to-text-discord-bot-written-in-go-eih</guid>
      <description>&lt;p&gt;As part of my personal journey to learn Go, I've decided to rewrite one of my open source projects in GoLang.&lt;/p&gt;

&lt;p&gt;The project is a standalone (offline) speech-to-text bot for Discord. Basically it transcribes everything you say in a voice channel. This is useful if you want to have custom voice commands (eg. while gaming), or enhance the communication experience for hearing impaired/deaf people.&lt;/p&gt;

&lt;p&gt;Repository: &lt;a href="https://github.com/inevolin/DiscordEarsGo" rel="noopener noreferrer"&gt;https://github.com/inevolin/DiscordEarsGo&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The project makes use of the Vosk library, which does not work well on Mac OS (M1), so by default it is designed to only work on Linux x86 systems (since you would likely be hosting it on Linux). But the great thing is that Vosk works offline, open source and comes with a ton of models and languages (english, german, french, chinese, ...) for download &lt;a href="https://alphacephei.com/vosk/models" rel="noopener noreferrer"&gt;https://alphacephei.com/vosk/models&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;One of the annoying things was also to decode Opus packets to PCM, it requires opus libraries to be installed. The same is true for the NodeJS version (which now requires ffmpeg to be installed). It would be nice if there was a tiny library/snippet that does this (not external library).&lt;/p&gt;

&lt;p&gt;Enjoy!&lt;/p&gt;

</description>
      <category>go</category>
      <category>discord</category>
      <category>ai</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Work on Open Source projects to stand out in 2024</title>
      <dc:creator>Ilja (ilya) Nevolin</dc:creator>
      <pubDate>Tue, 02 Jan 2024 14:49:51 +0000</pubDate>
      <link>https://dev.to/codr/work-on-open-source-projects-to-stand-out-in-2024-3men</link>
      <guid>https://dev.to/codr/work-on-open-source-projects-to-stand-out-in-2024-3men</guid>
      <description>&lt;p&gt;Happy new year everyone!&lt;/p&gt;

&lt;p&gt;I thought of sharing something cool and fun with my fellow coders. A few years ago I created a speech-to-text bot for Discord,, initially designed to control my own music bot (at the time), but then people started using it to communicate better with their deaf gaming friends in real-time.&lt;/p&gt;

&lt;p&gt;This is the project: &lt;a href="https://github.com/inevolin/DiscordEarsBot" rel="noopener noreferrer"&gt;https://github.com/inevolin/DiscordEarsBot&lt;/a&gt; (the music bot is in another repo which needs a big update). The STT methods include offline and online APIs, so you get to choose the quality/performance you want. But with the rise in AI and ML jobs, this can serve as a great framework to build projects to stand out in your interviews:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use this technology in another tool (Slack, Zoom, phone, browser, ...)&lt;/li&gt;
&lt;li&gt;Use this technology to build voice-based games (maybe for handicapped kids)&lt;/li&gt;
&lt;li&gt;Improve the STT results by adding another ML model to correct the text&lt;/li&gt;
&lt;li&gt;Create a fun bot that "talks back" or tells jokes based on the conversation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you want to collaborate on a project, post in the comments below and match up with other people!&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>ai</category>
      <category>node</category>
      <category>javascript</category>
    </item>
    <item>
      <title>The dark truth behind Cryptocurrencies</title>
      <dc:creator>Ilja (ilya) Nevolin</dc:creator>
      <pubDate>Sun, 20 Nov 2022 18:05:52 +0000</pubDate>
      <link>https://dev.to/codr/the-dark-truth-behind-cryptocurrencies-1ef7</link>
      <guid>https://dev.to/codr/the-dark-truth-behind-cryptocurrencies-1ef7</guid>
      <description>&lt;p&gt;&lt;strong&gt;The environmental impact of blockchains&lt;/strong&gt; and cryptocurrencies cannot be overlooked. In particular Proof-of-Work systems such as Bitcoin have a huge (understated) energy footprint. In conventional cryptocurrency systems, tokens are awarded to “miners” for successfully mining blocks on the blockchain. The core problem is that mining consumes incomprehensible amounts of electrical energy.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7b4gdf25ip6lgv93pb6g.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7b4gdf25ip6lgv93pb6g.png" alt="Source: https://www.bbc.com/news/science-environment-56215787" width="800" height="687"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How bad is it?&lt;/strong&gt;&lt;br&gt;
According to several studies (&lt;a href="https://www.statista.com/statistics/881541/bitcoin-energy-consumption-transaction-comparison-visa/" rel="noopener noreferrer"&gt;link&lt;/a&gt;), a single Bitcoin transaction requires 2,180kWh, with this amount of energy you can execute over 1.4 million Visa transactions, or fully charge 29 Tesla cars (Model 3, 75kWh). Another research reveals Bitcoin system alone consumes half of the energy of the banking industry (&lt;a href="https://www.nasdaq.com/articles/research%3A-bitcoin-consumes-less-than-half-the-energy-of-the-banking-or-gold-industries" rel="noopener noreferrer"&gt;source&lt;/a&gt;). Pretty bad is an understatement...&lt;/p&gt;

&lt;p&gt;If you ask any expert, Bitcoins are a &lt;strong&gt;dramatic waste of natural resources&lt;/strong&gt;. Even if Bitcoin is fully run on renewable energy, its benefits will never outweigh the energy consumption (mind the natural resources, maintenance &amp;amp; production, material waste from solar panels, wind turbines, etc). You may also have seen articles trying to debunk Bitcoin fuds, but if you conduct some research, many of those authors are merely crypto influencers, acting as Hollywood scientists (&lt;a href="https://endthefud.org/" rel="noopener noreferrer"&gt;examples&lt;/a&gt;).&lt;/p&gt;

&lt;h2&gt;
  
  
  How can we solve this?
&lt;/h2&gt;

&lt;p&gt;I’m building the Carbon3 cryptocurrency that does not use a blockchain (requires no mining). It has better security and privacy wallet aspects than existing cryptocurrencies, stimulates good capitalistic behavior and enforces eco-friendly consumerism.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;About me&lt;/strong&gt;&lt;br&gt;
I work in the web3.0 industry with a particular stake in the decentralized-identity space. Whether we like it or not, blockchain technologies (in particular PoW ~ Bitcoin) are wasting precious energy resources from our planet 🌎, but fail to universally solve the centralized monetary issues 💰. The big institutions still dominate the financial sector, and are dominating the crypto industry as well. And with enforced Travel Rule worldwide, crypto loses its face as an anonymous system. &lt;/p&gt;

&lt;p&gt;Get in touch to learn more &lt;a href="https://www.linkedin.com/in/iljanevolin/" rel="noopener noreferrer"&gt;https://www.linkedin.com/in/iljanevolin/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>crypto</category>
      <category>blockchain</category>
      <category>bitcoin</category>
      <category>ethereum</category>
    </item>
    <item>
      <title>My First Month of Running an API-first Startup</title>
      <dc:creator>Ilja (ilya) Nevolin</dc:creator>
      <pubDate>Tue, 06 Apr 2021 21:51:17 +0000</pubDate>
      <link>https://dev.to/codr/my-first-month-of-running-an-api-first-startup-3oj7</link>
      <guid>https://dev.to/codr/my-first-month-of-running-an-api-first-startup-3oj7</guid>
      <description>&lt;p&gt;Early March I was hired to run and grow &lt;a href="https://www.spurwing.io/" rel="noopener noreferrer"&gt;Spurwing&lt;/a&gt;. I am in charge of the business development, sales and marketing aspects, and co-responsible for several engineering projects. In this post I'll share my personal insights, tips and tricks from my first month at an early-stage Startup company.&lt;/p&gt;

&lt;h2&gt;
  
  
  The company
&lt;/h2&gt;

&lt;p&gt;Our core product is the &lt;strong&gt;Appointment Scheduling API&lt;/strong&gt;. Our primary clients are engineering teams and managers. The API allows developers to innovate quicker, build cheaper and scale easier any kind of time sensitive process.&lt;/p&gt;

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

&lt;p&gt;The most common use cases we focus on are &lt;strong&gt;Time Management Solutions&lt;/strong&gt;. The most simple use cases are custom booking and scheduling widgets. The more complex solutions entail enterprise calendar management, remote team collaboration tools and supply chain management. Our products fit in any industry and can be used by most roles.&lt;/p&gt;

&lt;p&gt;We are not directly competing with products like Calendly. Our mission is providing engineering resources and tools to development teams to solve problems quicker, easier and cheaper. &lt;/p&gt;

&lt;p&gt;Spurwing is actually a spin-off product developed for &lt;a href="https://www.gethealthie.com/" rel="noopener noreferrer"&gt;Healthie Inc.&lt;/a&gt; where its technology is used to schedule and manage millions of annual bookings and events.&lt;/p&gt;

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

&lt;h2&gt;
  
  
  First week
&lt;/h2&gt;

&lt;p&gt;I have been working in software engineering, product and business development for over 10 years. So it was a fairly easy and efficient on-boarding process for me. Some of you may relate, but most of the things we do at Spurwing, and the challenges we face, I already faced before. I have a pretty solid idea of how to tackle most challenges and what it takes to execute.&lt;/p&gt;

&lt;p&gt;This being said, the first week I spent a lot of time communicating with the directors on our vision and strategy for Spurwing. The goal we set is building a large, free and &lt;a href="https://github.com/Spurwing/" rel="noopener noreferrer"&gt;open-source Marketplace&lt;/a&gt;. This marketplace will contain a ton of resources and tools for engineering teams and developers. These include API libraries, widgets, chat bots, management dashboards and many integrations with 3rd party providers.&lt;/p&gt;

&lt;p&gt;Giving away all these resources for free provides us with great marketing opportunities and a big advantage over the competition as well.&lt;/p&gt;

&lt;p&gt;Once we had our goal clearly defined, it was time to execute. I started building the libraries for the API in several programming languages: Python, NodeJS, JavaScript/Ajax and we are working on Java, C++ and C# as well. Thanks to these libraries we can now easily and quickly build new tools and platforms.&lt;/p&gt;

&lt;h2&gt;
  
  
  Second week
&lt;/h2&gt;

&lt;p&gt;Research is an important activity I do on a daily basis. Specifically I research and note down all types of projects and solutions for us to work on. &lt;/p&gt;

&lt;p&gt;I started building the most crucial ones first: 1:1 appointment scheduling widgets for websites, calendar links and the like.&lt;/p&gt;

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

&lt;h2&gt;
  
  
  Third week
&lt;/h2&gt;

&lt;p&gt;I spent that week mostly on research, prospecting and talking to potential clients. Most communication happens on LinkedIn or email. LinkedIn is great, but it's not easy to get people to talk to you. Most senior engineers and managers have no time to chat with randoms. It's all about finding the ones that are active and engage with them.&lt;/p&gt;

&lt;p&gt;A quite popular solution we built that week was a Facebook Messenger Chat Bot with booking / scheduling capabilities:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcjb8cpsnvbyc3lrm8c16.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcjb8cpsnvbyc3lrm8c16.gif" alt="chat bot for scheduling demo" width="295" height="405"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We are still in the process of improving this chat bot, enhancing the user experience and experimenting with new features. Aside from that we have several more chat bot integrations in the pipeline: Discord, Slack, WhatsApp, Skype, Intercom, Amazon Lex, Google Chat and more.&lt;/p&gt;

&lt;p&gt;We started building a CI/CD pipeline for all our libraries, widgets and tools on the marketplace. Over the years I became very proactive of Test Driven Development and the value that CI/CD pipelines provide to engineering &amp;amp; QA teams. These days I no longer build products without having some decent automated testing (and deployment) included.&lt;/p&gt;

&lt;h2&gt;
  
  
  Fourth week
&lt;/h2&gt;

&lt;p&gt;Mostly prospecting, building marketing content and researching product ideas. In addition to that we built a simple scheduling too for international teams across different time zones:&lt;/p&gt;

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

&lt;p&gt;Tools like these allow us to save precious time and be more productive internally. Most of our employees and partners are located at different time zones, thus setting up meetings can sometimes be a hassle. This tool allows all participants to submit their availability for a certain date range. The organizer of the event can then view a strict overlap of all the submissions and choose a time slot that works for all. It's a quite simple and basic implementation but provides a huge value.&lt;/p&gt;

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

&lt;p&gt;You may wonder how the heck we get so much done in just under a month. It's all about great management mixed with experience &amp;amp; expertise.&lt;/p&gt;

&lt;p&gt;We use Slack / Discord to easily and quickly communicate with all our business and engineering teams. We spend very little time on email or phone communication. We only have one dedicated video chat call per week to catch up. As you can see, we try to minimize and reduce any unnecessary bottlenecks. This allows us to be extremely productive.&lt;/p&gt;

&lt;p&gt;If you have any specific questions, post them down below!&lt;/p&gt;

&lt;h3&gt;
  
  
  Useful links
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://dev.to/spurwing"&gt;Spurwing blog on DEV&lt;/a&gt;&lt;br&gt;
&lt;a href="https://github.com/Spurwing/" rel="noopener noreferrer"&gt;Open-Source Marketplace&lt;/a&gt;&lt;br&gt;
&lt;a href="https://www.slideshare.net/IljaNevolin/time-management-tools-appointment-scheduling-software-and-booking-solutions-for-business-teams" rel="noopener noreferrer"&gt;Brochure&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  About me
&lt;/h3&gt;

&lt;p&gt;I'm a modest Software engineer with +10yrs of experience in building software for web, desktop and some Android stuff. Multi-Startup founder and product developer. Feel free to connect: &lt;a href="https://www.linkedin.com/in/iljanevolin/" rel="noopener noreferrer"&gt;https://www.linkedin.com/in/iljanevolin/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ciao!&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>webdev</category>
      <category>programming</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Do you even Refactor? 003</title>
      <dc:creator>Ilja (ilya) Nevolin</dc:creator>
      <pubDate>Sun, 14 Feb 2021 22:34:19 +0000</pubDate>
      <link>https://dev.to/codr/do-you-even-refactor-003-3emc</link>
      <guid>https://dev.to/codr/do-you-even-refactor-003-3emc</guid>
      <description>&lt;p&gt;Code refactoring is crucial but often overlooked. It can improve the design and performance of existing code.&lt;/p&gt;

&lt;p&gt;The Python code below takes about 14 seconds to complete. Refactor the &lt;code&gt;getData&lt;/code&gt; function to make it run in less than 10 seconds. Post your answer in the comments.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;getData&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
  &lt;span class="n"&gt;arr&lt;/span&gt; &lt;span class="o"&gt;=&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;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;arr&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;lo&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;hi&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="mi"&gt;0&lt;/span&gt;
  &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;arr&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;lo&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
      &lt;span class="n"&gt;lo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;hi&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
      &lt;span class="n"&gt;hi&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;
  &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;lo&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;hi&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;arr&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;timed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;func&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;Tstart&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;time&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="nf"&gt;func&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;  
    &lt;span class="n"&gt;Tend&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;time&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;Tdt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;round&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Tend&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;Tstart&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="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Tdt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;seconds&lt;/span&gt;&lt;span class="sh"&gt;'&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;run&lt;/span&gt;

&lt;span class="nd"&gt;@timed&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
  &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;getData&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;len:&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;sum:&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

&lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>beginners</category>
      <category>codenewbie</category>
      <category>python</category>
      <category>challenge</category>
    </item>
    <item>
      <title>Do you even Refactor? 002</title>
      <dc:creator>Ilja (ilya) Nevolin</dc:creator>
      <pubDate>Sat, 13 Feb 2021 16:29:43 +0000</pubDate>
      <link>https://dev.to/codr/do-you-even-refactor-002-4i9h</link>
      <guid>https://dev.to/codr/do-you-even-refactor-002-4i9h</guid>
      <description>&lt;p&gt;Code refactoring is crucial but often overlooked. It can improve the design and performance of existing code.&lt;/p&gt;

&lt;p&gt;The Python code below takes about 17 seconds to complete. Refactor the &lt;code&gt;getData&lt;/code&gt; function to make it run in less than 5 seconds. Post your answer in the comments.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;getData&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
  &lt;span class="n"&gt;arr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;
  &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&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="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;arr&lt;/span&gt;&lt;span class="p"&gt;)):&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="mi"&gt;5&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="n"&gt;arr&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&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="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;arr&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;timed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;func&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;Tstart&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;time&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="nf"&gt;func&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;  
    &lt;span class="n"&gt;Tend&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;time&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;Tdt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;round&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Tend&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;Tstart&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="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Tdt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;seconds&lt;/span&gt;&lt;span class="sh"&gt;'&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;run&lt;/span&gt;

&lt;span class="nd"&gt;@timed&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
  &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;getData&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;len:&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;sum:&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

&lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>codenewbie</category>
      <category>beginners</category>
      <category>python</category>
      <category>algorithms</category>
    </item>
    <item>
      <title>Do you even Refactor? 001</title>
      <dc:creator>Ilja (ilya) Nevolin</dc:creator>
      <pubDate>Sat, 13 Feb 2021 12:16:51 +0000</pubDate>
      <link>https://dev.to/codr/do-you-even-refactor-001-2ed3</link>
      <guid>https://dev.to/codr/do-you-even-refactor-001-2ed3</guid>
      <description>&lt;p&gt;Code refactoring is crucial but often overlooked. It can improve the design and performance of existing code.&lt;/p&gt;

&lt;p&gt;The Python code below takes about 12 seconds to execute. Refactor the &lt;code&gt;getData&lt;/code&gt; function to make it run in less than 1 second. Post your answer in the comments.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;getData&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
  &lt;span class="n"&gt;arr&lt;/span&gt; &lt;span class="o"&gt;=&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;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;arr&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&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;arr&lt;/span&gt;


&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;timed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;func&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;Tstart&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;time&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="nf"&gt;func&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;  
    &lt;span class="n"&gt;Tend&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;time&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;Tdt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;round&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Tend&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;Tstart&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="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Tdt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;seconds&lt;/span&gt;&lt;span class="sh"&gt;'&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;run&lt;/span&gt;

&lt;span class="nd"&gt;@timed&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
  &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;getData&lt;/span&gt;&lt;span class="p"&gt;()))&lt;/span&gt;

&lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>codenewbie</category>
      <category>beginners</category>
      <category>python</category>
      <category>algorithms</category>
    </item>
    <item>
      <title>MultiVariate Anomaly Detection</title>
      <dc:creator>Ilja (ilya) Nevolin</dc:creator>
      <pubDate>Sun, 07 Feb 2021 16:21:37 +0000</pubDate>
      <link>https://dev.to/codr/multivariate-anomaly-detection-51pi</link>
      <guid>https://dev.to/codr/multivariate-anomaly-detection-51pi</guid>
      <description>&lt;p&gt;Discovering anomalies in complex multivariate and multidimensional data can be quite a challenge. Visualizing these anomalies can be even trickier, especially if you want to keep it simple without having to go over thousands of charts to filter out issues from false positives and noise. Using statistical methods we can aggregate complex data to be displayed on a single heatmap. By hovering over specific cells, we can quickly display the individual data on charts.&lt;/p&gt;

&lt;p&gt;Heatmap: &lt;a href="https://healzer.github.io/Industrial-Data-Analysis/hmap1.html?testdays=3&amp;amp;testlike=1" rel="noopener noreferrer"&gt;https://healzer.github.io/Industrial-Data-Analysis/hmap1.html?testdays=3&amp;amp;testlike=1&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;This system was first implemented for a high-tech enterprise's CI/CD pipeline. It is being used by R&amp;amp;D, Q&amp;amp;A and management to keep track of all processes and variables throughout the development lifecycle. Any anomalies can easily be identified and pinpointed as soon as they appear on the heatmap. Anomalous decreases (green) indicate performance improvements (time, memory and parameter reductions), while degradations (red) imply performance issues.&lt;/p&gt;

&lt;p&gt;Very subtle improvements or degradations are tricky to identify and detect, but overall the system has a very high accuracy. The best use of this system is for data that should remain static over time, it may not work very well if you have alternating/seasonal data. Separate charts can be built for mapping GitHub commits to each individual data point, allowing the team to instantly pinpoint which code change caused which performance change.&lt;/p&gt;

&lt;p&gt;The demo URL can contains three parameters:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;testdays&lt;/code&gt;: how many days from the data should be used as test data (versus baseline data)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;testlike&lt;/code&gt;: filter data whose test value should contain a certain string (these are the Y-axis values)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;annotate&lt;/code&gt;: (0 or 1) primarily for debugging reasons, indicating whether to show Z-values on each cell (may slow down your browser!)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This code may not be directly usable for your purposes, but the general idea of using statistical functions like MADe and Z-values to detect anomalies in datasets may be very useful in CI/CD pipelines but also many industrial processes.&lt;/p&gt;

&lt;p&gt;GitHub: &lt;a href="https://github.com/healzer/Industrial-Data-Analysis" rel="noopener noreferrer"&gt;https://github.com/healzer/Industrial-Data-Analysis&lt;/a&gt;&lt;/p&gt;

</description>
      <category>machinelearning</category>
      <category>webdev</category>
      <category>javascript</category>
      <category>datascience</category>
    </item>
    <item>
      <title>Multipurpose tables as CRM and to-do lists</title>
      <dc:creator>Ilja (ilya) Nevolin</dc:creator>
      <pubDate>Sat, 06 Feb 2021 12:32:50 +0000</pubDate>
      <link>https://dev.to/codr/multipurpose-tables-as-crm-and-to-do-lists-gem</link>
      <guid>https://dev.to/codr/multipurpose-tables-as-crm-and-to-do-lists-gem</guid>
      <description>&lt;p&gt;Most of you know CRM by the many advanced tools out there such as Salesforce, Capterra and Hubspot. But millions of small companies still use Excel/Word/Files/Directories to manage their accounts, invoices and projects. I have met very few individual contractors who use productivity tools/apps, even simple things like notepad apps to record customer requests and issues. Even fewer apply basic CRM practices to stay in touch with their customers, such as keeping their contact details and/or sending out promotional emails.&lt;/p&gt;

&lt;p&gt;I understand that for many businesses it may seem like a lot of overhead with little or no immediate value. But some of these do wish to grow and expand their operations, thus seek low-cost solutions.&lt;/p&gt;

&lt;p&gt;Since I started the &lt;a href="https://github.com/healzer/PyCRM" rel="noopener noreferrer"&gt;PyCRM&lt;/a&gt; project I have been thinking of very simple yet effective ways of doing CRM. Since every business is different, everyone wants a slightly different interface, customization is key.&lt;/p&gt;

&lt;p&gt;I remembered that there are many Javascript libraries that provide customizable tables/forms. In addition many of these use very simple data structures which can easily be serialized as JSON and stored as a file without using a complex (No)SQL database.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F4u41lhro1l9tb341ccko.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F4u41lhro1l9tb341ccko.png" alt="Alt Text" width="799" height="343"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In the latest addition to our &lt;a href="https://github.com/healzer/PyCRM" rel="noopener noreferrer"&gt;PyCRM&lt;/a&gt; project, we can use the JS Tabulator library which provides this functionality. You can easily customize the columns, fields and hundreds of other features.&lt;/p&gt;

&lt;p&gt;Since it's a SaaS page, it works pretty well on mobile devices. You can use it anywhere as long as you have an internet connection. The save button saves any changes on the server. &lt;/p&gt;

&lt;p&gt;This is a very basic implementation, so be very careful when it is used by multiple people at once. When multiple people save then only ones' version will be stored, the other changes will be overridden and lost.&lt;/p&gt;

&lt;p&gt;An improved implementation would be to commit individual fields instead of the entire dataset. But also keep any changes automatically synced over all active users. Once again this isn't difficult to implement but depends on whether you need it or not.&lt;/p&gt;

&lt;p&gt;Apart from using this as a CRM, you can turn this into a simple project management tool, or a to-do list or a sales tracking tool, etc. Enjoy!&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>beginners</category>
      <category>datascience</category>
    </item>
    <item>
      <title>Mr. Meow meow 😹</title>
      <dc:creator>Ilja (ilya) Nevolin</dc:creator>
      <pubDate>Sat, 30 Jan 2021 20:03:47 +0000</pubDate>
      <link>https://dev.to/codr/meow-synthesizer-3b0i</link>
      <guid>https://dev.to/codr/meow-synthesizer-3b0i</guid>
      <description>&lt;p&gt;Past few weeks I was obsessed with the song &lt;a href="https://www.youtube.com/watch?v=CX45pYvxDiA" rel="noopener noreferrer"&gt;Mr Sandman&lt;/a&gt;. And been thinking of making a cat edition of this beat.&lt;/p&gt;

&lt;p&gt;Since I couldn't find anything decent on YouTube, it was time to have a productive Saturday!&lt;/p&gt;

&lt;p&gt;Video Demo 1: &lt;a href="https://www.youtube.com/watch?v=y7hKNtucQbg" rel="noopener noreferrer"&gt;https://www.youtube.com/watch?v=y7hKNtucQbg&lt;/a&gt;&lt;br&gt;
Video Demo 2: &lt;a href="https://www.youtube.com/watch?v=Eu4TOEb1xII" rel="noopener noreferrer"&gt;https://www.youtube.com/watch?v=Eu4TOEb1xII&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Live Demo: &lt;a href="https://nevolin.be/meow/" rel="noopener noreferrer"&gt;https://nevolin.be/meow/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;GitHub: &lt;a href="https://github.com/healzer/MeowSynth" rel="noopener noreferrer"&gt;https://github.com/healzer/MeowSynth&lt;/a&gt;&lt;br&gt;
&lt;em&gt;This code may not work on a mobile device (not sure why).&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Implementation
&lt;/h2&gt;

&lt;p&gt;I'll briefly explain how I made this.&lt;/p&gt;

&lt;p&gt;I used &lt;a href="https://tonejs.github.io/" rel="noopener noreferrer"&gt;ToneJS&lt;/a&gt; which allows us to sample and synthesize mp3 sounds and use them as separate notes (it does some manipulations behind the scenes).&lt;/p&gt;

&lt;p&gt;Next we need the piano notes of this song, so I Googled for a MIDI file and used &lt;a href="https://tonejs.github.io/Midi/" rel="noopener noreferrer"&gt;ToneJS MIDI to JSON tool&lt;/a&gt; to get the bass and treble notes as arrays. &lt;/p&gt;

&lt;p&gt;Those arrays can be merged and used as input for the Sampler :)&lt;/p&gt;

&lt;p&gt;There is a lot of tuning possible, getting better meow sounds and/or more different samples. You can observe this in the code. It's just a few lines that you can play with.&lt;/p&gt;

&lt;p&gt;Happy meow! Who can make us a dog, sheep and horse edition?&lt;/p&gt;

</description>
      <category>music</category>
      <category>javascript</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
