<?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: NordicBeaver</title>
    <description>The latest articles on DEV Community by NordicBeaver (@nordicbeaver).</description>
    <link>https://dev.to/nordicbeaver</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%2F707272%2F080019c1-8067-42ab-8edc-98bb0e6c8362.png</url>
      <title>DEV Community: NordicBeaver</title>
      <link>https://dev.to/nordicbeaver</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/nordicbeaver"/>
    <language>en</language>
    <item>
      <title>Top programming and tech videos of December 2022.</title>
      <dc:creator>NordicBeaver</dc:creator>
      <pubDate>Thu, 12 Jan 2023 15:01:39 +0000</pubDate>
      <link>https://dev.to/nordicbeaver/top-programming-and-tech-videos-of-december-2022-1ojc</link>
      <guid>https://dev.to/nordicbeaver/top-programming-and-tech-videos-of-december-2022-1ojc</guid>
      <description>&lt;p&gt;A bit late this month, but here we go. The best tech and programming related YouTube videos of December 2022!&lt;/p&gt;

&lt;h2&gt;
  
  
  Game development and math
&lt;/h2&gt;

&lt;p&gt;A gorgeously animated video explaining how splines work and the math behind them.&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/jvPPXbo87ds"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;&lt;a href="https://wheatcha.com/videos/best/2022-12?tag=30e7b029-1e0b-40c2-9465-0e6c5cf5b991" rel="noopener noreferrer"&gt;More game development videos of December&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  AI
&lt;/h2&gt;

&lt;p&gt;Everyone is talking about that ChatGPT thing. Want to know why? Watch this!&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/yIZqIMNvqjg"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;&lt;a href="https://wheatcha.com/videos/best/2022-12?tag=c3a317d2-ca7b-4f3b-b369-4023f8bde188" rel="noopener noreferrer"&gt;More AI videos of December&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Web development
&lt;/h2&gt;

&lt;p&gt;An introduction to SvelteKit 1.0.&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/uEJ-Rnm2yOE"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;&lt;a href="https://wheatcha.com/videos/best/2022-12?tag=49aa2c6c-acd9-4d0a-81f9-3f666971fa9d" rel="noopener noreferrer"&gt;More web development videos of November&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Tutorial
&lt;/h2&gt;

&lt;p&gt;From zero to a complete app pog fr fr.&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/KjY94sAKLlw"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;&lt;a href="https://wheatcha.com/videos/best/2022-12?tag=c7fc22c3-2f9b-41bf-81ea-7f71dd6d83c8" rel="noopener noreferrer"&gt;More tutorial videos of November&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  More?
&lt;/h2&gt;

&lt;p&gt;I'm developing a catalogue of programming and tech videos called &lt;a href="https://wheatcha.com/" rel="noopener noreferrer"&gt;Wheatcha&lt;/a&gt;. Feel free to come by if you want to find more cool stuff.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where is &lt;code&gt;{my_favourite_youtuber}&lt;/code&gt;???!!!
&lt;/h2&gt;

&lt;p&gt;Did I miss someone? Feel free to let me know in the comments and I'll fix it next month.&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>career</category>
      <category>learning</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Double pendulums, how do they work? | Physics | Simulation | TypeScript</title>
      <dc:creator>NordicBeaver</dc:creator>
      <pubDate>Sat, 07 Jan 2023 07:49:38 +0000</pubDate>
      <link>https://dev.to/nordicbeaver/double-pendulums-how-do-they-work-physics-simulation-typescript-2cg1</link>
      <guid>https://dev.to/nordicbeaver/double-pendulums-how-do-they-work-physics-simulation-typescript-2cg1</guid>
      <description>&lt;p&gt;Are you guys interested in a little sprinkle of physics and simulations on your web dev journey? Here is a perfect (okay, maybe just good (or not...)) tutorial just for you!&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/vjVAibzNO2U"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

</description>
      <category>socialmedia</category>
      <category>offers</category>
      <category>watercooler</category>
    </item>
    <item>
      <title>Wheatcha - IT videos catalogue. New update: The library grows!</title>
      <dc:creator>NordicBeaver</dc:creator>
      <pubDate>Wed, 23 Nov 2022 13:17:25 +0000</pubDate>
      <link>https://dev.to/nordicbeaver/wheatcha-tech-videos-catalogue-new-update-the-library-grows-c4f</link>
      <guid>https://dev.to/nordicbeaver/wheatcha-tech-videos-catalogue-new-update-the-library-grows-c4f</guid>
      <description>&lt;p&gt;&lt;a href="https://wheatcha.com/"&gt;Wheatcha&lt;/a&gt; is a new platform I'm building. It's an online catalogue of tech and programming videos on YouTube. The plan is to make it easier to find something like '&lt;em&gt;The best step-by-step tutorials of developing a backend with TypeScript and Prisma of 2022&lt;/em&gt;'.&lt;/p&gt;

&lt;p&gt;In this update I wanted to announce that a lot of videos were added to the library. Right now it contains about 40 channels and almost 500 videos. And don't forget dozens of tags that have been assigned to these videos. It's still only a fraction of all the free content you can see on YouTube and the plan is to add more and more every day. &lt;/p&gt;

&lt;p&gt;If you think a platform like this is interesting, you can always help as well. Let me know about your favorite creator or a video in the comments, and I'll add it right away. And, of course, if it's already on &lt;a href="https://wheatcha.com/"&gt;Wheatcha&lt;/a&gt;, you can already rate it to help the algorithm. I would greatly appreciate it. &lt;/p&gt;

</description>
      <category>tutorial</category>
      <category>programming</category>
      <category>beginners</category>
      <category>computerscience</category>
    </item>
    <item>
      <title>Wheatcha - MVP release! A catalogue of the best tech videos on YouTube.</title>
      <dc:creator>NordicBeaver</dc:creator>
      <pubDate>Fri, 18 Nov 2022 16:42:02 +0000</pubDate>
      <link>https://dev.to/nordicbeaver/wheatcha-mvp-release-a-catalogue-of-the-best-tech-videos-on-youtube-3aok</link>
      <guid>https://dev.to/nordicbeaver/wheatcha-mvp-release-a-catalogue-of-the-best-tech-videos-on-youtube-3aok</guid>
      <description>&lt;h2&gt;
  
  
  What's Wheatcha?
&lt;/h2&gt;

&lt;p&gt;Don't know about you guys, but I love watching programming and IT videos on YouTube. So much, that at one point I found myself in some kind of a tutorial hell people keep talking about. I managed to escape it, but I still appreciate how much free content people are producing every day.&lt;/p&gt;

&lt;p&gt;But there is one big problem. It's not that easy to find a video about a topic you're interested in. And even if you find a couple, there is no quick way to know how good they are. Especially now that YouTube removed dislikes.&lt;/p&gt;

&lt;p&gt;That's why we decided to create &lt;a href="https://wheatcha.com/" rel="noopener noreferrer"&gt;Wheatcha&lt;/a&gt;. A catalogue of tech related videos, with tags, ratings, reviews, and more. So that you can easily find the best React video of 2020, that is a complete step-by-step tutorial and also TypeScript is used.&lt;/p&gt;

&lt;p&gt;And today we released the first MVP version of the platform. Obviously not all the features are there yet, but we were just too curious to see if someone likes the idea.&lt;/p&gt;

&lt;h2&gt;
  
  
  Our plans
&lt;/h2&gt;

&lt;p&gt;The roadmap is pretty big. Here are some of the features we're planning to implement next&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Way bigger library.&lt;/li&gt;
&lt;li&gt;Complex search with multiple filters.&lt;/li&gt;
&lt;li&gt;User reviews.&lt;/li&gt;
&lt;li&gt;Design updates.&lt;/li&gt;
&lt;li&gt;And more!&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We could also use some help from the community. If you think your favorite youtuber is missing, just let us know in the comments and we will gladly add their videos. Any suggestions regarding functionality, design, tags would also be greatly appreciated. Or feel free to just say hi if you think a platform like this would be useful to you.&lt;/p&gt;

&lt;p&gt;See you on &lt;a href="https://wheatcha.com/" rel="noopener noreferrer"&gt;Wheatcha&lt;/a&gt;!&lt;/p&gt;

</description>
      <category>braziliandevs</category>
    </item>
    <item>
      <title>React SketchBoard DevLog #2 - Zoom, fix bugs and improve code quality.</title>
      <dc:creator>NordicBeaver</dc:creator>
      <pubDate>Sun, 10 Apr 2022 16:50:49 +0000</pubDate>
      <link>https://dev.to/nordicbeaver/react-sketchboard-devlog-2-zoom-fix-bugs-and-improve-code-quality-2dcf</link>
      <guid>https://dev.to/nordicbeaver/react-sketchboard-devlog-2-zoom-fix-bugs-and-improve-code-quality-2dcf</guid>
      <description>&lt;p&gt;This is a second video in a series of making a react library for drawing stuff in a browser. We'll look at how to implement zooming, make it work with a mouse wheel, fix a couple of bugs and refactor the code a bit.&lt;/p&gt;

&lt;p&gt;For the project I'm using react and typescript.&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/d_ZU9tx9R_c"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>typescript</category>
      <category>react</category>
    </item>
    <item>
      <title>Making a rain animation with WebGL shaders in Three.js.</title>
      <dc:creator>NordicBeaver</dc:creator>
      <pubDate>Tue, 14 Dec 2021 13:46:39 +0000</pubDate>
      <link>https://dev.to/nordicbeaver/making-rain-animation-with-webgl-shaders-in-threejs-4ic5</link>
      <guid>https://dev.to/nordicbeaver/making-rain-animation-with-webgl-shaders-in-threejs-4ic5</guid>
      <description>&lt;p&gt;I made a small shader that resembles rain on a window. You can try it &lt;a href="https://rain-shader.nordicbeaver.io/" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Check out the full code here:&lt;br&gt;
&lt;/p&gt;
&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/NordicBeaver" rel="noopener noreferrer"&gt;
        NordicBeaver
      &lt;/a&gt; / &lt;a href="https://github.com/NordicBeaver/rain-shader" rel="noopener noreferrer"&gt;
        rain-shader
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;rain-shader&lt;/h1&gt;

&lt;/div&gt;
&lt;p&gt;A simple raindrops shader implemented in WebGL.&lt;/p&gt;
&lt;p&gt;Live version: &lt;a href="https://rain-shader.nordicbeaver.io/" rel="nofollow noopener noreferrer"&gt;https://rain-shader.nordicbeaver.io/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;More details: &lt;a href="https://www.youtube.com/watch?v=Rl3clbrsI40" rel="nofollow noopener noreferrer"&gt;https://www.youtube.com/watch?v=Rl3clbrsI40&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;



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


&lt;p&gt;The most interesting part is the fragment shader, where the magic happens. I tried to add some comments, so it's easier to read.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight glsl"&gt;&lt;code&gt;&lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="kt"&gt;vec2&lt;/span&gt; &lt;span class="n"&gt;uvInterpolator&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;uniform&lt;/span&gt; &lt;span class="kt"&gt;float&lt;/span&gt; &lt;span class="n"&gt;u_time&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;uniform&lt;/span&gt; &lt;span class="kt"&gt;sampler2D&lt;/span&gt; &lt;span class="n"&gt;u_texture&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// Generate a random float from a single input and seed.&lt;/span&gt;
&lt;span class="kt"&gt;float&lt;/span&gt; &lt;span class="nf"&gt;Random11&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;float&lt;/span&gt; &lt;span class="n"&gt;inputValue&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;float&lt;/span&gt; &lt;span class="n"&gt;seed&lt;/span&gt;&lt;span class="p"&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;fract&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sin&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;inputValue&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;345&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;456&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;seed&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Generate a random float from a 2d input and seed.&lt;/span&gt;
&lt;span class="kt"&gt;float&lt;/span&gt; &lt;span class="nf"&gt;Random21&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;vec2&lt;/span&gt; &lt;span class="n"&gt;inputValue&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;float&lt;/span&gt; &lt;span class="n"&gt;seed&lt;/span&gt;&lt;span class="p"&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;fract&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sin&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;inputValue&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;vec2&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;123&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;456&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;43&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;seed&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Generate drops as distortions, that can be applied to UV coordinates&lt;/span&gt;
&lt;span class="kt"&gt;vec2&lt;/span&gt; &lt;span class="nf"&gt;Drops&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;vec2&lt;/span&gt; &lt;span class="n"&gt;uv&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;float&lt;/span&gt; &lt;span class="n"&gt;seed&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// Randmply move everything&lt;/span&gt;
  &lt;span class="kt"&gt;float&lt;/span&gt; &lt;span class="n"&gt;shiftY&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Random11&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;seed&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="n"&gt;uv&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;shiftY&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="c1"&gt;// Split UV spac into cells. Each cell will contain a drop.&lt;/span&gt;
  &lt;span class="kt"&gt;float&lt;/span&gt; &lt;span class="n"&gt;cellsResolution&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="n"&gt;uv&lt;/span&gt; &lt;span class="o"&gt;*=&lt;/span&gt; &lt;span class="n"&gt;cellsResolution&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="c1"&gt;// Move each row randomly.&lt;/span&gt;
  &lt;span class="kt"&gt;float&lt;/span&gt; &lt;span class="n"&gt;rowIndex&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;floor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;uv&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kt"&gt;float&lt;/span&gt; &lt;span class="n"&gt;shiftX&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Random11&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rowIndex&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;seed&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="n"&gt;uv&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;shiftX&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="kt"&gt;vec2&lt;/span&gt; &lt;span class="n"&gt;cellIndex&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;floor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;uv&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kt"&gt;vec2&lt;/span&gt; &lt;span class="n"&gt;cellUv&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;fract&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;uv&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="kt"&gt;vec2&lt;/span&gt; &lt;span class="n"&gt;cellCenter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;vec2&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kt"&gt;float&lt;/span&gt; &lt;span class="n"&gt;distanceFromCenter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;distance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cellUv&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cellCenter&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="c1"&gt;// We don't want to show every drop. So randomly remove some of them.&lt;/span&gt;
  &lt;span class="kt"&gt;float&lt;/span&gt; &lt;span class="n"&gt;isDropShown&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;step&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Random21&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cellIndex&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;seed&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;14244&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;324&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;

  &lt;span class="c1"&gt;// Decrease each drop intensity with time. Then make it appear again.&lt;/span&gt;
  &lt;span class="kt"&gt;float&lt;/span&gt; &lt;span class="n"&gt;dropIntensity&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;fract&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;u_time&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;1&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;Random21&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cellIndex&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;seed&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;32132&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;432&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="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="mi"&gt;2&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;dropIntensity&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sign&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dropIntensity&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;abs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dropIntensity&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;dropIntensity&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;dropIntensity&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;dropIntensity&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="n"&gt;dropIntensity&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;clamp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dropIntensity&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&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="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="c1"&gt;// We only need results from inside a specefec radius of a drop.&lt;/span&gt;
  &lt;span class="kt"&gt;float&lt;/span&gt; &lt;span class="n"&gt;isInsideDrop&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;step&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;distanceFromCenter&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="kt"&gt;vec2&lt;/span&gt; &lt;span class="n"&gt;vecToCenter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;normalize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cellCenter&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;cellUv&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="c1"&gt;// Drop value is a vector to the center that increases with distance form it.&lt;/span&gt;
  &lt;span class="kt"&gt;vec2&lt;/span&gt; &lt;span class="n"&gt;dropValue&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;vecToCenter&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;distanceFromCenter&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;distanceFromCenter&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;40&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="kt"&gt;vec2&lt;/span&gt; &lt;span class="n"&gt;drop&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;dropValue&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;isInsideDrop&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;isDropShown&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;dropIntensity&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;drop&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kt"&gt;vec2&lt;/span&gt; &lt;span class="n"&gt;uv&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;uvInterpolator&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="c1"&gt;// Run the Drop function 10 times to create seemingly random pattern.&lt;/span&gt;
  &lt;span class="kt"&gt;vec2&lt;/span&gt; &lt;span class="n"&gt;drops&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;vec2&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;i&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;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;drops&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;Drops&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;uv&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;42424&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;43&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="kt"&gt;float&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;12313&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;432&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="c1"&gt;// Distort UV.&lt;/span&gt;
  &lt;span class="n"&gt;uv&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;drops&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="c1"&gt;// Sample the texture after distorting the UV space.&lt;/span&gt;
  &lt;span class="kt"&gt;vec4&lt;/span&gt; &lt;span class="n"&gt;color&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;texture2D&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;u_texture&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;uv&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="nb"&gt;gl_FragColor&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;color&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;Basically, all I do is generate drops at random positions. For every pixel around the drop I then calculate how much I need to distort the background. And then I apply the distortion to the UV space and sample the texture with the updated coordinates.&lt;/p&gt;

&lt;p&gt;It's way easier to explain visually, so I made a video of the whole process of making this.&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/Rl3clbrsI40"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>threejs</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Making the most boring website ever with TypeScript, NestJs, React and others. Part 9.</title>
      <dc:creator>NordicBeaver</dc:creator>
      <pubDate>Thu, 02 Dec 2021 12:47:55 +0000</pubDate>
      <link>https://dev.to/nordicbeaver/making-the-most-boring-website-ever-with-typescript-nestjs-react-and-others-part-9-5a77</link>
      <guid>https://dev.to/nordicbeaver/making-the-most-boring-website-ever-with-typescript-nestjs-react-and-others-part-9-5a77</guid>
      <description>&lt;p&gt;&lt;em&gt;This series is about making a generic website for a local business with TypeScript, NodeJs, NestJs, Prisma, React and NextJs. I'm trying to make my videos quite short, about 10 minutes each (except for the first one), while putting as much content there as I can. &lt;a href="https://www.youtube.com/playlist?list=PL7b0cPjh8z6K_4qLNu_QdE3RpiU6omViC"&gt;Here&lt;/a&gt; is the full playlist.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  In this episode:
&lt;/h2&gt;

&lt;h3&gt;
  
  
  User Roles
&lt;/h3&gt;

&lt;p&gt;So first we will add some roles for the users. We'll only need 3 for now: &lt;em&gt;ADMIN&lt;/em&gt;, &lt;em&gt;MANAGER&lt;/em&gt; and &lt;em&gt;GUEST&lt;/em&gt;.&lt;br&gt;
To do that, we'll update our &lt;strong&gt;Prisma&lt;/strong&gt; model and learn how to use guards in &lt;strong&gt;NestJs&lt;/strong&gt; to protect different routes based on current user's role.&lt;/p&gt;
&lt;h3&gt;
  
  
  Deployment to Dokku
&lt;/h3&gt;

&lt;p&gt;Then, I'll try to explain how to publish a web application for everyone to see. I use Dokku for my personal projects and I'll show you how simple it is to set it up and deploy to it.&lt;/p&gt;

&lt;p&gt;Since the project is now officially online (even though very unfinished), here are the links: &lt;a href="https://beardybear.nordicbeaver.io/"&gt;Website&lt;/a&gt;, &lt;a href="https://admin.beardybear.nordicbeaver.io/"&gt;Admin Panel&lt;/a&gt; (you can use &lt;em&gt;guest/guest&lt;/em&gt; to login)&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/pedR8s98wEU"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

</description>
      <category>react</category>
      <category>typescript</category>
      <category>node</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Drawing with Mr. Fourier and Typescript</title>
      <dc:creator>NordicBeaver</dc:creator>
      <pubDate>Wed, 24 Nov 2021 15:06:59 +0000</pubDate>
      <link>https://dev.to/nordicbeaver/drawing-with-mr-fourier-and-typescript-5h70</link>
      <guid>https://dev.to/nordicbeaver/drawing-with-mr-fourier-and-typescript-5h70</guid>
      <description>&lt;p&gt;What if we connect a couple of rotating sticks together and trace the shape they make? We can get something like this.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/VDbjh7etUnHmXXE05U/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/VDbjh7etUnHmXXE05U/giphy.gif" alt="Rotating Sticks" width="480" height="270"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The most interesting part about this is if we get enough sticks we can draw anything we want!&lt;/p&gt;

&lt;p&gt;You can try it yourself &lt;a href="https://fourier-painter.nordicbeaver.io/"&gt;here&lt;/a&gt;. Just draw a &lt;strong&gt;closed&lt;/strong&gt; (that's pretty important) shape and press 'Start'.&lt;/p&gt;

&lt;p&gt;This is based on a thing caller &lt;em&gt;Fourier Transform&lt;/em&gt;. Basically, every complex function on a set interval can be represented as an infinite sum of exponents:&lt;/p&gt;

&lt;p&gt;

&lt;/p&gt;
&lt;div class="katex-element"&gt;
  &lt;span class="katex-display"&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;f(t)=∑n=−inf⁡inf⁡cnen2πit,0≤t≤1
f(t) = \sum_{n=-\inf}^{\inf}c_n e^{n 2 \pi i t}, 
0 \le t \le 1
&lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;f&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord mathnormal"&gt;t&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mop op-limits"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathnormal mtight"&gt;n&lt;/span&gt;&lt;span class="mrel mtight"&gt;=&lt;/span&gt;&lt;span class="mord mtight"&gt;−&lt;/span&gt;&lt;span class="mspace mtight"&gt;&lt;/span&gt;&lt;span class="mop mtight"&gt;&lt;span class="mtight"&gt;i&lt;/span&gt;&lt;span class="mtight"&gt;n&lt;/span&gt;&lt;span class="mtight"&gt;f&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="mop op-symbol large-op"&gt;∑&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mop mtight"&gt;&lt;span class="mtight"&gt;i&lt;/span&gt;&lt;span class="mtight"&gt;n&lt;/span&gt;&lt;span class="mtight"&gt;f&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;c&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mathnormal mtight"&gt;n&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;e&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathnormal mtight"&gt;n&lt;/span&gt;&lt;span class="mord mtight"&gt;2&lt;/span&gt;&lt;span class="mord mathnormal mtight"&gt;πi&lt;/span&gt;&lt;span class="mord mathnormal mtight"&gt;t&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mord"&gt;0&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;≤&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;t&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;≤&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/div&gt;


&lt;p&gt;Where&lt;/p&gt;


&lt;div class="katex-element"&gt;
  &lt;span class="katex-display"&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;cn=∫01f(t)e−n2πit
c_n = \int_0^1 f(t) e^{-n 2 \pi i t}
&lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;c&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mathnormal mtight"&gt;n&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mop"&gt;&lt;span class="mop op-symbol large-op"&gt;∫&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;0&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;f&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord mathnormal"&gt;t&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;e&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mtight"&gt;−&lt;/span&gt;&lt;span class="mord mathnormal mtight"&gt;n&lt;/span&gt;&lt;span class="mord mtight"&gt;2&lt;/span&gt;&lt;span class="mord mathnormal mtight"&gt;πi&lt;/span&gt;&lt;span class="mord mathnormal mtight"&gt;t&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/div&gt;


&lt;p&gt;But if we look closer we may notice that every element of that sum is actually a rotating vector Cn. So if we manage to represent a shape as a complex function, we could find these vectors (maybe not all, since there is infinite number of them, but we don't need all) and that would mean drawing the shape just by rotating those vectors!&lt;/p&gt;

&lt;p&gt;I made a video where I tried to explain this in more detail and code it in TypeScript.&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/sGwtJzLh6_k"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

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

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>typescript</category>
      <category>programming</category>
    </item>
    <item>
      <title>React SketchBoard DevLog #1 - Drawing with mouse, color and width selection and panning.</title>
      <dc:creator>NordicBeaver</dc:creator>
      <pubDate>Thu, 18 Nov 2021 18:01:11 +0000</pubDate>
      <link>https://dev.to/nordicbeaver/react-sketchboard-devlog-1-drawing-with-mouse-color-and-width-selection-and-panning-5h3o</link>
      <guid>https://dev.to/nordicbeaver/react-sketchboard-devlog-1-drawing-with-mouse-color-and-width-selection-and-panning-5h3o</guid>
      <description>&lt;p&gt;Recently I started developing a react library for drawing in a browser. It turned out that it's not as trivial as it seemed and there is a lot of cool stuff and interesting problems there. So I decided to do a DevLog and share those thing with you.&lt;/p&gt;

&lt;p&gt;I hope you'll enjoy!&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/aoPAq-hC0J8"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

</description>
      <category>react</category>
      <category>javascript</category>
      <category>typescript</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Making the most boring website ever with TypeScript, NestJs, React and others. Part 8. </title>
      <dc:creator>NordicBeaver</dc:creator>
      <pubDate>Fri, 12 Nov 2021 15:01:19 +0000</pubDate>
      <link>https://dev.to/nordicbeaver/making-the-most-boring-website-ever-with-typescript-nestjs-react-and-others-part-8-1pjo</link>
      <guid>https://dev.to/nordicbeaver/making-the-most-boring-website-ever-with-typescript-nestjs-react-and-others-part-8-1pjo</guid>
      <description>&lt;p&gt;&lt;em&gt;This series is about making a generic website for a local business with TypeScript, NodeJs, NestJs, Prisma, React and NextJs. I'm trying to make my videos quite short, about 10 minutes each (except for the first one), while putting as much content there as I can. &lt;a href="https://www.youtube.com/playlist?list=PL7b0cPjh8z6K_4qLNu_QdE3RpiU6omViC"&gt;Here&lt;/a&gt; is the full playlist.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;In this videos we'll create a User model to store users data on the server and discuss why we need password hashing and salt. We'll also add new forms and pages to manage users in the Admin panel.&lt;/p&gt;

&lt;p&gt;Enjoy :)&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/Svblmsp0Hn4"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

</description>
      <category>react</category>
      <category>typescript</category>
      <category>node</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Having fun with pendulums in ThreeJs</title>
      <dc:creator>NordicBeaver</dc:creator>
      <pubDate>Sun, 07 Nov 2021 19:36:56 +0000</pubDate>
      <link>https://dev.to/nordicbeaver/having-fun-with-pendulums-in-threejs-31hc</link>
      <guid>https://dev.to/nordicbeaver/having-fun-with-pendulums-in-threejs-31hc</guid>
      <description>&lt;p&gt;I was messing around with &lt;strong&gt;ThreeJs&lt;/strong&gt; and got an idea of a simple but interesting animation. Here is the video of how I turned it into reality.&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/43WXC0rPKcE"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;If you just want to see the end result, go ahead and click &lt;a href="https://threejspendulums.nordicbeaver.io/"&gt;here&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>typescript</category>
      <category>webdev</category>
      <category>threejs</category>
    </item>
    <item>
      <title>Making the most boring website ever with TypeScript, NestJs, React and others. Part 7. </title>
      <dc:creator>NordicBeaver</dc:creator>
      <pubDate>Tue, 02 Nov 2021 13:43:01 +0000</pubDate>
      <link>https://dev.to/nordicbeaver/making-the-most-boring-website-ever-with-typescript-nestjs-react-and-others-part-7-1p4e</link>
      <guid>https://dev.to/nordicbeaver/making-the-most-boring-website-ever-with-typescript-nestjs-react-and-others-part-7-1p4e</guid>
      <description>&lt;p&gt;&lt;em&gt;This series is about making a generic website for a local business with TypeScript, NodeJs, NestJs, Prisma, React and NextJs. I'm trying to make my videos quite short, about 10 minutes each (except for the first one), while putting as much content there as I can. &lt;a href="https://www.youtube.com/playlist?list=PL7b0cPjh8z6K_4qLNu_QdE3RpiU6omViC"&gt;Here&lt;/a&gt; is the full playlist.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Today we will implements validation both on the server and the client. And also add a couple of new fields to the Appointment model.&lt;/p&gt;

&lt;p&gt;Enjoy :)&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/seCTFau-0WA"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

</description>
      <category>react</category>
      <category>typescript</category>
      <category>node</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
