<?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>Forem: Dennis Mathew Philip</title>
    <description>The latest articles on Forem by Dennis Mathew Philip (@dennismphil).</description>
    <link>https://forem.com/dennismphil</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%2F198184%2F8d9fd6c9-e7a7-4f61-89fb-2db521571bc1.png</url>
      <title>Forem: Dennis Mathew Philip</title>
      <link>https://forem.com/dennismphil</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/dennismphil"/>
    <language>en</language>
    <item>
      <title>Will a Television purchased from the US work in other countries?</title>
      <dc:creator>Dennis Mathew Philip</dc:creator>
      <pubDate>Sun, 05 Dec 2021 01:54:16 +0000</pubDate>
      <link>https://forem.com/dennismphil/will-an-lg-television-bought-from-the-us-work-in-india-1c73</link>
      <guid>https://forem.com/dennismphil/will-an-lg-television-bought-from-the-us-work-in-india-1c73</guid>
      <description>&lt;h1&gt;
  
  
  Overview
&lt;/h1&gt;

&lt;p&gt;This article suggests a DIY definitive way to understand if you will fry your device connecting to a non 120V supply. &lt;/p&gt;

&lt;h1&gt;
  
  
  Will it work?
&lt;/h1&gt;

&lt;p&gt;I purchased a LG Television 65UP7670PUC.AUS from a local Costco in the US where the supported voltage is 120V/60Hz to be used in India where the voltage is 240V/50Hz. I was curious if the television would work without a step down transformer. &lt;/p&gt;

&lt;p&gt;The specs on the LG Website says the television supports dual voltage.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--IqVRyhfL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4jw402mh75wk61gxdt2q.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--IqVRyhfL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4jw402mh75wk61gxdt2q.png" alt="LG TV supported voltage" width="529" height="229"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;However, when I received the unit, it had a label on it mentioning it supports only 120V. Quite misleading. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--caJ89X1A--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xibob09yljozczw36gir.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--caJ89X1A--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xibob09yljozczw36gir.png" alt="Label on TV" width="880" height="416"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Running the Television with a Step down transformer is a hassle. I wrote to LG asking if this particular model supports 220V and received a reply.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--X-fE01nz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/785ysvg0x29f4yybmpyq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--X-fE01nz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/785ysvg0x29f4yybmpyq.png" alt="LG Support Reply" width="587" height="1068"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Duh!&lt;/p&gt;

&lt;h2&gt;
  
  
  🪛 Time to open the backplate
&lt;/h2&gt;

&lt;p&gt;Every television has an internal power supply board that converts the input AC voltage to the desired DC voltage.  &lt;/p&gt;

&lt;p&gt;Removed the screws behind the television and with a little bit of prying was able to get the backplate off. On checking the input voltage rating on the internal power supply board, voila, it's written input 100-240V. There lies my answer. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--bX7OAphe--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/z7l4ivumr3zdhi0lavrt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--bX7OAphe--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/z7l4ivumr3zdhi0lavrt.png" alt="Power Supply Unit" width="880" height="758"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you have a television or any electronic equipment purchased from the US and wondering if that would work in your destination country, the definitive way is to check the input rating voltage labeled on the PCB of the internal power supply board.  &lt;/p&gt;

</description>
      <category>65up7670puc</category>
      <category>television</category>
    </item>
    <item>
      <title>The key to HYPER productivity</title>
      <dc:creator>Dennis Mathew Philip</dc:creator>
      <pubDate>Sun, 07 Feb 2021 18:35:46 +0000</pubDate>
      <link>https://forem.com/dennismphil/the-key-to-hyper-productivity-4l50</link>
      <guid>https://forem.com/dennismphil/the-key-to-hyper-productivity-4l50</guid>
      <description>&lt;p&gt;Have the spiders made a web 🕸 on your CAPS LOCK key? Has it not lost its shine, from the time you bought that keyboard? &lt;/p&gt;

&lt;p&gt;Let's find a way to put it to some good use.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is Hyper Key?
&lt;/h2&gt;

&lt;p&gt;Hyper Key = Your own key for hyper-productivity.&lt;/p&gt;

&lt;p&gt;Hyper key is the name given for the combination (in a mac keyboard layout context)&lt;/p&gt;

&lt;p&gt;SHIFT + CONTROL + OPTION + COMMAND&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--xyl28TWM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/lkrpsmxgj6e0ztglmuug.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--xyl28TWM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/lkrpsmxgj6e0ztglmuug.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;🛑 STOP. Read on before you start using your 🦶 toe to keep the keys pressed.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's great about it?
&lt;/h2&gt;

&lt;p&gt;I have always wished for an easy to remember keys combination for some of my workflows just like elsewhere on the internet &lt;code&gt;Ctrl&lt;/code&gt;/&lt;code&gt;Cmd&lt;/code&gt; + &lt;code&gt;C&lt;/code&gt; is for copying. But, then I realize this combination is already taken.&lt;/p&gt;

&lt;p&gt;For me, it may be an easy key for window resizing;&lt;br&gt;
For you, it may be to start playing a Spotify playlist;&lt;br&gt;
or, an easy key to control the brightness of your fifth monitor behind you. &lt;/p&gt;

&lt;p&gt;Whatever the use case may be, this key combination is YOURS, made for you. An easy to remember key combination that, does not conflict with any pre-mapping that the machine was shipped with. &lt;/p&gt;

&lt;p&gt;We decide how to make use of this. The power is in our hands. &lt;/p&gt;

&lt;h2&gt;
  
  
  Remap time
&lt;/h2&gt;

&lt;p&gt;What if, we can remap our CAPS LOCK key to be the new HYPER key? &lt;/p&gt;

&lt;p&gt;Download and install &lt;a href="https://karabiner-elements.pqrs.org/"&gt;Karabiner Elements&lt;/a&gt; - A powerful and stable keyboard customizer for macOS.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Goto "Complex Modifications"&lt;/li&gt;
&lt;li&gt;"Add Rule" to remap caps_lock to our hyper key combo&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--z0q_sNUz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/39wue36yguqqq1lb1qwd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--z0q_sNUz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/39wue36yguqqq1lb1qwd.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Easy?&lt;/p&gt;

&lt;h2&gt;
  
  
  Customize your apps
&lt;/h2&gt;

&lt;p&gt;For window resizing, I use an app called &lt;a href="https://rectangleapp.com/"&gt;Rectangle&lt;/a&gt;. Fire up your app and record the newly minted shortcut.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--72D_4Aq7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/boyjhlze27ciuoj5e3i3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--72D_4Aq7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/boyjhlze27ciuoj5e3i3.png" alt="Karabiner"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is just one example, where we can use the num pad to resize open windows to regions on the screen. The 1-9 keys in num pad region naturally align to 9 regions on screen and can be easily remembered the way it is arranged on the keyboard.&lt;/p&gt;

&lt;p&gt;Never again drag your window corners to perfectly align one-third of your screen just because we forgot the shortcut. &lt;br&gt;
Use them in your favorite application where you spend the time the most.&lt;/p&gt;

&lt;p&gt;For controlling all monitor brightness, found an app &lt;a href="https://apps.apple.com/us/app/brightness-slider/id456624497?mt=12"&gt;Brightness Slider&lt;/a&gt; and configured hyper key to be used with it.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--mG2OIAre--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/cyjkeh3cg3385ccokwjs.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--mG2OIAre--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/cyjkeh3cg3385ccokwjs.png" alt="Brightness Slider"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;💗 Love little productivity hack like these. They optimize our time to getting things done a tad bit faster.&lt;/p&gt;

&lt;h3&gt;
  
  
  🙏 Thank you for reading
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--kEsHYvJ2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/dr7239vwt3x8r5jf2qi0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--kEsHYvJ2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/dr7239vwt3x8r5jf2qi0.png" alt="Hyper Keyboard"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We saw what Hyper key is, which is just like a combination key &lt;code&gt;Control&lt;/code&gt; or &lt;code&gt;Alt&lt;/code&gt;. Also, saw how to remap the CAPS LOCK key to optimize some of our workflows. Here, we saw one example of window resizing, but the possibilities this opens up are endless for your daily repetitive tasks. May the force be with you.&lt;/p&gt;

&lt;p&gt;What are you going to use Hyper key for?&lt;/p&gt;




&lt;p&gt;Please find my other writings here:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href="https://medium.com/@dennismphil/one-side-rounded-rectangle-using-svg-fb31cf318d90"&gt;One side rounded rectangle using SVG&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/dennismphil/what-makes-these-borders-beautiful-2loj"&gt;What makes these borders beautiful?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/dennismphil/automated-end-to-end-tests-made-easy-180m"&gt;Automated End to End tests made easy&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/dennismphil/automate-your-node-dependency-updates-4aga"&gt;Automate your node dependency update&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/@dennismphil/debugging-node-js-using-visual-studio-code-c30e5eeb9e38"&gt;Visual Studio Code — Debug Mode&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/@dennismphil/i-want-typescript-to-succeed-d421d00fd856"&gt;I want TypeScript to succeed.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/@dennismphil/whats-on-my-laptop-2cc2619aa55f"&gt;What’s in my laptop?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/@dennismphil/coffeescripts-most-loved-feature-soon-in-javascript-b2f6740c2dc7"&gt;CoffeeScript’s most loved feature soon in JavaScript&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/dennismphil/extend-your-wireless-signal-with-an-old-router-2lfd"&gt;Extend your wireless signal with an old router&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/dennismphil/make-yourself-rich-by-hacking-this-juice-shop-5e72/edit"&gt;Make yourself rich by hacking this juice shop&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>tooling</category>
      <category>productivity</category>
      <category>programming</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Make yourself rich by hacking this juice shop 💵</title>
      <dc:creator>Dennis Mathew Philip</dc:creator>
      <pubDate>Mon, 29 Jun 2020 02:38:08 +0000</pubDate>
      <link>https://forem.com/dennismphil/make-yourself-rich-by-hacking-this-juice-shop-5e72</link>
      <guid>https://forem.com/dennismphil/make-yourself-rich-by-hacking-this-juice-shop-5e72</guid>
      <description>&lt;p&gt;As a business owner or as a professional, getting your website hacked is no fun. How do hackers do this?&lt;/p&gt;

&lt;p&gt;Through this article, I would like to bring your attention to an exciting topic - Web Application Security.&lt;/p&gt;

&lt;p&gt;Knowing some of the techniques will help you design a reasonably "secure" web application. Before a release, attacking your own application will help mitigate some of the vulnerabilities. &lt;/p&gt;

&lt;h2&gt;
  
  
  📖 Learn the techniques
&lt;/h2&gt;

&lt;p&gt;Pay attention to the screenshot below. You may have placed eCommerce orders for 1 or more items. Have you thought what would happen when an order is placed with a quantity of -100 items? This order will &lt;strong&gt;return money to the shopper's credit card&lt;/strong&gt;!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--uTnmqf1c--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/9qzg60y4nmqai9qa68sz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--uTnmqf1c--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/9qzg60y4nmqai9qa68sz.png" alt="Final"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Do you want to be that devastated owner of a business that "pays" money for no juice sold?&lt;/p&gt;

&lt;p&gt;You may have read or heard about &lt;em&gt;SQL injection&lt;/em&gt;, &lt;em&gt;Cross-site scripting&lt;/em&gt;, &lt;em&gt;Cross-site Request Forgery&lt;/em&gt;, and other popular attacks. &lt;/p&gt;

&lt;p&gt;Let's learn swimming, by actually being in the water.&lt;/p&gt;

&lt;h2&gt;
  
  
  🥤 Set up your juice shop
&lt;/h2&gt;

&lt;p&gt;Before we start, we need an online juice shop - an insecure vulnerable web application to learn some basic and advanced attacks. Luckily there is one that exists.&lt;/p&gt;

&lt;p&gt;Assuming you have NodeJS installed:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Clone the repository &lt;/li&gt;
&lt;li&gt;Install the project dependencies&lt;/li&gt;
&lt;li&gt;Start the server.
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git clone https://github.com/bkimminich/juice-shop.git
npm install
npm start
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Your juice shop is up and running.&lt;/p&gt;

&lt;p&gt;Navigate to &lt;a href="http://localhost:3000"&gt;http://localhost:3000&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  💵 Make yourself rich
&lt;/h2&gt;

&lt;p&gt;The user interface will let you pick only 1 juice. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--zP1zVCnF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/eh92rr76gtbfd8xtacy6.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--zP1zVCnF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/eh92rr76gtbfd8xtacy6.gif" alt="UI"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;mmmmm... What about the API?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Open the browser developer tools, firefox will let you resend a request quite easily.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s---IRIGDUp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/478yki0ej4kfy17bk473.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s---IRIGDUp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/478yki0ej4kfy17bk473.gif" alt="Dev Tools"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That works 🎉. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--3Z7Uva9S--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/vp65sqk76a26uamnfas5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--3Z7Uva9S--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/vp65sqk76a26uamnfas5.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Wait, what just happened? We used the API to post the quantity of juice as -100. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--wSL6TEV2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/0thz3x7cay3a4gy7193q.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--wSL6TEV2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/0thz3x7cay3a4gy7193q.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Placing this order will pay you $198.01 from the juice vendor!&lt;/p&gt;

&lt;p&gt;Obviously, this is a hypothetical situation. The web application is mindfully crafted to be insecure to show the point.&lt;/p&gt;

&lt;h2&gt;
  
  
  🧊 The tip of the iceberg
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--yhIHVnqy--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/2plkmyk9okzzozy47chb.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--yhIHVnqy--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/2plkmyk9okzzozy47chb.jpg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;"OWASP Juice Shop" is an application that provides awareness for security risks that potentially exist in modern web applications. &lt;/p&gt;

&lt;p&gt;This is &lt;strong&gt;only one of the many&lt;/strong&gt; challenges in the set of OWASP Juice Shop exercises. See all the challenges and work through each of them. You will be delighted to learn some of the popular techniques to&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Access confidential files on the server&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Decrypt coupon codes and &lt;strong&gt;get an 80% off an order&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Login as a different user &lt;strong&gt;without knowing their password&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Start here: &lt;a href="https://bkimminich.gitbooks.io/pwning-owasp-juice-shop/content"&gt;https://bkimminich.gitbooks.io/pwning-owasp-juice-shop/content&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is definitely one of the best free security training for you out there. Let's create secure web applications together. &lt;/p&gt;

&lt;h2&gt;
  
  
  🙏 Credits
&lt;/h2&gt;

&lt;p&gt;Björn Kimminich for creating and maintaining this project for the world to learn.&lt;/p&gt;




&lt;p&gt;Please find my other writings here:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href="https://medium.com/@dennismphil/one-side-rounded-rectangle-using-svg-fb31cf318d90"&gt;One side rounded rectangle using SVG&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/dennismphil/what-makes-these-borders-beautiful-2loj"&gt;What makes these borders beautiful?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/dennismphil/automated-end-to-end-tests-made-easy-180m"&gt;Automated End to End tests made easy&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/dennismphil/automate-your-node-dependency-updates-4aga"&gt;Automate your node dependency update&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/@dennismphil/debugging-node-js-using-visual-studio-code-c30e5eeb9e38"&gt;Visual Studio Code — Debug Mode&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/@dennismphil/i-want-typescript-to-succeed-d421d00fd856"&gt;I want TypeScript to succeed.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/@dennismphil/whats-on-my-laptop-2cc2619aa55f"&gt;What’s in my laptop?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/@dennismphil/coffeescripts-most-loved-feature-soon-in-javascript-b2f6740c2dc7"&gt;CoffeeScript’s most loved feature soon in JavaScript&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/dennismphil/extend-your-wireless-signal-with-an-old-router-2lfd"&gt;Extend your wireless signal with an old router&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>javascript</category>
      <category>security</category>
      <category>webdev</category>
      <category>testing</category>
    </item>
    <item>
      <title>What makes these borders beautiful?</title>
      <dc:creator>Dennis Mathew Philip</dc:creator>
      <pubDate>Tue, 19 May 2020 15:40:25 +0000</pubDate>
      <link>https://forem.com/dennismphil/what-makes-these-borders-beautiful-2loj</link>
      <guid>https://forem.com/dennismphil/what-makes-these-borders-beautiful-2loj</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--baXqlzrJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/nbpma2shl6i03hi7v6e0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--baXqlzrJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/nbpma2shl6i03hi7v6e0.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Beauty&lt;/strong&gt; is in the eye of the &lt;strong&gt;beholder&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;Are you in the camp that feels these borders are beautiful?&lt;/p&gt;

&lt;p&gt;These designs are increasingly seen in modern design and in the design community, they are known as &lt;strong&gt;Neumorphism&lt;/strong&gt;. They add extra polish to dashboards and dark mode mobile app designs. I certainly feel these are gorgeous. Let's take a closer look at these.&lt;/p&gt;

&lt;h2&gt;
  
  
  A tale of two shadows
&lt;/h2&gt;

&lt;p&gt;These borders are created using two complimentary shadows. One lighter and one darker having complimentary offsets. They are professionally hand-crafted to give this soft UI look. The offset and blur of the shadow depend on the size of the element.&lt;/p&gt;

&lt;p&gt;For example, &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;To create a pressed surface create two inset shadows with the slightly darker and lighter surface shades&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--peml6-xH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/ufkstqtt4xc7hvmlmwtt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--peml6-xH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/ufkstqtt4xc7hvmlmwtt.png" alt="Inner Shadow"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;To create an elevated surface create two shadows again with slightly darker and lighter surface shades&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--UJ_Y_CIQ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/5chq3wtf8kkm07b62ggw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--UJ_Y_CIQ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/5chq3wtf8kkm07b62ggw.png" alt="Outer Shadow"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Start here
&lt;/h2&gt;

&lt;p&gt;A great starting point is &lt;a href="https://neumorphism.io/"&gt;https://neumorphism.io/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Use in moderation. &lt;/p&gt;

&lt;p&gt;Next time you see a neomorphic design, you know they are nothing but, the play of 2 shadows. &lt;/p&gt;




&lt;p&gt;Please find my other writings here:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href="https://medium.com/@dennismphil/one-side-rounded-rectangle-using-svg-fb31cf318d90"&gt;One side rounded rectangle using SVG&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/dennismphil/automated-end-to-end-tests-made-easy-180m"&gt;Automated End to End tests made easy&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/dennismphil/automate-your-node-dependency-updates-4aga"&gt;Automate your node dependency update&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/@dennismphil/debugging-node-js-using-visual-studio-code-c30e5eeb9e38"&gt;Visual Studio Code — Debug Mode&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/@dennismphil/i-want-typescript-to-succeed-d421d00fd856"&gt;I want TypeScript to succeed.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/@dennismphil/whats-on-my-laptop-2cc2619aa55f"&gt;What’s in my laptop?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/@dennismphil/coffeescripts-most-loved-feature-soon-in-javascript-b2f6740c2dc7"&gt;CoffeeScript’s most loved feature soon in JavaScript&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/dennismphil/extend-your-wireless-signal-with-an-old-router-2lfd"&gt;Extend your wireless signal with an old router&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>neumorphism</category>
      <category>design</category>
      <category>css</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Extend your wireless signal with an old router</title>
      <dc:creator>Dennis Mathew Philip</dc:creator>
      <pubDate>Sat, 14 Dec 2019 09:40:52 +0000</pubDate>
      <link>https://forem.com/dennismphil/extend-your-wireless-signal-with-an-old-router-2lfd</link>
      <guid>https://forem.com/dennismphil/extend-your-wireless-signal-with-an-old-router-2lfd</guid>
      <description>&lt;p&gt;&lt;em&gt;A cost-effective alternative to Mesh routers for signal expansion where internet speeds are less than 300Mbps&lt;/em&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Introduction
&lt;/h1&gt;

&lt;p&gt;Do you have wifi dead spots in your home? Can you get hold of an old wireless router? Let's fix it by wirelessly linking both routers and then extend your wifi range to reach all the corners. &lt;/p&gt;

&lt;p&gt;Typically the Internet Service Provider(ISP)'s cable enters your home at a corner. This forces you to place your router at one corner of your home which is not the ideal placement for optimal coverage. &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%2Fag9zd34sowe1jmmhipqi.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%2Fag9zd34sowe1jmmhipqi.png" alt="No wifi"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  📖 Background
&lt;/h1&gt;

&lt;p&gt;The technique I am going to explain is called &lt;em&gt;Wireless Distribution System (WDS)&lt;/em&gt; which enables us to wirelessly link two routers and thereby extending the reach of the wireless signal.&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%2F054d6karucq3av39w3bu.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%2F054d6karucq3av39w3bu.png" alt="Cost comparison"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I purchased a preowned TPLink Archer C50 for $15 for testing purpose. The general theory should work across manufacturers/models that support WDS.&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%2Fcja2wwzwmihkfyqdgfw7.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%2Fcja2wwzwmihkfyqdgfw7.png" alt="TPLink Archer C50"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;TPLink Archer C50 supports up to 300Mbps over the 2.4Ghz band and 867Mbps over the 5Ghz band. Also, comes with WDS support. My internet speed is well below the 300Mbps limit which made this a cost-effective pick to extend the wifi range of my 2.4Ghz band.  &lt;/p&gt;

&lt;h1&gt;
  
  
  ⚙️ Configuration
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2F1c2yq4tin4gzwfjesffg.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%2F1c2yq4tin4gzwfjesffg.png" alt="WDS wifi extension architecture"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This requires configuration on the base router as well as the extended router. The base router need not support WDS. &lt;/p&gt;

&lt;p&gt;The key to successfully configuring this lies behind the idea we need to bring all the devices on a common LAN address range 192.168.1.x&lt;/p&gt;

&lt;h2&gt;
  
  
  Base router configuration
&lt;/h2&gt;

&lt;p&gt;The base router is the primary or root router which is the entry point from the ISP to your home. We are going to extend the wifi signal from this router.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Assign an IP 192.168.1.1 to this router and limit the range of IP addresses issued from this router to be between &lt;/p&gt;

&lt;p&gt;192.168.1.3 - 192.168.1.99 &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%2Ftvxvr7c6epebn14fl9v7.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%2Ftvxvr7c6epebn14fl9v7.png" alt="Base Router config"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Set the channel of the wifi signal to be static (eg: 11) instead of &lt;code&gt;auto&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;This will make sure whenever the router reboots the WDS link does not break. For WDS to work, both routers need to be on the same channel.&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%2Fwtzk8w32fyfa4lx9tckc.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%2Fwtzk8w32fyfa4lx9tckc.png" alt="Extended Router Static IP"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Extended router configuration
&lt;/h2&gt;

&lt;p&gt;Extended router is the new router(in my case TPLink Archer C50) which can be positioned optimally for the best wireless reception extending the base router signal.&lt;/p&gt;

&lt;p&gt;Assign an IP 192.168.1.2 to this router and limit the range of IP addresses issued from this router between &lt;/p&gt;

&lt;p&gt;192.168.1.100 - 192.168.1.199&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Assign Static IP &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%2Fdot6k3cgatj613fpuwf0.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%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fdot6k3cgatj613fpuwf0.jpeg" alt="Extended Router Static IP"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Configure DHCP&lt;/p&gt;

&lt;p&gt;(&lt;em&gt;In some other places, you may see instructions to turn DHCP completely off for the extended router. However, this did not work for my case. I had to keep the DHCP on for the extended router&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%2F4p4z30d29ocfky55tp0b.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%2F4p4z30d29ocfky55tp0b.png" alt="Extended Router DHCP"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Configure WDS&lt;/p&gt;

&lt;p&gt;Enable the WDS bridging mode. TP-link router had a survey button that conveniently found the mac address of the base router. If your router does not have this, you can find this from the label on the router or issuing a command on the CLI&lt;/p&gt;

&lt;p&gt;&lt;code&gt;arp -a&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Provide the same SSID and password for this network. Devices will automatically connect to the strongest wireless signal in areas of overlap.&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%2Fg8imweze35t5bi3k312y.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%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fg8imweze35t5bi3k312y.jpeg" alt="Extended Router WDS"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  🎖 Results
&lt;/h2&gt;

&lt;p&gt;In areas of overlap, you will see the signal from both routers. In this case, since the signal from the extended router is the strongest, the devices will automatically latch onto the stronger network. &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%2F9qnv9xra5re66ye2c0ik.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%2F9qnv9xra5re66ye2c0ik.png" alt="Signal strength"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The internet connection speed where I tested this was 20Mbps. I am getting the full 20Mbps on the wired, wireless signal from primary router as well as from the wireless signal from the extended router.&lt;/p&gt;

&lt;h1&gt;
  
  
  Conclusion
&lt;/h1&gt;

&lt;p&gt;WDS is great for expanding the internet signal range with minimum investment and serves as a great alternative before investing in an expensive mesh router system. This setting is often buried deep inside the router configuration and has not gotten much attention. &lt;/p&gt;

&lt;p&gt;Once we link either the 2.4Ghz or 5Ghz band from the base router, the extended router can transmit both bands. This technique works well typically where the internet speeds are less than 300Mbps. &lt;/p&gt;

&lt;p&gt;Please find my other writings here:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href="https://dev.to/dennismphil/automated-end-to-end-tests-made-easy-180m"&gt;Automated End to End tests made easy&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/dennismphil/automate-your-node-dependency-updates-4aga"&gt;Automate your node dependency update&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://medium.com/@dennismphil/one-side-rounded-rectangle-using-svg-fb31cf318d90" rel="noopener noreferrer"&gt;One side rounded rectangle using SVG&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/@dennismphil/debugging-node-js-using-visual-studio-code-c30e5eeb9e38" rel="noopener noreferrer"&gt;Visual Studio Code — Debug Mode&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/@dennismphil/i-want-typescript-to-succeed-d421d00fd856" rel="noopener noreferrer"&gt;I want TypeScript to succeed.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/@dennismphil/whats-on-my-laptop-2cc2619aa55f" rel="noopener noreferrer"&gt;What’s in my laptop?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/@dennismphil/coffeescripts-most-loved-feature-soon-in-javascript-b2f6740c2dc7" rel="noopener noreferrer"&gt;CoffeeScript’s most loved feature soon in JavaScript&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>wds</category>
      <category>productivity</category>
      <category>wifi</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Automated End to End tests made easy</title>
      <dc:creator>Dennis Mathew Philip</dc:creator>
      <pubDate>Wed, 25 Sep 2019 06:41:45 +0000</pubDate>
      <link>https://forem.com/dennismphil/automated-end-to-end-tests-made-easy-180m</link>
      <guid>https://forem.com/dennismphil/automated-end-to-end-tests-made-easy-180m</guid>
      <description>&lt;p&gt;Time to add some end to end tests for your next application. Today I have a new browser automation tool to share.&lt;/p&gt;

&lt;p&gt;This is written from the perspective of the team heavily using JavaScript as the development language. I evaluated a few browser automation frameworks for end-to-end application testing and thought to share things the current landscape of tooling. &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;An End to end test is also known as functional-tests or happy-path tests which automates the sanity or spot checks before or after a software release.  &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I needed to pick one considering ease of development, long term maintainability, test framework integration. Let's explore a few interesting players out there. &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The good old &lt;strong&gt;Selenium&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;The Chromium based browser automation API &lt;strong&gt;Puppeteer&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;The most hyped &lt;strong&gt;Cypress&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Taiko&lt;/strong&gt; - The new kid on the block (It's ok if you have never heard of this. I didn't too)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;TL;DR;&lt;/strong&gt; I ended up picking &lt;strong&gt;Taiko&lt;/strong&gt; for its ❤️ beautiful API and it just works like magic!&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Selenium ❌
&lt;/h2&gt;

&lt;p&gt;Selenium was built in 2004. The major pain point of Selenium is its architecture.&lt;/p&gt;

&lt;p&gt;A system that behaves differently in each run, also termed as &lt;em&gt;flakiness&lt;/em&gt; is the major concern with Selenium with its layered architecture.  Let's see why Selenium tests are flaky.&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%2Fdhm24gl3szbzg900vsmk.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%2Fdhm24gl3szbzg900vsmk.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In the diagram, it is obvious that the commands have to pass through multiple layers. The drivers are built external to the browser which results in driving the browser "blind" with no feedback on whether the command has successfully been executed. &lt;/p&gt;

&lt;h2&gt;
  
  
  2. Puppeteer ❌
&lt;/h2&gt;

&lt;p&gt;Fast forward from 2004, 14 years later, Google released v1.0 of Puppeteer.&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%2F235rtuuwvx5mo59aphrg.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%2F235rtuuwvx5mo59aphrg.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;One thing you will notice from the previous diagram is there are fewer layers between the controller and the browser. This is the key difference between the modern end to end testing frameworks.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Puppeteer is a Node library which provides a high-level API to control headless Chrome or Chromium over the DevTools Protocol. &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This is powerful. It uses the DevTools protocol, the same low-level protocol which the Chrome Developer tools uses to interact with the browser. &lt;/p&gt;

&lt;p&gt;A code example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;browser&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;puppeteer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;launch&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;page&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;browser&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;newPage&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;goto&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://example.com&lt;/span&gt;&lt;span class="dl"&gt;'&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="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;content&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;screenshot&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;screenshot.png&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;browser&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;close&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;However, it is geared towards browser automation and the end to end web application testing is only one of them. This means you have to explicitly wait for a page to load, assert things you care about which will soon make writing and maintaining tests not so fun.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Cypress ❌
&lt;/h2&gt;

&lt;p&gt;Cypress automates the browser with its own unique architecture. Cypress takes a less traveled and hard path to make runs the test from inside the browser and communicates the actions to an outside Node process which makes testing very capable. &lt;/p&gt;

&lt;p&gt;It comes with electron baked in. Many times, I found very simple tests work in electron which they bundle by default however fails to run in Chromium or Chrome in a headless environment.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Rave reviews, Marketing, Podcast talks, Beautiful documentation, however, it does not live up to the high expectations you would expect.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I gave it enough energy and wanted this to work. Wanted this to work so badly. However, realized it has dangerous browser proxy mods which fail to set the redirections when run inside a corporate proxy environment and the most annoying limitation, if you are on one domain you cannot visit another domain.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Each test is limited to only visiting a single super-domain.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;So if you have an application with a login page which is in another domain get ready to cry 😭. Cry so loud that Cypress team hears. I wish these change in the future. I gave up.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Taiko ✅
&lt;/h2&gt;

&lt;p&gt;Taiko is from ThoughtWorks. The same place where Selenium was born. It shines ✨. &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;It shines really well with its ❤️ beautiful API. &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Show me some code...&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;await&lt;/span&gt; &lt;span class="nf"&gt;openBrowser&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;goto&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;google.com&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Dennis Mathew Philip&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;click&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Google Search&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You will notice there is no waiting for an element to appear. No CSS selectors. It is smart to identify what input field.&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%2Fkhdun8onqsyu9nb9qiua.gif" 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%2Fkhdun8onqsyu9nb9qiua.gif" alt="Running a test"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;✅ Beautiful documentation &lt;br&gt;
✅ Integration with Jest and other popular testing frameworks&lt;br&gt;
✅ No explicit wait needed. Less code&lt;br&gt;
✅ Headless and CI friendly&lt;/p&gt;

&lt;p&gt;It also has a REPL which makes the development a breeze. &lt;/p&gt;

&lt;p&gt;A straightforward gif from the Taiko team:&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%2F6we9xmgb7pwjvh1s8135.gif" 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%2F6we9xmgb7pwjvh1s8135.gif" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I loved using Taiko. I am having fun writing end to end tests. I hope you will too. &lt;/p&gt;

&lt;h1&gt;
  
  
  To conclude...
&lt;/h1&gt;

&lt;p&gt;End to end testing improves the confidence with which you release the software. We compared some of the free and open-source end to end testing solutions - Selenium, Puppeteer, Cypress and Taiko.  The opinion written here is straight what I experienced. Consider your use-case closely and pick the right tool what works best for you. Browser automation tools is a lot of power. Use responsibly. &lt;/p&gt;

&lt;p&gt;If your web application does not have at least one functional test, start today.&lt;/p&gt;

&lt;p&gt;Please find my other writings here:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href="https://dev.to/dennismphil/automate-your-node-dependency-updates-4aga"&gt;Automate your node dependency update&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://medium.com/@dennismphil/one-side-rounded-rectangle-using-svg-fb31cf318d90" rel="noopener noreferrer"&gt;One side rounded rectangle using SVG&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/@dennismphil/debugging-node-js-using-visual-studio-code-c30e5eeb9e38" rel="noopener noreferrer"&gt;Visual Studio Code — Debug Mode&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/@dennismphil/i-want-typescript-to-succeed-d421d00fd856" rel="noopener noreferrer"&gt;I want TypeScript to succeed.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/@dennismphil/whats-on-my-laptop-2cc2619aa55f" rel="noopener noreferrer"&gt;What’s in my laptop?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/@dennismphil/coffeescripts-most-loved-feature-soon-in-javascript-b2f6740c2dc7" rel="noopener noreferrer"&gt;CoffeeScript’s most loved feature soon in JavaScript&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>testing</category>
      <category>javascript</category>
      <category>selenium</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Automate your node dependency updates</title>
      <dc:creator>Dennis Mathew Philip</dc:creator>
      <pubDate>Sun, 21 Jul 2019 08:36:26 +0000</pubDate>
      <link>https://forem.com/dennismphil/automate-your-node-dependency-updates-4aga</link>
      <guid>https://forem.com/dennismphil/automate-your-node-dependency-updates-4aga</guid>
      <description>&lt;p&gt;A reasonably large Node application will have 100's of dependencies. Keeping them all updated is a 🧹chore a developer needs to perform at some point. Either you ignore the dependency updates until you are stuck with a very old set of dependencies hindering your progress with 🦹‍♂️ security vulnerabilities or you spend your valuable application development time manually testing out the updates on a reasonable cadence.&lt;/p&gt;

&lt;p&gt;Let's see how to automate this process in an enterprise environment assuming you have some kind of CI/CD environment and a private GitHub repo.&lt;/p&gt;

&lt;h2&gt;
  
  
  🥒 Ingredients
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Solid unit tests for your code. Bonus points if you have end to end tests and snapshot tests for UI components&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;next-update&lt;/code&gt;
&lt;em&gt;An npm package which tests whether your dependencies can be updated without breaking the tests.&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;hub&lt;/code&gt; CLI
&lt;em&gt;This is a command-line application from Git"Hub" which can interact with your GitHub repo. &lt;code&gt;hub&lt;/code&gt; is exactly similar to &lt;code&gt;git&lt;/code&gt; CLI and a drop-in replacement but has added features to interact with GitHub. Handy to open a Pull Request after the update operation.&lt;/em&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  📝 Recipe
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;npm install next-update --save-dev&lt;/code&gt;&lt;br&gt;
&lt;em&gt;Install next-update as a dev-dependency.&lt;/em&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Configure an &lt;code&gt;npm&lt;/code&gt; script &lt;code&gt;dep:update&lt;/code&gt; in your &lt;code&gt;package.json&lt;/code&gt; scripts section&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// package.json&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;name&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;a-sample-node-project&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;version&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;0.0.1&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;description&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;A sample node project&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;scripts&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="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;test&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;jest&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;start&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;node app.js&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;dep:update&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;next-update&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="c1"&gt;// Configure an npm script&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;devDependencies&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="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;next-update&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;^3.6.0&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;dependencies&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="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;npm run dep:update&lt;/code&gt;&lt;br&gt;
&lt;em&gt;Run the script. &lt;code&gt;next-update&lt;/code&gt; will go ahead and find all new packages. Updates them in sequence and keep the update if your tests pass.&lt;/em&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Download and install the &lt;code&gt;hub&lt;/code&gt; cli&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# download-hub.sh&lt;/span&gt;
&lt;span class="nv"&gt;HUB_CLI&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/opt/hub-linux/bin/hub

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[[&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt; &lt;span class="nv"&gt;$HUB_CLI&lt;/span&gt; &lt;span class="o"&gt;]]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
   &lt;/span&gt;wget https://github.com/github/hub/releases/download/v2.12.2/hub-linux-amd64-2.12.2.tgz 
   &lt;span class="nb"&gt;tar &lt;/span&gt;zxvf hub-linux-amd64-2.12.2.tgz 
   &lt;span class="nb"&gt;rm&lt;/span&gt; &lt;span class="nt"&gt;-rf&lt;/span&gt; hub-linux-amd64-2.12.2.tgz /opt/hub-linux
   &lt;span class="nb"&gt;mv &lt;/span&gt;hub-linux-amd64-2.12.2 /opt/hub-linux
&lt;span class="k"&gt;fi&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Configure hub&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git config &lt;span class="nt"&gt;--global&lt;/span&gt; &lt;span class="nt"&gt;--replace-all&lt;/span&gt; hub.host github.yourdomain.com
git config &lt;span class="nt"&gt;--global&lt;/span&gt; &lt;span class="nt"&gt;--replace-all&lt;/span&gt; hub.protocol git
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Instruct the 🤖 bot to open a Pull Request&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$HUB_CLI&lt;/span&gt; add package.json package-lock.json
&lt;span class="nv"&gt;$HUB_CLI&lt;/span&gt; commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"🤖 [BOT] Automated dependency update"&lt;/span&gt;
&lt;span class="nv"&gt;$HUB_CLI&lt;/span&gt; pull-request &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--push&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"Pull Request Subject"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"Pull Request Description"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--no-edit&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--reviewer&lt;/span&gt; user-id1,user-id2
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Hook up this script in your CI/CD environment to run daily&lt;/p&gt;&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%2Fthepracticaldev.s3.amazonaws.com%2Fi%2F3re3uynhyg0kc4jpw7hx.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%2F3re3uynhyg0kc4jpw7hx.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Wrapping up
&lt;/h2&gt;

&lt;p&gt;We saw how to check and update the node dependencies and automate the process of opening a PR. If your project is open-source, you may use a service like Greenkeeper.  &lt;/p&gt;

&lt;p&gt;Cheers&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%2Fsrc9sniteiq1jdvbxg1z.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%2Fsrc9sniteiq1jdvbxg1z.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Please find my previous writings on Medium:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;a href="https://medium.com/@dennismphil/one-side-rounded-rectangle-using-svg-fb31cf318d90" rel="noopener noreferrer"&gt;One side rounded rectangle using SVG&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/@dennismphil/debugging-node-js-using-visual-studio-code-c30e5eeb9e38" rel="noopener noreferrer"&gt;Visual Studio Code — Debug Mode&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/@dennismphil/i-want-typescript-to-succeed-d421d00fd856" rel="noopener noreferrer"&gt;I want TypeScript to succeed.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/@dennismphil/whats-on-my-laptop-2cc2619aa55f" rel="noopener noreferrer"&gt;What’s in my laptop?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/@dennismphil/coffeescripts-most-loved-feature-soon-in-javascript-b2f6740c2dc7" rel="noopener noreferrer"&gt;CoffeeScript’s most loved feature soon in JavaScript&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>javascript</category>
      <category>npm</category>
      <category>github</category>
      <category>productivity</category>
    </item>
  </channel>
</rss>
