{"componentChunkName":"component---src-templates-post-post-jsx","path":"/blog/sprint","result":{"data":{"markdownRemark":{"html":"<p>Today we are going to write a compiler together this compiler is going to be the smallest compiler in the world. Since it's going to be a long article you can skip directly to the <a href=\"https://github.com/rolwin100/mini_compiler_demo\" target=\"_blank\" rel=\"nofollow\">code</a> if you can't wait 😅.</p>\n<p>Compilers are there everywhere, right from the point you switch ON your machine till you surf the web or open any application. So why do many developers tend to give less importance to it and don't have much knowledge on how it works 🤔. Probably they think compilers are too scary 👻 and only the nerdiest of the geeks 🤓 can work on it. But that not true. Compilers are quite simple. It's just that they involve a little understanding.</p>\n<p>Before jumping into what is a compiler and how compilers work. I'll explain what we are going to do in this article. We are going to write a code to compile a <a href=\"https://en.wikipedia.org/wiki/Lisp_(programming_language)\" target=\"_blank\" rel=\"nofollow\"><code class=\"language-text\">LISP</code></a> like function calls into C-like function calls. For those of you who don't know what is LISP, it's just a very old programming language like Fortran.</p>\n<p>For example if we have two functions <code class=\"language-text\">add</code> and <code class=\"language-text\">subtract</code> they would be written like this in LISP and C.</p>\n<table>\n<thead>\n<tr>\n<th></th>\n<th>LISP</th>\n<th>C</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><strong>2 + 2</strong></td>\n<td><code class=\"language-text\">(add 2 2)</code></td>\n<td><code class=\"language-text\">add(2, 2)</code></td>\n</tr>\n<tr>\n<td><strong>4 - 2</strong></td>\n<td><code class=\"language-text\">(subtract 4 2)</code></td>\n<td><code class=\"language-text\">subtract(4, 2)</code></td>\n</tr>\n<tr>\n<td><strong>2 + (4 - 2)</strong></td>\n<td><code class=\"language-text\">(add 2 (subtract 4 2))</code></td>\n<td><code class=\"language-text\">add(2, subtract(4, 2))</code></td>\n</tr>\n</tbody>\n</table>\n<h2></h2>\n<p>Easy-pezzy right? </p>\n<p>OK good!! we will be using the above example as the input for our compiler.</p>\n<h2>So what the hell is a compiler ? you may be asking ! 😂</h2>\n<p>So the compiler is a tool that just converts code from one programming language into another programming language without changing the actual meaning of the code. There is also something called a transpiler you may have come across while building JS application with typescript. A transpiler is also a compiler. So the difference between a compiler and a transpiler is that compiler converts code from a programming language to byte codes which humans can't understand. Whereas a transpiler is a source-to-source compiler i.e it converts code from one language to another and the compiled code is still human-readable.</p>\n<h2>stages in a compiler</h2>\n<p>Most of the compilers have three stages on a high level design i.e <code class=\"language-text\">Parsing</code>, <code class=\"language-text\">Transformation</code> and <code class=\"language-text\">Code Generation</code>.</p>\n<ol>\n<li><code class=\"language-text\">Parsing</code> is basically taking the code we are about to compile and turning it into an abstract representation.</li>\n<li><code class=\"language-text\">Transformation</code> is taking the output from the parsing stage and do whatever changes the compiler wants to do for the abstract representation.</li>\n<li><code class=\"language-text\">Code Generation</code> takes the output of transformation stage and converts it to the new Code.</li>\n</ol>\n<p>Thats it these are the three main stages of a compiler. 😃</p>\n<ol>\n<li>\n<h3>Parsing</h3>\n<p>Again parsing can be broken down into two phases <code class=\"language-text\">Lexical Analysis</code> and <code class=\"language-text\">Syntactic Analysis</code>.</p>\n<p><code class=\"language-text\">Lexical Analysis</code> takes the raw code and splits into token with the help of tokenizer also called as the lexer.</p>\n<p>For the following code</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">(add 2 (subtract 4 2))</code></pre></div>\n<p>The below token structure will be generated</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">[\n    { type: &#39;paren&#39;,  value: &#39;(&#39;        },\n    { type: &#39;name&#39;,   value: &#39;add&#39;      },\n    { type: &#39;number&#39;, value: &#39;2&#39;        },\n    { type: &#39;paren&#39;,  value: &#39;(&#39;        },\n    { type: &#39;name&#39;,   value: &#39;subtract&#39; },\n    { type: &#39;number&#39;, value: &#39;4&#39;        },\n    { type: &#39;number&#39;, value: &#39;2&#39;        },\n    { type: &#39;paren&#39;,  value: &#39;)&#39;        },\n    { type: &#39;paren&#39;,  value: &#39;)&#39;        },\n]</code></pre></div>\n<p>Below is the code of how a tokenizer generates the tokens.</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token comment\">/**\n * ============================================================================\n*                                   (/^▽^)/\n*                                THE TOKENIZER!\n* ============================================================================\n*/</span>\n\n<span class=\"token comment\">/**\n* the tokenizer is going to take the code and covert it to an array of tokens\n*\n* (add 2 (subtract 4 2))   =>   [{ type: 'paren', value: '(' }, { type: 'name', value: 'add'} ...]\n*/</span>\n<span class=\"token keyword\">function</span> <span class=\"token function\">tokenizer</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">input</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\n<span class=\"token comment\">// Let's keep a variable called current that will be used as a cursor.</span>\n<span class=\"token keyword\">let</span> current <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// Token array for inserting the tokens.</span>\n<span class=\"token keyword\">let</span> tokens <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n\n\n<span class=\"token keyword\">while</span> <span class=\"token punctuation\">(</span>current <span class=\"token operator\">&lt;</span> input<span class=\"token punctuation\">.</span>length<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\n    <span class=\"token comment\">// Take the current character</span>\n    <span class=\"token keyword\">let</span> char <span class=\"token operator\">=</span> input<span class=\"token punctuation\">[</span>current<span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n\n    <span class=\"token comment\">// The first thing we want to check for is an open parenthesis. This will </span>\n    <span class=\"token comment\">// later we will use this for `CallExpression`. As of now we will only take care</span>\n    <span class=\"token comment\">// of the character. if we come across one we push them in the token array with type</span>\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>char <span class=\"token operator\">===</span> <span class=\"token string\">'('</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        tokens<span class=\"token punctuation\">.</span><span class=\"token function\">push</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span> type<span class=\"token operator\">:</span> <span class=\"token string\">'paren'</span><span class=\"token punctuation\">,</span> value<span class=\"token operator\">:</span> <span class=\"token string\">'('</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n        <span class=\"token comment\">// Then we increment `current` and continue to the next cycle of the loop</span>\n        current<span class=\"token operator\">++</span><span class=\"token punctuation\">;</span>\n        <span class=\"token keyword\">continue</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token comment\">// Next we're going to check for a closing parenthesis. We do the same exact</span>\n    <span class=\"token comment\">// thing as before.</span>\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>char <span class=\"token operator\">===</span> <span class=\"token string\">')'</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        tokens<span class=\"token punctuation\">.</span><span class=\"token function\">push</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span> type<span class=\"token operator\">:</span> <span class=\"token string\">'paren'</span><span class=\"token punctuation\">,</span>value<span class=\"token operator\">:</span> <span class=\"token string\">')'</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        current<span class=\"token operator\">++</span><span class=\"token punctuation\">;</span>\n        <span class=\"token keyword\">continue</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token comment\">// Let's check for whitespaces. We need them because whitespace exists to </span>\n    <span class=\"token comment\">// separate characters, but it isn't actually important for us to store as a token.</span>\n    <span class=\"token comment\">// We would only throw it out later.</span>\n    <span class=\"token keyword\">let</span> <span class=\"token constant\">WHITESPACE</span> <span class=\"token operator\">=</span> <span class=\"token regex\"><span class=\"token regex-delimiter\">/</span><span class=\"token regex-source language-regex\">\\s</span><span class=\"token regex-delimiter\">/</span></span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token constant\">WHITESPACE</span><span class=\"token punctuation\">.</span><span class=\"token function\">test</span><span class=\"token punctuation\">(</span>char<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        current<span class=\"token operator\">++</span><span class=\"token punctuation\">;</span>\n        <span class=\"token keyword\">continue</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token comment\">// Next let us take care of number tokens. It's a bit different because a number can </span>\n    <span class=\"token comment\">// have a continuous sequence and we need to  capture the entire sequence of characters</span>\n    <span class=\"token comment\">// as one token.</span>\n    <span class=\"token comment\">//</span>\n    <span class=\"token comment\">//   (add 123 456)</span>\n    <span class=\"token comment\">//        ^^^ ^^^</span>\n    <span class=\"token comment\">//        Only two separate tokens</span>\n    <span class=\"token comment\">//</span>\n    <span class=\"token comment\">// So we start this off when we encounter the first number in a sequence.</span>\n    <span class=\"token keyword\">let</span> <span class=\"token constant\">NUMBERS</span> <span class=\"token operator\">=</span> <span class=\"token regex\"><span class=\"token regex-delimiter\">/</span><span class=\"token regex-source language-regex\">[0-9]</span><span class=\"token regex-delimiter\">/</span></span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token constant\">NUMBERS</span><span class=\"token punctuation\">.</span><span class=\"token function\">test</span><span class=\"token punctuation\">(</span>char<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token comment\">// We're going to create a `value` string that we are going to push</span>\n        <span class=\"token comment\">// characters to.</span>\n        <span class=\"token keyword\">let</span> value <span class=\"token operator\">=</span> <span class=\"token string\">''</span><span class=\"token punctuation\">;</span>\n\n        <span class=\"token comment\">// Loop through the characters in the sequence until we encounter a character that </span>\n        <span class=\"token comment\">// is not a number. Push each character that is a number to our `value` and </span>\n        <span class=\"token comment\">// incrementing `current` as we go.</span>\n        <span class=\"token keyword\">while</span> <span class=\"token punctuation\">(</span><span class=\"token constant\">NUMBERS</span><span class=\"token punctuation\">.</span><span class=\"token function\">test</span><span class=\"token punctuation\">(</span>char<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n            value <span class=\"token operator\">+=</span> char<span class=\"token punctuation\">;</span>\n            char <span class=\"token operator\">=</span> input<span class=\"token punctuation\">[</span><span class=\"token operator\">++</span>current<span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n        <span class=\"token punctuation\">}</span>\n\n        tokens<span class=\"token punctuation\">.</span><span class=\"token function\">push</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span> type<span class=\"token operator\">:</span> <span class=\"token string\">'number'</span><span class=\"token punctuation\">,</span> value <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token keyword\">continue</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token comment\">// So what about strings then we need to parse the strings as well right. So how do we </span>\n    <span class=\"token comment\">// do it 🤷‍♀️. You guessed it right we need to look for the start and end of a double quote.</span>\n    <span class=\"token comment\">//</span>\n    <span class=\"token comment\">//   (concat \"foo\" \"bar\")</span>\n    <span class=\"token comment\">//            ^^^   ^^^ string tokens</span>\n    <span class=\"token comment\">//</span>\n    <span class=\"token comment\">// The same logic can be applied which we used for numbers numberWe'll start by </span>\n    <span class=\"token comment\">// checking for the opening quote:</span>\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>char <span class=\"token operator\">===</span> <span class=\"token string\">'\"'</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token comment\">// value variable to insert the characters to form the string.</span>\n        <span class=\"token keyword\">let</span> value <span class=\"token operator\">=</span> <span class=\"token string\">''</span><span class=\"token punctuation\">;</span>\n        char <span class=\"token operator\">=</span> input<span class=\"token punctuation\">[</span><span class=\"token operator\">++</span>current<span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n\n        <span class=\"token keyword\">while</span> <span class=\"token punctuation\">(</span>char <span class=\"token operator\">!==</span> <span class=\"token string\">'\"'</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n            value <span class=\"token operator\">+=</span> char<span class=\"token punctuation\">;</span>\n            char <span class=\"token operator\">=</span> input<span class=\"token punctuation\">[</span><span class=\"token operator\">++</span>current<span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n        <span class=\"token punctuation\">}</span>\n\n        char <span class=\"token operator\">=</span> input<span class=\"token punctuation\">[</span><span class=\"token operator\">++</span>current<span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n        tokens<span class=\"token punctuation\">.</span><span class=\"token function\">push</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span> type<span class=\"token operator\">:</span> <span class=\"token string\">'string'</span><span class=\"token punctuation\">,</span> value <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token keyword\">continue</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token comment\">// Lastly let's take care of the `name token`. Names are sequence of letters,</span>\n    <span class=\"token comment\">// that are the names of functions in our lisp syntax.</span>\n    <span class=\"token comment\">//</span>\n    <span class=\"token comment\">//   (add 2 4)</span>\n    <span class=\"token comment\">//    ^^^</span>\n    <span class=\"token comment\">//    Name token</span>\n    <span class=\"token comment\">//</span>\n    <span class=\"token keyword\">let</span> <span class=\"token constant\">LETTERS</span> <span class=\"token operator\">=</span> <span class=\"token regex\"><span class=\"token regex-delimiter\">/</span><span class=\"token regex-source language-regex\">[a-z]</span><span class=\"token regex-delimiter\">/</span><span class=\"token regex-flags\">i</span></span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token constant\">LETTERS</span><span class=\"token punctuation\">.</span><span class=\"token function\">test</span><span class=\"token punctuation\">(</span>char<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">let</span> value <span class=\"token operator\">=</span> <span class=\"token string\">''</span><span class=\"token punctuation\">;</span>\n\n        <span class=\"token comment\">// Again we're just going to loop through all the letters pushing them to</span>\n        <span class=\"token comment\">// a value.</span>\n        <span class=\"token keyword\">while</span> <span class=\"token punctuation\">(</span><span class=\"token constant\">LETTERS</span><span class=\"token punctuation\">.</span><span class=\"token function\">test</span><span class=\"token punctuation\">(</span>char<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n            value <span class=\"token operator\">+=</span> char<span class=\"token punctuation\">;</span>\n            char <span class=\"token operator\">=</span> input<span class=\"token punctuation\">[</span><span class=\"token operator\">++</span>current<span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n        <span class=\"token punctuation\">}</span>\n        \n        tokens<span class=\"token punctuation\">.</span><span class=\"token function\">push</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span> type<span class=\"token operator\">:</span> <span class=\"token string\">'name'</span><span class=\"token punctuation\">,</span> value <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token keyword\">continue</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token comment\">// Finally if we have not matched any characters then let's throw the below error</span>\n    <span class=\"token comment\">// and completely exit.</span>\n    <span class=\"token keyword\">throw</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">TypeError</span><span class=\"token punctuation\">(</span><span class=\"token string\">'I\\'m not really sure what this character is : '</span> <span class=\"token operator\">+</span> char<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token comment\">// Then at the end of our `tokenizer` we simply return the tokens array.</span>\n<span class=\"token keyword\">return</span> tokens<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token comment\">// export the tokenizer module final compiler...</span>\nmodule<span class=\"token punctuation\">.</span>exports <span class=\"token operator\">=</span> tokenizer<span class=\"token punctuation\">;</span></code></pre></div>\n<p><code class=\"language-text\">Syntactic Analysis</code> takes the token and reformats them into a tree-like structure called <code class=\"language-text\">Abstract Syntax Tree or AST</code> that describes the token's relationship with one another. This is also called as Intermediate representation or AST.</p>\n<p>Below is what an AST looks like</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">{\n    type: &#39;Program&#39;,\n    body: [{\n        type: &#39;CallExpression&#39;,\n        name: &#39;add&#39;,\n        params: [{\n            type: &#39;NumberLiteral&#39;,\n            value: &#39;2&#39;,\n            }, {\n            type: &#39;CallExpression&#39;,\n            name: &#39;subtract&#39;,\n            params: [{\n                type: &#39;NumberLiteral&#39;,\n                value: &#39;4&#39;,\n            }, {\n                type: &#39;NumberLiteral&#39;,\n                value: &#39;2&#39;,\n            }]\n        }]\n    }]\n}</code></pre></div>\n<p>The code below is how the parser generates the <code class=\"language-text\">AST</code> by taking the output from the tokenizer as input.</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token comment\">/**\n * ============================================================================\n*                                 ヽ/❀o ل͜ o\\ﾉ\n*                                THE PARSER!!!\n* ============================================================================\n*/</span>\n\n<span class=\"token comment\">/**\n* For our parser take the token array from the output of tokenizer and tranform it to AST\n*\n*   [{ type: 'paren', value: '(' }, { type:'name', value: 'add'} ...]   =>   { type: 'Program', body: [...] }\n*/</span>\n\n<span class=\"token comment\">// Let's start by defining a function called parser that accepts an array of token</span>\n<span class=\"token keyword\">function</span> <span class=\"token function\">parser</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">tokens</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\n    <span class=\"token comment\">// Let's keep a variable called current that will be used as a cursor.</span>\n    <span class=\"token keyword\">let</span> current <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span>\n\n    <span class=\"token comment\">// But this time we're going to use recursion instead of a `while` loop. So we</span>\n    <span class=\"token comment\">// define a `walk` function.</span>\n    <span class=\"token keyword\">function</span> <span class=\"token function\">walk</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\n        <span class=\"token comment\">// Inside this function let's start by taking the value of the current token</span>\n        <span class=\"token keyword\">let</span> token <span class=\"token operator\">=</span> tokens<span class=\"token punctuation\">[</span>current<span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n\n        <span class=\"token comment\">// Let's spilt the each type of token into different nodes</span>\n        <span class=\"token comment\">// starting off with `number` tokens.</span>\n        <span class=\"token comment\">//</span>\n        <span class=\"token comment\">// We test to see if we have a `number` token.</span>\n        <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>token<span class=\"token punctuation\">.</span>type <span class=\"token operator\">===</span> <span class=\"token string\">'number'</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n            <span class=\"token comment\">// If we have one, we'll increment `current`.</span>\n            current<span class=\"token operator\">++</span><span class=\"token punctuation\">;</span>\n\n            <span class=\"token comment\">// Return a new AST node called `NumberLiteral` and set value to the </span>\n            <span class=\"token comment\">// value of our token.</span>\n            <span class=\"token keyword\">return</span> <span class=\"token punctuation\">{</span> type<span class=\"token operator\">:</span> <span class=\"token string\">'NumberLiteral'</span><span class=\"token punctuation\">,</span> value<span class=\"token operator\">:</span> token<span class=\"token punctuation\">.</span>value <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n        <span class=\"token punctuation\">}</span>\n\n        <span class=\"token comment\">// Again let's do the same for a `StringLiteral` node.</span>\n        <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>token<span class=\"token punctuation\">.</span>type <span class=\"token operator\">===</span> <span class=\"token string\">'string'</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n            current<span class=\"token operator\">++</span><span class=\"token punctuation\">;</span>\n\n            <span class=\"token keyword\">return</span> <span class=\"token punctuation\">{</span> type<span class=\"token operator\">:</span> <span class=\"token string\">'StringLiteral'</span><span class=\"token punctuation\">,</span> value<span class=\"token operator\">:</span> token<span class=\"token punctuation\">.</span>value <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n        <span class=\"token punctuation\">}</span>\n\n        <span class=\"token comment\">// Next we're going to look for CallExpressions. We start this off when we</span>\n        <span class=\"token comment\">// encounter an open parenthesis.</span>\n        <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span> token<span class=\"token punctuation\">.</span>type <span class=\"token operator\">===</span> <span class=\"token string\">'paren'</span> <span class=\"token operator\">&amp;&amp;</span> token<span class=\"token punctuation\">.</span>value <span class=\"token operator\">===</span> <span class=\"token string\">'('</span> <span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\n            <span class=\"token comment\">// We'll increment `current` to skip the parenthesis since we don't care</span>\n            <span class=\"token comment\">// about it in our AST.</span>\n            token <span class=\"token operator\">=</span> tokens<span class=\"token punctuation\">[</span><span class=\"token operator\">++</span>current<span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n\n            <span class=\"token comment\">// we will create a node with the type `CallExpression`, and we're going</span>\n            <span class=\"token comment\">// to set the name as the current token's value since the next token after</span>\n            <span class=\"token comment\">// the open parenthesis is the name of the function.</span>\n            <span class=\"token keyword\">let</span> node <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>\n                type<span class=\"token operator\">:</span> <span class=\"token string\">'CallExpression'</span><span class=\"token punctuation\">,</span>\n                name<span class=\"token operator\">:</span> token<span class=\"token punctuation\">.</span>value<span class=\"token punctuation\">,</span>\n                params<span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\n            <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n\n            <span class=\"token comment\">// We increment `current` *again* to skip the name token.</span>\n            token <span class=\"token operator\">=</span> tokens<span class=\"token punctuation\">[</span><span class=\"token operator\">++</span>current<span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n\n            <span class=\"token comment\">// Next we would like to add each token as `params` for the `CallExpression` till we</span>\n            <span class=\"token comment\">// encounter a closing params.</span>\n            <span class=\"token comment\">//</span>\n            <span class=\"token comment\">// For this let's make use of Recursion instead of infinitely looping on each result.</span>\n            <span class=\"token comment\">//</span>\n            <span class=\"token comment\">// To explain this let's look at the LISP snippet below which includes multiple paranthesis.</span>\n            <span class=\"token comment\">//</span>\n            <span class=\"token comment\">//   (add 2 (subtract 4 2))</span>\n            <span class=\"token comment\">//</span>\n            <span class=\"token comment\">// The token array will have multiple nested paranthesis as well</span>\n            <span class=\"token comment\">//</span>\n            <span class=\"token comment\">//   [</span>\n            <span class=\"token comment\">//     { type: 'paren',  value: '('        },</span>\n            <span class=\"token comment\">//     { type: 'name',   value: 'add'      },</span>\n            <span class=\"token comment\">//     { type: 'number', value: '2'        },</span>\n            <span class=\"token comment\">//     { type: 'paren',  value: '('        },</span>\n            <span class=\"token comment\">//     { type: 'name',   value: 'subtract' },</span>\n            <span class=\"token comment\">//     { type: 'number', value: '4'        },</span>\n            <span class=\"token comment\">//     { type: 'number', value: '2'        },</span>\n            <span class=\"token comment\">//     { type: 'paren',  value: ')'        }, &lt;&lt;&lt; Closing parenthesis</span>\n            <span class=\"token comment\">//     { type: 'paren',  value: ')'        }, &lt;&lt;&lt; Closing parenthesis</span>\n            <span class=\"token comment\">//   ]</span>\n            <span class=\"token comment\">//</span>\n            <span class=\"token comment\">// We're going to rely on the nested `walk` function to increment our</span>\n            <span class=\"token comment\">// `current` variable past any nested `CallExpression`.</span>\n\n            <span class=\"token comment\">// So we create a `while` loop that will continue until it encounters a</span>\n            <span class=\"token comment\">// token with a `type` of `'paren'` and a `value` of a closing</span>\n            <span class=\"token comment\">// parenthesis.</span>\n            <span class=\"token keyword\">while</span> <span class=\"token punctuation\">(</span>\n                <span class=\"token punctuation\">(</span>token<span class=\"token punctuation\">.</span>type <span class=\"token operator\">!==</span> <span class=\"token string\">'paren'</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">||</span>\n                <span class=\"token punctuation\">(</span>token<span class=\"token punctuation\">.</span>type <span class=\"token operator\">===</span> <span class=\"token string\">'paren'</span> <span class=\"token operator\">&amp;&amp;</span> token<span class=\"token punctuation\">.</span>value <span class=\"token operator\">!==</span> <span class=\"token string\">')'</span><span class=\"token punctuation\">)</span>\n            <span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n                <span class=\"token comment\">// we'll call the `walk` function which will return a `node` and we'll</span>\n                <span class=\"token comment\">// push it into our `node.params`.</span>\n                node<span class=\"token punctuation\">.</span>params<span class=\"token punctuation\">.</span><span class=\"token function\">push</span><span class=\"token punctuation\">(</span><span class=\"token function\">walk</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n                token <span class=\"token operator\">=</span> tokens<span class=\"token punctuation\">[</span>current<span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n            <span class=\"token punctuation\">}</span>\n\n            <span class=\"token comment\">// Finally we will increment `current` one last time to skip the closing</span>\n            <span class=\"token comment\">// parenthesis.</span>\n            current<span class=\"token operator\">++</span><span class=\"token punctuation\">;</span>\n\n            <span class=\"token comment\">// And return the node.</span>\n            <span class=\"token keyword\">return</span> node<span class=\"token punctuation\">;</span>\n        <span class=\"token punctuation\">}</span>\n\n        <span class=\"token comment\">// Again, if we haven't recognized the token type by now we're going to</span>\n        <span class=\"token comment\">// throw an error.</span>\n        <span class=\"token keyword\">throw</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">TypeError</span><span class=\"token punctuation\">(</span>token<span class=\"token punctuation\">.</span>type<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token comment\">// Now, we're going to create our AST which will have a root which is a</span>\n    <span class=\"token comment\">// `Program` node.</span>\n    <span class=\"token keyword\">let</span> ast <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>\n        type<span class=\"token operator\">:</span> <span class=\"token string\">'Program'</span><span class=\"token punctuation\">,</span>\n        body<span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n\n    <span class=\"token comment\">// And we're going to kickstart our `walk` function, pushing nodes to our</span>\n    <span class=\"token comment\">// `ast.body` array.</span>\n    <span class=\"token comment\">//</span>\n    <span class=\"token comment\">// The reason we are doing this inside a loop is because our program can have</span>\n    <span class=\"token comment\">// `CallExpression` after one another instead of being nested.</span>\n    <span class=\"token comment\">//</span>\n    <span class=\"token comment\">//   (add 2 2)</span>\n    <span class=\"token comment\">//   (subtract 4 2)</span>\n    <span class=\"token comment\">//</span>\n    <span class=\"token keyword\">while</span> <span class=\"token punctuation\">(</span>current <span class=\"token operator\">&lt;</span> tokens<span class=\"token punctuation\">.</span>length<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        ast<span class=\"token punctuation\">.</span>body<span class=\"token punctuation\">.</span><span class=\"token function\">push</span><span class=\"token punctuation\">(</span><span class=\"token function\">walk</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token comment\">// At the end of our parser we'll return the AST.</span>\n    <span class=\"token keyword\">return</span> ast<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token comment\">// Just exporting our parser to be used in the final compiler...</span>\nmodule<span class=\"token punctuation\">.</span>exports <span class=\"token operator\">=</span> parser<span class=\"token punctuation\">;</span></code></pre></div>\n</li>\n<li>\n<h3>Transformation</h3>\n<p>The next stage of the compiler is the transforamtion stage. In this stage we take the <code class=\"language-text\">AST</code> from the previous step and do manipulation over it or create a new <code class=\"language-text\">AST</code> from the existing <code class=\"language-text\">AST</code>. It can manipulate the <code class=\"language-text\">AST</code> in the same language or it can translate it to an entirelly different language.</p>\n<p>Now let's start transforming our <code class=\"language-text\">AST</code>.</p>\n<p>If we look at the <code class=\"language-text\">AST</code> closely we have node with a certain property each of these nodes are know as AST node. These nodes define an isolated part of the tree.</p>\n<p>For instance for \"NumberLiteral\" we have a node.</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">{\n    type: &#39;NumberLiteral&#39;,\n    value: &#39;2&#39;,\n}</code></pre></div>\n<p>and if we conider a \"CallExpression\" then we have the node as</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">{\n    type: &#39;CallExpression&#39;,\n    name: &#39;subtract&#39;,\n    params: [\n        // nested nodes \n    ],\n}</code></pre></div>\n<p>When we are taversing the <code class=\"language-text\">AST</code> we either add, remove or manipulate the nodes or we can create a new AST from the existing AST.</p>\n<p>Since we are targetting a new language let's create a new AST while keeping the old one as reference.</p>\n<ul>\n<li><code class=\"language-text\">Traversal</code>: This process involves visiting all the nodes in the AST with depth-first approach. Comsider the <code class=\"language-text\">AST</code></li>\n</ul>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">{\n    type: &#39;Program&#39;,\n    body: [{\n        type: &#39;CallExpression&#39;,\n        name: &#39;add&#39;,\n        params: [{\n        type: &#39;NumberLiteral&#39;,\n        value: &#39;2&#39;\n        }, {\n        type: &#39;CallExpression&#39;,\n        name: &#39;subtract&#39;,\n        params: [{\n            type: &#39;NumberLiteral&#39;,\n            value: &#39;4&#39;\n        }, {\n            type: &#39;NumberLiteral&#39;,\n            value: &#39;2&#39;\n        }]\n        }]\n    }]\n}</code></pre></div>\n<p>So for the <code class=\"language-text\">AST</code> above we would go like:</p>\n<ol>\n<li>Program - starting at the top level of the AST</li>\n<li>CallExpression (add) - Next let us move to the first node of the program body</li>\n<li>NumberLiteral (2) - Going to to the first element of CallExpression's params</li>\n<li>CallExpression (subtract) - Going to the second element of CallExpression's params</li>\n<li>NumberLiteral (4) - Going to the first element of CallExpression's params</li>\n<li>NumberLiteral (2) - Going to the second element of CallExpression's params</li>\n</ol>\n<p>If we are going to manipulate the nodes directly we would likely to introduce lot of scenarios, so we better we visit each nodes.</p>\n<ul>\n<li><code class=\"language-text\">Vistors</code>: So visitor is going to be an object that will have methods to handle different node types.</li>\n</ul>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">var</span> visitor <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token function\">NumberLiteral</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n    <span class=\"token function\">CallExpression</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>Whenever we find a match with AST node and visitor object type we will call the methods in the visitor object.</p>\n<p>Inorder to make things simple and to keep track of the modified node let's pass the node and reference to the parent node.</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">var</span> visitor <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token function\">NumberLiteral</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">node<span class=\"token punctuation\">,</span> parent</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n    <span class=\"token function\">CallExpression</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">node<span class=\"token punctuation\">,</span> parent</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>Okk so there is a teeny weeny problem with that structure 😑. Imagine we go down the tree of a node as soon as we finish up at the bottom of that node we may endup calling an exit function which may lead to ignoring of other nodes.</p>\n<p>In order to support this the final form of our visitor should look like.</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">var</span> visitor <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>\n    NumberLiteral<span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token function\">enter</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">node<span class=\"token punctuation\">,</span> parent</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n        <span class=\"token function\">exit</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">node<span class=\"token punctuation\">,</span> parent</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span> </code></pre></div>\n<p>Looks good now. Now lets write the snippet for our traverser.</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token comment\">/**\n * ============================================================================\n*                                 ⌒(❀>◞౪◟&lt;❀)⌒\n*                               THE TRAVERSER!!!\n* ============================================================================\n*/</span>\n\n<span class=\"token comment\">/**\n* So our traverser function will accept an AST and also a visior node this visitor\n* node method will be used for performing a mapping with the AST nodes.\n*\n*   traverse(ast, {\n*     Program: (node, parent) => {\n*       //do something here\n*     },\n*\n*     CallExpression: (node, parent) => {\n*       //do something here\n*     },\n*\n*     NumberLiteral: (node, parent) => {\n*      //do something here\n*     },\n*   });\n*/</span>\n<span class=\"token keyword\">function</span> <span class=\"token function\">traverser</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">ast<span class=\"token punctuation\">,</span> visitor</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\n    <span class=\"token comment\">// Iterates over the array and call the next function traverseNode with reference </span>\n    <span class=\"token comment\">// to the parent.</span>\n    <span class=\"token keyword\">function</span> <span class=\"token function\">traverseArray</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">array<span class=\"token punctuation\">,</span> parent</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        array<span class=\"token punctuation\">.</span><span class=\"token function\">forEach</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">child</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n            <span class=\"token function\">traverseNode</span><span class=\"token punctuation\">(</span>child<span class=\"token punctuation\">,</span> parent<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token comment\">// accepts a node and parent so that it can pass both to our visitor methods</span>\n    <span class=\"token keyword\">function</span> <span class=\"token function\">traverseNode</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">node<span class=\"token punctuation\">,</span> parent</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\n        <span class=\"token comment\">// We start by testing for the existence of a method on the visitor with a</span>\n        <span class=\"token comment\">// matching `type`.</span>\n        <span class=\"token keyword\">let</span> methods <span class=\"token operator\">=</span> visitor<span class=\"token punctuation\">[</span>node<span class=\"token punctuation\">.</span>type<span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n\n        <span class=\"token comment\">// If there is an `enter` method for this node type we'll call it with the</span>\n        <span class=\"token comment\">// `node` and its `parent`.</span>\n        <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>methods <span class=\"token operator\">&amp;&amp;</span> methods<span class=\"token punctuation\">.</span>enter<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n            methods<span class=\"token punctuation\">.</span><span class=\"token function\">enter</span><span class=\"token punctuation\">(</span>node<span class=\"token punctuation\">,</span> parent<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token punctuation\">}</span>\n\n        <span class=\"token comment\">// Next we are going to split things up by the current node type.</span>\n        <span class=\"token keyword\">switch</span> <span class=\"token punctuation\">(</span>node<span class=\"token punctuation\">.</span>type<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\n            <span class=\"token comment\">// Let's start with the 'Program' array and then call the traverseArray </span>\n            <span class=\"token comment\">// method for the body node</span>\n            <span class=\"token keyword\">case</span> <span class=\"token string\">'Program'</span><span class=\"token operator\">:</span>\n                <span class=\"token function\">traverseArray</span><span class=\"token punctuation\">(</span>node<span class=\"token punctuation\">.</span>body<span class=\"token punctuation\">,</span> node<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n                <span class=\"token keyword\">break</span><span class=\"token punctuation\">;</span>\n\n            <span class=\"token comment\">// Next we take care of 'CallExpression' since 'CallExpressions' have params</span>\n            <span class=\"token comment\">// we will pass that as the array params.</span>\n            <span class=\"token keyword\">case</span> <span class=\"token string\">'CallExpression'</span><span class=\"token operator\">:</span>\n                <span class=\"token function\">traverseArray</span><span class=\"token punctuation\">(</span>node<span class=\"token punctuation\">.</span>params<span class=\"token punctuation\">,</span> node<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n                <span class=\"token keyword\">break</span><span class=\"token punctuation\">;</span>\n\n            <span class=\"token comment\">// `NumberLiteral` and `StringLiteral` We don't have anything to do so we just break</span>\n            <span class=\"token keyword\">case</span> <span class=\"token string\">'NumberLiteral'</span><span class=\"token operator\">:</span>\n            <span class=\"token keyword\">case</span> <span class=\"token string\">'StringLiteral'</span><span class=\"token operator\">:</span>\n                <span class=\"token keyword\">break</span><span class=\"token punctuation\">;</span>\n\n            <span class=\"token comment\">// If node type is not recognized we simply throw an error</span>\n            <span class=\"token keyword\">default</span><span class=\"token operator\">:</span>\n                <span class=\"token keyword\">throw</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">TypeError</span><span class=\"token punctuation\">(</span>node<span class=\"token punctuation\">.</span>type<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token punctuation\">}</span>\n\n        <span class=\"token comment\">// if `exit` method is encountered for this node type we'll call it with the</span>\n        <span class=\"token comment\">// `node` and its `parent`.</span>\n        <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>methods <span class=\"token operator\">&amp;&amp;</span> methods<span class=\"token punctuation\">.</span>exit<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n            methods<span class=\"token punctuation\">.</span><span class=\"token function\">exit</span><span class=\"token punctuation\">(</span>node<span class=\"token punctuation\">,</span> parent<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token punctuation\">}</span>\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token comment\">// Let's call the traverserNode function with the parent parameter as null </span>\n    <span class=\"token comment\">// because the top level does not have a parent</span>\n    <span class=\"token function\">traverseNode</span><span class=\"token punctuation\">(</span>ast<span class=\"token punctuation\">,</span> <span class=\"token keyword\">null</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token comment\">// exporting the traverser method</span>\nmodule<span class=\"token punctuation\">.</span>exports <span class=\"token operator\">=</span> traverser<span class=\"token punctuation\">;</span></code></pre></div>\n<p>Next up let's write the transformer function.</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\">    <span class=\"token keyword\">var</span> traverser <span class=\"token operator\">=</span> <span class=\"token function\">require</span><span class=\"token punctuation\">(</span><span class=\"token string\">'./traverser'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n    <span class=\"token comment\">/**\n    * ============================================================================\n    *                                   ⁽(◍˃̵͈̑ᴗ˂̵͈̑)⁽\n    *                              THE TRANSFORMER!!!\n    * ============================================================================\n    */</span>\n\n    <span class=\"token comment\">/**\n    * Our transformer is going to take the ast and pass it to the traverser and for\n    * the new AST.\n    *\n    * ----------------------------------------------------------------------------\n    *   Original AST                     |   Transformed AST\n    * ----------------------------------------------------------------------------\n    *   {                                |   {\n    *     type: 'Program',               |     type: 'Program',\n    *     body: [{                       |     body: [{\n    *       type: 'CallExpression',      |       type: 'ExpressionStatement',\n    *       name: 'add',                 |       expression: {\n    *       params: [{                   |         type: 'CallExpression',\n    *         type: 'NumberLiteral',     |         callee: {\n    *         value: '2'                 |           type: 'Identifier',\n    *       }, {                         |           name: 'add'\n    *         type: 'CallExpression',    |         },\n    *         name: 'subtract',          |         arguments: [{\n    *         params: [{                 |           type: 'NumberLiteral',\n    *           type: 'NumberLiteral',   |           value: '2'\n    *           value: '4'               |         }, {\n    *         }, {                       |           type: 'CallExpression',\n    *           type: 'NumberLiteral',   |           callee: {\n    *           value: '2'               |             type: 'Identifier',\n    *         }]                         |             name: 'subtract'\n    *       }]                           |           },\n    *     }]                             |           arguments: [{\n    *   }                                |             type: 'NumberLiteral',\n    *                                    |             value: '4'\n    * ---------------------------------- |           }, {\n    *                                    |             type: 'NumberLiteral',\n    *                                    |             value: '2'\n    *                                    |           }]\n    * (sorry the other one is longer 😜) |         }\n    *                                    |       }\n    *                                    |     }]\n    *                                    |   }\n    * ----------------------------------------------------------------------------\n    */</span>\n\n    <span class=\"token comment\">// Transformer function with the ast as params</span>\n    <span class=\"token keyword\">function</span> <span class=\"token function\">transformer</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">ast</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\n        <span class=\"token comment\">// A new AST with initalization</span>\n        <span class=\"token keyword\">let</span> newAst <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>\n            type<span class=\"token operator\">:</span> <span class=\"token string\">'Program'</span><span class=\"token punctuation\">,</span>\n            body<span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\n        <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n\n        <span class=\"token comment\">// We are going to pass a property called context to the node which keeps the reference</span>\n        <span class=\"token comment\">// to the parent</span>\n        ast<span class=\"token punctuation\">.</span>_context <span class=\"token operator\">=</span> newAst<span class=\"token punctuation\">.</span>body<span class=\"token punctuation\">;</span>\n\n        <span class=\"token comment\">// Let's call the traverser function with ast and our visitor</span>\n        <span class=\"token function\">traverser</span><span class=\"token punctuation\">(</span>ast<span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span>\n            <span class=\"token comment\">// Take care of NumberLiteral</span>\n            NumberLiteral<span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n                <span class=\"token comment\">// We'll visit them on enter.</span>\n                <span class=\"token function\">enter</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">node<span class=\"token punctuation\">,</span> parent</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n                        <span class=\"token comment\">// create a node call 'NumberLiteral' that will push the parent context.</span>\n                        parent<span class=\"token punctuation\">.</span>_context<span class=\"token punctuation\">.</span><span class=\"token function\">push</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>\n                            type<span class=\"token operator\">:</span> <span class=\"token string\">'NumberLiteral'</span><span class=\"token punctuation\">,</span>\n                            value<span class=\"token operator\">:</span> node<span class=\"token punctuation\">.</span>value<span class=\"token punctuation\">,</span>\n                        <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n                    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n            <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n\n            <span class=\"token comment\">// Let's do the same for `StringLiteral`</span>\n            StringLiteral<span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n                <span class=\"token function\">enter</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">node<span class=\"token punctuation\">,</span> parent</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n                    parent<span class=\"token punctuation\">.</span>_context<span class=\"token punctuation\">.</span><span class=\"token function\">push</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>\n                        type<span class=\"token operator\">:</span> <span class=\"token string\">'StringLiteral'</span><span class=\"token punctuation\">,</span>\n                        value<span class=\"token operator\">:</span> node<span class=\"token punctuation\">.</span>value<span class=\"token punctuation\">,</span>\n                    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n                <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n            <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n\n            <span class=\"token comment\">// So `CallExpression` should be taken care like this.</span>\n            CallExpression<span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n                <span class=\"token function\">enter</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">node<span class=\"token punctuation\">,</span> parent</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\n                    <span class=\"token comment\">//  create a `CallExpression` node with a nested `Identifier`.</span>\n                    <span class=\"token keyword\">let</span> expression <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>\n                        type<span class=\"token operator\">:</span> <span class=\"token string\">'CallExpression'</span><span class=\"token punctuation\">,</span>\n                        callee<span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n                            type<span class=\"token operator\">:</span> <span class=\"token string\">'Identifier'</span><span class=\"token punctuation\">,</span>\n                            name<span class=\"token operator\">:</span> node<span class=\"token punctuation\">.</span>name<span class=\"token punctuation\">,</span>\n                        <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n                        arguments<span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\n                    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n\n                    <span class=\"token comment\">// Let's create a new context for the original 'CallExpression' so that we can push</span>\n                    <span class=\"token comment\">// arguments </span>\n                    node<span class=\"token punctuation\">.</span>_context <span class=\"token operator\">=</span> expression<span class=\"token punctuation\">.</span>arguments<span class=\"token punctuation\">;</span>\n\n                    <span class=\"token comment\">// Ceck the parent node is a `CallExpression` if it is not then</span>\n                    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>parent<span class=\"token punctuation\">.</span>type <span class=\"token operator\">!==</span> <span class=\"token string\">'CallExpression'</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\n                        <span class=\"token comment\">// wrap our `CallExpression` node with an `ExpressionStatement`. </span>\n                        <span class=\"token comment\">// This is done because the top level `CallExpression` in JavaScript are actually </span>\n                        <span class=\"token comment\">// statements.</span>\n                        expression <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>\n                            type<span class=\"token operator\">:</span> <span class=\"token string\">'ExpressionStatement'</span><span class=\"token punctuation\">,</span>\n                            expression<span class=\"token operator\">:</span> expression<span class=\"token punctuation\">,</span>\n                        <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n                    <span class=\"token punctuation\">}</span>\n\n                    <span class=\"token comment\">// Lat but not the least wrap the expression with the parent context</span>\n                    parent<span class=\"token punctuation\">.</span>_context<span class=\"token punctuation\">.</span><span class=\"token function\">push</span><span class=\"token punctuation\">(</span>expression<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n                <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n            <span class=\"token punctuation\">}</span>\n        <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n        <span class=\"token comment\">// return the new AST</span>\n        <span class=\"token keyword\">return</span> newAst<span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token comment\">// export transformer </span>\n    module<span class=\"token punctuation\">.</span>exports <span class=\"token operator\">=</span> transformer<span class=\"token punctuation\">;</span></code></pre></div>\n</li>\n<li>\n<h3>Code Generation</h3>\n<p>This is the final step in our compiler design this phase is going to generate the code for the new program by taking the AST. At times compilers do things that will overlap with the transformation.</p>\n<p>Code generators work in different ways, some will reuse the tokens from the earlier and others will generate the code in a linear fashion by generating a new AST.</p>\n<p>In our code generator we are going to use the same AST and generate our code.</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\">    <span class=\"token comment\">/**\n    * ============================================================================\n    *                               ヾ（〃＾∇＾）ﾉ♪\n    *                            THE CODE GENERATOR!!!!\n    * ============================================================================\n    */</span>\n\n    <span class=\"token comment\">/**\n    * Our CodeGenerator is going to call itself recursively to to print a string \n    * The code generator is quite straight forward to understand\n    */</span>\n\n    <span class=\"token keyword\">function</span> <span class=\"token function\">codeGenerator</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">node</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\n        <span class=\"token comment\">// We'll break things down by the `type` of the `node`.</span>\n        <span class=\"token keyword\">switch</span> <span class=\"token punctuation\">(</span>node<span class=\"token punctuation\">.</span>type<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\n            <span class=\"token keyword\">case</span> <span class=\"token string\">'Program'</span><span class=\"token operator\">:</span>\n                <span class=\"token keyword\">return</span> node<span class=\"token punctuation\">.</span>body<span class=\"token punctuation\">.</span><span class=\"token function\">map</span><span class=\"token punctuation\">(</span>codeGenerator<span class=\"token punctuation\">)</span>\n                    <span class=\"token punctuation\">.</span><span class=\"token function\">join</span><span class=\"token punctuation\">(</span><span class=\"token string\">'\\n'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n            <span class=\"token comment\">// For `ExpressionStatement` call the codegenerator function and add a semicolon</span>\n            <span class=\"token keyword\">case</span> <span class=\"token string\">'ExpressionStatement'</span><span class=\"token operator\">:</span>\n                <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span>\n                    <span class=\"token function\">codeGenerator</span><span class=\"token punctuation\">(</span>node<span class=\"token punctuation\">.</span>expression<span class=\"token punctuation\">)</span> <span class=\"token operator\">+</span>\n                    <span class=\"token string\">';'</span>\n                <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n            <span class=\"token comment\">// For `CallExpression` we will print the `callee`, and call the codeGenerator</span>\n            <span class=\"token comment\">// recursively so that the end result of recursion is going to be a string </span>\n            <span class=\"token comment\">// the arguments are concatenated as shown below</span>\n            <span class=\"token keyword\">case</span> <span class=\"token string\">'CallExpression'</span><span class=\"token operator\">:</span>\n                <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span>\n                    <span class=\"token function\">codeGenerator</span><span class=\"token punctuation\">(</span>node<span class=\"token punctuation\">.</span>callee<span class=\"token punctuation\">)</span> <span class=\"token operator\">+</span>\n                    <span class=\"token string\">'('</span> <span class=\"token operator\">+</span>\n                    node<span class=\"token punctuation\">.</span>arguments<span class=\"token punctuation\">.</span><span class=\"token function\">map</span><span class=\"token punctuation\">(</span>codeGenerator<span class=\"token punctuation\">)</span>\n                    <span class=\"token punctuation\">.</span><span class=\"token function\">join</span><span class=\"token punctuation\">(</span><span class=\"token string\">', '</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">+</span>\n                    <span class=\"token string\">')'</span>\n                <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n            <span class=\"token comment\">// For identifier we will return the name</span>\n            <span class=\"token keyword\">case</span> <span class=\"token string\">'Identifier'</span><span class=\"token operator\">:</span>\n                <span class=\"token keyword\">return</span> node<span class=\"token punctuation\">.</span>name<span class=\"token punctuation\">;</span>\n\n            <span class=\"token comment\">// For `NumberLiteral` let's return the value</span>\n            <span class=\"token keyword\">case</span> <span class=\"token string\">'NumberLiteral'</span><span class=\"token operator\">:</span>\n                <span class=\"token keyword\">return</span> node<span class=\"token punctuation\">.</span>value<span class=\"token punctuation\">;</span>\n\n            <span class=\"token comment\">// For `StringLiteral` we just add quotes arround the value</span>\n            <span class=\"token keyword\">case</span> <span class=\"token string\">'StringLiteral'</span><span class=\"token operator\">:</span>\n                <span class=\"token keyword\">return</span> <span class=\"token string\">'\"'</span> <span class=\"token operator\">+</span> node<span class=\"token punctuation\">.</span>value <span class=\"token operator\">+</span> <span class=\"token string\">'\"'</span><span class=\"token punctuation\">;</span>\n\n            <span class=\"token comment\">// And if we haven't recognized the node, we'll throw an error.</span>\n            <span class=\"token keyword\">default</span><span class=\"token operator\">:</span>\n                <span class=\"token keyword\">throw</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">TypeError</span><span class=\"token punctuation\">(</span>node<span class=\"token punctuation\">.</span>type<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token punctuation\">}</span>\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token comment\">// export code generator</span>\n    module<span class=\"token punctuation\">.</span>exports <span class=\"token operator\">=</span> codeGenerator<span class=\"token punctuation\">;</span></code></pre></div>\n<p>That's it we are done with our compiler 👏👏👏.</p>\n<p>For the last part let us call the compiler program in a file.</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">var</span> tokenizer     <span class=\"token operator\">=</span> <span class=\"token function\">require</span><span class=\"token punctuation\">(</span><span class=\"token string\">'./tokenizer'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">var</span> parser        <span class=\"token operator\">=</span> <span class=\"token function\">require</span><span class=\"token punctuation\">(</span><span class=\"token string\">'./parser'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">var</span> transformer   <span class=\"token operator\">=</span> <span class=\"token function\">require</span><span class=\"token punctuation\">(</span><span class=\"token string\">'./transformer'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">var</span> codeGenerator <span class=\"token operator\">=</span> <span class=\"token function\">require</span><span class=\"token punctuation\">(</span><span class=\"token string\">'./code-generator'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">/**\n* ============================================================================\n*                                  (۶* ‘ヮ’)۶”\n*                         !!!!!!!!THE COMPILER!!!!!!!!\n* ============================================================================\n*/</span>\n<span class=\"token keyword\">function</span> <span class=\"token function\">compiler</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">input</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">let</span> tokens <span class=\"token operator\">=</span> <span class=\"token function\">tokenizer</span><span class=\"token punctuation\">(</span>input<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">let</span> ast    <span class=\"token operator\">=</span> <span class=\"token function\">parser</span><span class=\"token punctuation\">(</span>tokens<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">let</span> newAst <span class=\"token operator\">=</span> <span class=\"token function\">transformer</span><span class=\"token punctuation\">(</span>ast<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">let</span> output <span class=\"token operator\">=</span> <span class=\"token function\">codeGenerator</span><span class=\"token punctuation\">(</span>newAst<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n    <span class=\"token comment\">// and simply return the output!</span>\n    <span class=\"token keyword\">return</span> output<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\nmodule<span class=\"token punctuation\">.</span>exports <span class=\"token operator\">=</span> compiler<span class=\"token punctuation\">;</span></code></pre></div>\n</li>\n</ol>","timeToRead":14,"frontmatter":{"title":"Cloud Sprint Student Program","date":"01 Jul 2020","tags":["gcp"],"path":"blog/sprint","excerpt":"A 12 week summer program sponsored by Google Cloud for selected undergraduates to explore GCP and take on the ACE Certification.","cover":{"childImageSharp":{"fluid":{"tracedSVG":"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='400'%20height='222'%20viewBox='0%200%20400%20222'%20preserveAspectRatio='none'%3e%3cpath%20d='M31%2073c-6%203-10%205-13%209-4%205-7%2011-5%2012%201%200%200%202-2%203l-3%203-2%201c-1%202%200%203%201%204v2H6c0-3-2-1-2%202%200%202%200%202%202%201h1l1%203c0%202%200%202-1%201l-2-2c-1%201%202%209%203%208v2h1l2-1-1%202c-1%201%202%204%206%206l24%201c19%200%2021%200%2025-2%2012-6%2014-21%205-32l-6-9c-6-12-22-18-33-14m77%2010c-13%207-15%2024-4%2033%2013%2011%2033%203%2033-13v-4h-19v6h7c7%200%207%200%204%205-4%209-19%207-24-3-7-13%2010-27%2022-18%201%201%202%201%203-1l2-2-3-2c-5-4-15-4-21-1m118%2019v19h6V82h-6v20m56-16c-17%207-15%2032%204%2035%205%201%2011%200%2015-3%202-3%202-3%201-4-2-2-2-2-5%200-4%204-13%204-17%200-10-10-3-26%2010-25%203%200%206%201%207%203h4c4-5-11-10-19-6M32%2087c-3%201-5%204-3%204s3%200%205%202c3%202%203%202%202%203-2%201-2%202-2%203%201%204-2%207-4%205-2-4-13-3-13%200l-1%202c-2%200-2%205%200%207v5c-2%200-2%201-1%202l2-1%2020-1c19%200%2022%200%2025-4s0-10-5-11l-2-4c0-10-13-17-23-12m275%2016v18h5V85h-5v18m83-11c0%204%200%207-1%206-2-4-12-3-16%202-8%2010%202%2026%2013%2021l4-1%203%201h2V85h-2c-3%200-3%200-3%207m-244%204c-10%205-9%2020%201%2025%2010%203%2018-3%2018-12%200-11-9-17-19-13m29%200c-7%204-10%2015-4%2021%208%209%2023%204%2023-8%200-10-10-17-19-13m30%200c-15%206-7%2030%207%2025%204-1%204-1%204%201%200%206-7%208-11%204-3-2-7-2-7%200s6%207%208%207c13%201%2016-3%2016-24V96h-17m36%201c-12%206-7%2024%206%2024%207%201%2013-4%209-7h-4c-2%202-7%203-9%201s-1-3%203-4l8-4%205-2-2-3c-3-6-10-8-16-5m83-1c-8%203-11%2015-5%2021%207%209%2020%204%2022-7%201-10-8-17-17-14m21%2010c0%2012%201%2013%206%2015h7c2-2%204-2%204-1l2%201c2%200%202-1%202-12%200-12%200-13-2-13s-2%201-2%208c0%2010-2%2013-7%2013s-6-3-6-13c0-7%200-8-2-8s-2%201-2%2010m-166-5c-8%202-6%2015%202%2015s10-13%202-15h-4m144%201c-3%204-3%2010%200%2013%206%205%2013%201%2013-7%200-7-8-11-13-6m54%200c-5%206-1%2015%206%2015%206%200%2010-10%205-15-3-3-7-3-11%200m-230%201c-3%202-3%208%200%2011%205%205%2012%201%2012-6%200-6-6-9-12-5m57%200c-3%204%200%2013%205%2013%206%200%2010-8%206-13-3-3-8-3-11%200'%20fill='%23d3d3d3'%20fill-rule='evenodd'/%3e%3c/svg%3e","aspectRatio":1.7985611510791366,"src":"/static/34571f89f87caa7608d9228147ff2778/a7715/google-cloud_fb.jpg","srcSet":"/static/34571f89f87caa7608d9228147ff2778/8f7df/google-cloud_fb.jpg 250w,\n/static/34571f89f87caa7608d9228147ff2778/0f3a1/google-cloud_fb.jpg 500w,\n/static/34571f89f87caa7608d9228147ff2778/a7715/google-cloud_fb.jpg 1000w,\n/static/34571f89f87caa7608d9228147ff2778/47498/google-cloud_fb.jpg 1200w","sizes":"(max-width: 1000px) 100vw, 1000px"}}}}},"allMarkdownRemark":{"edges":[{"node":{"frontmatter":{"path":"blog/icbs","title":"Consultation Booking System","tags":["python","firebase","raspberrypi"],"excerpt":"An integrated professor-student realtime consultation booking system.","cover":{"childImageSharp":{"fluid":{"tracedSVG":"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='400'%20height='234'%20viewBox='0%200%20400%20234'%20preserveAspectRatio='none'%3e%3cpath%20d='M171%2046c-14%202-26%206-26%208h2c2-6%2041-8%2085-6%2021%201%2023%202%2026%209%204%207%203%2045-1%2052-3%205-15%206-57%206-35%200-43%200-51-5l-3-1c0%201%204%204%2011%206%2011%203%2091%202%2098-2%205-3%207-12%207-35%201-24-3-30-17-31-12-1-66-2-74-1m-31%2012a332%20332%200%20002%2044c3%200%203-2%203-15%200-20-1-29-3-30l-2%201m54%200c-2%201%200%2041%202%2043h8c9-1%2013-5%2012-11-1-4-5-9-8-11-2%200-1-1%202-4%206-6%206-9%202-14-4-3-4-3-11-4l-7%201m-29%202c-9%206-13%2022-8%2032%204%207%206%208%2016%209%208%200%208%200%208-2s-2-3-8-3c-8%200-12-4-14-13-1-9%208-23%2013-20%202%202%204%201%204-1%200-4-6-5-11-2m67%200c-3%202-6%207-6%2010%200%204%202%206%208%209%2010%204%2014%2010%209%2014-2%203-6%202-11-1-4-2-5-2-6-1-5%205%2014%2012%2020%207%208-6%203-17-9-23-6-3-7-5-6-8%202-4%206-5%2011-5h5c0-4-11-5-15-2m-35%203l1%207v5h3c7-2%2011-7%208-11-2-3-13-4-12-1m2%2025c0%209%200%209%204%208%2010-1%2011-9%201-13-6-3-6-3-5%205m-59%2048v7h3c3%200%206-3%205-5v-4c0-3-1-4-4-4h-4v6'%20fill='%23d3d3d3'%20fill-rule='evenodd'/%3e%3c/svg%3e","aspectRatio":1.7045454545454546,"src":"/static/fba3ec7bc8986a5670124b1e4f67f29f/4fe8c/icbs.jpg","srcSet":"/static/fba3ec7bc8986a5670124b1e4f67f29f/aabdf/icbs.jpg 150w,\n/static/fba3ec7bc8986a5670124b1e4f67f29f/9dc27/icbs.jpg 300w,\n/static/fba3ec7bc8986a5670124b1e4f67f29f/4fe8c/icbs.jpg 600w,\n/static/fba3ec7bc8986a5670124b1e4f67f29f/9842e/icbs.jpg 900w,\n/static/fba3ec7bc8986a5670124b1e4f67f29f/50ba2/icbs.jpg 1109w","sizes":"(max-width: 600px) 100vw, 600px"}}}}}},{"node":{"frontmatter":{"path":"blog/stagecraft","title":"StageCraft - a neural network based game that helps actors build acting skills","tags":["tensorflow","opencv","tkinter"],"excerpt":"Winner for HackNRoll 2019, a gamified application that allows users to improve their acting skills by thriving on a deep neural network emotion classifier.","cover":{"childImageSharp":{"fluid":{"tracedSVG":"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='400'%20height='253'%20viewBox='0%200%20400%20253'%20preserveAspectRatio='none'%3e%3cpath%20d='M164%205c-3%203-3%205-3%208l-3%202-2%201h2c5-1%204%201-2%206l-5%206%206-5%207-4-1%202c-2%201-3%203-1%203l-1%204c-2%204-2%205-1%205l-1%205c-2%204-4%207-4%204h-2l-3-1-1-1c-2%202-9-1-8-3h-7l-5-1c-2%200%208%204%2012%204%206%202%207%202%203%207l-3%206%204-5c4-6%2010-7%206-1l-1%204%203-3c1-4%203-5%203-2h1c1-1%201-1%201%201l-1%203-1%201v-2c0-2%200-2-1%200-1%203-5%205-5%203h-1c-2%202-8%204-8%202h-1c-1%202-2%202-2%201l-2-1v1c2%202-7%204-9%203h-1c1%201%200%202-1%202-1%201-1%201%201%201l3%201h1c-1-2%205-5%206-3l3-1%205-2c3-1%203-1%203%202l1-1c1-3%205-5%205-3h4c0-2%203-3%204-2v2c-1%202%200%203%202%201l-4%207c-5%207-5%207-7%205l-1-2c0-1%201-1%201%201h1l2-4c2-2%202-3%200-3h-1l-2%203h-1c2-5%202-7%200-3-2%205-4%206-5%203%200-1-1-2-2-1l-1%201c1%200-3%2010-5%2011l-2-2h-1c1%202%200%202-1%202-2%200-2%200%200%201l3%202-2%201-3%201-1%202c-1%203%202%203%203%200h1c1%202%201%202%202-1l1-3%202%202%202%204%201%201v2c-1%201-1%201-1-1l-2%203-2%205-1-3c0-2-1-3-2-3v3l1%202c1%202%201%202-1%202-3%200-5-3-3-4%201%200%202-1%201-2l1-1%201-2c0-3-2-3-2%200-1%202-1%202-2%201l-1-2-1-1c-1%200-3-5-2-7l2%201c1%202%202%202%202%201l-1-3c-1%200-1-1%201-1v-1c-2%200-3-2-1-2l1-2h-1c-2%202-2%202-3%200l-2-2%201%202c0%203-3%203-4-1v-5l2%202%201%202-6-13c-1-1-1-1-1%201h-1l-1-3h2c0-2-2-3-2-2l-1-2%201-3%201-1-1-1h-1c0%202-1%200-2-3%200-2%201-3%203%200l2%201-1-2c-3-4-2-5%204-3l6%201-5-2c-8-3-8-5%200-8l5-2-6%201c-5%202-5%202-6%200-5-7-17-4-17%204%200%202-1%203-3%204l-2%201h2c3-1%203%200%204%201l1%202%201%203-1%201-2%201c-3%204-2%205%200%202l2-1c1%201%201%200%202-1%201-3%208-4%208-2l3%2010c2%208%202%2010-1%208-4-2-9-1-11%202-2%202-5%203-7%201l1-5%202-5-3%204-4%205c-2%200-2%200-1-2%200-2%200-2-2-1-1%201-3%202-5%201h-3l3%201c2%201%203%202%202%203h1c2-2%205-1%205%201h1c1-2%206%200%207%203l-4%203c-5%201-6%201-5-1%200-2%200-2-2%201l-5%204c-4%201-5%200-3-1l1-2-2%201-3%202-2%202v3h1c2-2%202-2%204-1%202%203%204%202%202%200s-2-2%201-3l4-1h2l6-3c7-1%208%200%203%204l-3%204%205-3c2-3%203-3%203-1-1%202%200%205%202%203%200-2%202-2%204-2%203%200%203%201%205%205l2%203c0-2%203%202%203%204l-1-1c-2-2-2-2-2%202%200%203%201%204%202%203v1c0%203%201%202%204%200%202-2%202-2%200-3s-2-4%200-3l1-1c-1-1%200-2%201-3h1l1%201c1-1%203%200%202%201h-1c-1-1-1-1-1%201l-1%202-1%202h2c1-1%201-1%201%201v3c3%202%202%203%200%203l-3-2-2-2%201%203v2h-2l-2%201-2-1c0-4-10-6-13-3h-2c-2-2-3-1-2%201l1%203c-1%201-6-1-6-3h-1c-1%202-4%201-4-1v-1l-3%202-1%201-1%203-2%202-5%208-2-2c0-2%200-2-1-1h-1c-1-1%202-9%204-12l2%202h1c-1-2%200-2%202-1h4l-4-1c-3-1-3-3%200-9%201-3%202-4%203-3s1%202-1%204l-1%202%202-1%203-2%201-1%202-3%203-3-4%202c-3%203-5%203-6-1l-4%205-3%207-3-3c-2-4-3-6-1-6l1-2h-2c-1%202-2%202-3%201h-1l1%201v3l1%201c0-1%202%200%203%202l2%203h-2l-4-1v-2c0-2%200-2-1-1s-2%200-3-3l-3-3%201%204c2%204%202%204%200%203-2%200-2%200%200%201l1%203h4c1-2%207%200%207%202-1%204-2%206-3%205l-1%201c1%201%200%203-1%203l-1%203-1%203c-1%203-1%203-3%202-1-1-1-1-1%201%201%202%201%202-1%202s-4-3-3-6l-1-1h-1c-1-1-1-1-1%201l2%203c1%203%201%204-1%204-1%201-1%201%201%201%203%200%204%203%203%206h-4c-3-1-4-4-2-5v-1c-3%200-3-2-1-4l2-2-3%202c-2%201-2%201-2-1v-1l-6%201c-5%200-9%203-9%206%200%202-2%202-14%202H9l13%201c12%200%2013%200%2014%202%201%204%205%206%209%206l6%201c1%201%201%201%201-1-1-2-1-2%201-1%203%203%204%202%201%200-2-3-1-4%202-3%202%200%203%201%203%202h1c1-2%204-1%203%202h1c2-1%202-1%203%202l1%204c0%202%201%201%203-1%202-1%202-1%202%201-1%203%200%202%201-1l2-3%205%208%201%201c2%200%201-2-2-6-2-3-2-4%202-2%202%201%203%201%202%203h1c1-1%202%200%203%202l2%202-1-3c-1-2-1-2%205-1l4%203c0%203-6%205-7%203h-1l2%203%201%201c0-2%202-3%205-3%202%200%201%203-3%206l-3%203-2-3c-3-5-7-9-7-7l1%202-2%202-2%201h3c3-1%204-1%206%203%202%205%203%205%204%203s1-2%202-1h1l2-4c3-2%203-2%206-1%204%203%2011%201%2011-3l2-1c1%200%202%201%201%202%200%202%200%202%201%201%201-2%202-2%204-1%204%201%204%201%203%203-1%201-2%203-1%204h-3l1%202v3c0%204-2%203-2-1%201-2%201-2-2%201l-3%202%201-2%201-3%202-2%202-4c0-3%200-3-1-1-2%202-2%203-3%201l-1-1v2c1%201%202%202%201%203h-1l-2-3c-2-1-3%200-1%202%201%201%201%202-1%207-3%208-3%208-7%208-2%201-3%201-4-2-1-4-2-4-1%201v4l-4-3-4-3%206%206c2%200%200%203-2%203v1c2%200%201%204-1%205s-2%201%200%201c1%200%204%201%205%203%202%202%208%203%2012%201%201-1%202%200%202%201v3l-3%207c-2%208-2%208-6%208-2%200-3-1-4-3-1-1-1-2-2-1h-1c-2%200-1%201%201%203v3l-1%201c1%203-1%203-5%201l-7-1%205%202c5%202%206%202%206%205%200%208%2012%2011%2017%204%201-2%201-2%206%200l6%201-5-2c-6-2-8-5-5-6v-1c-3%200-2-2%200-5l1-2-2%202c-3%203-4-3-1-7%201-2%202-4%201-5%200-2%200-2%201-1s1%201%202-1c1-1%201-1%205%202%205%204%207%203%202%200l-2-3%202-3c2-2%203-3%205-2h4l-3-1c-2-1-3-2-2-3h-1l-3%201c-2%200-2%200-1%201%202%200%202%201%200%204-3%203-4%203-4%200%200-2%200-2-1-1%200%202-2%200-1-2h-2l1-2c2%201%204-3%203-5l-1%201-1%202v-3c1-3%201-3%202-1%201%201%201%201%201-1l3-2-1%204v3l2-3c2-5%203-6%207-6%203-1%203-1%202%201h1c2-2%202-2%204-1%203%202%204%201%202-1s-2-2%200-2c2-1%202%200%204%202l1%204-1-4c0-5-1-5-3-4h-2l1-2c0-1-1-1-2%201l-2%202-1-4-2-4-1-2v-3c-2%200-5-4-4-5l1%201h1l1-2%201-1h2l-1%202v1c2%200%202%200%201%201v3c1%201%201%201%201-1%201-1%202%200%203%204l3%205c1-1%202-1%203%201%202%201%202%202%201%202v1c2%200%204%208%203%209-1%202%202%201%204-1l3-2%201-2c0-1%201-1%202%201v5c0%202%200%202%201%201h2l-2-5c-1-4%200-7%204-5%203%201%2012%201%2012-1v-2l2%202c0%202%200%202%201%201h1c0%201%201%202%202%201l1%202v1c1-2%202-2%203%200%202%201%202%201%200%202l-2%202-4-5-1-1h-1l-2-1%201%202%201%202h-1c0-1-2%201-3%206-2%207-3%208-6%208-2%200-3%200-4-4-1-3-1-4-2-3h-1l1%204-1%201c-2-1-1%200%201%202%201%202%201%202-1%201-2%200-2%200-1%201v3c-1%201-4%200-4-2h-1c-1%202-1%202-2%201%200-2-1-2-1-1l1%205c2%202%202%202%202%200v-2l2%206-1-1h-1c-1%202-1%202-4-2l-1-5v-1l-2-1c-1-2-2-2-3%200v1c2%200%208%2010%206%2010l1%201%203%205%202%202-2-4v-3l2%202c0%202%200%202%201%201%201-2%201-2%201%201l2%2012-1%202%201%202c2%203%201%205-1%202-4-3-5-2-2%201%204%204%203%205-2%204l-4-1%203%202%205%202c-1%208%209%2013%2015%208l2-4c0-3%202-3%2023-3h21l2%203c3%206%209%208%2013%204%203-2%206-10%204-10s-1-3%202-6l1-2-2%202c-3%203-5%202-3%200l1-3v-4l2-3h-1c-2%202-1-1%201-4l1-6c-1-2-1-2%200%200h1c0-2%202-3%202%200l1-1c3-2%203-5%200-3-1%201-1%201-1-2%201-4%204-7%205-4l2-1%203-2%203-1c1-1%201-1-2-1l-5%201c-2%202-3%201-2-2l1-4-2%204c-1%204-3%206-2%201%200-3%203-8%204-6l2-1%201-2%202-3%203-3-3%201c-1%201-1%201-1-2l-1%201c-2%205-4%204-2-2%201-4%204-5%204-2h4l1%201-1%204v3l2-3c0-2%202-3%202-2l1-2%201-3v-2c-1-1-1-1-2%201%200%202-5%202-6%200l1-1c2%201%202%201%202-1l-1-3h-1l-1-1%202-1v-1l1-1%202-2v-2l1%202c1%202%201%202%202%201l3%202c3%201%203%202%202%203-1%202-3%200-2-1l-1-2c-2-1-2-1-1%203l1%203c0%202%201%201%203-1h3l1%201v6h-2l-2%201c-1%201-1%201%201%201v3h2l1-1c0-2%203%200%205%203%201%202%201%202%201%200-1-3%201-3%201%200v3h-1l-1%202h-3c-2%201-7-2-6-4l-1-2-2%202v2l-1%201h1c2-1%205%201%204%203l1%201h2l2-1h5v4c-1-1-2%201-2%202%200%202%203%200%203-1h1v4c0%202%200%202%201%201s1-1%201%201v1c1-1%201-1%201%201l1%204-1%202c-2-1-1%200%201%202v2l-1-1-2-1%201%202c3%203%200%204-7%202l-8-2%206%203c6%201%208%203%208%204v2l2%204c4%203%208%204%2012%202%202-1%205-7%205-9-1-1%200-1%203-2l8-3-7%201c-6%202-7%201-4-2v-2l-1%201-2%201%201-3c3-4%204-7%201-3l-2%201v1c0%202%200%202-1%201h-1c-1%201-2%202-4%201-3%200-3-1-6-9-3-10-3-12%201-10%203%202%208%201%2011-2l5-2c2%200%202%200%200-1-4-2-3-5%203-6l3-2-5%201c-3%201-7-1-7-4%201-2%200-3-1-2l-4%201c-4%200-4-1-6-5-1-4-1-5-2-4v9c2%202%200%206-3%206-1%200-3-4-3-7v-3c-2-2%201-4%203-1l-1-3c0-2%202-3%202-1v-1c0-2%200-2%201-1s1%201%201-2l-1-3-1-1-1-3v-3c2%200%205%204%204%205l-1%201h1l5-1c5%200%206%200%208-3%203-2%206-2%208%200h3l1-1-2-1h-1l-4-1c-4-1-3-4%201-6l4-1-4%201c-4%200-8-3-6-5l1-1h-1l-6%201h-4l-3-7c-3-5-3-6-2-7s1-1%201%201v1l2-4v-2h6c4-1%205%200%207%202l2%202-2-3-1-4%201%201%201%201v-1c-1-2-1-4%202-4v-1l-1-2-1-4c-1-3%203-7%205-4%201%201%201%201%201-2-1-4-1-4-5%200-2%203-3%203-4%202l-6-1c-4%200-5%200-6-2-2-3-2-9-1-7h1v-2l2-3c1-3%201-4%205-4l4%201h2c-1%201%200%204%201%207l3%203-1-3c-2-3-1-4%201-1s3%201%200-2c-1-2-1-2-2-1s-1%201-1-1v-2l-1-3%201-1c1%201%201%200%200%200-1-3%201-3%207-1%205%201%206%202%207%204s2%203%202%200c-1-1-1-2%201-2%201-1%201-1-1-1l-3-2h-1c-1%201-10-2-10-4-1-2%204-5%206-3l1-1c2-2%205-1%207%203l3%203-2-4c-3-4-2-4%204-6%203%200%204%200%206%202%204%204%205%204%202%200-3-3-3-3%202-4l3-2-6%201h-6c-2-3-4-2-2%200s2%202-2%203h-5l-1%201c0%202-4%201-5-1-1-1-1-1-1%201%201%204-4%204-7%201s-7-4-12-2c-1%201-2%200-2-2v-2l3-7c2-8%202-8%205-8l4%201h1l1%201v1l2%201h1l-2-3-1-3%202%201%201%201v-2c-3-3-2-4%202-3%205%202%207%201%202-1-3-1-4-2-4-4-2-8-11-11-16-5-2%202-3%203-6%202h-2l2%201%203%203%201%204c1%201%201%201-1%203l-1%203%202-1%202-2v2c-2%202-3%203-1%203h1l-1%202-1-1h-1l-1%201%201%201h1l1%203h-1c-1-1-1-1-1%201v5l-2%201-1-2c-1%201-2-1-1-2%202-2%201-3-1-2-1%201-2%202-3%201v4h1l3%201%201%201v3c-1%203-2%202-1%200%200-2%200-2-1%200-2%203-2%204%200%203v5c-2%203-4%204-4%201h-1c-2%202-2%202-3%200-2-3%200-7%204-7%202%200%202%200%201-1l-2-1-1-1c-1%201-9-1-9-2l-1-1-3-3-3-3%201%204%202%202h-3l-5-3-2-1c0%203-3%201-4-1%200-2%200-2-1%200-1%201-1%201-2-1l-1-1c0%203-2%202-2%200%200-1%200-2%201-1l1-1h2c1%202%201%202%201%200%200-3%202-3%202%200l2%202-2-5c-1-3-1-3-2-1-1%201-1%201-2-1-1-1-1-1-1%201v2l-1-2c-1-2-1-2-1%201%200%202%200%202-1%201-3-5-10-7-14-3-2%202-2%202-1-3a652%20652%200%20007-17c2%200%203%202%205%2010l4%208h1v-1l1-3v-2h-1c0%204-1%201-2-2v-5c-1-2-1-2%201%200%203%204%203%201%200-3-4-4-3-5%201-1l3%202-2-4c-3-3-4-6-1-5l13%204-6-3c-6-2-8-2-8-4%200-10-15-12-18-3%200%202-1%202-22%202l-21%201%2021%201%2022%201c1%201%200%202-1%203l-2%202%203-1c3-2%203%201-1%205l-3%203%204-2c3-4%204-3%201%201-2%202-3%205-1%204l1%203-1%202c-1-1-1-1-1%201v4l-1%203v-3c0-2%200-2-1-1-1%202-3%202-2-1h-4c-2%200%201%203%203%203%202%201%200%207-2%207l-2-1h-1c-3%202-11%201-14-2l-3-3%202%204%202%202h-3l-4%201h4l3%201h1l3%202%203%203-1-3-2-2h10c2-1%202-1%202%201-2%205-2%206%200%202s2-4%203-2c0%202%200%202%201%201l1-2v2c0%202-2%205-2%203s0-2-1%200c-1%203-4%205-4%203h-1c-2%202-4-1-3-4%202-3%201-4-1-1s-2%204%200%206l2%202-3%201-3%203%203-1h3l1-1c0-2%204%203%204%205l-1-1h-1v1l-1%201c0%202-4%207-5%207l-1-2-2-3%201-1%201%202%202-1c1-3%202-6%200-4-1%202-2%202-4%201-1-1-2-1-1-2v-2h-1l-3%201c-3-1-3-1-2%201%202%201%202%201%201%202v1h2c1-1%204%204%204%206l-2%205-1%204-2-3-1-2h-1v-5c2-4%202-5%200-2-1%201-1%201-1-1v-2l-4-7-1-3c0%201-4-6-4-9%200-1%203-1%204%201h1l-2-4c-1-2-2-2-2-1%201%204-3%202-4-1s-1-3%201-4%202-1%201-2-2%200-2%201h-2c-1-1-1-1-1%201l-1-1c-2-3-3-6-1-4%201%202%201-1-1-4l1-2c2%201%201%200-1-4s-3-5%200-3h1l-1-2c-2-2-1-3%201-2v-5c2-7-9-13-15-8m3%2018a5522%205522%200%2001-4%2019c3-3%208-4%2012-2l2%202-5-20c-1-2-5-1-5%201M38%2041l-2%204c0%202-2%202-13%202l-13%201%2013%201h12l1%203c2%203%206%205%2010%205%202%200%203%201%206%207l4%206-1-4c-2-4-2-5%200-3s1%200-1-4c-3-3-4-4-1-4h1l-1-1v-2c0-1%202-1%206%201l6%201-5-2c-7-2-8-4-4-7%202-1%202-1%200-1l-5-2c-4-4-9-4-13-1m314-1l-3%203c0%202-1%202-2%202l-4-2c-3%200-3%200%201%202%206%202%205%204-1%206-4%202-1%202%204%200%204-1%202%203-4%207l-5%206%206-4c6-5%207-6%206-4%200%201%201%202%205%201%206%200%208-1%2010-5l2-3h12l13-1-13-1c-12%200-13%200-13-2-2-5-9-7-14-5M240%2052l2%204%201%202-2-1c-2-3-3-2-2%200l1%203-1%202%201%204c0%202%200%202%201%201s1-1%201%201v2l1%203v-2h1c2%201%202%201%201%203-1%201-2%202-1%203%201%202%203%203%202%201v-2l4%207-1-1c-2-4-4-2-2%203%201%203%204%204%204%202h1c2%202%203-1%202-4-3-7-6-12-8-11v-4c-3-2-2-4%200-1l2%202c2%200%200-7-2-8l-1-2%201-1%202%202c2%203%204%204%202%200l-1-3%202%203%203%204v1l2%203%203%203-2-1h-2l-1-1c-2-3-3-1-2%204%201%204%202%205%204%202h4l1-1v-3h1c1%202%208%202%2010%201%201-1-2-5-3-4l-1-1c1-2-4-9-6-9h-1l-1-1-4-2c-2%200-2%200-1%203%202%203%202%203%204%202%202-2%202-1%200%202l-2%202-2-5c-3-5-5-6-6-4h-1c0-3-2-2-2%200s0%202-1-1c-2-3-4-4-5-2m-75%209l-2%203h-1v-3c-2%200-7%209-6%2010l-1%201-4%203-1%203h7v-6l4%203v2c-2-1-4%202-2%203v1l-2%201h-1c0-2-2-3-2-1l-2%203%201-3c0-2%200-2-2-2l-3%202-1%201v5h3l1-1c0%203%202%202%204-1%201-2%201-2%201%200v2c2%200%204-2%205-4%200-6%205-9%2011-8l4%202%202%201%201-2h2c0-2%200-2%201-1%201%202%202%200%201-3h1c1%202%202%202%203%200%202-1%202-1%201-2s-1-1-1%201l-1-1-1-2-2%202-2%203-1%201h-1l-1%201-1-1-2-8c-2-8-3-9-6-9-2%200-3%200-4%204m61%206l-2%2011%201-2v-1h5c2-1%204%200%205%201h5v1c-1%202%200%203%202%203s2%200%201-3l-2-3v-1l-1-4c-2-8-5-12-8-12s-3%200-6%2010m43%207l-3%201v4c-1%201-1%201-2-1%200-2-1-2-1-1h-4l-2%201h-1c-2%200-2%201-1%202%202%202%203%203%203%201l2-2c1-1%201-1%201%201l-1%203-1%201h-1l2%201%202%202%202%204%202-5c2-4%204-8%203-4-1%202%201%204%202%204v-3c0-2%200-2%201-1h2l1-2c1%201%201-5-1-6h-1l-1%203-1-2c1-2%201-2-2-1M53%2076h-3c-4-3-14%201-14%205%200%202-2%202-14%202H9l13%201c13%200%2013%200%2014%202%201%204%206%207%209%207%203-1%203%200%206%206%203%207%205%209%205%206l1-2%202-3c1-2%201-2%203-1%201%201%202%203%201%204h1l2-1%203-2%202-4-3-2v2c1%201%200%202-1%203-1%202-1%202-4-1-3-2-4-2-5%202l-2-1c-2-3-3-2-1%201l1%203c-1%200-2-1-2-3l-1-3%201-1-2-1v-1l-1-1-1-1%202-1%201-2%204-1h4l-4-1c-4-1-4-5-1-6%202-1%202-1%200-1-3%200-4-2-1-4%202-2%200-3-2%200m298%200l-2%203-3%201c-2%200-2%200%200%201s3%205%201%205v1c2%200%202%202%200%204-1%202%200%203%202%201l1%202-1%202-2%201h1l1%203%202-3c2-4%202-5%206-5s9-3%209-7l13-1%2014-1h-27l-1-3c-2-5-8-7-14-4m-15%2012c-2%202-8%204-8%202h-3l-1-1h-1v-1h-2c-1%200-1%201%201%202%203%202%203%202-2%204-4%201-4%201-6-1-3-3-2-1%200%202s2%203%203%202l5-2h1l-1%202%202-1%202-1%203%202h3l-3-2-1-2%209-1%203%205%203%206%201%201c1-1%202%200%201%202h-5l-2%204-2%202-2-3c-1-4%200-6%203-5%202%200%202%200%201-1v-2l-2-1-2%201v2c-2%201-2%201-3-2-1-2-1-2-2%200-1%205-3%208-6%208a18943%2018943%200%2001-12-2c2%200%204%201%206%205%201%201%201%201%201-1-1-2-1-2%202-1%205%200%205%200%201%204l-2%203%202-1c0-1%201-1%201%201%201%201%201%201%202-2l2-2h2c1-1%205%200%208%202l2%201%202-1-1%202-1%203%201%202%201%202-2-1h-1c-1%201-2%201-3-1h-1l1%202c2%201%201%202-3%202-2%201-3%201-2-1h-1c-2%203-4%201-4-2l-1-1v5l1%203%201%201%202%202c1%201%201%202%202%201%200-2%202-1%202%201s2%200%202-3v-1c-2%202-2%202-4-1l-2-2h2c6-1%208%200%209%201%201%202%202%202%202%201l-1-1c-2-1-1-4%200-4l3%202%202%202-1-3c-1-1-1-2%201-2%201-1%201-1-1-1-4%200-4-7%200-7%202-1%201-1-2-2h-4l2-4c2-2%203-3%204-2v2l-1%203%201-1c1-1%202-2%203-1v-3c0-2%200-2%201-1h2l-1-1v-3l-1-1h-1v-1l1-2h-1c-3%202-4-1-2-3%201-2%200-3-2-1l-3-2-1-3v-2c0-2-1-2-2%200m-179%200c-3%200-5%204-3%208l1%203c-1-1-2-1-3%201-2%202-2%202%200%203%202%202%204%201%204-2l1-1%201%201%201%202%203%205c3%203%204%204%205%203h10l-1%201%201%202c2%200%204-1%204-3h2l1-2c-1-2-1-2%201-1%202%202%205%200%203-2v-3c1-2%201-2%202%200%200%202%200%203%201%202h2v-1l-1-4c-1-3-3-4-3-1l-2%202v2h-1c-2%200-2-3%200-3v-3c-1-2-1-2-3%201-1%202-1%202-2%200s-4-5-4-3l2%203c4%205%205%2010%203%209-1-1-1%200-1%201l-2%202v-2c0-2%200-2-1-1l-1-1c1-1%200-4-1-7-3-5-3-6-7-6l-4%201h-1l-1%201v1h-1v-7c0-2-2-2-5-1m70%208l-2%203h-1v-2c0-2%200-2-1-1-2%201-3%205-1%204%201-1%201%200%201%201h1c1-1%201-1%201%202v3l1%202h-2l-1-1%202%203h2l3%201h5c1%201%202%200%203-1l2-2-1%202%201%202v2c0%202%200%202%202%202s2%200%201%201c-1%200-2%201-2%203l2%202c1%201%201%201-1%201s-3%202-1%204v1l-2-1h-1l-7%201c-4%200-4%201-6%205l-2%204v1l-1%202c-2%200-2-1-1-2%202-5%201-6-1-3l-3%202%202%203c4%204%204%205%200%202-3-4-5-3-4%200%201%202%201%202%203%201h1l-1%202%201%202%201%202h-2c0%202%202%206%204%206%201%200%202-3%200-5v-1c4%201%205-1%203-5-2-3-3-5%200-3l1%201%201%201c2%203%202%203%205%203s4%200%206-4%203-5%203-3v3h1l-2%201v1l-1%202-1%202%202-1c4-3%205-2%202%201l-2%203c1%201%206%200%208-2h2l1-1h-1l-1-2c0-2-2-4-2-2l-2%201c-1%200%200-2%203-4l3-4%201-1%202-3c1-2%200-7-2-5l-1-1-4-3c-3%200-3%200-1-1l3-3%202-4-1-1-1%202h-1l-2-1c-2%200-2%200-1-1%201%200%202-1%201-2h1c2%201%204%201%204-1l1-1%202-1c1-3-1-7-3-6v-1c1-1%201-2-1-3-2-2-5%200-4%202l-1%202c0-1-2%200-2%202l-3%202%201-2c1-1%200-3-2-7-3-6-4-7-7-7s-3%201-5%204m-145%207l-4%206%203-1c4%200%205-1%203-2-2-2-1-3%201-2%201%202%202%202%202%201h1l4%201%205-1-4%201a678%20678%200%2001-5%204l2%204-2-2c-1-3-1-3-3-1h-1c1-2%200-2-4-1-2%201-2%201-1%202v3l1%202%201-1c-1-2%201-2%203%200l3%202c2%200%201%202-1%204-2%200-2%201-2%203s0%202-1%201c-2-2-2-2-3%200-3%203-2%203%203%203%203%201%204%200%205-1l2-2-1%203c-1%202-1%202%201%203%208%203%2011%202%207-2v-2l2%202c2%202%202%200%200-3l-2-4%203%203c3%204%2011%204%2012%200%201-2%201-2%202-1h1c2%200%201%202%200%203l-2%202h1l2-1v1c-2%202-1%204%202%204%204-1%204-2%202-5l-2-2%202-2c3-2%204-3%204-1h1l1-1v-6l-1-3-1%201v2c-2-1-4%203-3%204l1%201h-1c-2-1-3%200-2%201l-1%202-2-2v-1l-1%201-1-3c0-4%201-5%202-3h1l-1-1-1-2%202%201c2%203%203%203%204%202%201-2%200-4-2-2-2%200-1-3%201-5s1-4-2-4c-3-1-4%200-2%202%201%202%200%203-2%201h-1l1%202v3c-1%201-1%201-2-1-1-3-8-4-11-1h-2l1-1%201-2-2%201-4%202%202-2c2-3%203-5%200-5v-1l1-2c0-3-6-5-7-3h-1c0-4-4-3-8%204m193-5v1c-1-2-2-1-3%202-1%205%202%206%203%202%202-4%203-5%203-3-1%204%200%204%202%203%201-2%201-2%201%200v6c1%202%201%202%202%201%202-2%203-1%201%201v3l2-1%202-3c2%200-2-5-4-5h-2l2-1c1-1%202-1%201-3%200-2-3-3-3-1h-1l-1-2h-2l-1-1-2%201m-127%207h-1v-1c-1%201%201%208%202%208l1-2%202-1-1%202c-1%202%201%204%203%203h1c0%202%205%202%207%200%202-1%202-2%200-5l-3-2-1-2v-2l-2%202-2%202-2-2c-3-2-3-2-4%200m207%206h-3l-1%201h-1c-1%200-2%200-1%202%200%202%200%202-2%202s-2%200-1%201c1%200%202%201%202%203l-2%202c-1%201-1%201%201%201s2%200%202%202c-1%202%200%202%201%202h1c0%201%206%202%2010%200l4-4%201-3h13l14-1h-27l-1-3c-1-3-6-6-8-6l-2%201m-285%202c-3%200-3%200-2%202%200%202%200%202-1%201-2-2-4%203-3%206l2%201%201%201c0%204%202%208%203%208l4-3-2-1v-1c2%200%202-1%201-1l-1-2%202%201c2%202%202%202%203%201l1-2c1%201%201-6-1-9l-1-3-2%202-2%201%201-2v-1l-3%201m87%2011c-2%200-2%201-1%202%200%202%200%202-1%201-2-3-5-2-4%201h-4c-1-2-1%201%201%206%201%202%201%202%203%201l2-1-2%202v3c2%201%202%202%200%203-1%201-1%201-2-1l-2-2h-1l1-1c1%200%200-2-3-3-2-3-3-3-3-2l1%203h2l1%205%202%204c0%201-1%201-1-1-1-2-1-2-4%200s-3%203%200%203h7l2-2c0-3%202-3%202%200l-1%202-1%201%201%201h2l3%202v1c-1%200-2%201-1%202%200%202%200%202-1%200-2-4-8-4-7%201%200%204%201%205%203%205l2-1-1-4%202%203c0%202%202%201%202-1h1c0%202%203%201%203-1%201-1%200-2-1-3v-1c3%200%205-4%204-6l-2-2h2l1%201h1c3%203%208%201%2010-3%201-4%201-4%202-2%201%201%200%203-1%204v3l1%201v2l1%201c0%201%201%204%203%204l1-1h1c0%202%202%201%203-1v-4c-1-1-1%200-2%202s-1%202-1%200l-1-2v-1c1-1%202-2%201-3%200-2-1-2-4%200l-2%201%202-2%202-3c1-2%201-2%202%200%202%203%203%204%203%201h1c0%203%201%202%203%200l2-1h1v-1l-1-2%201-3v-1h-3l-1%202v3c0%203%200%203-2%202l-3-2c-2%202-1-1%202-4s3-3%202-4c-2-1-3-1-5%202-1%203-1%203-2%201h-2c0%202%200%202-2-1-3-3-2-5%200-2l2%201-1-1-1-2h3l1%201c0%202%202%203%202%200v-2h-2c0-2-3-3-4-2v1l-1%201h-1l-6%201-6-1c1-2-2-5-3-5l-3%201m160%203c-1%203-1%203-3%202h-1l-1%203c-2%201-2%201%200%201h3c2%200%203%204%202%206%200%202%200%202%201%201%202-1%202-1%204%202s2%203%200%203v1c3%200%202%201%200%203l-1%202h3c2-3%202-4%203-2h1c0-2%206%200%208%202l2%201%202-1c2-1%202-1%200-1s-2%200-2-3v-1c-1%202-2%202-3-1l-2-1%201%203c1%201%201%201-1%201l-4-1c-2%200-2%200%200-2s2-3%200-4c-1-1-1-1-2%201l-1%203-3-4-2-4c2-2%201-3%200-2-2%201-2%201-3-1-1-3-1-3%201-3v-1c-2%200-2%200-1-2l1-3-2%202M52%20138c-3%208-4%209-6%208-3-1-8%202-9%206l-2%203H22l-13%201h13l14%201%202%204c2%203%209%204%2012%202h2c2%202%203%201%202-1-1-1-2-2-1-3l1-4%204-3c6-2%206-1%204%203s-2%204-5%203h-3l2%201c3%201%203%202%202%204%200%202%200%202%202%200l3-8c2-3%203-4%204-3s1%201%201-1c-1-1-1-2%201-2v-1c-1%200-2-1-1-2%200-2%200-2-1%200l-2%202-1-2-2-2%201%203c1%202%201%202-4%203-5%202-8%202-7-1v-1l-1-2%201-2c0%201%201%201%202-1v-5c1-2%201-2%202-1l2%203%201%202c1%201%202%201%204-1%202-3%203-3%204-1%201%201%202%202%201%203h1c2-1%202-1%200-4-3-3-4-3-7%200l-2%202-1-2-2-3v-3l1-2%201%202%201%201%201%201%202%201v-2c-2-1-2-2-1-2l1-2h-1c-2%202-2%202-3%201-2-3-2-3-7%207m299%206l-1%201h-1l1%202%201%201-2-1-3-1%201%202c3%202%202%204%200%204s-2%200-1%201c3%200%203%205%200%205-2%201-2%201%200%201%203%200%203%200%203%202-1%201%200%202%201%202l6%201c5%200%208-1%209-5l1-3h13l14-1h-14c-11%200-13%200-13-2%200-3-6-7-9-7-3%201-4%200-5-1%200-2-1-2-1-1m-269%209c2%202%203%203%202%204s-2%200-3-2l-2-2%201%203c1%202%201%203-1%205s-2%202-4%200h-2c1%201%200%202-1%202v1l2%201%205%201c7%201%206%201%2013%2014l6%2010-2-6-2-6-1-1-5-9c1-1-2-2-6-3-4%200-5-1-2-3l2-2%201%203%202%201-1-3c-1-1%200-2%202-5l2-3-1%201-3-1c-4-4-5-4-2%200m117%208l-2%202-1-2%202%206%203%205%201-2%202-1c0%202%202%201%202-1h1v3l-4%201v4h-1c-1-1-1-1-2%201h-2l-2-1h-1l3-2%201-1c0-1-4-2-5-1s-1%201-1-1l-1-2c-2-1-2%200-2%201s0%202-1%201c-3-1-3%202-1%204l2%202%202-2c1-2%201-2%201%200v2l-1%203-3%204c-1%201-1%201-1-1%202-5-3%200-4%206l-1%203%202-3c2-2%202-2%202%200%201%202%204%202%204%200l2-3-1%204%203%201c3%200%204-1%203-2h1c2%201%202%201%204-1l3-3-1%203-2%202h9c3%202%203%201%202-3l-1-4%202%203c2%204%203%205%203%202h1l1%202v-3c-1-3-1-3-2-1-1%201-1%201-1-1-1-3-4-5-4-3h-3l-1-1-1-4-1-1c1%201%202%200%202-1l1%201%202%201c1-2%200-6-2-10l-2-3-2%202c-2%202-2%202-2%200l-3-9-2%204m41-1c0%204-14%205-15%202%200-2-2-1-2%201h1v6l3%206c2%207%203%207%205%207%203%200%203-1%204-3l2-2v-2c0-2%200-2%201-1h2l-1%203-1%201h2c2-2%201%200-1%203-3%204-2%204%202%200%206-4%209-12%205-11h-1l-1-3c-2-2-2-2-3%200-1%201-1%201-1-1v-2l-1-2%203%201c1%202%202%202%202%201%201-1%201-1%201%201%200%203%201%203%204%200l2-3-2-1-3%201h-1c1-2-2-3-2-1-1%201-1%201%200%200l-2-2-2%201M53%20174c-4%207-5%208-7%208-4%200-9%203-10%205%200%204-3%204-16%204H9l13%201c12%200%2014%200%2014%202l2%204c4%203%209%203%2013-1%203-2%203-3%206-2l4%201-3-2c-5-1-5-4-1-6%202-1%202-1-1-1l-3-1-1-2-1-3c0-2%200-2%201-1s1%201%201-1v-1c0%201%203%200%203-2h-1c-3%202-2%201%200-4s5-6%203-2c0%202%200%202%201%201h3v-3l1-2h-1c-2%202-2%202-3%201-2-3-2-3-6%207m298%205l-1%202h-1l1%202%201%201-3-1-3-3c-1%200%200%202%202%203%202%202%203%205%201%205l-7-2-8-2c-1%200%202%202%207%203%2010%203%2011%205%204%207l-4%202%204-1c4%200%204%200%207%202%203%204%209%204%2012%200l3-4%2013-1h14l-13-1h-13l-1-3c-3-4-6-6-10-6l-4-2c-1-4-2-4-1-1m-169%2015v3h1c0%202%207%205%209%204h1l-3%204h-2c1-3-2-4-4-2h-1c1-3%200-5-1-3h-1c0-2%200-2-1-1l-1%204v5c-2%203-2%204-1%204l-1%202c-1%203-1%205%201%203h1l-1%202c-2%202-1%203%201%202v1c-3%204%200%204%2022%204s25-1%2022-4v-1c3%200%202-1%200-4l-3-3%202%201%203%202v-3l-1-2c-1%201-1%201-2-1v-3l1-3c0-3-1-4-1-2-1%201-1%201-1-1l-2-2c-1%200-1%201%201%204%202%205%201%205-2%200l-3-7c2%203%204%202%203-1h1c1%202%202%201%201-2-1-2-1-2-2-1l-1%201c-1-3-4-2-4%200l1%203-2-3c-1-2-2-2-6-2-2%200-4%200-3%201l1%201h-2c-2-2-2-2-4%201l-3%203%202-4%202-2h-4l-6%202h-1c1-3-2-2-4%200l-1%203v-3c1-2%200-3-1%200m58%201c0%205-10%207-14%203a807%20807%200%20012%2013c4%2012%206%209%2011-9l2-8-1%201m-79%204c3%2012%206%2019%208%2019s3-1%206-10c3-11%203-12%200-9-3%202-8%201-12-1l-2-2v3'%20fill='%23d3d3d3'%20fill-rule='evenodd'/%3e%3c/svg%3e","aspectRatio":1.5789473684210527,"src":"/static/0dc323ac434a4af322c40aa263f121d7/4fe8c/network.jpg","srcSet":"/static/0dc323ac434a4af322c40aa263f121d7/aabdf/network.jpg 150w,\n/static/0dc323ac434a4af322c40aa263f121d7/9dc27/network.jpg 300w,\n/static/0dc323ac434a4af322c40aa263f121d7/4fe8c/network.jpg 600w,\n/static/0dc323ac434a4af322c40aa263f121d7/9842e/network.jpg 900w,\n/static/0dc323ac434a4af322c40aa263f121d7/ff531/network.jpg 1056w","sizes":"(max-width: 600px) 100vw, 600px"}}}}}},{"node":{"frontmatter":{"path":"blog/promises-in-javascript","title":"BLink - an all in one events solution","tags":["android","java","opencv"],"excerpt":"An events solution application that is targeted at reducing queues, smoothening event registration processes, and for users to seamlessly expand and build their professional network.","cover":{"childImageSharp":{"fluid":{"tracedSVG":"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='400'%20height='410'%20viewBox='0%200%20400%20410'%20preserveAspectRatio='none'%3e%3cpath%20d='M17%2044l-1%2011a18073%2018073%200%20002%20309l1%203c-1%201%200%203%201%204l1%204c0%202%203%205%205%205s2%201%202%202c-1%202%204%206%208%206l3%202%20159%201a1115%201115%200%2000169-3c2%200%207-5%206-6l1-2h2l2-1%202-5%201-3%202-4c0-2%200-2%201-1%202%205%202-28%202-166a3926%203926%200%2000-2-150v-5l-1%207-1%20157c0%20170%201%20153-8%20163-9%209%208%208-171%208l-163-1c-6-1-14-7-18-13l-2-4-1-159a8617%208617%200%2000-2-159m61%2096l-1%2061%201%2061h26c47%200%2061-4%2068-22%206-17%200-32-15-39-5-3-5-3%200-6%2016-10%2014-36-3-49-2-2-10-4-18-6H78m224%200c-8%202-12%208-13%2017v7l3%205c3%203%209%206%2014%206%2012%200%2020-12%2017-23-3-8-13-14-21-12m-103%201l-8%201v120h78v-11l-1-12-24-1-25-2-1-48c0-51%201-48-6-48l-13%201m-94%2035l1%2013%2013-1c13%200%2013%200%2016-3%203-2%203-3%203-8%200-11-3-13-22-14h-11v13m194%2019c-4%201-7%204-9%209-2%203-2%206-2%2030l1%2028h14l18-1h3v-26a160%20160%200%2000-2-30c0-8-13-14-23-10m-193%2016c-1%200-2%2026%200%2027%203%201%2026%200%2032-2l6-2%201-11c0-7-2-9-12-11-9-1-25-2-27-1'%20fill='%23d3d3d3'%20fill-rule='evenodd'/%3e%3c/svg%3e","aspectRatio":0.974025974025974,"src":"/static/f983134a008a6eccfceeeff5c61e5b36/1b0b3/blink.jpg","srcSet":"/static/f983134a008a6eccfceeeff5c61e5b36/aabdf/blink.jpg 150w,\n/static/f983134a008a6eccfceeeff5c61e5b36/1b0b3/blink.jpg 168w","sizes":"(max-width: 168px) 100vw, 168px"}}}}}},{"node":{"frontmatter":{"path":"blog/routingpear","title":"Pear - A Web Application designed for Routing customer calls to agents","tags":["node.js","rainbow","css"],"excerpt":"A Node.js based web application built on top of the Rainbow SDK to help customers route their calls and queries to appropriate call center agents.","cover":{"childImageSharp":{"fluid":{"tracedSVG":"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='400'%20height='256'%20viewBox='0%200%20400%20256'%20preserveAspectRatio='none'%3e%3cpath%20d='M0%20128v128h401V0H0v128m69-73c-3%201-4%204-3%206%200%202%202%203%207%204l2%202c0%202-3%202-4%200-2-2-6-1-6%201%201%205%2013%205%2014%200%201-3-1-7-4-7l-4-1c-1-2-1-2%201-2l3%201c0%202%204%201%204%200%200-3-5-5-10-4M9%2063v9h7c6%200%206%200%206-3%200-2%200-2-4-2h-4v-6c0-6%200-6-2-6-3%200-3%200-3%208m24%200c0%208%201%209%203%209s3-1%203-4%200-3%203-3l3-1c0-1-1-2-3-2l-3-1c0-2%201-2%204-2%202%200%203%200%203-2s-1-2-7-2h-6v8m16%200v9h7c6%200%207%200%207-2s-1-2-4-2l-5-1c0-2%201-2%204-2s4%200%204-2-1-2-4-2c-5%200-5-2%200-2%203%200%205-1%205-2%200-2-1-2-7-2h-7v8m32-6l3%202c2%200%202%201%202%206%200%206%201%207%203%207s3-1%203-7c0-5%200-6%202-6l3-2%201-1c4%205%206%2010%206%2012%200%204%200%204%203%204%202%200%202%200%202-4%200-3%201-5%203-8%204-5%204-5%200-5-2%200-3%201-4%203s-1%202-3%201l-1-3-12-1c-10%200-11%200-11%202m36%206v9h7c6%200%206%200%206-2l-1-3c-7%201-7%200-7-6s0-6-2-6c-3%200-3%200-3%208m15-7v9l1%207h6c6%200%208-1%208-2%200-2-1-2-4-2-6%200-7-3-1-3%205-1%206-4%200-4l-4-1%204-1c3%200%204%200%204-2s-1-2-7-2l-7%201M11%2083c-4%203-2%207%203%209l4%203h-5c0-2-5-3-5-1%200%203%203%205%207%205%2010%200%2011-9%202-11l-3-1c0-1%201-2%203-1l4%201h3l-3-3c-2-2-8-3-10-1m15%207c0%208%200%209%202%209s2-1%202-5c0-6%200-6%202%201%202%206%204%206%206-1l2-4v4c0%205%200%205%202%205%203%200%203%200%203-8l-1-8h-3c-3%200-4%200-4%203l-2%204-2-4c0-3-1-4-4-4h-3v8m24-1l-4%208c0%202%200%202%203%202l3-1c0-1%201-2%203-2l3%202%203%201c3%200%203%200%203-2l-4-8c-2-6-2-7-5-7s-3%201-5%207m16%202c0%208%200%208%202%208%203%200%203-1%203-4l1-3%202%203c2%203%203%204%205%204s3-2%200-5v-4c4-4%200-8-7-8h-6v9m17-8c-2%201-1%203%201%203%203%200%203%200%203%206s1%207%203%207h3v-6c0-7%200-7%203-7l2-2c0-2-1-2-7-2l-8%201m216%2051c-3%203-3%20115%200%20117%202%202%2091%203%2093%201l1-60c0-56%200-58-2-59l-46-1c-42%200-45%200-46%202m4%2030v3h50v-7h-50v4'%20fill='%23d3d3d3'%20fill-rule='evenodd'/%3e%3c/svg%3e","aspectRatio":1.5625,"src":"/static/a4177b2784a4d043bf2af946ce9d0864/4fe8c/pear.jpg","srcSet":"/static/a4177b2784a4d043bf2af946ce9d0864/aabdf/pear.jpg 150w,\n/static/a4177b2784a4d043bf2af946ce9d0864/9dc27/pear.jpg 300w,\n/static/a4177b2784a4d043bf2af946ce9d0864/4fe8c/pear.jpg 600w,\n/static/a4177b2784a4d043bf2af946ce9d0864/9842e/pear.jpg 900w,\n/static/a4177b2784a4d043bf2af946ce9d0864/73482/pear.jpg 989w","sizes":"(max-width: 600px) 100vw, 600px"}}}}}},{"node":{"frontmatter":{"path":"blog/twohandsonebrain","title":"2 Hands 1 Brain - a Verilog based Arcade Station","tags":["verilog","fpga","lucid"],"excerpt":"A mind boggling, single player arcade game built for one of my academic modules.","cover":{"childImageSharp":{"fluid":{"tracedSVG":"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='400'%20height='205'%20viewBox='0%200%20400%20205'%20preserveAspectRatio='none'%3e%3cpath%20d='M0%20102v103h242V70h94v67a1505%201505%200%2001-1%2056v-10l-11-1h-11v22l1-11v-10h10l10%201v9c0%2011%201%2010-12%2010l-10%201v-21l-11-1h-11v11l-1%2011v-21l-11-1h-11v22l1-11v-10h10l10%201v19h-10c-10%200-10%201-6%201h22l7-1c7%200%208%200%205%201l45%201h50V0H0v102m326-80c-3%203-3%203-3%2013v10l4%203%203%204h22l3-3c3-4%203-4%203-14V24l-3-3-4-3h-22l-3%204M59%2036v14h4c4%200%205-1%205-4%200-5%204-4%204%201%200%203%200%203%204%203h4V22l-4-1h-4v4c0%206-2%206-2%201v-4l-6-1h-5v15m30-12v2l-1%202-1%202-1%202-1%202-1%202-1%207v7h22V39c0-10%200-10-3-13-2-2-11-3-13-2m20%201c-2%202-2%204-2%2013l1%2012h8v-3c0-4%201-5%203-2l6%202h4V24h-4c-4%200-5%200-5%202s-1%203-3%200-6-3-8-1m28-1h-6v13l1%2013h5c6%200%206%200%2010-4%206-6%206-13%200-19-3-3-4-3-10-3m62%200c-2%200-2%200-2%2013v13h8c7%200%208%200%2011-3%203-4%204-12%202-13l-2-4-1-5c-2-1-12-2-16-1m30%200h-8v13l1%2013h4c3%200%204-1%204-3%200-3%201-3%203%201%203%203%206%203%208%200%202-2%202-4%202-11s0-8-3-11c-2-2-3-2-11-2m28%200c-4%200-5%200-5%202l-1%202-1%202-2%202-1%202c1%201%200%202-1%202l-1%207%201%207h21V40c0-11%200-11-3-14-2-2-3-2-7-2m19%200h-6v26h4c4%200%204%200%204-3s0-4%202-4l1-3%201-3V24h-6m23%200l-1%202c0%203-1%202-3%200s-6-3-9-1l-1%2013%201%2012h8v-3c0-4%201-5%203-2l6%202h4V36c0-11%200-12-2-12l-4-1-2%201M61%2035c0%209%200%2010%202%2010%201%200%202-1%202-3%200-3%201-3%205-3%203%200%204%200%204%203%200%202%201%203%202%203%202%200%202-1%202-10%200-10%200-11-2-11s-2%201-2%204c0%204%200%204-3%204-4%200-4%200-4-4s0-4-3-4h-3v11m95-8c-3%203-3%2017%200%2019l2%203%208%201%207-1%201-2c2%200%201-20%200-22-3-2-15-1-18%202M36%2028c0%202%201%202%204%202l5%201-1%201c-2%200-8%208-8%2010v3h8c6%200%207%200%207-2s-1-2-4-2c-5%200-5%200-1-4l3-4%201-1c1-1%200-2-1-3-4-4-13-4-13-1m56%200l-1%202-1%201-4%208-1%203c0%203%200%203%204%203%202%200%203%200%203-2l2-2%202%202c0%202%201%202%203%202h3v-7c0-6%200-7-2-10-4-3-8-3-8%200m19-1l-1%2010c0%207%200%208%202%208s2-1%202-5l1-6%204%205c6%206%208%205%208-3s-1-10-3-10l-1%204c0%205-1%206-6%200-4-5-4-4-6-3m23%209v9h3c4%200%2012-6%2012-9%200-4-8-10-12-10h-3v10m24-7c-2%202-1%205%202%205l2%201%202%201c1%200%205%203%205%205%200%201-6%200-8-2s-2-2-4-1c-1%202-1%202%201%204%203%203%2011%204%2014%202%203-4%200-9-4-9-2%200-6-3-6-5l7%201h2c3-3%200-5-6-5-3%200-5%201-7%203m41%207v9h6c9%200%2014-5%209-9-2-2-3-4-1-4v-5l-8-1h-6v10m25%200c0%208%200%209%202%209s2-1%202-3c0-5%201-5%206%200%203%203%203%203%205%202%201-2%201-2-1-4-3-2-3-3%200-5%205-4%200-9-8-9h-6v10m30-8l-1%202-1%202-1%203-1%202-1%202-1%203c0%203%200%203%203%203%202%200%203%200%203-2%200-1%201-2%203-2l2%202c0%202%201%202%203%202h3v-7l-1-8-3-2-4-2c-2%200-3%200-3%202m18%208c0%208%200%209%202%209s2-1%202-3l1-3%201-3%201-4%201-3c0-3%200-3-4-3h-4v10m17-9l-1%2010c0%207%200%208%202%208s2-1%202-5c0-7%200-7%206-1s7%205%207-5c0-7%200-8-2-8s-2%201-2%204c0%205-1%206-6%200-4-5-4-4-6-3m-46%2055v10h23V71h-23v11m24%200v10h21V81l1-10h-22v11m23%200v10h22V71h-22v11m23%200v10h22V71h-22v11M137%2093v8l1%207h16V93l-8-1-9%201m22%200l-1%208v7h16V93l-8-1-7%201m84%2011v10h23V93h-23v11m24%200v10h21V93h-21v11m23%200v10h22V93h-22v11m23%200v10h22V93h-22v11m-174-4v6h13V94h-13v6m106%204v9h19V94h-19v10m46%200v9h20l-1-7c0-13%201-12-9-12h-10v10M93%2098c0%202-6%202-12%201h-3l-7%201-7%201c0%202%2011%202%2011%200h1c2%202%207%202%209%200h2l5%202c2%200%203-1%202-3%200-3-1-4-1-2m150%2028v11h23v-21l-12-1h-11v11m24%200v11h21v-22h-21v11m23%200v11h22v-21l-11-1h-11v11m23%200v11h10l11%201h-21v21h22v-43l-11-1h-11v11m-176%201l1%208h16v-15h-17v7m21%2019v7h16v-15h-16v8m85%203v10h23v-21h-23v11m24%200v10h21v-21h-21v11m23%200v10h22v-21h-22v11m-45%200v9h19v-19h-19v10m-2%2022v10h23v-21h-23v11m24%200v10h21v-21h-21v11m23%200v10h22v-21h-22v11m23-1v11h22v-20l-11-1h-11v10m-22%201v9h19v-19h-19v10m-130%201v8h16v-16h-16v8m82%2021v12h13c7%200%2012%200%2011-1l-1-11v-10l-12-1h-11v11m-82-5c-1%2010-1%2010%208%2010h8v-15h-16v5m1%202v7l6-1h7v-12h-13v6m154%203v8h16v-16h-16v8'%20fill='%23d3d3d3'%20fill-rule='evenodd'/%3e%3c/svg%3e","aspectRatio":1.948051948051948,"src":"/static/136983f100d98cb7c1e2d1ef306cf5fa/2a4de/poster.png","srcSet":"/static/136983f100d98cb7c1e2d1ef306cf5fa/6d161/poster.png 150w,\n/static/136983f100d98cb7c1e2d1ef306cf5fa/630fb/poster.png 300w,\n/static/136983f100d98cb7c1e2d1ef306cf5fa/2a4de/poster.png 600w,\n/static/136983f100d98cb7c1e2d1ef306cf5fa/db955/poster.png 900w,\n/static/136983f100d98cb7c1e2d1ef306cf5fa/f3583/poster.png 1200w,\n/static/136983f100d98cb7c1e2d1ef306cf5fa/be6d9/poster.png 9710w","sizes":"(max-width: 600px) 100vw, 600px"}}}}}},{"node":{"frontmatter":{"path":"blog/liberate","title":"Liberate - A Distributed Book Review Application","tags":["node.js","hadoop","spark","bash","rest-api"],"excerpt":"A Node.js based fully automated web application like GoodReads, with distributed analytics functionality.","cover":{"childImageSharp":{"fluid":{"tracedSVG":"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='400'%20height='289'%20viewBox='0%200%20400%20289'%20preserveAspectRatio='none'%3e%3cpath%20d='M183%2037v14l-1-13-1-12v27h2l6%201c3%200%203%200%202-1-2-1-2-1%200-1l3%201h11c-1%201-1%201%202%201l6-1h2V26l-1%2012v13l-4%201h-4l3-1%204-1V37l-1-13c-1-1-11%202-13%203l-5-1-8-2-3-1v14m-67%2074l-4%201-1%204v8l1%202h172l1-2c1-6%200-12-3-13H116m134%2046h-4l-3%201-1%207c0%207%200%208%202%209l2%201h1l2-1%201%201v2c2%202-1%205-4%206-3%200-3%201-4%204v3h6c5%200%206%200%205%201s0%201%203%201%203%200%201-1l-2-1h2l3%201h1v-34c0-1-10-2-11%200m-110%201l-5%201-3%201v20l4%201h11l7%201v-22l-14-2m76%2016l1%2016h17v-31l-9-1h-9v16m-21-12c-3%200-3%200-1%201v1c-5%202-6%202-3%203l2%201-2%201c-2-1-2%200-2%202s0%202%209%202c8%200%209%200%209-2s-1-2-5-2-4%200-3-2h4l3-1c1-1%200-1-2-1s-2%200-1-1l1-2-2%201h-1l-1-2-5%201m-28%2019l-2%202c-1%200-2%200-2%203-1%204-1%204%204%204l4%201%202%201%202-1v-1l1%201h2l2-4-2-4-2-2h-2c-3%202-6%203-6%201l2-1c2-1%202-1%200-1-2-1-3%200-3%201m23%202l-1%204c0%203%200%203%205%203l4%201%204%201%203-1v-1c2%200%202-1%202-4v-4h-8l-9%201m-45%2014h-4l-3%201c-2%200-2%202-2%2016v16h5c4%200%205%200%204%201s-1%201%201%201c1%200%202%200%201-1l3-1%203%201v-17l-1-16v-1l-1-1c-5-1-6-1-6%201m26-1h-2l-1%202c1%201%200%203-1%204l-2%204c1%201%200%202-1%202-3%200-3%205%200%206%203%200%204%2014%201%2014s-4%200-3%201l5%201%205%201c-1%201%200%201%202%201s2%200%201-1c-2-1-2-1%202-1l4-1-5-1c-6%200-7-3-5-7%201-1%201-1%201%201%200%201%204%205%205%204%202-2%200-6-3-6s-3-5%200-6c2%200%203-1%203-2h1c0%203%202%202%202-1l-1-3-1-4-2-4-1-1%203-1c2%200%202%200%201-1-1-2-5-2-6%200l-2%201v-1l1-2-1%201m55%200l-6%201-3%201-1%2016v16h5l4%201%202%201c2%200%202%200%201-1-2-1-2-1%202-1h4v-16l-1-17c-1-1-4-2-7-1m27%200l-4%201h4c3%201%202%201-3%201h-6l-1%2016v16h5l4%201c-1%201%200%201%201%201%202%200%202%200%201-1s0-1%202-1l4-1a4430%204430%200%2001-2-32l-1-2-4%201m-56%209v5c1%202-1%204-2%202l-2-2c-2%200-2%200-1-1v-2c-2%200-2%202-2%2012v11h4l4%201%202%201c2%200%202%200%201-1s-1-1%202-1l4%201v-24h-4l-3-1c0-2-2-2-3-1'%20fill='%23d3d3d3'%20fill-rule='evenodd'/%3e%3c/svg%3e","aspectRatio":1.3888888888888888,"src":"/static/bf0b5ac8334f3577278aa5b949685a71/4fe8c/liberate-1.jpg","srcSet":"/static/bf0b5ac8334f3577278aa5b949685a71/aabdf/liberate-1.jpg 150w,\n/static/bf0b5ac8334f3577278aa5b949685a71/9dc27/liberate-1.jpg 300w,\n/static/bf0b5ac8334f3577278aa5b949685a71/4fe8c/liberate-1.jpg 600w,\n/static/bf0b5ac8334f3577278aa5b949685a71/9842e/liberate-1.jpg 900w,\n/static/bf0b5ac8334f3577278aa5b949685a71/67c96/liberate-1.jpg 983w","sizes":"(max-width: 600px) 100vw, 600px"}}}}}},{"node":{"frontmatter":{"path":"blog/music-generation","title":"Music Generation","tags":["keras","python","flask"],"excerpt":"A deep Neural Network tuned for jazz music generation, with a comparative study on multiple network architectures like LSTM and Transformers. A front end developed on React that allows users to feed in their own input notes while the model generates some infinite music!","cover":{"childImageSharp":{"fluid":{"tracedSVG":"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='400'%20height='217'%20viewBox='0%200%20400%20217'%20preserveAspectRatio='none'%3e%3cpath%20d='M0%2051v51h12l13%201H0v6h12l13%201H12c-11%200-12%200-12%202s1%202%207%202l7%201H0v3c0%203%200%203%207%203l7%201H0v95h401V0H0v51m151-36c-8%204-10%2014-6%2023%204%208%201%208%2063%208h55l3-3c8-8%206-23-3-28-5-3-107-3-112%200m180%202c-9%206-8%2021%202%2026%205%203%2054%203%2059%201%206-3%208-6%208-14%200-15-1-15-37-15-27%200-29%200-32%202M104%2092v19H71l16%201h17v30a824%20824%200%20000-51m-86%2091c-15%205-15%2026-1%2031%2017%206%2031-16%2017-28-5-5-10-6-16-3m51-1c-13%204-16%2021-5%2030%204%203%2014%204%2019%200%2015-11%204-36-14-30m48%201c-13%206-13%2024-1%2030%2014%206%2029-6%2024-21-4-9-14-13-23-9m52%200c-12%203-15%2017-7%2026%209%2011%2027%206%2029-9%200-6%200-8-5-13-5-6-10-7-17-4m51-1c-8%202-12%209-12%2018%202%2021%2033%2020%2033-2%200-11-11-19-21-16m48%201c-13%206-13%2024-1%2030%206%203%2011%203%2016%200%2018-10%204-39-15-30m52-1c-20%208-12%2036%209%2033%2010-2%2016-15%2011-25-4-7-13-10-20-8m51%200c-8%202-12%2010-12%2018%202%2019%2028%2020%2033%202%203-12-9-24-21-20'%20fill='%23d3d3d3'%20fill-rule='evenodd'/%3e%3c/svg%3e","aspectRatio":1.829268292682927,"src":"/static/79b0b87a20e4d8ff7f7f9809c0d3fac6/2a4de/musicgen.png","srcSet":"/static/79b0b87a20e4d8ff7f7f9809c0d3fac6/6d161/musicgen.png 150w,\n/static/79b0b87a20e4d8ff7f7f9809c0d3fac6/630fb/musicgen.png 300w,\n/static/79b0b87a20e4d8ff7f7f9809c0d3fac6/2a4de/musicgen.png 600w,\n/static/79b0b87a20e4d8ff7f7f9809c0d3fac6/db955/musicgen.png 900w,\n/static/79b0b87a20e4d8ff7f7f9809c0d3fac6/f3583/musicgen.png 1200w,\n/static/79b0b87a20e4d8ff7f7f9809c0d3fac6/d004a/musicgen.png 3622w","sizes":"(max-width: 600px) 100vw, 600px"}}}}}}]}},"pageContext":{"postPath":"blog/sprint","translations":[{"hreflang":"en","path":"/blog/sprint"}]}},"staticQueryHashes":["4097791827"]}