<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: John Paul Ada</title>
    <description>The latest articles on DEV Community by John Paul Ada (@johnpaulada).</description>
    <link>https://dev.to/johnpaulada</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F20933%2Fdf992b3d-57ed-4e82-bcd6-9249c574768b.png</url>
      <title>DEV Community: John Paul Ada</title>
      <link>https://dev.to/johnpaulada</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/johnpaulada"/>
    <language>en</language>
    <item>
      <title>💪 UNBREAKABLE Code with ChatGPT!</title>
      <dc:creator>John Paul Ada</dc:creator>
      <pubDate>Mon, 24 Apr 2023 06:42:01 +0000</pubDate>
      <link>https://dev.to/johnpaulada/unbreakable-code-with-chatgpt-oke</link>
      <guid>https://dev.to/johnpaulada/unbreakable-code-with-chatgpt-oke</guid>
      <description>&lt;p&gt;&lt;strong&gt;TL;DR Video&lt;/strong&gt; &lt;br&gt;
&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/Zb_X_HpSiAM"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;If you're not using ChatGPT yet as a programmer, YOU ARE MISSING OUT!&lt;/p&gt;

&lt;p&gt;I'll show you one of my favorite tricks for using ChatGPT: Using ChatGPT to write property-based tests!&lt;/p&gt;

&lt;p&gt;Property-based tests, A.K.A PBTs, allow you to run hundreds of unit tests with just a single PBT. It does this by making you define a property of a function, then runs it with the full range of your inputs, and if your function fails the test, a PBT would find the smallest value that would fail that function.&lt;/p&gt;

&lt;p&gt;Theoretically, if you were able to test all the properties of a function, then your function is now UNBREAKABLE! This is because the properties of your functions is the definition of your function: if your definition is perfect, then the function is perfect!&lt;/p&gt;

&lt;p&gt;Oooookay so I think that's a bit confusing so let me show you an example instead!&lt;/p&gt;

&lt;p&gt;Suppose we have an addition function:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;How we'd usually test this is do something like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;test_add_1&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
  &lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="n"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But what if a weird dev used this implementation instead?&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Obviously &lt;strong&gt;this would pass the test&lt;/strong&gt;, but would fail in other instances.&lt;/p&gt;

&lt;p&gt;This is where unit tests fail. You can't possibly manually write every possible test for every possible input. With property-based tests, you can achieve this by testing the function properties themselves.&lt;/p&gt;

&lt;p&gt;What you can do instead is to test the properties with Property-based Tests.&lt;/p&gt;

&lt;p&gt;One of the properties of addition is the &lt;code&gt;identity&lt;/code&gt; property. Whatever number you add to zero, it will return that number.&lt;/p&gt;

&lt;p&gt;To test for that we can do something like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;given&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;st&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;floats&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;test_add_identity&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="n"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;What this will do is that for all float values, it will test if adding that to 0 will always return itself. With the weird implementation, if a is 2 then it works, but then the PBT will continue testing for other values until it encounters an issue.&lt;/p&gt;

&lt;p&gt;Now this obviously still has loopholes, but if you manage to test for all properties, like the commutative, associative, etc. then you'll have an unbreakable function.&lt;/p&gt;




&lt;p&gt;Now we understand how powerful these tests are. Let's use ChatGPT to do this for a more complex example!&lt;/p&gt;

&lt;p&gt;Let's use this naive Pearson r implementation:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;pearson_correlation_coefficient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x_values&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y_values&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;x_mean&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x_values&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x_values&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;y_mean&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;y_values&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;y_values&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;covariance&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;x_mean&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;y_mean&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;zip&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x_values&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y_values&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x_values&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;stddev_x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;x_mean&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;x_values&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x_values&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt; &lt;span class="mf"&gt;0.5&lt;/span&gt;
    &lt;span class="n"&gt;stddev_y&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;y_mean&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;y_values&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;y_values&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt; &lt;span class="mf"&gt;0.5&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;covariance&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;stddev_x&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;stddev_y&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This has glaringly obvious bugs but assume that you don't know for now.&lt;br&gt;
To write Property-based tests for these, we can do use this ChatGPT prompt:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Create property-based tests for the following code. Please be comprehensive and test all properties and cases, especially those that will make the function fail. Make sure to thoroughly document the properties being tested using docstrings. Use &lt;code&gt;library&lt;/code&gt; as test library.&lt;/p&gt;

&lt;p&gt;Code:&lt;br&gt;
&lt;code&gt;insert code&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Together with the function we have, the complete prompt will look something like this:&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--naccLMb4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/tnf2cdr9fi2l2gk5vlny.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--naccLMb4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/tnf2cdr9fi2l2gk5vlny.png" alt="Complete prompt for Pearson r example" width="800" height="366"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This prompt generated these property-based tests for me:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;pytest&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;hypothesis&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;given&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;strategies&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;st&lt;/span&gt;

&lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;pytest&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;fixture&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;pearson_corr&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;pearson_correlation_coefficient&lt;/span&gt;

&lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;given&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;st&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;lists&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;st&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;floats&lt;/span&gt;&lt;span class="p"&gt;()),&lt;/span&gt; &lt;span class="n"&gt;st&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;lists&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;st&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;floats&lt;/span&gt;&lt;span class="p"&gt;()))&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;test_pearson_correlation_coefficient_valid_input&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pearson_corr&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;x_values&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y_values&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="s"&gt;"""
    Test the pearson_correlation_coefficient function with valid input.
    It should return a value between -1 and 1, inclusive.
    """&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x_values&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;y_values&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;pytest&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;raises&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;ZeroDivisionError&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
            &lt;span class="n"&gt;pearson_corr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x_values&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y_values&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pearson_corr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x_values&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y_values&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;

&lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;given&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;st&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;lists&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;st&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;floats&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;min_value&lt;/span&gt;&lt;span class="o"&gt;=-&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;max_value&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;min_size&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;st&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;lists&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;st&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;floats&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;min_value&lt;/span&gt;&lt;span class="o"&gt;=-&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;max_value&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;min_size&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;test_pearson_correlation_coefficient_identical_inputs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pearson_corr&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;x_values&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y_values&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="s"&gt;"""
    Test the pearson_correlation_coefficient function with identical inputs.
    It should return 1.
    """&lt;/span&gt;
    &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pearson_corr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x_values&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;x_values&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;

&lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;given&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;st&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;lists&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;st&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;floats&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;min_value&lt;/span&gt;&lt;span class="o"&gt;=-&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;max_value&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;min_size&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;st&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;lists&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;st&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;floats&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;min_value&lt;/span&gt;&lt;span class="o"&gt;=-&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;max_value&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;min_size&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;test_pearson_correlation_coefficient_negative_identical_inputs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pearson_corr&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;x_values&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y_values&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="s"&gt;"""
    Test the pearson_correlation_coefficient function with identical inputs but with one list negated.
    It should return -1.
    """&lt;/span&gt;
    &lt;span class="n"&gt;y_values_neg&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;y_values&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pearson_corr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x_values&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y_values_neg&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;

&lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;given&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;st&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;lists&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;st&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;floats&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;min_value&lt;/span&gt;&lt;span class="o"&gt;=-&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;max_value&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;min_size&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;st&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;lists&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;st&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;floats&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;min_value&lt;/span&gt;&lt;span class="o"&gt;=-&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;max_value&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;min_size&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;test_pearson_correlation_coefficient_orthogonal_inputs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pearson_corr&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;x_values&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y_values&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="s"&gt;"""
    Test the pearson_correlation_coefficient function with orthogonal inputs.
    It should return 0.
    """&lt;/span&gt;
    &lt;span class="n"&gt;x_values_orth&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;y_values&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pearson_corr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x_values&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;x_values_orth&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;

&lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;given&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;st&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;lists&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;st&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;floats&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;min_size&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;st&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;lists&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;st&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;floats&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;min_size&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;test_pearson_correlation_coefficient_zero_division_error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pearson_corr&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;x_values&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y_values&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="s"&gt;"""
    Test the pearson_correlation_coefficient function with inputs that have zero variance.
    It should raise a ZeroDivisionError.
    """&lt;/span&gt;
    &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;pytest&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;raises&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;ZeroDivisionError&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;pearson_corr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x_values&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y_values&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;given&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;st&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;lists&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;st&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;floats&lt;/span&gt;&lt;span class="p"&gt;()),&lt;/span&gt; &lt;span class="n"&gt;st&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;lists&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;st&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;floats&lt;/span&gt;&lt;span class="p"&gt;()))&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;test_pearson_correlation_coefficient_same_length&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pearson_corr&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;x_values&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y_values&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="s"&gt;"""
    Test the pearson_correlation_coefficient function with inputs that have different lengths.
    It should raise a ValueError.
    """&lt;/span&gt;
    &lt;span class="n"&gt;x_values&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pop&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;pytest&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;raises&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;ValueError&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;pearson_corr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x_values&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y_values&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;As you can see, with ChatGPT, it is VERY EASY to generate tests that will bug-proof your code. I use this almost everyday in my work as a data engineer. Now then, try this out with your own code and prepare to be amazed!&lt;/p&gt;




&lt;blockquote&gt;
&lt;p&gt;If you liked this, Like and Follow me here on &lt;a href="https://medium.com/@jepedesu"&gt;Medium&lt;/a&gt; - Subscribing to my &lt;a href="https://www.youtube.com/@devstuffwithjpada"&gt;YouTube&lt;/a&gt; would help me a lot as well! Thank you!!! 💚&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>chatgpt</category>
      <category>programming</category>
      <category>python</category>
      <category>ai</category>
    </item>
    <item>
      <title>How to Create Jobs With Multiple Tasks in Databricks</title>
      <dc:creator>John Paul Ada</dc:creator>
      <pubDate>Fri, 15 Oct 2021 13:29:02 +0000</pubDate>
      <link>https://dev.to/johnpaulada/how-to-create-jobs-with-multiple-tasks-in-databricks-2omf</link>
      <guid>https://dev.to/johnpaulada/how-to-create-jobs-with-multiple-tasks-in-databricks-2omf</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Original Blog Post: &lt;a href="https://blog.johnpaulada.com/Blog/How+to+Create+Jobs+With+Multiple+Tasks+in+Databricks"&gt;My Blog - How to Create Jobs With Multiple Tasks in Databricks&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

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

&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: This video is in Filipino/Tagalog.&lt;/p&gt;




&lt;p&gt;When working with data it's very useful to be able to create data pipelines where we can have tasks in a pipeline run in sequence or in parallel or have dependencies witch each other, where the next tasks will only run when their dependencies or previous tasks have finished running.&lt;/p&gt;

&lt;p&gt;To accomplish, usually we'd use external task orchestrators like &lt;a href="https://airflow.apache.org/"&gt;Airflow&lt;/a&gt;, &lt;a href="https://www.prefect.io/"&gt;Prefect&lt;/a&gt;, &lt;a href="https://nifi.apache.org/"&gt;Nifi&lt;/a&gt;, or &lt;a href="https://oozie.apache.org/"&gt;Oozie&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;In the version of Databricks as of this writing, by default we are unable to create jobs with multiple tasks as shown here:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--EuqtjVsa--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/5m3wf87lerfuuo8u6gnu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--EuqtjVsa--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/5m3wf87lerfuuo8u6gnu.png" alt="Single Task Job" width="800" height="438"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;But there's a way to add multiple tasks to a job in Databricks, and that's by enabling &lt;strong&gt;Task Orchestration&lt;/strong&gt;. At the time of this writing, Task Orchestration is a feature that's in &lt;em&gt;public preview&lt;/em&gt;. This means that it's currently available for everyone, but it's not enabled by default.&lt;/p&gt;

&lt;p&gt;To enable it we first go to the the &lt;strong&gt;Admin Console&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--vH062P2J--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xjsubrc57mf32hstkins.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--vH062P2J--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xjsubrc57mf32hstkins.png" alt="Admin Console" width="800" height="433"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Then go to &lt;strong&gt;Workspace Settings&lt;/strong&gt; tab:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--2iBLOXWA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/8y1rtwppdy6jn1dvouc8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--2iBLOXWA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/8y1rtwppdy6jn1dvouc8.png" alt="Workspace Settings" width="800" height="550"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Then we'll search &lt;code&gt;Task&lt;/code&gt; on the search bar. We'll then be able to see the switch for Task Orchestration:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--5faWJNUk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/djwlx5nhn7lu9069zy4x.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--5faWJNUk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/djwlx5nhn7lu9069zy4x.png" alt="Enable Task Orchestration" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It might take some time to take effect but once that's enabled, we will now be able to see a button for adding another task to our job:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--3IEhqlWq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/dadp96oddur216588t3a.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--3IEhqlWq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/dadp96oddur216588t3a.png" alt="Add Job Button" width="800" height="437"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After that we can just add a task similar to what we're used to. The only difference is now there is a &lt;code&gt;Depends on&lt;/code&gt; field where we can specify the dependencies of our current task:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--wKe8wKnB--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/qonbrf09zp3skn0pe70c.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--wKe8wKnB--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/qonbrf09zp3skn0pe70c.png" alt="Depends On" width="800" height="437"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once we're done adding that, we can run our job and see something like this when it's complete!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--65CJOMjL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7bx9k2pxpq4644rqmrde.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--65CJOMjL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7bx9k2pxpq4644rqmrde.png" alt="Complete Run" width="800" height="436"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And that's a wrap! I hope this helps you setup your own data pipeline in Databricks!&lt;/p&gt;

</description>
      <category>datascience</category>
      <category>dataengineering</category>
      <category>microsoftazure</category>
      <category>azuredatabricks</category>
    </item>
    <item>
      <title>🔥 #overengineeringchallenge 🔥</title>
      <dc:creator>John Paul Ada</dc:creator>
      <pubDate>Wed, 03 Apr 2019 14:13:59 +0000</pubDate>
      <link>https://dev.to/johnpaulada/overengineeringchallenge-34l1</link>
      <guid>https://dev.to/johnpaulada/overengineeringchallenge-34l1</guid>
      <description>&lt;h2&gt;
  
  
  Rationale 🤔
&lt;/h2&gt;

&lt;p&gt;Overengineering has always been the pet peeve of many developers. We engineers have this tendency to descend into the chaos of adding nice-to-have features or architecting to support things that might happen in the far future. To avoid this, we create constraints for the project and work around these constraints.&lt;/p&gt;

&lt;p&gt;But what if we break out of this for once? What if we do the &lt;strong&gt;OPPOSITE&lt;/strong&gt;?&lt;/p&gt;

&lt;p&gt;That's where this challenge comes in.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Challenge 💪
&lt;/h2&gt;

&lt;p&gt;The challenge is to create a &lt;strong&gt;TODO List App&lt;/strong&gt; and overengineer it to its limits.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Make it with the most overkill tech you know.&lt;/li&gt;
&lt;li&gt;Use the most exotic techniques that you can wield.&lt;/li&gt;
&lt;li&gt;Build it with the most overblown architectures.&lt;/li&gt;
&lt;li&gt;Design with the insanest user experience.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/johnpaulada/overengineeringchallenge" rel="noopener noreferrer"&gt;FORK THIS PROJECT&lt;/a&gt;&lt;/strong&gt; and let your imagination run wild. There are no limits to what you can do.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;JUST OVERENGINEER™.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;YOU HAVE THE LICENSE TO DO IT.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Example 📜
&lt;/h2&gt;

&lt;p&gt;Here's my idea of what I'd do when I do this challenge:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Create an Elixir GraphQL API using Absinthe&lt;/li&gt;
&lt;li&gt;Create the web application frontend using ReasonReact&lt;/li&gt;
&lt;li&gt;Use Kubernetes to stitch together the web application&lt;/li&gt;
&lt;li&gt;Create a mobile app using Flutter or bs-react-native&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Social 💻
&lt;/h2&gt;

&lt;p&gt;Add a hashtag &lt;code&gt;#overengineeringchallenge&lt;/code&gt; when you share your project on social media!&lt;/p&gt;

&lt;p&gt;When you're done, make a Pull Request and add yourself to the list of challengers! 🔥&lt;/p&gt;

&lt;h2&gt;
  
  
  Github Repo
&lt;/h2&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/johnpaulada" rel="noopener noreferrer"&gt;
        johnpaulada
      &lt;/a&gt; / &lt;a href="https://github.com/johnpaulada/overengineeringchallenge" rel="noopener noreferrer"&gt;
        overengineeringchallenge
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      🔥 THE #overengineeringchallenge.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;🔥 Over Engineering Challenge&lt;/h1&gt;
&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Rationale 🤔&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;Overengineering has always been the pet peeve of many developers. We engineers have this tendency to descend into the chaos of adding nice-to-have features or architecting to support things that might happen in the far future. To avoid this, we create constraints for the project and work around these constraints.&lt;/p&gt;
&lt;p&gt;But what if we break out of this for once? What if we do the &lt;strong&gt;OPPOSITE&lt;/strong&gt;?&lt;/p&gt;
&lt;p&gt;That's where this challenge comes in.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;The Challenge 💪&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;The challenge is to create a &lt;strong&gt;TODO List App&lt;/strong&gt; and overengineer it to its limits.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Make it with the most overkill tech you know.&lt;/li&gt;
&lt;li&gt;Use the most exotic techniques that you can wield.&lt;/li&gt;
&lt;li&gt;Build it with the most overblown architectures.&lt;/li&gt;
&lt;li&gt;Design with the insanest user experience.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;FORK THIS PROJECT&lt;/strong&gt; and let your imagination run wild. There are no limits to what you can do.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;JUST OVERENGINEER™.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;YOU HAVE&lt;/strong&gt;…&lt;/p&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/johnpaulada/overengineeringchallenge" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;






&lt;center&gt;&lt;h4&gt;What do you think about the challenge? Please comment below!&lt;/h4&gt;&lt;/center&gt;





&lt;center&gt;&lt;h2&gt;✨ ALL CONTRIBUTORS ARE WELCOME! ✨&lt;/h2&gt;&lt;/center&gt;

</description>
      <category>opensource</category>
      <category>showdev</category>
      <category>programming</category>
      <category>contributorswanted</category>
    </item>
    <item>
      <title>Pop Tech TL;DR Episode 2 - Combatting bad clients, better npm packing, meaningful tech jobs, and more!</title>
      <dc:creator>John Paul Ada</dc:creator>
      <pubDate>Sat, 16 Feb 2019 16:42:39 +0000</pubDate>
      <link>https://dev.to/johnpaulada/pop-tech-tldr-episode-2---combatting-bad-clients-better-npm-packing-meaningful-tech-jobs-and-more-319e</link>
      <guid>https://dev.to/johnpaulada/pop-tech-tldr-episode-2---combatting-bad-clients-better-npm-packing-meaningful-tech-jobs-and-more-319e</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Originally posted at: &lt;a href="https://devstuffwithjpada.com/pop-tech-tldr-episode-2/"&gt;https://devstuffwithjpada.com/pop-tech-tldr-episode-2/&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--jgCVqYQk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/2600/1%2Avc082TQVqbMi0w26lC1ccw.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--jgCVqYQk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/2600/1%2Avc082TQVqbMi0w26lC1ccw.jpeg" alt="Pop Tech TL;DR" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--GX4koiqS--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/2000/1%2AHjvBU3BZASK6SnPPXwbr0g.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--GX4koiqS--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/2000/1%2AHjvBU3BZASK6SnPPXwbr0g.png" alt="Not Paid Github Repository" width="800" height="440"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;a href="https://github.com/kleampa/not-paid"&gt;Not Paid&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Did your client forget to pay? Fade out the website each day they don’t pay until it completely disappears! Pro Tip: Mix it with the code, minify, and obfuscate for greater effect. &lt;em&gt;*winks&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--eEO-JEzn--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/2000/1%2ADyf0j-6OA76AkXL26Y27lQ.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--eEO-JEzn--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/2000/1%2ADyf0j-6OA76AkXL26Y27lQ.png" alt="x0 Homepage" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;a href="https://compositor.io/x0/"&gt;x0&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;x0 is a tool that allows you to create documentation for your React components. Think of it as an alternative to StoryBook. One of the most interesting features it has is the &lt;em&gt;LiveEditor&lt;/em&gt;, allowing you to play around with the components in a live environment and being able to see a preview of the change immediately.&lt;/p&gt;




&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--WykbmX1H--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/2000/1%2ACJzHtNE1NS0uTciGakYQzA.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--WykbmX1H--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/2000/1%2ACJzHtNE1NS0uTciGakYQzA.png" alt="Brisk Github Repository" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;a href="https://github.com/briskml/brisk"&gt;Brisk&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Brisk allows you to use ReasonML/OCaml to create native UIs. It’s still a work in progress but it’s exciting to see how it’s gonna end up, especially since it’s using Reason.&lt;/p&gt;




&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--xWUuxucs--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/2000/1%2AW95z4lYsOTbdJw-Qo0Zb8g.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--xWUuxucs--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/2000/1%2AW95z4lYsOTbdJw-Qo0Zb8g.png" alt="JAMstack WTF Landing Page" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;a href="https://jamstack.wtf/"&gt;JAMstack WTF&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;The JAMstack is wildly popular right now. This site will help you understand WTF JAMstack really is and why developers are currently all about trying to build their apps with this technology stack. It also teaches some best practices and an ideal workflow. Now go over there and be one of the JAMstack-savvy developers!&lt;/p&gt;




&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--wV9_Seob--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/2000/1%2AY6lAdRsJa1X_IV1caFhuyw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--wV9_Seob--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/2000/1%2AY6lAdRsJa1X_IV1caFhuyw.png" alt="Positive Impact Tech Jobs Homepage" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;a href="https://positiveimpacttechjobs.com/"&gt;Positive Impact Tech Jobs&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;If you’re looking for a job, how about you consider applying for one that has positive impact on the world and its people? Positive Impact Tech Jobs is a listing of tech job opportunities in companies that try to make a positive change in the world. They have a listing for companies with social impact, education impact, environmental impact, healthcare impact, et cetera. Companies like Khan Academy, John Hopkins University, and OpenAI have job opportunities posted on the listings. If you ever want to work for a company that champions social good, this is a great place to start.&lt;/p&gt;




&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--8HH1JEgj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/2000/1%2Ajf0nrCRypyIS06oD8g-T5A.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--8HH1JEgj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/2000/1%2Ajf0nrCRypyIS06oD8g-T5A.png" alt="@pika/pack introductory blog post" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;a href="https://www.pikapkg.com/blog/introducing-pika-pack/"&gt;@pika/pack&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;This tool is one that I am personally very excited to try out. @pika/pack is a CLI tool that allows you to simplify the process of packing and deploying an npm package. @pika/pack lets you create a pipeline of the common processes you do with a library such as compiling to ES5, uglification and the like, using plugins with sensible defaults. Once you’ve setup your pipeline, just run &lt;code&gt;pack build &amp;amp;&amp;amp; pack publish&lt;/code&gt; and you are done!&lt;/p&gt;




&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--4ihJjQii--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/2000/1%2AQSRNrkRcCowufDOd0f9PwQ.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--4ihJjQii--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/2000/1%2AQSRNrkRcCowufDOd0f9PwQ.png" alt="We are Colorblind Homepage" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;a href="https://wearecolorblind.com/"&gt;We are Colorblind&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;We are Colorblind is a site that educates people about colorblindedness and gives insights, tips, and resources to help people develop content and software that are colorblind-friendly.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>react</category>
      <category>reason</category>
      <category>jobs</category>
    </item>
    <item>
      <title>Pop Tech TL;DR Episode 1 - A review of tech about APIs, JavaScript search, SVG, GraphQL, Testing!</title>
      <dc:creator>John Paul Ada</dc:creator>
      <pubDate>Sat, 09 Feb 2019 18:30:36 +0000</pubDate>
      <link>https://dev.to/johnpaulada/pop-tech-tldr-episode-1-26e5</link>
      <guid>https://dev.to/johnpaulada/pop-tech-tldr-episode-1-26e5</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally posted at &lt;a href="https://devstuffwithjpada.com/pop-tech-tldr-episode-1/" rel="noopener noreferrer"&gt;https://devstuffwithjpada.com/pop-tech-tldr-episode-1/&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;Hey guys! I'm starting a new series called Pop Tech TL;DR, where we'll take a look at popular technologies, concepts, advances, and trends in the world of software engineering. This episode will be the first in the series.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;a href="https://workwithapis.com/" rel="noopener noreferrer"&gt;1. Learning to work with APIs&lt;/a&gt;
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;This guide is designed for people who have something they want to accomplish that requires using an API, but aren't quite sure how to get started.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdevstuffwithjpada.com%2Fmedia%2Fposts%2F13%2Fresponsive%2FScreen-Shot-2019-02-03-at-6.14.44-AM-xl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdevstuffwithjpada.com%2Fmedia%2Fposts%2F13%2Fresponsive%2FScreen-Shot-2019-02-03-at-6.14.44-AM-xl.png" alt="Learn how to build APIs with Slash the Dog"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This site will teach you how to use REST APIs, which are a must if you want to get information or use services created by other people. It talks about authentication, requests, responses, tools, etc. If you want to learn how to consume REST APIs, check it out! It's really easy to understand.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;a href="https://github.com/nextapps-de/flexsearch" rel="noopener noreferrer"&gt;2. FlexSearch.js&lt;/a&gt;
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;Web's fastest and most memory-flexible full-text search library with zero dependencies.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdevstuffwithjpada.com%2Fmedia%2Fposts%2F13%2Fresponsive%2FScreen-Shot-2019-02-03-at-6.31.31-AM-xl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdevstuffwithjpada.com%2Fmedia%2Fposts%2F13%2Fresponsive%2FScreen-Shot-2019-02-03-at-6.31.31-AM-xl.png" alt="FlexSearch.js Github Repository"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;FlexSearch is a new JavaScript library for almost everything you'd want in text search functionality. It's full featured, supporting things like async search, partial matching, phonetic matching, and more! Apparently it's also really really fast, but as always, take everything with a grain of salt and actually try it out yourself to see if their measurements really do check out.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;a href="https://css-tricks.com/lodge/svg/" rel="noopener noreferrer"&gt;3. Everything You Need To Know About SVG&lt;/a&gt;
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;Using SVG can be very simple, but if you start digging in, there is a lot to know about SVG. In this series you're going to learn why SVG is such an important part of building websites. From why SVG is useful and how to get your hands on it all the way to implementing it as a system and fancy stuff like animating it.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdevstuffwithjpada.com%2Fmedia%2Fposts%2F13%2Fresponsive%2FScreen-Shot-2019-02-03-at-6.31.48-AM-xl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdevstuffwithjpada.com%2Fmedia%2Fposts%2F13%2Fresponsive%2FScreen-Shot-2019-02-03-at-6.31.48-AM-xl.png" alt="CSS Tricks - Everything You Need To Know About SVGs"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;CSS Tricks just updated the look and feel of their site and man, is it gorgeous. Very fitting, being the CSS masters that they are. This new course they have about SVGs is no exception. It look so slick, elegant, and modern. Of course, the content is very important, and they have videos on what SVGs are, why we need them, how to use them, tools, optimizations, and tips to really help you understand SVGs in-depth. Designer or not, it's a pretty awesome course to check out.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;a href="http://www.graphqldesigner.com/" rel="noopener noreferrer"&gt;4. GraphQL Designer&lt;/a&gt;
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;A developer web-app tool to rapidly prototype a full stack implementation of GraphQL with React.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdevstuffwithjpada.com%2Fmedia%2Fposts%2F13%2Fresponsive%2FScreen-Shot-2019-02-03-at-6.42.55-AM-xl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdevstuffwithjpada.com%2Fmedia%2Fposts%2F13%2Fresponsive%2FScreen-Shot-2019-02-03-at-6.42.55-AM-xl.png" alt="GraphQL Designer"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Pick a database, create a schema, export your code and voila!&lt;br&gt;
GraphQL Designer is a rapid GraphQL API design and prototyping tool that allows you to pick a database, create a schema, then convert the schema you made into working code! You'll download the database schema, the GraphQL schema, and client code for making requests to your GraphQL API. Great for prototyping in hackathons or if you're building simple or straightforward apps. In any case, if you work with GraphQL, you might want to check this out.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;a href="https://testing-library.com/react" rel="noopener noreferrer"&gt;5. React Testing Library&lt;/a&gt;
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;Simple and complete React DOM testing utilities that encourage good testing practices&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdevstuffwithjpada.com%2Fmedia%2Fposts%2F13%2Fresponsive%2FScreen-Shot-2019-02-03-at-6.49.48-AM-xl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdevstuffwithjpada.com%2Fmedia%2Fposts%2F13%2Fresponsive%2FScreen-Shot-2019-02-03-at-6.49.48-AM-xl.png" alt="React Testing Library by Kent Dodds"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The prolific React and JavaScript developer Kent Dodds created this library as an alternative to Enzyme. It gives us less flexibility because it's opinionated, but this also means that we're going to be implementing best practices by using it. Less options means we have less rope to hang ourselves. Kent already has a tutorial video on how to use it on YouTube but I think I'll cover it in Filipino for all my Filipino developer peers out there. Definitely look forward to it!&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>css</category>
      <category>graphql</category>
      <category>react</category>
    </item>
    <item>
      <title>This Week I Learned #9</title>
      <dc:creator>John Paul Ada</dc:creator>
      <pubDate>Thu, 27 Sep 2018 14:48:08 +0000</pubDate>
      <link>https://dev.to/johnpaulada/this-week-i-learned-9-1mib</link>
      <guid>https://dev.to/johnpaulada/this-week-i-learned-9-1mib</guid>
      <description>&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F2000%2F1%2ALajC4RIKn5A-4zmlSCXb9Q.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F2000%2F1%2ALajC4RIKn5A-4zmlSCXb9Q.jpeg" alt="This Week I Learned"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Fun stuff and announcements about testing, Python, ReasonML, etc. in this episode of This Week I Learned!&lt;/p&gt;
&lt;/blockquote&gt;

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

&lt;h2&gt;
  
  
  &lt;a href="https://www.cypress.io/" rel="noopener noreferrer"&gt;Cypress&lt;/a&gt;
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;Fast, easy and reliable testing for anything that runs in a browser.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Cypress is a new way to your web applications. Personally, I think it replaces my use cases for Selenium and it is faster, prettier, and easier to use. Here are my favorite features of Cypress:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Doesn't use a WebDriver.&lt;/li&gt;
&lt;li&gt;It has a pretty GUI.&lt;/li&gt;
&lt;li&gt;You use JavaScript to write Cypress tests.&lt;/li&gt;
&lt;li&gt;The assertion syntax is similar to other JavaScript testing libraries like Chai and Jasmine.&lt;/li&gt;
&lt;li&gt;You don't need to explicitly tell it to wait. It automatically does so.&lt;/li&gt;
&lt;li&gt;The tests reload when you change your test code.&lt;/li&gt;
&lt;li&gt;You can see the tests as they happen and you can step back through the testing process.&lt;/li&gt;
&lt;li&gt;It creates a video of the testing process if you run it without the GUI.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;h2&gt;
  
  
  &lt;a href="https://github.com/ageitgey/face_recognition" rel="noopener noreferrer"&gt;face_recognition&lt;/a&gt;
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;The world's simplest facial recognition api for Python and the command line&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If you want to do facial recognition and you know Python, look no further. Adam Geitgey's face_recognition library is very easy to use and pretty accurate. Just look up the docs and you'll immediately know what you need to do.&lt;/p&gt;

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

&lt;h2&gt;
  
  
  &lt;a href="https://sketch.sh/" rel="noopener noreferrer"&gt;Sketch.sh&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;If you've used Jupyter notebooks before for Python or R, or RunKit, ObservableHQ Scratchpad, and Kajero for JavaScript, you'd agree that they're pretty neat platforms for experimentation and sharing your work.&lt;/p&gt;

&lt;p&gt;If you're into Reason and those kinds of notebooks, you'll be pretty happy with Sketch.sh. Sketch allows you to create ReasonML and OCaml interactive notebooks. This would be great if you want to teach and learn ReasonML interactively especially since it is pretty new.&lt;/p&gt;

&lt;h2&gt;
  
  
  Doc Tests in Elixir
&lt;/h2&gt;

&lt;p&gt;Have you ever wrote documentation and found out that the code examples in your documentation no longer work because the code was updated?&lt;/p&gt;

&lt;p&gt;Elixir eliminates this problem by having what we call doctests. Basically, when you add code snippets in your documentation and you configure it to work with doctests, Elixir (ExUnit, specifically) will make sure that the snippet works. If the value isn’t as expected, the tests will fail. This makes sure that the documentation you have actually matches the software you have written.&lt;/p&gt;

&lt;p&gt;Pretty cool! Another reason to switch to Elixir! 😄&lt;/p&gt;

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

&lt;h2&gt;
  
  
  &lt;a href="https://github.com/jxnblk/mdx-deck" rel="noopener noreferrer"&gt;mdx-deck&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;If you’re a geek like me, you like creating slides with code because it’s cool! But building it in something like HTML is a bit time consuming and complicated so we sometimes just resort to using Markdown to make things simple. But Markdown isn’t omnipotent. If you want to add interactivity, it’s game over.&lt;/p&gt;

&lt;p&gt;Luckily there’s &lt;a href="https://mdxjs.com/" rel="noopener noreferrer"&gt;mdx&lt;/a&gt;, which allows us to create Markdown documents with JSX! Now we can add interactivity and “web components” in to our documents. Now, mdx allows us to create interactive documents, but what about slides? mdx-deck solves that problem for us by allowing us to create slide decks using mdx syntax. So we can create some React components and show them in action in our slides. You can even change the theme using the ones included or create your own theme. Have fun making your slides with mdx-deck!&lt;/p&gt;

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

&lt;h2&gt;
  
  
  &lt;a href="https://redex.github.io/package/reason-maybe/" rel="noopener noreferrer"&gt;reason-maybe&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;I’ve been playing around with ReasonML for a while and so it doesn’t come as a surprise that I tried building a library in Reason. So, I built reason-maybe, which is a Maybe monad implementation in Reason. For most cases, you can just the optional type in Reason but if you want chains/flatMaps, etc., this is a pretty okay one to try.&lt;/p&gt;

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

&lt;h2&gt;
  
  
  &lt;a href="https://stenci.la/" rel="noopener noreferrer"&gt;Stencila&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Stencila is another interactive notebook software for building reproducible research. This combines something like MS Excel and Word, plus the ability to code in Python and Node. It also looks a bit cleaner. This is definitely a pretty interesting one to try, although I feel that it isn’t quite ready yet. But do definitely give this a try.&lt;/p&gt;

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

&lt;h2&gt;
  
  
  &lt;a href="https://drystack.io/" rel="noopener noreferrer"&gt;DryStack&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;If you have difficulty picking the stack for your project, or you don’t know what your choices are, you can try out DryStack. You can check out some tech stack options for client, server, tooling, etc. If you don’t know where to start, this is a pretty good starting point.&lt;/p&gt;

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

&lt;h2&gt;
  
  
  &lt;a href="https://github.com/FlacheQL/FlacheQL" rel="noopener noreferrer"&gt;FlacheQL&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;GraphQL is a young piece of technology and there are still a lot of problems with no industry standard method of solving. One of those problems in caching. While Facebook has created a solution for this, namely dataloader, it only caches exact requests. A new contender, FlacheQL, allows partial retrieval of a cached result. This is definitely pretty nice because you don’t have to fetch everything if the query does not exactly match the query that was cached. This will make caching with GraphQL more efficient.&lt;/p&gt;

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

&lt;h2&gt;
  
  
  &lt;a href="https://kore.io/" rel="noopener noreferrer"&gt;Kore&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;If you’re bored with the usual PHP/Java/C#/Node approach to developing web APIs and want something more hard core, try out Kore! It allows you to build web APIs in C.&lt;/p&gt;

&lt;p&gt;IN. C.&lt;/p&gt;

&lt;p&gt;If that isn’t hardcore enough, I don’t know what your definition of hardcore is.&lt;/p&gt;

&lt;p&gt;But still it is an interesting concept, and we all know how fast C is. So definitely try and check this out, if you dare.&lt;/p&gt;

</description>
      <category>python</category>
      <category>reason</category>
      <category>datascience</category>
      <category>elixir</category>
    </item>
    <item>
      <title>This Week I Learned #8</title>
      <dc:creator>John Paul Ada</dc:creator>
      <pubDate>Thu, 05 Jul 2018 08:13:18 +0000</pubDate>
      <link>https://dev.to/johnpaulada/this-week-i-learned8-1793</link>
      <guid>https://dev.to/johnpaulada/this-week-i-learned8-1793</guid>
      <description>&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fx6m33rdtnm9n5a3djtvd.JPG" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fx6m33rdtnm9n5a3djtvd.JPG" alt="This Week I Learned"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;JavaScript, Python, Reason, and more! Fun tech stuff to look forward to!&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy" rel="noopener noreferrer"&gt;JavaScript Proxy&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Proxies in JavaScript allow us to add hooks to objects. For example, when a value in an object is being extracted or being set, we can execute some side-effect or override the value being returned. This is helpful if you want to do some simple pub-sub actions, e.g. informing other objects if an object's value has changed. This can also be helpful if you want to do validation, e.g. the value in the object will remain the same if the value it was set with was invalid. This is a very powerful feature so check it out and see what creative ways you can use JavaScript proxies in!&lt;/p&gt;

&lt;p&gt;Here's a basic validation example from MDN:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;validator&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;set&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;prop&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;prop&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;age&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nb"&gt;Number&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;isInteger&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;TypeError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;The age is not an integer&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;RangeError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;The age seems invalid&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c1"&gt;// The default behavior to store the value&lt;/span&gt;
    &lt;span class="nx"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;prop&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="c1"&gt;// Indicate success&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;person&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Proxy&lt;/span&gt;&lt;span class="p"&gt;({},&lt;/span&gt; &lt;span class="nx"&gt;validator&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;person&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;age&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;person&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;age&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// 100&lt;/span&gt;
&lt;span class="nx"&gt;person&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;age&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;young&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Throws an exception&lt;/span&gt;
&lt;span class="nx"&gt;person&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;age&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;300&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Throws an exception&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






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

&lt;h2&gt;
  
  
  &lt;a href="https://formspree.io/" rel="noopener noreferrer"&gt;FormSpree&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;One of the things that throw you off when you want to create a landing page or just a simple static homepage is the issue of forms. Where would you send them if you don't have a server?&lt;/p&gt;

&lt;p&gt;FormSpree deals with that problem by receiving the data from the form and forwarding the data to your email. It has a pretty okay free tier and for unlimited amounts of emails you just have to pay $10 per month.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;form&lt;/span&gt; &lt;span class="na"&gt;action=&lt;/span&gt;&lt;span class="s"&gt;"https://formspree.io/your@email.com"&lt;/span&gt;
      &lt;span class="na"&gt;method=&lt;/span&gt;&lt;span class="s"&gt;"POST"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"text"&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"name"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"email"&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"_replyto"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"submit"&lt;/span&gt; &lt;span class="na"&gt;value=&lt;/span&gt;&lt;span class="s"&gt;"Send"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/form&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  &lt;a href="http://2ality.com/2017/12/for-await-of-sync-iterables.html" rel="noopener noreferrer"&gt;for-await-of&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Sometimes it's helpful to put Promises in an array and loop through their resolved values, like when making a lot of requests via &lt;code&gt;fetch&lt;/code&gt; or &lt;code&gt;axios&lt;/code&gt;. When dealing with an array of Promises, we usually use Promise.all to make sure they're all resolved, right? The problem with this is that it will wait for all of the Promises to resolve first before we can actually work with them. What we want is to get each request and start working with them the moment they resolve. How do we do that? We can use the for-await-of JavaScript syntax.&lt;/p&gt;

&lt;p&gt;Here's an example from from Dr. Axel Rauschmayer's blog. Basically instead of using Promise.all like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;x&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;all&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;syncIterableOverPromises&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Do something with x&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;we do this instead:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="k"&gt;await &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;x&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nx"&gt;syncIterableOverPromises&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Do something with x&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This will get each &lt;code&gt;x&lt;/code&gt; in the &lt;code&gt;syncIterableOverPromises&lt;/code&gt; iterable and then wait for it to resolve then proceed to the body of the for loop to work with the resolved &lt;code&gt;x&lt;/code&gt;. This makes it easier to start working with a list of Promises without waiting for all of them to complete.&lt;/p&gt;




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

&lt;h2&gt;
  
  
  &lt;a href="https://in.airdev.co/clementine" rel="noopener noreferrer"&gt;Clementine&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;If you have difficulty trying to build your application specs and the cost for building the application, you can use Clementine for that! Clementine guides you through the process of building your app specs, and at the end, estimates how much building the application would cost.&lt;/p&gt;

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

&lt;h2&gt;
  
  
  &lt;a href="https://vibora.io/" rel="noopener noreferrer"&gt;Vibora&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;If you like building Web APIs with Python with Django or Flask, why not take Vibora out for a spin? Vibora is a new web framework for building fast APIs, faster than most of the popular Python web frameworks out there. Inspired by Flask, Vibora is pretty easy to use and it is fully asynchronous. Check out their benchmarks on their site to see for yourself!&lt;/p&gt;

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

&lt;h2&gt;
  
  
  &lt;a href="https://transfer.sh/" rel="noopener noreferrer"&gt;Transfer.sh&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;If you want to share files for free without leaving your terminal, transfer.sh is the thing or you! If you the installation instructions, you'll have a transfer binary that you can run to upload a file. After uploading, you'll be presented with the download link you can send to your friends! The link lasts for 14 days and can be as big as 10 GB. The best thing is that it's free! Check it out!&lt;/p&gt;

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

&lt;h2&gt;
  
  
  &lt;a href="https://sail.sh/" rel="noopener noreferrer"&gt;Sail CI&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;If you want a hosted CI solution that's cheap, easy to use, and has a great free tier, check out Sail CI! You have 1000 build minutes per month which is already good enough compared to most hosted solutions out there. It's also pretty to setup! Just go to your project directory, run &lt;code&gt;sail init&lt;/code&gt; , define your pipeline in a &lt;code&gt;.sail&lt;/code&gt; file and you're all set!&lt;/p&gt;

&lt;p&gt;It currently only supports Github, but we'll probably see support on the others like Gitlab and Bitbucket in the near future!&lt;/p&gt;

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

&lt;h2&gt;
  
  
  &lt;a href="https://whydoiprocrastinate.com/" rel="noopener noreferrer"&gt;Why do I Procrastinate&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;This site asks you some questions and figures out why you're procrastinating. After that, it gives you recommendations on what to do to stop procrastinating and start working!&lt;/p&gt;

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

&lt;h2&gt;
  
  
  &lt;a href="https://ml5js.org/" rel="noopener noreferrer"&gt;ML5.js&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;TensorFlow.js took the web world by storm but to some still feel it is complicated even for common tasks. ML5.js makes this simpler by having a relatively easier API for dealing with common tasks like image classification. If you've been itching to do Machine Learning on the web, try this out!&lt;/p&gt;

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

&lt;h2&gt;
  
  
  &lt;a href="https://github.com/FiloSottile/mkcert" rel="noopener noreferrer"&gt;Mkcert&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;When developing for the web, sometimes we need to test our applications with HTTPS enabled. The problem is that most of the time, that is difficult - so features that require HTTPS to work can't be tested on locally. Mkcert helps us with this problem by being a zero-config tool for creating certificates for HTTPS. Next time you need HTTPS for local testing, try Mkcert out!&lt;/p&gt;

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

&lt;h2&gt;
  
  
  &lt;a href="https://gethttpsforfree.com/" rel="noopener noreferrer"&gt;Get HTTPS for Free&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Let's be honest - the process of getting a certificate from Let's Encrypt is not a piece of cake. Get HTTPS for Free helps you create your own certificates and get them signed with Let's Encrypt with relatively easy to understand instructions - and all you need is a terminal window and the single page of the site. The site doesn't look too great, but it works!&lt;br&gt;
Side note: I'm trying to recreate the site with another design - if you want to help me out here: &lt;a href="https://github.com/johnpaulada/gethttpsforfree-redesign" rel="noopener noreferrer"&gt;https://github.com/johnpaulada/gethttpsforfree-redesign&lt;/a&gt;!&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;a href="https://fsharpforfunandprofit.com/rop/" rel="noopener noreferrer"&gt;Railway-Oriented Programming&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;When developing applications, we usually focus on the happy path - on how the application should be behaving, but when you think about it, errors are also part of the program. Therefore, we also have to assume errors are going to happen and assume that there will be two paths: the happy path and the failure path. That's what Railway-Oriented Programming is all about. Our program should always take those two paths in consideration. Check it out if you're interested! 😄&lt;/p&gt;

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

&lt;h2&gt;
  
  
  &lt;a href="https://www.facebook.com/groups/202735933780478/" rel="noopener noreferrer"&gt;ReasonML Philippines&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;ReasonML is an awesome language created by Jordan Walke, the same guy who created React at Facebook. I've been very interested in it since the time I heard it last year during ReactConf 2017 during Cheng Lou's talk. I noticed that there weren't a lot of ReasonML enthusiasts in the Philippines - heck there wasn't even a Facebook group! So I created one! If you're from the Philippines, or even if you're just plain interested in ReasonML, please join us in the group! 😃&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>devops</category>
      <category>python</category>
      <category>reason</category>
    </item>
    <item>
      <title>It's my Dev.to anniversary! Here are some stuff!</title>
      <dc:creator>John Paul Ada</dc:creator>
      <pubDate>Tue, 05 Jun 2018 08:23:55 +0000</pubDate>
      <link>https://dev.to/johnpaulada/its-my-devto-anniversary-here-are-some-stuff-k4a</link>
      <guid>https://dev.to/johnpaulada/its-my-devto-anniversary-here-are-some-stuff-k4a</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Hd5zSJ1_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://thepracticaldev.s3.amazonaws.com/i/pf21soh1pqlbzi5mdpty.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Hd5zSJ1_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://thepracticaldev.s3.amazonaws.com/i/pf21soh1pqlbzi5mdpty.jpg" alt="Photo by Elena de Soto on Unsplash" width="800" height="482"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It's my one year anniversary at &lt;a href="https://dev.to/"&gt;Dev.to&lt;/a&gt;! 🎉&lt;/p&gt;

&lt;p&gt;I received an email today saying I got the beloved comment badge so I visited my &lt;a href="https://dev.to/johnpaulada"&gt;Dev.to profile page&lt;/a&gt; and saw that I joined Dev.to this day last year!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--vhsDr9xd--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://thepracticaldev.s3.amazonaws.com/i/p0rvx6kzpe0c3byznk1o.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--vhsDr9xd--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://thepracticaldev.s3.amazonaws.com/i/p0rvx6kzpe0c3byznk1o.png" alt="johnpaulada Dev.to profile" width="800" height="271"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Good Stuff
&lt;/h2&gt;

&lt;p&gt;To thank the community, here are some of my favorite resources:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--i4WNFMpE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://thepracticaldev.s3.amazonaws.com/i/39vitrqvz9caikwwrhhs.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--i4WNFMpE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://thepracticaldev.s3.amazonaws.com/i/39vitrqvz9caikwwrhhs.png" alt="Awesome Learning Resources" width="800" height="419"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://github.com/johnpaulada/awesome-learning-collections"&gt;Awesome Learning Resources&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;This is my own collection of resources, inspired by the Awesome collections. I'm sure you're familiar with them. This one is a collection of learning collections. Meta af, am I right?&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--UB5S05lY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://thepracticaldev.s3.amazonaws.com/i/cenh9hj38cl1a8ol4bmr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--UB5S05lY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://thepracticaldev.s3.amazonaws.com/i/cenh9hj38cl1a8ol4bmr.png" alt="Alcamy" width="800" height="419"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://alcamy.org/library/data-science"&gt;Alcamy Data Science Topic&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;This is a topic on Alcamy that I also compiled. This is my main study guide when it comes to Data Science. I update this whenever I find a good resource to add to the list.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--PB0CQpw3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://thepracticaldev.s3.amazonaws.com/i/l5k2nt0mk5b0e6dqfn66.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--PB0CQpw3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://thepracticaldev.s3.amazonaws.com/i/l5k2nt0mk5b0e6dqfn66.png" alt="Github Trending Page" width="800" height="419"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://github.com/trending"&gt;Github Trending Page&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;A list of the day's trending repositories. You can also filter it by date range (week, month), language used, etc.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--hhLd4KNn--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://thepracticaldev.s3.amazonaws.com/i/qi1afr2i65l3cns6fyj8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--hhLd4KNn--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://thepracticaldev.s3.amazonaws.com/i/qi1afr2i65l3cns6fyj8.png" alt="StackShare News" width="800" height="419"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://stackshare.io/news"&gt;StackShare News&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;This site collects tech news from a range of sources like Reddit, Medium, HackerNews, etc. You can specify which technologies you would like to display news for.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--6pWrknu5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://thepracticaldev.s3.amazonaws.com/i/23jyhyuzxjdgtgu7o8cf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--6pWrknu5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://thepracticaldev.s3.amazonaws.com/i/23jyhyuzxjdgtgu7o8cf.png" alt="Vue HN 2.0" width="800" height="419"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://hnews.xyz/top"&gt;Vue HN 2.0&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;A web app that pulls data from HackerNews and displays preview of the page.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ZlbAF-Kb--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://thepracticaldev.s3.amazonaws.com/i/io055he9xr42pkj1zx7e.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ZlbAF-Kb--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://thepracticaldev.s3.amazonaws.com/i/io055he9xr42pkj1zx7e.png" alt="The Random Programmer" width="800" height="419"&gt;&lt;/a&gt;&lt;br&gt;
Bonus: My Anchor Podcast: &lt;a href="https://anchor.fm/john-paul-nuguit-ada"&gt;The Random Programmer&lt;/a&gt; - I talk about a bunch of stuff about programming and software development.&lt;/p&gt;

</description>
      <category>fun</category>
      <category>learning</category>
      <category>devto</category>
    </item>
    <item>
      <title>This Week I Learned #7</title>
      <dc:creator>John Paul Ada</dc:creator>
      <pubDate>Tue, 29 May 2018 13:43:16 +0000</pubDate>
      <link>https://dev.to/johnpaulada/this-week-i-learned-7-3c6p</link>
      <guid>https://dev.to/johnpaulada/this-week-i-learned-7-3c6p</guid>
      <description>&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fjrmvuir64pudz7uzk3kd.JPG" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fjrmvuir64pudz7uzk3kd.JPG" alt="This Week I Learned"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Logic, Promises, NPM, PHP, ML, and a bunch of other acronyms in this episode of This Week I Learned!&lt;/p&gt;

&lt;p&gt;This was originally posted on &lt;a href="https://medium.com/@jepedesu/this-week-i-learned-7-e1c3c9417029" rel="noopener noreferrer"&gt;Medium&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  &lt;a href="https://www.wikiwand.com/en/De_Morgan%27s_laws" rel="noopener noreferrer"&gt;De Morgan’s Laws&lt;/a&gt;
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;The rules can be expressed in English as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the negation of a disjunction is the conjunction of the negations;&lt;/li&gt;
&lt;li&gt;and the negation of a conjunction is the disjunction of the negations;&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;p&gt;The De Morgan’s laws are a set of rules that allow us to transform a logic expression. I use these to make my boolean expressions simpler.&lt;/p&gt;

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

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

&lt;h2&gt;
  
  
  &lt;a href="https://gist.github.com/johnpaulada/fe5532f49f10f3579d2b337667aee73e" rel="noopener noreferrer"&gt;Promise.notAll/Promise.allMost&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Sometimes you need a list of Promises and you want them all to complete then return the array with the expected values. You’d usually use Promise.all for this in JavaScript, right? But what if one of the Promises rejects but you still want to get the ones that succeeded on their respective positions?&lt;/p&gt;

&lt;p&gt;We encountered this problem so we built &lt;code&gt;Promise.notAll&lt;/code&gt;! We also called it &lt;code&gt;Promise.allMost&lt;/code&gt; (get it?) thanks to &lt;a href="https://medium.com/@kurtgerm" rel="noopener noreferrer"&gt;Kurt Jerome Obispo&lt;/a&gt;’s suggestion. Anyway, here’s the code for it.&lt;/p&gt;

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

&lt;p&gt;And here's how you'd use it:&lt;/p&gt;

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

&lt;h2&gt;
  
  
  &lt;a href="https://docs.npmjs.com/cli/run-script#description" rel="noopener noreferrer"&gt;npm --&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;This enables you to add arguments to your call to an NPM script. For example, if you have an npm script called test and would like to add a verbose flag to it, then you can do:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm run &lt;span class="nb"&gt;test&lt;/span&gt; &lt;span class="nt"&gt;--&lt;/span&gt; &lt;span class="nt"&gt;--verbose&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  &lt;a href="https://docs.npmjs.com/getting-started/running-a-security-audit" rel="noopener noreferrer"&gt;npm audit&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;npm audit&lt;/code&gt; analyzes your dependencies and lists the vulnerable packages and their level of severity. You can even see the link to the security report on the vulnerable packages! This makes it easier to secure our node applications.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;a href="https://github.com/sindresorhus/ow" rel="noopener noreferrer"&gt;Ow&lt;/a&gt;
&lt;/h2&gt;

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

&lt;p&gt;Ow! is a library for &lt;em&gt;Function argument validation for humans&lt;/em&gt; built by the prolific &lt;a href="https://github.com/sindresorhus" rel="noopener noreferrer"&gt;Sindre Sorhus&lt;/a&gt;. It‘s batteries-included and has a great chainable API. You can also use create your own validator if you want! All in all, this would help you keep your code away from bugs and malicious input.&lt;/p&gt;

&lt;h2&gt;
  
  
  :: placeholder
&lt;/h2&gt;

&lt;p&gt;Apparently you can style textbox placeholders! I didn’t know that. LOL. But apparently you can use the ::placeholder pseudoselector to select placeholders and style them with CSS.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;a href="https://www.microsoft.com/net/learn/apps/machine-learning-and-ai/ml-dotnet" rel="noopener noreferrer"&gt;ML .NET&lt;/a&gt;
&lt;/h2&gt;

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

&lt;p&gt;Just install the Microsoft.ML package and enjoy the power of Machine Learning whether you’re using C# or F# or whatever language that uses the .NET framework! I don’t have much to say about this so just jump right in and try it out instead! 😆&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;a href="https://github.com/GoogleChrome/rendertron" rel="noopener noreferrer"&gt;Rendertron&lt;/a&gt;
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;Rendertron is a dockerized, headless Chrome rendering solution designed to render &amp;amp; serialise web pages on the fly.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Rendertron is Google’s answer to Prerender, which allows you to render your SPAs and that’s what’s served to search engines for SEO and indexing purposes. So you basically spin up a server running Rendertron server and you access the site via the rendertron server. The server will request your real web app and will display it when it has completely loaded. You can let Rendertron decide when the site has loaded or you can explicitly set it. To know more about Rendertron, visit their &lt;a href="https://github.com/GoogleChrome/rendertron" rel="noopener noreferrer"&gt;Github repo&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;a href="http://php.net/manual/en/book.ui.php" rel="noopener noreferrer"&gt;PHP UI&lt;/a&gt;
&lt;/h2&gt;

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

&lt;p&gt;Yep. You’re seeing it right. You can actually build cross-platform desktop applications with PHP! It’s in the official documentation folks! In the introduction:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;This extension wraps libui to provide an OO API for the cross platform development of native look-and-feel user interfaces .&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Who says PHP is only for the web? 🙊&lt;/p&gt;

&lt;h2&gt;
  
  
  Kubernetes Autoscaling
&lt;/h2&gt;

&lt;p&gt;Last time I checked when you setup Horizontal Pod Autoscaling for Kubernetes, you use the CPU usage as the metric. Now you can use the RAM usage, HTTP requests, or other metrics as the trigger for when you would automatically scale your Kubernetes cluster. That is pretty great news!&lt;/p&gt;

</description>
      <category>devops</category>
      <category>javascript</category>
      <category>php</category>
      <category>node</category>
    </item>
    <item>
      <title>GraphCool Continuous Deployment with Bitbucket Pipeline</title>
      <dc:creator>John Paul Ada</dc:creator>
      <pubDate>Mon, 14 May 2018 10:32:25 +0000</pubDate>
      <link>https://dev.to/johnpaulada/graphcool-continuous-deployment-with-bitbucket-pipeline-akd</link>
      <guid>https://dev.to/johnpaulada/graphcool-continuous-deployment-with-bitbucket-pipeline-akd</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;This was originally posted on the &lt;a href="https://medium.com/gaplabs-engineering/graphcool-continuous-deployment-with-bitbucket-pipelines-cc1788e01c00" rel="noopener noreferrer"&gt;GAPLabs Engineering Blog&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If you can automate it, you should.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;We all try to live by this, but it’s not always easy. Automation is not the easiest thing to do. But it should be. And continuously deploying a GraphCool server with Bitbucket Pipelines is. Because we use Bitbucket everyday, it’s a no-brainer that we’d use Bitbucket Pipelines as our service of choice.&lt;/p&gt;

&lt;p&gt;In order to deploy a GraphCool server, we just need to do these steps:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Install the GraphCool CLI.&lt;/li&gt;
&lt;li&gt;Install dependencies.&lt;/li&gt;
&lt;li&gt;Run &lt;code&gt;graphcool deploy&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  bitbucket-pipelines.yml
&lt;/h2&gt;

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

&lt;p&gt;That’s it. Just include this bitbucket-pipelines.yml file in your root directory and push some changes to the master or dev branches. It will then begin the build and deploy. If you think this is confusing, here’s a little breakdown.&lt;/p&gt;

&lt;h3&gt;
  
  
  Breakdown
&lt;/h3&gt;

&lt;p&gt;This pipeline uses the &lt;code&gt;johnpaulada/graphcool&lt;/code&gt; image as its runtime image, which is just a Node image with the GraphCool CLI installed. This takes care of the step 1 above.&lt;/p&gt;

&lt;p&gt;After loading the image, it will then start installing the dependencies with Yarn. This takes care of step 2. If the &lt;code&gt;yarn.lock&lt;/code&gt; or &lt;code&gt;package.json&lt;/code&gt; have not changed, Pipelines caches the &lt;code&gt;node_modules&lt;/code&gt; folder, making the installation process faster.&lt;/p&gt;

&lt;p&gt;After that, &lt;code&gt;graphcool deploy&lt;/code&gt; is run, which starts the deployment process. It knows where to deploy it from the &lt;code&gt;GRAPHCOOL_TARGET&lt;/code&gt; environment variable. If deploying to &lt;code&gt;dev&lt;/code&gt;, we use the &lt;code&gt;GRAPHCOOL_TARGET_STAGING&lt;/code&gt; instead. This takes care of step 3.&lt;/p&gt;

&lt;h2&gt;
  
  
  Environment Variables
&lt;/h2&gt;

&lt;p&gt;We need the &lt;code&gt;GRAPHCOOL_TARGET&lt;/code&gt;, &lt;code&gt;GRAPHCOOL_PLATFORM_TARGET&lt;/code&gt;, and &lt;code&gt;GRAPHCOOL_TARGET_STAGING&lt;/code&gt; environment variables. You can get the &lt;code&gt;GRAPHCOOL_TARGET&lt;/code&gt; and &lt;code&gt;GRAPHCOOL_TARGET_STAGING&lt;/code&gt; from your &lt;code&gt;.graphcoolrc&lt;/code&gt; file. The &lt;code&gt;GRAPHCOOL_PLATFORM_TARGET&lt;/code&gt; is in your &lt;code&gt;~/.graphcoolrc&lt;/code&gt; file.&lt;/p&gt;

</description>
      <category>graphql</category>
      <category>devops</category>
    </item>
    <item>
      <title>This Week I Learned #6</title>
      <dc:creator>John Paul Ada</dc:creator>
      <pubDate>Sun, 06 May 2018 09:09:24 +0000</pubDate>
      <link>https://dev.to/johnpaulada/this-week-i-learned-6-4e74</link>
      <guid>https://dev.to/johnpaulada/this-week-i-learned-6-4e74</guid>
      <description>&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fj5o6h078siazpzjgipez.JPG" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fj5o6h078siazpzjgipez.JPG" alt="This Week I Learned"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is part 2 of the back-to-back podcast episodes! 😉&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;I’m recording this &lt;a href="https://anchor.fm/john-paul-nuguit-ada/episodes/This-Week-I-Learned-6-e1dq4t" rel="noopener noreferrer"&gt;podcast episode&lt;/a&gt; from Sambawan Island. 😄&lt;/p&gt;
&lt;/blockquote&gt;




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

&lt;h2&gt;
  
  
  &lt;a href="https://readrr.surge.sh/" rel="noopener noreferrer"&gt;Readrr&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;I saw this cool app called &lt;strong&gt;&lt;a href="https://www.producthunt.com/posts/spdr" rel="noopener noreferrer"&gt;Spdr&lt;/a&gt;&lt;/strong&gt; which allows you to speed read by copy pasting words on to the app and displaying the words one by one. It’s free so I tried to download it but apparently I can’t because you need to have iOS 11 and I’m still on 10 (can’t upgrade coz I got no space left).&lt;/p&gt;

&lt;p&gt;So I had my sister do a quick mockup of what the site would look like on Gravit and I implemented it. It looks like this because of my sister’s taste for design. It’s free and open source, so you can check it out &lt;strong&gt;&lt;a href="https://readrr.surge.sh/" rel="noopener noreferrer"&gt;here&lt;/a&gt;&lt;/strong&gt; and maybe checkout the &lt;strong&gt;&lt;a href="https://github.com/johnpaulada/readrr" rel="noopener noreferrer"&gt;repo&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;

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

&lt;h2&gt;
  
  
  &lt;a href="https://blog.angular.io/version-6-of-angular-now-available-cc56b0efa7a4" rel="noopener noreferrer"&gt;Angular 6&lt;/a&gt;
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;The 6.0.0 release of Angular is here! This is a major release focused less on the underlying framework, and more on the toolchain and on making it easier to move quickly with Angular in the future.&lt;/p&gt;
&lt;/blockquote&gt;

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

&lt;h2&gt;
  
  
  &lt;a href="https://webassembly.studio/" rel="noopener noreferrer"&gt;WebAssembly Studio&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;WebAssembly Studio is a web-based IDE for writing WebAssembly in C, Rust, etc. You build it out in a different language, run it, and then build a .wasm file when you’re ready. This makes using WebAssembly to build applications less daunting.&lt;/p&gt;

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

&lt;h2&gt;
  
  
  &lt;a href="https://github.com/Mailtrain-org/mailtrain" rel="noopener noreferrer"&gt;MailTrain&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;If you have a spare server lying around and MailChimp is not your thing, you can try out MailTrain!&lt;/p&gt;

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

&lt;h2&gt;
  
  
  &lt;a href="https://vscodecandothat.com/" rel="noopener noreferrer"&gt;VS Code Can Do That&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;If you’re new to Visual Studio Code try this out! The site teaches you fun and awesome features that you probably didn’t expect a code editor like VS Code to be able to do.&lt;/p&gt;

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

&lt;h2&gt;
  
  
  &lt;a href="https://stdlib.io/" rel="noopener noreferrer"&gt;Stdlib.io&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Despite being a very popular language, JavaScript does not have a standard library like C++ and Python. Stdlib.io is a project that aims to be a standard library for JavaScript. It has functions for math, for data structures, and even for plotting! The downside is that the library has pretty bad documentation and it’s pretty large — so large that I can’t use Jsdelivr as a CDN because it can’t process it. Other than that, it’s pretty awesome.&lt;/p&gt;

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

&lt;h2&gt;
  
  
  &lt;a href="https://plover.io/" rel="noopener noreferrer"&gt;Plover&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;If you’ve ever tried Apple’s AirDrop, it’s probably your choice of quickly sending files to nearby devices. Plover is an alternative for people who do not have Apple devices. Head on over to plover.io and find the person you wish to send the files to and there you go! You have to be connected to same network though.&lt;/p&gt;

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

&lt;h2&gt;
  
  
  &lt;a href="https://about.modeanalytics.com/" rel="noopener noreferrer"&gt;Mode Studio&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;If you work with data either at work or as a hobby, Mode Studio is a great tool to try out. It allows you to work with Python, R, and SQL seamlessly in a Jupyter notebook-like environment. Best of all: it’s free! What’s not to love?&lt;/p&gt;

</description>
      <category>learning</category>
      <category>webdev</category>
      <category>javascript</category>
    </item>
    <item>
      <title>This Week I Learned #5</title>
      <dc:creator>John Paul Ada</dc:creator>
      <pubDate>Tue, 24 Apr 2018 10:12:39 +0000</pubDate>
      <link>https://dev.to/johnpaulada/this-week-i-learned5-46ja</link>
      <guid>https://dev.to/johnpaulada/this-week-i-learned5-46ja</guid>
      <description>&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2F1eht9jlh2dw884knfwai.JPG" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2F1eht9jlh2dw884knfwai.JPG" alt="This Week I Learned"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;TensorFlow, Kubernetes, and more in this exciting episode!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It’s been a while guys! I’ve been pretty busy because there’s a lot going on, from giving a talk at &lt;a href="https://www.gdgph.org/#/events/tensorflow-dev-summit-2018" rel="noopener noreferrer"&gt;TensorFlow Dev Summit Extended Manila 2018&lt;/a&gt; to starting new projects.&lt;br&gt;
So I’m going to release two episodes side-by-side! I hope you’re ready! 😉&lt;/p&gt;

&lt;h2&gt;
  
  
  Save as PDF to iBooks
&lt;/h2&gt;

&lt;p&gt;The &lt;strong&gt;Save PDF to iBooks&lt;/strong&gt; share option in Safari in iOS devices are super awesome! It was unexpectedly good! I use it to save webpages like guides, tutorials, and cheatsheets as PDFs, especially since I’m not online a lot. If you have an iOS device, it’s worth a try. If you don’t have an iOS device, you can use &lt;a href="https://pdf.fivefilters.org/simple-print/url.php" rel="noopener noreferrer"&gt;SimplePrint&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/playlist?list=PLQY2H8rRoyvxjVx3zfw4vA4cvlKogyLNN" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2F6vx14f9wqxi9693qp1vc.png" alt="TensorFlow Dev Summit"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;a href="https://www.youtube.com/playlist?list=PLQY2H8rRoyvxjVx3zfw4vA4cvlKogyLNN" rel="noopener noreferrer"&gt;TensorFlow Dev Summit 2018&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;This year’s TensorFlow Dev Summit is awesome as usual! A lot of new tools and updates have been released and I’m so excited to try them out. We’ll look at two of my favorites next but if you want to learn more, here’s a link to the &lt;a href="https://medium.com/tensorflow" rel="noopener noreferrer"&gt;TensorFlow blog&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://js.tensorflow.org/" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fongfzrotguckfrli2xct.png" alt="TensorFlow.js"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;a href="https://js.tensorflow.org/" rel="noopener noreferrer"&gt;TensorFlow.js&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;TensorFlow.js is one of the awesome new members of the TensorFlow family. TensorFlow.js has support for the TensorFlow Layers API, is hardware-accelerated with access to the low-level Ops API (formerly Deeplearn.js), can train models in-browser, and use exported Keras models &amp;amp; TensorFlow SavedModels.&lt;/p&gt;

&lt;p&gt;This makes it easier to use machine learning with JavaScript, and this has a lot of implications — because JavaScript can be used almost everywhere: for mobile, desktop, and even VR development. Now we can easily apply Machine Learning to those fields. Also, almost every web developer knows JavaScript, which makes this another step to democratizing AI.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.tensorflow.org/hub/" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2F0htbrzsfacpu6u5pjqfp.png" alt="TensorFlow Hub"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;a href="https://www.tensorflow.org/hub/" rel="noopener noreferrer"&gt;TensorFlow Hub&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Similar to how TensorFlow.js can import Keras and TensorFlow models, we can now import powerful machine learning models without breaking a sweat in a single line of code with TensorFlow Hub. TensorFlow hub is like a repository of popular ML models like Inception and the like. Heck, even NASNet is there.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/databricks/click" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fdjwuql96nnm05nxb2qnd.png" alt="Kubernetes Click"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;a href="https://github.com/databricks/click" rel="noopener noreferrer"&gt;Kubernetes Click&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;A.K.A “Command Line Interactive Controller for Kubernetes”, Click helps Kubernetes users do their tasks faster by giving context to commands.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/chrissimpkins/Crunch" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fbaqodgitjyczw7cehezy.png" alt="Crunch"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;a href="https://github.com/chrissimpkins/Crunch" rel="noopener noreferrer"&gt;Crunch&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Crunch is a macOS application that compresses PNGs really well, but is “insanely” slow. You can give it a try if you want extra good compression and you have the time to do it.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://popmotion.io/pose/" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2F265sxmtvjpumrvlkl4jb.png" alt="PopMotion POSE"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;a href="https://popmotion.io/pose/" rel="noopener noreferrer"&gt;PopMotion POSE&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;PopMotion POSE is the declarative version of PopMotion. Declarative basically means you define what something should do, instead of being concerned with how and when it should happen. This allows you to have the power of PopMotion and giving it simplicity. This makes it really awesome to use with React, which is also declarative in nature.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://jenkins-x.io/" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fejuqmmxz9fxyghpoese2.png" alt="Jenkins X"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;a href="http://jenkins-x.io/" rel="noopener noreferrer"&gt;Jenkins X&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Jenkins X brings the power and flexibility of Jenkins for CI/CD and bringing it to Kubernetes. While having a fair level of abstraction, it still hasn’t lost its flexibility, as you still can go deep and tailor everything to your liking.&lt;/p&gt;

</description>
      <category>devops</category>
      <category>kuberntes</category>
      <category>javascript</category>
      <category>tensorflow</category>
    </item>
  </channel>
</rss>
