<?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: Victor Ribeiro</title>
    <description>The latest articles on DEV Community by Victor Ribeiro (@victorqribeiro).</description>
    <link>https://dev.to/victorqribeiro</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%2F107601%2Ffb9208e1-e0c6-44b7-bfbc-b0e9a5f904df.jpeg</url>
      <title>DEV Community: Victor Ribeiro</title>
      <link>https://dev.to/victorqribeiro</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/victorqribeiro"/>
    <language>en</language>
    <item>
      <title>JavaScript Syntax Highlighter </title>
      <dc:creator>Victor Ribeiro</dc:creator>
      <pubDate>Fri, 27 Nov 2020 20:13:29 +0000</pubDate>
      <link>https://dev.to/victorqribeiro/javascript-syntax-highlighter-4b0k</link>
      <guid>https://dev.to/victorqribeiro/javascript-syntax-highlighter-4b0k</guid>
      <description>&lt;h1&gt;
  
  
  JavaScript Syntax Highlighter
&lt;/h1&gt;

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

&lt;p&gt;&lt;a href="https://victorribeiro.com/syntax" rel="noopener noreferrer"&gt;Live Version&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  How to use it
&lt;/h2&gt;

&lt;p&gt;Add the file &lt;code&gt;syntax.min.js&lt;/code&gt; to the end of your code and it will automatically highlight every &lt;code&gt;&amp;lt;code&amp;gt;&lt;/code&gt; tag that you have in your page. Or use the defer attribute:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"syntax.min.js"&lt;/span&gt; &lt;span class="na"&gt;defer&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The script will create &lt;code&gt;&amp;lt;spam&amp;gt;&lt;/code&gt; tag for every reserved word, variable, methods and numbers so you can target them with CSS.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nt"&gt;code&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;font-family&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Consolas&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s1"&gt;"courier new"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#EEE&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;background-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#333&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;2px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;font-size&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;105%&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;display&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;block&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;white-space&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;pre&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;counter-reset&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nt"&gt;code&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;counter-increment&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;display&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;block&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;min-height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1em&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nt"&gt;code&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="nd"&gt;::before&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;counter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;line&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="s2"&gt;'\A0'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;display&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;inline-block&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;4ch&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;text-align&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;left&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;-webkit-select&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;none&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#666&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nc"&gt;.reserved&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;font-weight&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;bold&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#55C&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nc"&gt;.methods&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;font-weight&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;bold&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;green&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nc"&gt;.variable&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;orange&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nc"&gt;.comment&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;gray&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nc"&gt;.number&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;red&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;Fell free to change anything you like to better suit your needs.&lt;/p&gt;

&lt;p&gt;Source code &lt;a href="https://github.com/victorqribeiro/syntax" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>javascript</category>
    </item>
    <item>
      <title>Scramble, a puzzle game in JavaScript</title>
      <dc:creator>Victor Ribeiro</dc:creator>
      <pubDate>Sat, 24 Oct 2020 01:38:35 +0000</pubDate>
      <link>https://dev.to/victorqribeiro/scramble-a-puzzle-game-in-javascript-140e</link>
      <guid>https://dev.to/victorqribeiro/scramble-a-puzzle-game-in-javascript-140e</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--F5zyyOel--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/wdalymc3g6nkkl0m64xj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--F5zyyOel--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/wdalymc3g6nkkl0m64xj.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I've been away for quite some time, but I'm back. I couldn't sleep one of those days so I end up writing this simple yet fun game. Hope you like it.&lt;/p&gt;

&lt;p&gt;Play it &lt;a href="https://victorribeiro.com/scramble"&gt;here&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Source code &lt;a href="https://github.com/victorqribeiro/scramble"&gt;here&lt;/a&gt;&lt;/p&gt;

</description>
      <category>games</category>
      <category>canvas</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Extracting text from images using Tesseract</title>
      <dc:creator>Victor Ribeiro</dc:creator>
      <pubDate>Fri, 27 Dec 2019 17:47:34 +0000</pubDate>
      <link>https://dev.to/victorqribeiro/extracting-text-from-images-using-tesseract-4b4n</link>
      <guid>https://dev.to/victorqribeiro/extracting-text-from-images-using-tesseract-4b4n</guid>
      <description>&lt;p&gt;After I learned about &lt;a href="https://tesseract.projectnaptha.com/"&gt;Tesseract&lt;/a&gt; I immediately wanted to use it. So I made this simple web app. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://victorribeiro.com/ocr/"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--PHwW0K8g--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/ftanmxde2aimnet78mpg.png" alt="screenshot"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can take a picture of a document, edit it on your favorite photo editor, crop the part you're interested in, and feed to the app, so you can extract the text.&lt;/p&gt;

&lt;p&gt;I'm also planning using this to extract text from memes, so people with visual impairment can also have a laugh.&lt;/p&gt;

&lt;p&gt;Get the app &lt;a href="https://github.com/victorqribeiro/ocr"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The memes app I was talking about is &lt;a href="https://victorribeiro.com/memes/"&gt;here&lt;/a&gt; - I'm not the creator of the memes, I just scrape them together.&lt;/p&gt;

</description>
      <category>ocr</category>
      <category>textextraction</category>
      <category>textrecognition</category>
    </item>
    <item>
      <title>Water ripple effect using canvas</title>
      <dc:creator>Victor Ribeiro</dc:creator>
      <pubDate>Wed, 11 Dec 2019 20:33:20 +0000</pubDate>
      <link>https://dev.to/victorqribeiro/water-ripple-effect-using-canvas-2l19</link>
      <guid>https://dev.to/victorqribeiro/water-ripple-effect-using-canvas-2l19</guid>
      <description>&lt;p&gt;Some time ago I stumbled upon this &lt;a href="https://web.archive.org/web/20160418004149/http://freespace.virgin.net/hugo.elias/graphics/x_water.htm"&gt;link&lt;/a&gt;. It describes a cool algorithm to create a water ripple effect. &lt;/p&gt;

&lt;p&gt;So, I decided to give it a go &lt;a href="http://jsfiddle.net/victorqribeiro/r5m7j623/"&gt;here&lt;/a&gt;. But it wasn't very good, performance wise. &lt;/p&gt;

&lt;p&gt;So, the other day I was idle and decided to give the code a little brush. &lt;/p&gt;

&lt;p&gt;Here's the &lt;a href="https://victorribeiro.com/rippleEffect/"&gt;final version&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As you can see, the performance is much better now, since I'm using putImadeData from canvas to draw the final image. &lt;/p&gt;

&lt;p&gt;You can check out the code &lt;a href="https://github.com/victorqribeiro/rippleEffect"&gt;here&lt;/a&gt;&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>ripple</category>
      <category>canvas</category>
    </item>
    <item>
      <title>How to create a Fake OS like web app</title>
      <dc:creator>Victor Ribeiro</dc:creator>
      <pubDate>Sat, 09 Nov 2019 17:15:10 +0000</pubDate>
      <link>https://dev.to/victorqribeiro/how-to-create-a-fake-os-like-web-app-1mle</link>
      <guid>https://dev.to/victorqribeiro/how-to-create-a-fake-os-like-web-app-1mle</guid>
      <description>&lt;h1&gt;
  
  
  FOS
&lt;/h1&gt;

&lt;p&gt;FOS is a light weight small library that creates new web components that behaves like an operating system. It is composed by desktop, windows, icons, bar and menus. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--9bsO0Pko--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://github.com/victorqribeiro/fos/blob/master/screenshot.png%3Fraw%3Dtrue" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--9bsO0Pko--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://github.com/victorqribeiro/fos/blob/master/screenshot.png%3Fraw%3Dtrue" alt="screenshot"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://victorribeiro.com/fos"&gt;Live example&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/victorqribeiro/fos"&gt;GitHub&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Creating your first FOS web app
&lt;/h2&gt;

&lt;p&gt;First clone the &lt;a href="https://github.com/victorqribeiro/fos"&gt;repository&lt;/a&gt; and then add the &lt;em&gt;fos.min.js&lt;/em&gt; file to your project:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"fos.min.js"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Now we are able to create our first Fake Operating System.  &lt;/p&gt;

&lt;p&gt;We should start with a desktop.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;fos-desktop&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/fos-desktop&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Nice!&lt;/p&gt;

&lt;p&gt;Now we should create some icons. You don't need to stress about where each icon will be on the fos-desktop. They will be spread out across the screen automatically, from top-left to bottom-right.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;fos-desktop&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;fos-icon&amp;gt;&lt;/span&gt;F&lt;span class="nt"&gt;&amp;lt;/fos-icon&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;fos-icon&amp;gt;&lt;/span&gt;O&lt;span class="nt"&gt;&amp;lt;/fos-icon&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;fos-icon&amp;gt;&lt;/span&gt;S&lt;span class="nt"&gt;&amp;lt;/fos-icon&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;/fos-desktop&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Cool!&lt;/p&gt;

&lt;p&gt;Now the icons can be used to open windows. So we should crate some windows and then linking them to an icon. This can be done by setting a &lt;strong&gt;name&lt;/strong&gt; attribute on a window and a &lt;strong&gt;href&lt;/strong&gt; attribute on the icon.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;fos-desktop&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;fos-icon&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"w1"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;F&lt;span class="nt"&gt;&amp;lt;/fos-icon&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;fos-icon&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"w2"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;O&lt;span class="nt"&gt;&amp;lt;/fos-icon&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;fos-icon&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"w3"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;S&lt;span class="nt"&gt;&amp;lt;/fos-icon&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;fos-window&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"w1"&lt;/span&gt; &lt;span class="na"&gt;title=&lt;/span&gt;&lt;span class="s"&gt;"Window 1"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/fos-window&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;fos-window&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"w1"&lt;/span&gt; &lt;span class="na"&gt;title=&lt;/span&gt;&lt;span class="s"&gt;"Window 1"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/fos-window&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;fos-window&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"w1"&lt;/span&gt; &lt;span class="na"&gt;title=&lt;/span&gt;&lt;span class="s"&gt;"Window 1"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/fos-window&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;/fos-desktop&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;This is going really well. Now when we double click the icon (yes, yes I know - but I like double clicks) it will open a window.&lt;/p&gt;

&lt;p&gt;The window can be dragged around by its top part. It also can be resized by it's bottom right corner. It can be maximized clicking on the &lt;strong&gt;[]&lt;/strong&gt; button or closed clicking on the &lt;strong&gt;X&lt;/strong&gt; button, both on the right top corner.&lt;/p&gt;

&lt;p&gt;Our fake os is kinda lame right now, but when can mess around with the sytle using CSS. You can add a nice background image to the desktop and create some nice images for the icons, instead of letters.&lt;/p&gt;

&lt;p&gt;Well, you can do that whenever you want. But for this tutorial, we should add a bar on the bottom of the screen and a Start menu. The Start menu will also control the windows.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;fos-desktop&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;fos-icon&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"w1"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;F&lt;span class="nt"&gt;&amp;lt;/fos-icon&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;fos-icon&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"w2"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;O&lt;span class="nt"&gt;&amp;lt;/fos-icon&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;fos-icon&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"w3"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;S&lt;span class="nt"&gt;&amp;lt;/fos-icon&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;fos-window&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"w1"&lt;/span&gt; &lt;span class="na"&gt;title=&lt;/span&gt;&lt;span class="s"&gt;"Window 1"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;h2&amp;gt;&lt;/span&gt;Test 1&lt;span class="nt"&gt;&amp;lt;/h2&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/fos-window&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;fos-window&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"w2"&lt;/span&gt; &lt;span class="na"&gt;title=&lt;/span&gt;&lt;span class="s"&gt;"Window 2"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;h1&amp;gt;&lt;/span&gt;Hello&lt;span class="nt"&gt;&amp;lt;/h1&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;How are you on this fine morning/afternoon/night?&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&amp;lt;a&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"javascript:alert('hi');"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Click here to say hi&lt;span class="nt"&gt;&amp;lt;/a&amp;gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/fos-window&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;fos-window&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"w3"&lt;/span&gt; &lt;span class="na"&gt;title=&lt;/span&gt;&lt;span class="s"&gt;"Window 3"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        ???
    &lt;span class="nt"&gt;&amp;lt;/fos-window&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;fos-bar&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;fos-menu&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"Start"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;fos-menu-item&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"w1"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
                Window 1
            &lt;span class="nt"&gt;&amp;lt;/fos-menu-item&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;fos-menu-item&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"w2"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
                Window 2
            &lt;span class="nt"&gt;&amp;lt;/fos-menu-item&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;fos-menu-item&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"w3"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
                Window 3
            &lt;span class="nt"&gt;&amp;lt;/fos-menu-item&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/fos-menu&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/fos-bar&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;/fos-desktop&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;fos-widow can have html written direct into them, but if you want to separate your content you could use the same schema fos-bar -&amp;gt; fos-menu -&amp;gt; fos-menu-item controling a fos-pane. Let's see how simple it is to do just that:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;fos-desktop&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;fos-icon&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"w1"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;F&lt;span class="nt"&gt;&amp;lt;/fos-icon&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;fos-icon&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"w2"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;O&lt;span class="nt"&gt;&amp;lt;/fos-icon&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;fos-icon&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"w3"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;S&lt;span class="nt"&gt;&amp;lt;/fos-icon&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;fos-window&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"w1"&lt;/span&gt; &lt;span class="na"&gt;title=&lt;/span&gt;&lt;span class="s"&gt;"Window 1"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;h2&amp;gt;&lt;/span&gt;Test 1&lt;span class="nt"&gt;&amp;lt;/h2&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/fos-window&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;fos-window&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"w2"&lt;/span&gt; &lt;span class="na"&gt;title=&lt;/span&gt;&lt;span class="s"&gt;"Window 2"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;h1&amp;gt;&lt;/span&gt;Hello&lt;span class="nt"&gt;&amp;lt;/h1&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;How are you on this fine morning/afternoon/night?&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&amp;lt;a&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"javascript:alert('hi');"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Click here to say hi&lt;span class="nt"&gt;&amp;lt;/a&amp;gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/fos-window&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;fos-window&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"w3"&lt;/span&gt; &lt;span class="na"&gt;title=&lt;/span&gt;&lt;span class="s"&gt;"Window 2"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;fos-bar&lt;/span&gt; &lt;span class="na"&gt;position=&lt;/span&gt;&lt;span class="s"&gt;"top"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;fos-menu&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"File"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;fos-menu-item&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"file1"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;File 1&lt;span class="nt"&gt;&amp;lt;/fos-menu-item&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;fos-menu-item&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"file2"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;File 2&lt;span class="nt"&gt;&amp;lt;/fos-menu-item&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;/fos-menu&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/fos-bar&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;br&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;fos-panel&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"file1"&lt;/span&gt; &lt;span class="na"&gt;selected&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;h1&amp;gt;&lt;/span&gt;Panel 1&lt;span class="nt"&gt;&amp;lt;/h1&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;Hi, this is the panel one.&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/fos-panel&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;fos-panel&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"file2"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;h1&amp;gt;&lt;/span&gt;Panel 2&lt;span class="nt"&gt;&amp;lt;/h1&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;Hello again, this is the panel two.&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/fos-panel&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/fos-window&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;fos-bar&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;fos-menu&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"Start"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;fos-menu-item&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"w1"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
                Window 1
            &lt;span class="nt"&gt;&amp;lt;/fos-menu-item&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;fos-menu-item&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"w2"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
                Window 2
            &lt;span class="nt"&gt;&amp;lt;/fos-menu-item&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;fos-menu-item&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"w3"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
                Window 3
            &lt;span class="nt"&gt;&amp;lt;/fos-menu-item&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/fos-menu&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/fos-bar&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;/fos-desktop&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;fos-bar can be placed on the top or the bottom of your fos-desktop / fos-window and the fos-menu inside it will behave accordingly: if it's on the bottom, the menu will open up; if it's on the top, the menu will drop down. Cool, right?! To place the fos-bar on top, just pass to the attribute &lt;strong&gt;position&lt;/strong&gt; one of the values &lt;strong&gt;top&lt;/strong&gt; or &lt;strong&gt;bottom&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;"Wait! If the fos-bar can be placed on the top, it will be displayed over me icons."&lt;/p&gt;

&lt;p&gt;You right. To address it, the fos-desktop have a special iconOffset to address this. The value passed to that attribute will move the icons. E.g.: 20px, 40px, 55px...&lt;/p&gt;

&lt;p&gt;Well, that's it. Hope you had fun creating a Fake OS web app.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>webcomponents</category>
      <category>ui</category>
    </item>
    <item>
      <title>Split your Django generated models into separated files</title>
      <dc:creator>Victor Ribeiro</dc:creator>
      <pubDate>Tue, 10 Sep 2019 22:38:53 +0000</pubDate>
      <link>https://dev.to/victorqribeiro/split-your-django-generated-models-into-separated-files-2ade</link>
      <guid>https://dev.to/victorqribeiro/split-your-django-generated-models-into-separated-files-2ade</guid>
      <description>&lt;h1&gt;
  
  
  Split Django Models
&lt;/h1&gt;

&lt;p&gt;Split Django generated models into separated files, with proper names, classes and imports.&lt;/p&gt;

&lt;h2&gt;
  
  
  Usage
&lt;/h2&gt;

&lt;p&gt;Generate your models:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;python3 manage.py inspectdb &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; models.py
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Run the script:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;./split_django_models.sh models.py
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Put them all into a folder so you can enjoy the step bellow:  &lt;/p&gt;

&lt;p&gt;The script also creates a &lt;em&gt;__init__.py&lt;/em&gt; file, so you can import them all at once:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;yourapp.models&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Get the script &lt;a href="https://github.com/victorqribeiro/splitDjangoModels"&gt;here&lt;/a&gt;&lt;/p&gt;

</description>
      <category>django</category>
      <category>models</category>
      <category>split</category>
    </item>
    <item>
      <title>How to create a radial menu for your web app.</title>
      <dc:creator>Victor Ribeiro</dc:creator>
      <pubDate>Mon, 26 Aug 2019 01:14:21 +0000</pubDate>
      <link>https://dev.to/victorqribeiro/how-to-create-a-radial-menu-for-your-web-app-d2h</link>
      <guid>https://dev.to/victorqribeiro/how-to-create-a-radial-menu-for-your-web-app-d2h</guid>
      <description>&lt;h1&gt;
  
  
  Radial Menu
&lt;/h1&gt;

&lt;p&gt;A highly customizable radial menu that's very easy to setup.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fxvs5ag2079jfaoklpwkl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fxvs5ag2079jfaoklpwkl.png" alt="screenshot"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;See it live &lt;a href="https://victorribeiro.com/radialMenu" rel="noopener noreferrer"&gt;here&lt;/a&gt; - (Right click if you're on a desktop / touch and hold on smartphone)&lt;/p&gt;

&lt;h2&gt;
  
  
  About
&lt;/h2&gt;

&lt;p&gt;Create a customized and beautiful radial menu for your web app that can be used as a standalone menu or override the default context menu. On a desktop or notebook click the second button of the mouse (context menu). On a smartphone or tablet, click the screen and hold for few seconds and the menu will pop.&lt;/p&gt;

&lt;p&gt;Feel free to commit new styles and share them with the public.&lt;/p&gt;

&lt;h2&gt;
  
  
  Documentation
&lt;/h2&gt;

&lt;p&gt;Let's create a new radial button so you can see how simple it is. You'll need to add the &lt;em&gt;RadialMenu.js&lt;/em&gt; to your web app and then create a new menu. Let's look at the code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"RadialMenu.js"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;script&amp;gt;&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;radial&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;RadialMenu&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's it. The library has some default buttons included as example so you can see how it works. Let's continue reading the documentation so we can learn how to create our very own radial menu with our very own buttons.&lt;/p&gt;

&lt;p&gt;To create a Radial Menu in your web app you'll need to pass a configuration object to the constructor. By default a lot of values are already seted, but you can fiddle with every single one of them.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;mySettings&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;textColor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;red&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;//define the color of the text on the buttons&lt;/span&gt;
    &lt;span class="na"&gt;buttons&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;text&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;&lt;span class="s1"&gt;uf053&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;action&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;history&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;go&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="c1"&gt;//create a button that goes back on history&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;text&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;&lt;span class="s1"&gt;uf054&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;action&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;history&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;go&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="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="c1"&gt;//create a button tha goes forward on history&lt;/span&gt;
    &lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;radial&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;RadialMenu&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;mySettings&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Get the library, read the documentation and check out the code &lt;a href="https://github.com/victorqribeiro/radialMenu" rel="noopener noreferrer"&gt;here&lt;/a&gt;&lt;/p&gt;

</description>
      <category>radial</category>
      <category>menu</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Finding Areas Using the Monte Carlo Method</title>
      <dc:creator>Victor Ribeiro</dc:creator>
      <pubDate>Tue, 06 Aug 2019 17:56:57 +0000</pubDate>
      <link>https://dev.to/victorqribeiro/finding-areas-using-the-monte-carlo-method-3h6b</link>
      <guid>https://dev.to/victorqribeiro/finding-areas-using-the-monte-carlo-method-3h6b</guid>
      <description>&lt;h1&gt;
  
  
  Finding Areas Using the Monte Carlo Method
&lt;/h1&gt;

&lt;p&gt;Using the &lt;a href="http://mathonweb.com/entrtain/monte/t_monte.htm"&gt;Monte Carlo Method&lt;/a&gt; to find the area of an drawn image.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Pjp1PC5V--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/dyy2y8v6efkdh5lvjwu1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Pjp1PC5V--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/dyy2y8v6efkdh5lvjwu1.png" alt="Monte Carlo Method"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Live version &lt;a href="https://victorribeiro.com/monteCarlo"&gt;here&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  About
&lt;/h2&gt;

&lt;p&gt;Draw an image, run the monte carlo method to calculate it's area. Increase or decrese the number of samples used in the simulation. I have written a similar code that runs the simulation several times and get the mean of them all. I like this one better. The canvas is 500x500 pixels. So, if you color it all and click solve, you should get a result of 250000 pixels.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to use it
&lt;/h2&gt;

&lt;p&gt;Canvas - Draw the image you want to calculate the area from.&lt;/p&gt;

&lt;p&gt;Input - Enter the number of samples to be used in the simulation, in the input box.&lt;/p&gt;

&lt;p&gt;Solve - Click to solve the aproximate area of the drawn image. You can click solve multiple times to get different results.&lt;/p&gt;

&lt;p&gt;Clear - Clear the canvas.&lt;/p&gt;

&lt;p&gt;Take a look at the code &lt;a href="https://github.com/victorqribeiro/monteCarlo"&gt;here&lt;/a&gt;&lt;/p&gt;

</description>
      <category>montecarlomethod</category>
      <category>simulation</category>
      <category>trigonometry</category>
    </item>
    <item>
      <title>A naive approach to finding corners on an image </title>
      <dc:creator>Victor Ribeiro</dc:creator>
      <pubDate>Mon, 08 Jul 2019 02:02:44 +0000</pubDate>
      <link>https://dev.to/victorqribeiro/a-naive-approach-to-finding-corners-on-an-image-f87</link>
      <guid>https://dev.to/victorqribeiro/a-naive-approach-to-finding-corners-on-an-image-f87</guid>
      <description>&lt;h1&gt;
  
  
  Naive Corners
&lt;/h1&gt;

&lt;p&gt;A naive algorithm to find corners on a image.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--v0ZgUd07--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/u0vavmokchcwh8ik7ro1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--v0ZgUd07--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/u0vavmokchcwh8ik7ro1.png" alt="detected"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  About
&lt;/h2&gt;

&lt;p&gt;When I was still studying the basics of digital image processing I came up with this "algorithm" to detect corners on a image.&lt;/p&gt;

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

&lt;p&gt;Well, as the name suggests, this is a very naive approach.&lt;/p&gt;

&lt;p&gt;Given any image we will look at it a window of 3 by 3 at a time. (We could resize the image to speed up the process, but who's in a hurry?)&lt;/p&gt;

&lt;p&gt;3x3 window.&lt;br&gt;&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--5fgWPyiW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/migplp8u4l45793ct37v.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--5fgWPyiW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/migplp8u4l45793ct37v.png" alt="grid"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We will then just count how many colored pixels we have at that window. If there's 4 colored pixels, it must be a corner.&lt;/p&gt;

&lt;p&gt;Corner.&lt;br&gt;&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--hxQEkGry--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/w0glm34ck5ayzvc58gtn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--hxQEkGry--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/w0glm34ck5ayzvc58gtn.png" alt="grid"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Rotated corner.&lt;br&gt;&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--bURMXaVh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/n17k9hi7t0g9s25n67v4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--bURMXaVh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/n17k9hi7t0g9s25n67v4.png" alt="rotated corner"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Anything else, is not a corner.&lt;/p&gt;

&lt;p&gt;Not a corner.&lt;br&gt;&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--XBDHf3nD--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/pjyaqai1vy1i66x5bbuc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--XBDHf3nD--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/pjyaqai1vy1i66x5bbuc.png" alt="grid"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Not a corner either.&lt;br&gt;&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--5XWb-Mmi--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/vyp0t7v7ij7pnap1hh39.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--5XWb-Mmi--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/vyp0t7v7ij7pnap1hh39.png" alt="grid"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  See it working
&lt;/h2&gt;

&lt;p&gt;Run by calling&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;python corner.py img/mess.png
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;I also used this algorithm to process corners on a &lt;a href="https://youtu.be/OWOQL5jh_7A"&gt;real time webcam video&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;A python implementation of this algorithm is hosted &lt;a href="https://github.com/victorqribeiro/naiveCorners"&gt;here&lt;/a&gt;&lt;/p&gt;

</description>
      <category>naive</category>
      <category>cornerdetection</category>
      <category>python</category>
    </item>
    <item>
      <title>Let's code some happy text.</title>
      <dc:creator>Victor Ribeiro</dc:creator>
      <pubDate>Mon, 01 Jul 2019 21:20:08 +0000</pubDate>
      <link>https://dev.to/victorqribeiro/let-s-code-a-happy-text-5dm4</link>
      <guid>https://dev.to/victorqribeiro/let-s-code-a-happy-text-5dm4</guid>
      <description>&lt;h1&gt;
  
  
  Happy Text
&lt;/h1&gt;

&lt;p&gt;Let's start this tutorial by normalizing the CSS.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nt"&gt;body&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;margin&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nt"&gt;canvas&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;display&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;block&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;This will get rid of side bars when working with a full sized canvas.&lt;/p&gt;

&lt;p&gt;Now, let's create a canvas the same size as the page and append it to the body of the page.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;canvas&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;createElement&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;canvas&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;w&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;innerWidth&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;h&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;innerHeight&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;w2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;w&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="nx"&gt;h2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;h&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nx"&gt;canvas&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;width&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;w&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nx"&gt;canvas&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;height&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;h&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;appendChild&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;canvas&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

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



&lt;p&gt;Now we can get a canvas 2D context and define some text as well some text parameters.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;c&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;canvas&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;getContext&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;2d&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;fontsize&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nx"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;font&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;fontsize&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;px Arial&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;text&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Happy Text!&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Then we create a function that clear the canvas and draws our text to screen every frame.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;draw&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

  &lt;span class="cm"&gt;/* clear the canvas from 0,0 to w,h - width and height of the page */&lt;/span&gt;
  &lt;span class="nx"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;clearRect&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="nx"&gt;w&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;h&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="cm"&gt;/* draw the text on coords 10, 10 */&lt;/span&gt;
  &lt;span class="nx"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;fillText&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&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;10&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="cm"&gt;/* calls the draw function every frame */&lt;/span&gt;
  &lt;span class="nx"&gt;requestAnimationFrame&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;draw&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;draw&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Well, that's all fine, but that text is not happy at all.&lt;/p&gt;

&lt;p&gt;Instead of just drawing the text, we should draw each letter individually and then animate them.&lt;/p&gt;

&lt;p&gt;We can do that with a for loop, iterating each char from the text, and with a sine wave, controlling the Y position of each letter.&lt;/p&gt;

&lt;p&gt;So, now our draw function looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="cm"&gt;/* angle that controls the sine wave */&lt;/span&gt;
&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;a&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="cm"&gt;/* the size of the text, so we can centralize it on the screen */&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;xoffset&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;measureText&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;width&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;draw&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;clearRect&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="nx"&gt;w&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;h&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="cm"&gt;/* for loop to iterate each char from text */&lt;/span&gt;
  &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&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="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&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="nx"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;fillText&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; 
      &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;w2&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;xoffset&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;fontsize&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="cm"&gt;/* centralized X position */&lt;/span&gt;
      &lt;span class="nx"&gt;h2&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;sin&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&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;10&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt; &lt;span class="cm"&gt;/* sine wave offset by char position */&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="nx"&gt;a&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mf"&gt;0.08&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="cm"&gt;/* increase the angle each frame, so the sine wave moves */&lt;/span&gt;
  &lt;span class="nx"&gt;requestAnimationFrame&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;draw&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;draw&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;That's it. Our happy text is all done.&lt;/p&gt;

&lt;p&gt;The complete code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;canvas&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;createElement&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;canvas&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;w&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;innerWidth&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;h&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;innerHeight&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;w2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;w&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="nx"&gt;h2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;h&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nx"&gt;canvas&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;width&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;w&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nx"&gt;canvas&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;height&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;h&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;appendChild&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;canvas&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;c&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;canvas&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;getContext&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;2d&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;fontsize&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nx"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;font&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;fontsize&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;px Arial&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;text&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Happy Text!&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;a&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;xoffset&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;measureText&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;width&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;draw&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;clearRect&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="nx"&gt;w&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;h&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="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&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="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&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="nx"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;fillText&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
      &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;w2&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;xoffset&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;fontsize&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
      &lt;span class="nx"&gt;h2&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;sin&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&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;10&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="nx"&gt;a&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mf"&gt;0.08&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nx"&gt;requestAnimationFrame&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;draw&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;draw&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

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



&lt;p&gt;&lt;a href="http://jsfiddle.net/victorqribeiro/63e5s1pf/"&gt;Link to JSFiddle&lt;/a&gt; with the code. &lt;/p&gt;

</description>
      <category>javascript</category>
      <category>animation</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>GAIA - Generic Artificial Intelligence Agent</title>
      <dc:creator>Victor Ribeiro</dc:creator>
      <pubDate>Sun, 30 Jun 2019 23:08:57 +0000</pubDate>
      <link>https://dev.to/victorqribeiro/gaia-generic-artificial-intelligence-agent-2hpf</link>
      <guid>https://dev.to/victorqribeiro/gaia-generic-artificial-intelligence-agent-2hpf</guid>
      <description>&lt;h1&gt;
  
  
  GAIA
&lt;/h1&gt;

&lt;p&gt;Generic Artificial Intelligence Agent.&lt;br&gt;&lt;br&gt;
An AI concept that can help game designers to create procedural quests.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fwkf4a1ty8c1jchasgqvz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fwkf4a1ty8c1jchasgqvz.png"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://victorribeiro.com/gaia" rel="noopener noreferrer"&gt;Live version&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;GAIA is a concept, it aims to design a generic Agent that can be interacted with any time during the game. It uses finite state machines alongside attributes to give the Agent purpose. The player can alter this states with it's actions, turning the Agent into a enemy or a friend.&lt;/p&gt;

&lt;p&gt;In order to be interacted with, the agent must have some attributes to be interesting.&lt;/p&gt;

&lt;p&gt;In this example, the Agent has a &lt;strong&gt;name&lt;/strong&gt;, a &lt;strong&gt;title&lt;/strong&gt;, &lt;strong&gt;age&lt;/strong&gt;, &lt;strong&gt;affinity&lt;/strong&gt; with the player, &lt;strong&gt;hit points&lt;/strong&gt; (HP), &lt;strong&gt;hunger&lt;/strong&gt;, &lt;strong&gt;food&lt;/strong&gt; and some &lt;strong&gt;states&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;This attributes can be used to design quests, if the player choose to interact with the Agent, or just a ordinary dialogs.&lt;/p&gt;

&lt;p&gt;The Agent could answer it's name, it's age, how hungry it is, how much food it have, how close it is to dying and what it's doing. &lt;/p&gt;

&lt;p&gt;This information be used to create a quest. For example, lets suppose that the NPC is a shop owner that has a item that the player needs. &lt;br&gt;
If the NPC is busy hunting (or cutting wood, or fishing, or anything else other the selling) it won't be able to sell the item to the player. So the player could either kill the NPC and still the item, or help the NPC, giving him what it need or completing the action that restores them to they selling state (back to the store, for instance).&lt;/p&gt;

&lt;p&gt;This way, any NPC that the player encounters during the game could offer a somewhat interesting interaction. &lt;/p&gt;

&lt;h2&gt;
  
  
  Examples
&lt;/h2&gt;

&lt;p&gt;The player needs to cross a river and asks for a NPC on a boat to take them. The NPC could be busy fishing, so the player could fish for the NPC or just give it some fish, restoring it to a state where it can cross the player to the other side.&lt;/p&gt;

&lt;p&gt;The player encounters a NPC that is very hungry and decide to feed it. This NPC then become friends with the player and could  retribute the favor later on the game.&lt;/p&gt;

&lt;h2&gt;
  
  
  Interaction
&lt;/h2&gt;

&lt;p&gt;In this example the Agent has 3 states: idle, hunting and dead. If the Agent is hunting, it roams the map looking for food. When the Agent is younger than 10 or older than 50 years, it's change of huting with success drops to half.&lt;/p&gt;

&lt;p&gt;You can help the Agent feeding it, increasing it's affinity towards you, by clicking &lt;strong&gt;feed&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;You can also hurt the Agent, decreasing it's affinity towards you eventually killing it, by clicking &lt;strong&gt;hurt&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/victorqribeiro/gaia" rel="noopener noreferrer"&gt;Source code&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>artificialintelligence</category>
      <category>agent</category>
    </item>
    <item>
      <title>A native JavaScript paint and draw app</title>
      <dc:creator>Victor Ribeiro</dc:creator>
      <pubDate>Fri, 28 Jun 2019 05:15:05 +0000</pubDate>
      <link>https://dev.to/victorqribeiro/a-native-javascript-paint-and-draw-app-5h4c</link>
      <guid>https://dev.to/victorqribeiro/a-native-javascript-paint-and-draw-app-5h4c</guid>
      <description>&lt;h1&gt;
  
  
  Paint and Draw
&lt;/h1&gt;

&lt;p&gt;I made this project a while back. I always enjoy using the native functionalities of JavaScript to develop my projects. This one is no different. I was bored in class and decided to do something fun. I end up making this very simple app. Since I liked it a lot, I decided to upload it to GitHub and maybe work on it a little bit more latter on.&lt;/p&gt;

&lt;p&gt;Hope you like it to.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://victorribeiro.com/paintDraw"&gt;Live Version&lt;/a&gt;&lt;br&gt;
&lt;a href="https://github.com/victorqribeiro/paintDraw"&gt;Source Code&lt;/a&gt;&lt;/p&gt;

</description>
      <category>paint</category>
      <category>draw</category>
      <category>javascript</category>
    </item>
  </channel>
</rss>
