teleren/devto huggingface dataset:
HTML Export using JS to EXCEL
Published: 2022-06-09 11:12:54

Hi , i am new to Javascript which i am using to export a table rendered on HTML to excel as follows..However the output in CSV is not reported correctly..kindly assist.

Code as follows:

function exportData() {

  var table = document.getElementById("oltmopTable");
  var rows = [];

  for(var i=0,row; row=table.rows[i];i++){
    column1 = row.cells[0].innerText;
    column2 = row.cells[1].innerText;
    rows.push(
      [
        column1,
        column2
      ]
    );
  }

csvContent = "data:text/csv;charset=utf-8,";
rows.forEach(function(rowArray){
    row = rowArray.join(",");
    csvContent += row + "\r\n";
});
alert(csvContent)
var encodedUri = encodeURI(csvContent);
var link = document.createElement("a");
link.setAttribute("href", encodedUri);
link.setAttribute("download", "OLT_MOP_BNG_INTEGRATION.csv");
document.body.appendChild(link);
link.click();

}


CSV Output

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9f4b94bmvkh776dararg.png)


MY EXP Output

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/dirr5xkp1gyxeir2bna8.png)


Thanks
mohideen.
Book Club: "Test Driven Development: By Example" #12
Tags: books, tdd, discuss
Published: 2022-06-10 08:59:39

---
title: Book Club: "Test Driven Development: By Example" #12
published: true
description: A chapter by chapter discussion of "Test Driven Development By Example" by Kent Beck
tags: books, tdd, discussion
series: Book club TDD By Example
---

## Chapter 12: Addition, Finally

There's need of some thinking for this chapter, where we begin chipping away at addition.

Some things that stuck out for me, was our To Do list hygiene - as the list starts to get longer we can discard the 'done' items, and copy across the remaining tasks; this gives an opportunity to finish off items that are not worthy of being written onto the new list.

We also started to think about `reduce` as a bucket or wallet to collect `Money`. I first learned about reduction in programming in Ruby, and visualise the concept as a bucket and spade, processing each shovelful into the bucket. You're applying some function to elements in a list, and saving the result.

The next step will be refactoring our new green test to make the implementation _real_.

🔎 View my code-along repo at https://github.com/ruthmoog/test-driven-development-by-example 

-----

![Book cover](https://learning.oreilly.com/library/cover/0321146530/250w/ ) Kent Beck's "[Test Driven Development: By Example](https://www.oreilly.com/library/view/test-driven-development/0321146530/)" was released in 2002. The book aims to explain how to use TDD to write quality code that works.
Python Flask Elasticsearch - model data layer - Part 5 Tutorial
Published: 2022-06-10 14:27:34

Hi, the 5th article devoted to the theme: “How to work with ElasticSearch, Python and Flask” already ready for reading. Here will speak about model data layer and elasticsearch-dsl-py python package. All details are here: "[Python Flask  ElasticSearch - model data layer](https://sergiiblog.com/python-flask-elasticsearch-model-data-layer/)". Have a pleasant reading.
Graphics Programming in Python Turtle 2
Tags: python, turtle, graphics, graphicsprogramming
Published: 2022-06-10 14:17:56

**1. Painting landscapes using python language**
{% youtube https://youtu.be/hjnJPI_l52M %}
**2. Drawing Songoku and Dragon Ball in Python**
{% youtube https://youtu.be/OZJ5wY2W96Q %}
**3. Drawing rainbow colors Python**
{% youtube https://youtu.be/baN6B2vU5eY %}
**4. Drawing green trees Python**
{% youtube https://youtu.be/9S7Shulx1-o %}
**5. Drawing bicycle effect in Python**
{% youtube https://youtu.be/VgQ2MgzX7MU %}
**6. Drawing a boy sitting on a wind hill Python**
{% youtube https://youtu.be/kJdDIQysE5Q %}
**7. Drawing the golden buffalo symbol in folklore beliefs**
{% youtube https://youtu.be/lyHhkWhd1Uo %}
**8. Draw some peach trees in the wind - Python**
{% youtube https://youtu.be/_kY447H1eZ4 %} 
**9. Draw the orbit of the sun in Python**
{% youtube https://youtu.be/NSWndQwzMgQ?list=PLh72pSS7XkZ2elisJnmQCurjtM6c7IU1f %} 
**10. Wisdom and beauty coexist**
{% youtube https://youtu.be/hxMtXRKjVko?list=PLh72pSS7XkZ2elisJnmQCurjtM6c7IU1f %} 
**11. Draw a 7-storey tower in Python**
{% youtube https://youtu.be/4FaRUwMhWVE?list=PLh72pSS7XkZ2elisJnmQCurjtM6c7IU1f %}
Day 13 - Structs
Tags: 100daysofcode, solidity, web3, blockchain
Published: 2022-06-10 14:17:00

{% embed https://github.com/Envoy-VC/30-Days-of-Solidity noreadme %}

This is Day `13` of `30` in Solidity Series
Today I Learned About Structs in Solidity.

Structs in Solidity allows you to create more complicated data types that have multiple properties. You can define your own type by creating a struct.

They are useful for grouping together related data.

Structs can be declared outside of a contract and imported in another contract. Generally, it is used to represent a record. To define a structure struct keyword is used, which creates a new data type. 

**Syntax:**
```solidity
struct <structure_name> {  
   <data type> variable_1;  
   <data type> variable_2; 
}
```

Example:
```solidity
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.7;

contract structType {
    struct Student {
        string name;
        string gender;
        uint roll_no;
    }

    // Declaring a structure object
    Student student1;

    // Assigning values to the fields for the structure object student2
    Student student2 = Student("Jeff","Male",1);

    // Defining a function to set values for the fields for structure 
    // student1
    function setStudentDetails() public {
        student1 = Student("Teresa","Female",2);
    }

    // Defining a function to get Student Details
    function studentInfo() public view returns (string memory, string memory, uint) {
        return(student1.name , student1.gender , student1.roll_no);
    }
}
```

Output - 
When we run setStudentDetails it stores values in the structure `student2`
and when we call the studentInfo function we get
```solidity
{
	"0": "string: Teresa",
	"1": "string: Female",
	"2": "uint256: 2"
}
```

---
Building a “Follow Light” with Arduino: Part 2
Tags: arduino, iot, microcontroller
Published: 2022-06-10 14:13:24

It's been a while since we started our [Follow Light Arduino Project](https://dev.to/s2engineers/building-a-follow-light-with-arduino-4127) (and it's still not installed in our corridor 😳), but I recently stumbled over this awesome online simulator called **[Wokwi](https://wokwi.com)**!

So I decided to tidy up our codebase a bit and put it into action there. 

![How the simulator looks like](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3e9cszb3m9pjbk8g5foe.gif)

**Wokwi** doesn't support the **TFmini Plus LiDAR** sensor, but it does have the **HC-SR04** Ultrasonic distance sensor.

And there is a (hidden) [Wokwi Neo Pixel Canvas](https://wokwi.com/arduino/libraries/Adafruit_NeoPixel/RGBWstrandtest) component, which acts like a **LED lightstrip**. You can only add it by editing the `diagram.json`.

**You can find our Follow Light simulation here:** [https://wokwi.com/projects/334003558896632403](https://wokwi.com/projects/334003558896632403)

Just run the simulator and click the HC-SR04 component to change the detected distance.
Graphics Programming in Python Turtle 1
Tags: python, turtle, graphics, graphicsprogramming
Published: 2022-06-10 14:09:43

**1. Draw Github logo in python language**
{% youtube https://youtu.be/HvWivMnOFjo %}
**2. Drawing rose in turtle python**
{% youtube https://youtu.be/l2q3fd9RxBs %}
**3. Draw arbitrarily complex graphics - Python**
{% youtube https://youtu.be/5zPEAfge0tY %}
**4. Draw yellow apricot flowers in Python**
{% youtube https://youtu.be/O6GZ4vgRjRs %}
**5. Draw pokemon effects in Python**
{% youtube https://youtu.be/RAaUn_exp8Y %}
**6. Drawing Simple Roses in Python**
{% youtube https://youtu.be/ooqYaj9m_as %}
**7. Drawing pikachu cartoon character in python language**
{% youtube https://youtu.be/bbj6EFMpn2c %}
**8. Draw a simple bush in Python**
{% youtube https://youtu.be/50rQW2D2e2M %}
**9. Draw a beautiful cherry blossom tree in python**
{% youtube https://youtu.be/N73vhMWL_mE %}
**10. Drawing trees in python**
{% youtube https://youtu.be/MMXY2RzU_cc %}
Spiral Matrix II
Tags: leetcode, dsa, theabbie
Published: 2022-06-10 14:00:45

Given a positive integer `n`, generate an `n x n` `matrix` filled with elements from `1` to `n2` in spiral order.

**Example 1:**

![](https://assets.leetcode.com/uploads/2020/11/13/spiraln.jpg)

**Input:** n = 3
**Output:** \[\[1,2,3\],\[8,9,4\],\[7,6,5\]\]

**Example 2:**

**Input:** n = 1
**Output:** \[\[1\]\]

**Constraints:**

*   `1 <= n <= 20`

**SOLUTION:**

    class Solution:
        def generateMatrix(self, n: int) -> List[List[int]]:
            matrix = [[-1 for i in range(n)] for j in range(n)]
            ctr = 0
            direction = 0
            x, y = 0, 0
            while ctr < n * n:
                if matrix[x][y] == -1:
                    ctr += 1
                    matrix[x][y] = ctr
                switch = False
                if direction == 0:
                    if (y + 1) < n and matrix[x][y + 1] == -1:
                        y += 1
                    else:
                        switch = True
                elif direction == 1:
                    if (x + 1) < n and matrix[x + 1][y] == -1:
                        x += 1
                    else:
                        switch = True
                elif direction == 2:
                    if (y - 1) >= 0 and matrix[x][y - 1] == -1:
                        y -= 1
                    else:
                        switch = True
                else:
                    if (x - 1) >= 0 and matrix[x - 1][y] == -1:
                        x -= 1
                    else:
                        switch = True
                if switch:
                    direction = (direction + 1) % 4
            return matrix
Binary Tree Level Order Traversal II
Tags: leetcode, dsa, theabbie
Published: 2022-06-10 13:30:39

Given the `root` of a binary tree, return _the bottom-up level order traversal of its nodes' values_. (i.e., from left to right, level by level from leaf to root).

**Example 1:**

![](https://assets.leetcode.com/uploads/2021/02/19/tree1.jpg)

**Input:** root = \[3,9,20,null,null,15,7\]
**Output:** \[\[15,7\],\[9,20\],\[3\]\]

**Example 2:**

**Input:** root = \[1\]
**Output:** \[\[1\]\]

**Example 3:**

**Input:** root = \[\]
**Output:** \[\]

**Constraints:**

*   The number of nodes in the tree is in the range `[0, 2000]`.
*   `-1000 <= Node.val <= 1000`

**SOLUTION:**

    # Definition for a binary tree node.
    # class TreeNode:
    #     def __init__(self, val=0, left=None, right=None):
    #         self.val = val
    #         self.left = left
    #         self.right = right
    class Solution:
        def levelOrderBottom(self, root: Optional[TreeNode]) -> List[List[int]]:
            if not root:
                return []
            queue = [(root, 0)]
            levels = {}
            level = 0
            while len(queue) > 0:
                curr, level = queue.pop(0)
                levels[level] = levels.get(level, []) + [curr.val]
                if curr.left:
                    queue.append((curr.left, level + 1))
                if curr.right:
                    queue.append((curr.right, level + 1))
            return [levels[l] for l in range(level, -1, -1)]
is there a defense of crypto? (bitcoin specifically)
Published: 2022-06-10 13:24:12

---
title: is there a defense of crypto? (bitcoin specifically)
published: true
description: crypto
tags: 
//cover_image: https://direct_url_to_image.jpg
---

I saw this on hnews today: https://blog.cryptographyengineering.com/2022/06/09/in-defense-of-cryptocurrency/

- Such raw naked hunger and greed on display here.

- Literally burning enough energy to power an entire country to run hashing algorithms. And the days pass with hollow promises of better tech.
- Fix that first, fix that now and show the world your community actually gives AF.
- But you will not.
- Nor will your community. Crypto is fine and happy to help make the world burn hotter.
- If you hold bitcoin or mine bitcoin you have blood on your hands.
- It is that simple.
- Until bitcoin is stopped none of the rest of the article matters.
- Regulate it? Attack it? You pick but either way it must be stopped.
- The crypto community has no will to do it themselves.

- The tech is interesting to me but a central database solves most of the problems and does not burn the world in the process.
- Hopefully the newer blockchain tech will take over but I doubt it highly.
Data Science Cheat Sheet for Python & Pandas
Published: 2022-06-10 13:21:47

A beautiful **Python Cheat Sheet** useful for the aspiring data scientists and contains ready-to-use codes for data wrangling.

The **cheat sheet summarize the most commonly used Pandas features and APIs**.

**Data Science Cheat Sheet with Pandas and Python**:

[**Pandas Cheat Sheet for Data Science - full cheat sheet**](https://datascientyst.com/pandas-cheat-sheet-for-data-science/)

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/nkft9vrijz5931e38b1l.png)

This cheat sheet will act as a **crash course for Pandas beginners** and help you with various fundamentals of Data Science. It can be used by experienced users as a quick reference.

The cheat sheet is part of series cheat sheets devoted to Data Science, Python and Pandas. Follow us for future versions on topics like:

*   data cleaning
*   data analytics
*   stats and math for data science
*   data wrangling
*   text processing



The full cheat sheet on the link above include

*   Organized in sections
*   Easy copy & paste
*   Fast navigation
*   Beautiful visualization

**More resources**

*   [Pandas API Reference](https://pandas.pydata.org/pandas-docs/stable/reference/index.html#api)
*   [Pandas User Guide](https://pandas.pydata.org/pandas-docs/stable/user_guide/index.html#user-guide)
*   [Data Wrangling with Pandas Cheat Sheet](https://pandas.pydata.org/Pandas_Cheat_Sheet.pdf)

Example Section:

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/vumw9h9rgpk7hodec6vy.png)
Announcing HackWithNativeBase
Tags: hackathon, hackwithnativebase, react, reactnative
Published: 2022-06-10 13:09:49

We are thrilled to announce [HackWithNativeBase](https://nativebase.io/hackathon?utm_source=Devto&utm_medium=Article+&utm_campaign=HackWithNativeBase+&utm_id=HackWithNativeBase+) — the biggest React Native Hackathon of 2022.

This is an offline event, organized by [NativeBase](https://nativebase.io/) and sponsored by [GeekyAnts](https://geekyants.com/). This event will bring together React and React Native enthusiasts in a contest to create a universal application.


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/lbqr2k7imxvl5n1jttki.jpg)

## **About the Hackathon 💻**

[HackWithNativeBase](https://nativebase.io/hackathon?utm_source=Devto&utm_medium=Article+&utm_campaign=HackWithNativeBase+&utm_id=HackWithNativeBase+) is a hackathon designed to bring together the community of skilled React and React Native developers. Our goal is to construct cross-platform applications with a single codebase. 

The event is taking place on the 2nd of July, 2022. 

There will be a single round of screening to qualify for the showdown in Bengaluru, India. For more deets on the location, visit the website: https://nativebase.io/hackathon 

## **Prize Pool 🏆**


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/coxh9ca7ttkkg23x3yug.jpg)

We have three grand prizes for this Hackathon. Participants can also win big by participating in a Tweetathon challenge that will be conducted as a lead-up to Hack Day. 

**Three Grand Prizes**

- The winner bags a ₹100,000/- cash prize 

- The first runners-up to get a ₹50,000/- cash prize 

- The second runners-up get a ₹25,000/- cash prize 

All who make it to Hack Day in Bengaluru will get exclusive NativeBase swags.

**Tweetathon consists of three mini-challenges**

- Best Meme: ₹1,500/-

- Best Tweet: ₹2,000/-

- Viral Tweet: ₹4,000/-

For winning these mini-challenges, check out the website for rules. https://nativebase.io/hackathon 

## **Important Dates to Remember 🗓**

- 18th June: Registrations close and so does submissions for the qualifier round 

- 22nd June: Results from the qualifier round are announced

- 2nd July: Hack Day

## **Suggestions/ FAQs**

If you have any questions, please ask them on [#hack-with-nativebase](https://discord.com/channels/785491682719301643/974625121140629545) on the NativeBase Discord server. This is a dedicated channel for the Hackathon where you can get your doubts cleared and interact with fellow participants. We will also be sharing every update regarding the Discord channel. To join, [CLICK HERE](https://discord.com/channels/785491682719301643/974625121140629545).

You can also ask your doubts and interact with us on [Twitter](https://twitter.com/nativebase) by mentioning [@nativebase](https://twitter.com/nativebase). 
Visit the website to register and for more details: https://nativebase.io/hackathon 
 
We can't wait to see your projects! Good luck. ✌
Jest parametrized test that throws errors
Tags: javascript, node, jest, testing
Published: 2022-06-10 13:09:23

[](url)Let's say we have a code like below that runs in node.

```js
module.exports.registerUser = (username) => {
  if (!username) throw new Error('Username is required.');

  return { id: new Date().getTime(), username: username }
}
```

In the code, the scenario where Error should be thrown are when the `username` is invalid.

For the `username` to be invalid, the `username` should be one of these: `False`, `0`, `null`, `''`, `undefined`.

In the jest documentation, there is a section about parametrized (data-driven) tests in jest. However it is not clear how to handle erroneous situations in a bulk.

The code that I've come up is as below. Hope it helps!

```js
describe("registerUser", () => {
  it.each([null, undefined, NaN, "", 0, false])(
    "should throw if username is falsy",
    (inputs) => {
      expect(() => lib.registerUser(input)).toThrow();
    }
  );
});
```
MS-Teams — ใส่รูป profileให้ guest
Published: 2022-06-10 08:19:56

![“อย่าให้งาน ทำให้การเล่นเสีย” ยังเป็นคติประจำใจ](https://cdn-images-1.medium.com/max/2000/0*HRTV8nhquohWVMtF.jpg)

เนื่องจากทีมที่ทำงานอยู่ใช้ MS-Teams ของลูกค้าเป็นช่องทางการติดต่อหลัก + role เราเป็น guest ทำให้ features ต่าง ๆ ได้มาไม่ครบ แต่เรื่องพวกนั้นก็ยังหาท่าหาทางไปได้ แต่สิ่งที่รู้สึกยอมไม่ได้ คือ ทำไมเราเปลี่ยนรูป profile เราไม่ได้ (ฟร่ะ)

## ไม่ยอม อยากได้ ๆ

เริ่มจาก google เลยว่า guest ใน MS-Teams ถ้าอยากแก้รูป profile ทำไงได้บ้าง ใล่ ๆ ดูก็เจอคนที่อยากได้เหมือนกัน และไปพบว่าถ้าเราอัปเดตรูปบน AzureAD มันจะดึงมาเป็น MS-Teams profile ให้ ว่าแล้วเราก็เริ่มเลย

**เปิด Power Shell ก่อนเลย (Run as administrator ด้วยนะ)**

![Run as administrator](https://cdn-images-1.medium.com/max/2000/1*Uqx0usvY4BaavVV0CJAKsw.png)

และก็ install AzureAD PowerShell module เพื่อให้สามารถ connect AzureAD ผ่าน command ด้วยคำสั่ง
>  Install-Module AzureAD

จากนั้น connect ไปที่ AzureAD ที่เราเป็น guest อยู่ ประมาณนี้
>  Connect-AzureAD -TenantDomain xxxth.onmicrosoft.com

![แล้วมันจะมี popup ให้เรา login ประมาณนี้ ~](https://cdn-images-1.medium.com/max/2260/1*NxMuC-c2b6GhKvqzkcolKA.png)

![ถ้า login สำเร็จมันจะขึ้นประมาณนี้](https://cdn-images-1.medium.com/max/2666/1*cpyvRRYcfaCjMZamS-69Sw.png)

จากนั้นก็ใช่ command เพื่อ upload รูป profile ขึ้นไปไว้บน AzureAD โดยแทนที่ @ ใน email ด้วย _ และเพิ่ม #EXT#@ ตามด้วย domain ที่เรา login โดยไฟล์ใช้เป็น jpg หรือ png ~100kb
>  Set-AzureADUserThumbnailPhoto -ObjectId ‘your[_mail.com#EXT#@xxxth.onmicrosoft.com](mailto:tumit_odds.com#EXT#@xxxth.onmicrosoft.com)’ -FilePath ‘c:\pic.jpg’

ทดสอบว่าไฟล์ไปไหม ถ้าขึ้นว่ามีก็ใช้ได้
>  Get-AzureADUserThumbnailPhoto -ObjectId ‘your[_mail.com#EXT#@xxxth.onmicrosoft.com](mailto:tumit_odds.team#EXT#@setth.onmicrosoft.com)’

ที่เหลือก็แค่รอว่าเหมือนไหร่ cache มันจะหมดอายุแล้วโหลดรูป profile ใหม่จาก AzureAD มาแทน หรือถ้าใจร้อนก็ไป clear cache ของ MS-Teams เอาครับ (กรณี Window ก็ %AppData%\Microsoft\Teams ) ของผมรอประมาณ 4–5 วัน แต่กว่าคนอื่นก็รอไปประมาณ 1 เดือน LoL

![น้องตี๋ผู้ตกเป็นเหยื่อทดลอง](https://cdn-images-1.medium.com/max/2000/1*0i7_xaF7b1lhkmDiJ5BjHw.png)

จบการเล่นซนแต่เพียงเท่านี้ (-/\-)

Refs: [https://eightwone.com/2021/04/11/change-teams-guest-profile-picture/](https://eightwone.com/2021/04/11/change-teams-guest-profile-picture/)
Binary Tree Zigzag Level Order Traversal
Tags: leetcode, dsa, theabbie
Published: 2022-06-10 13:00:47

Given the `root` of a binary tree, return _the zigzag level order traversal of its nodes' values_. (i.e., from left to right, then right to left for the next level and alternate between).

**Example 1:**

![](https://assets.leetcode.com/uploads/2021/02/19/tree1.jpg)

**Input:** root = \[3,9,20,null,null,15,7\]
**Output:** \[\[3\],\[20,9\],\[15,7\]\]

**Example 2:**

**Input:** root = \[1\]
**Output:** \[\[1\]\]

**Example 3:**

**Input:** root = \[\]
**Output:** \[\]

**Constraints:**

*   The number of nodes in the tree is in the range `[0, 2000]`.
*   `-100 <= Node.val <= 100`

**SOLUTION:**

    # Definition for a binary tree node.
    # class TreeNode:
    #     def __init__(self, val=0, left=None, right=None):
    #         self.val = val
    #         self.left = left
    #         self.right = right
    class Solution:
        def zigzagLevelOrder(self, root: Optional[TreeNode]) -> List[List[int]]:
            if not root:
                return []
            queue = [(root, 0)]
            levels = {}
            level = 0
            while len(queue) > 0:
                curr, level = queue.pop(0)
                levels[level] = levels.get(level, []) + [curr.val]
                if curr.left:
                    queue.append((curr.left, level + 1))
                if curr.right:
                    queue.append((curr.right, level + 1))
            return [levels[l] if l % 2 == 0 else levels[l][::-1] for l in range(level + 1)]
Update & Sync GitHub Repositories in the morning
Tags: github, git
Published: 2022-06-10 13:00:01

I have many habits during the day, and the most important of all is my morning routine.
As you see below I use Microsoft ToDo to remind me what I need to do each morning and one of the steps I need to do is to update my local GitHub repositories.
I have many of that and of course it's not possible to do it manually.

![Microsoft ToDo](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/f84ybefblmyaljzpw22a.png) 
 
This is the reason why I have created a PowerShell script that works for me.
You can copy my code and put the script in the main folder of your GitHub repositories and launch it from the command line.
It takes more or less 3-5 minutes (but it depends on how many repositories you have locally).

{% embed https://gist.github.com/kasuken/e128dc563005d13a5065d1d98162eef6 %}

As you can see in the script, I use the command "git fetch prune".
This command helps to stay with clean branches and folders.
You can learn more on this topic at this [link](https://www.git-tower.com/learn/git/faq/cleanup-remote-branches-with-git-prune).

In the video below you can see the script running on my machine.

![Demo](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/73tqjfd46x1mfus67w57.gif)

Feel free to share your feedback or make some changes to the script.