teleren/devto huggingface dataset:
Machine Learning In The Real World - Retrace
Published: 2020-02-21 11:27:54

During your commute to the office today, you made countless life or death decisions that are so ordinary and common that you most likely didn't even notice them. If you decided to cross into the intersection a few seconds too early, your day might have taken a radically different trajectory.

Many humans are not aware of all the complex decisions they make throughout the day because they have become normalized through repetition. While driving, the decision to brake, turn, or accelerate relates back to a plethora of sub-conscious decisions about the world around us, such as depth estimation, object detection, and audio-visual corroboration. We subconsciously ingest and understand the scene around us as it relates to our ultimate objective of getting to our destination safely and on time.

<a href="https://retrace.ai/machine-learning-in-the-real-world/"><b>Read More</b></a>

<b>Contact Details:</b>
415–689–9090
info@retrace.ai
<a href="https://retrace.ai/about-retrace/">Retrace AI</a>

Visit Reference Profile Websites:
<a href="http://bit.ly/39NMo33">http://bit.ly/39NMo33</a>
<a href="http://bit.ly/2SHrL32">http://bit.ly/2SHrL32</a>
<a href="http://bit.ly/37KtLvJ">http://bit.ly/37KtLvJ</a>
<a href="http://bit.ly/39QwAfY">http://bit.ly/39QwAfY</a>
<a href="http://bit.ly/3bW9eaD">http://bit.ly/3bW9eaD</a>
<a href="http://bit.ly/2SJEPFe">http://bit.ly/2SJEPFe</a>
<a href="http://bit.ly/2HFvQyn">http://bit.ly/2HFvQyn</a>
<a href="http://bit.ly/2HFT1Zo">http://bit.ly/2HFT1Zo</a>
<a href="http://bit.ly/3bVsntd">http://bit.ly/3bVsntd</a>
<a href="http://bit.ly/38ETN4Q">http://bit.ly/38ETN4Q</a>
<a href="http://bit.ly/3bUWNMs">http://bit.ly/3bUWNMs</a>
<a href="https://w.tt/2SIhKlX">https://w.tt/2SIhKlX</a>
<a href="http://bit.ly/2V3EPRL">http://bit.ly/2V3EPRL</a>
<a href="http://bit.ly/2SKUWlC">http://bit.ly/2SKUWlC</a>
<a href="http://bit.ly/37IA6rz">http://bit.ly/37IA6rz</a>
<a href="http://bit.ly/2vOV1vQ">http://bit.ly/2vOV1vQ</a>
<a href="http://bit.ly/37KAOUV">http://bit.ly/37KAOUV</a>
Adding swagger through VSCode
Tags: showdev, webdev, beginners, vscode
Published: 2020-02-21 11:18:42

API is the backbone of any website, now when you develop and API then documenting the API would be a very important part. Now manual documentation is good but interactive documentation with tests always better than the previous. So what if there are some tools that are already present which do your job almost automatically. 

"Swagger"(https://swagger.io/) does this work very swiftly. It's an Open Source product, it takes care of the following areas of an API Project very swiftly

*API Design*
*API Development*
*API Documentation*
*API Testing*
*API Mocking and Virtualization*

It can be integrated with any of the languages that supports API development. 
 
Today we’ll be going through the steps through which we can add swagger in our API Project.

We will see the implementation of the swagger on an AspNetCore API project using vs-code.

Now, let’s Open the .NET CLI or console and write the following command

**dotnet new webapi**

This will create a web API project without swagger added.

Directory Structure will look something like below since I'm using vs-code to develop the API the screenshot is showing the vs-code explorer window

![Directory Structure](https://dev-to-uploads.s3.amazonaws.com/i/ug57rv22klmw7gmt1u2m.png)

Now let's follow the steps below to add swagger Nuget in our project.

*Step 1: Add NuGet Package*

Open the vs-code terminal and run the following command
 
**dotnet add TodoApi.csproj package Swashbuckle.AspNetCore**

*Step 2: Add & Configure Swagger to Middleware*

Now we have to modify the ConfigureServices Method

*public void ConfigureServices(IServiceCollection services)
{
services.AddMvc();
services.AddSwaggerGen(c =>
{
c.SwaggerDoc("v1", new Info { Title = "My API", Version = "v1" });
});
}*

Now add **using Swashbuckle.AspNetCore.Swagger;** so that compiler could know from where the reference of Info class should be taken.

*Step 3: Letting the middleware know about the swagger UI and the endpoint information*

Navigate to the *configure* method of *Startup.cs* and add the following code

**app.UseSwagger();**


*// Enable middleware to serve swagger-ui (HTML, JS, CSS, etc.), specifying the Swagger JSON endpoint.*

**app.UseSwaggerUI(c =>
{
c.SwaggerEndpoint("/swagger/v1/swagger.json", "My API V1");
});**

And we are done, so let's test our implementation, open the vs-code terminal again and then run the following command:

**dotnet run**

This should run the application, once it starts running we can see how swagger is managing the API documentation.

Open Chrome or any other browser of your choice and post the following URL

*http://localhost:<some-port-number>/swagger/*

you should be using the port number on which your application has been started. Now on your browser you should see the swagger documentation like below

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/kwkjn76chxvqr9vr0eoc.png)

So simple right. If you've liked this tutorial then please follow me on [twitter](https://twitter.com/avishekp86) and [dev.to](https://dev.to/avishekp86)
python control statements example
Tags: python
Published: 2020-02-21 11:08:30

In this post, you will learn about control statements in python with examples.

The control statement in Python, the statement that controls the flow of execution in a program.

#control statements in python

<!-- wp:heading {"level":3} -->
<h3>FLOW CONTROL</h3>
<!-- /wp:heading -->

<!-- wp:group -->
<div class="wp-block-group"><div class="wp-block-group__inner-container"><!-- wp:group -->
<div class="wp-block-group"><div class="wp-block-group__inner-container"><!-- wp:list -->
<ul><li><a href="https://www.tutsmake.com/python-if-elif-else-statement-with-example/">Python if...else</a></li><li><a href="https://www.tutsmake.com/python-for-loop-with-example/">Python for Loop</a></li><li><a href="https://www.tutsmake.com/python-while-loop-with-example/">while Loop</a></li><li><a href="https://www.tutsmake.com/break-and-continue-python-examples/">break and continue</a></li><li><a href="https://www.tutsmake.com/pass-statement-in-python-with-example/">Pass Statement</a></li></ul>
<!-- /wp:list --></div></div>
Configure a custom Git repository on Netlify
Tags: git, netlify, gitlab
Published: 2020-02-21 10:43:06

My personal web site (https://olisti.co) is a Gatsby.js project I used to serve publicly through [Netlify](https://netlify.com) but this required me to use Github.

Since I have my own Gitlab instance (https://source.olisti.co) I wanted to configure Netlify's CI to point to my Gitlab repository instead.

After a few attempts, I discovered that it's currently not possible to update the repository URL via:

- the web UI: since it doesn't provide the option to specify a self-hosted Gitlab instance or to specify a manual Git URL.
- `netlify api updateSite` since passing a `build_settings` object doesn't change the remote configuration, at least for the `repo_url` attribute.

I had to delete and recreate the Netlify site and configure it with [netlify-cli](https://cli.netlify.com/) specifying these parameters:

```shell
λ netlify sites:create --manual --with-ci
```

Here, `--with-ci` does the trick since it allows to specify the ssh URL of the Git repository.

One last hiccup has been while trying to provision the Let's Encrypt SSL certificate. A worrying error message showed up even though the required checks were passing.

It eventually went away after, I suppose, their local cache expired.

And now that I know this, I can import my other repositories. ;-)
🗜 How I purged 95% of unused CSS from my Gatsby website
Tags: gatsby, css, bootstrap, webdev
Published: 2020-02-21 10:33:26

I was using bootstrap for a long time. The last project I used bootstrap is the website I made with Gatsby. 

But most of the time, I use only the responsive classes in bootstrap. The `bootstrap.css` file itself is 152 kb in size. I had to find a way to remove unnecessary CSS from the code. I was using bootstrap from the first version of this website. I didn't want to change. 

So, I used [gatsby-plugin-purgecss](https://www.gatsbyjs.org/packages/gatsby-plugin-purgecss) to remove unnecessary CSS from the production build.

![Build Screenshot](https://dev-to-uploads.s3.amazonaws.com/i/u57ay3h7k3ki1ljg0qez.png)

Even though this is NOT an install and forgets type plugin (mentioned in their documentation), for my website, adding to the `gatsby-config.js` file did a good job.
How to Set Main-Container Div's Height Responsive in relevance to nested div elements ?
Published: 2020-02-21 10:23:18

How to set height of main-container div with response to nested div elements?

I have made two div elements placed next to each other with-in a main-container div.
Height of both div is set to auto. How can i set height of main-container div so it gets adjust as per the height of both div elements inside it, and footer element after main -container div gets placed at bottom of page. In bigger screens its not happening...See Codepen 0.5 view
Please Help


https://codepen.io/gpriya155/pen/yLNOQpL
Vue Core
Tags: vue
Published: 2020-02-21 09:57:39

## vue對數組的observe做了哪些處理？

Vue的Observer對數組做了單獨的處理，對數組的方法進行編譯，並賦值給數組屬性的__proto__屬性上，因為原型鏈的機制，找到對應的方法就不會繼續往上找了。編譯方法中會對一些會增加索引的方法（push，unshift，splice）進行手動observe。


vue的Observer類定義在[core/observer/index.js](https://github.com/vuejs/vue/blob/dev/src/core/observer/index.js) 中

```js
export class Observer {
   if (Array.isArray(value)) {
      if (hasProto) {
        protoAugment(value, arrayMethods)
      } else {
        copyAugment(value, arrayMethods, arrayKeys)
      }
      this.observeArray(value)
    } else {
      this.walk(value)
    }
```

可以看到，vue的Observer對數組做了單獨的處理。

[src/core/util/env.js](https://github.com/vuejs/vue/blob/dev/src/core/util/env.js)

```js
// can we use __proto__?
export const hasProto = '__proto__' in {}
```

`hasProto` 是判斷數組的實例是否有`__proto__`屬性，如果有__proto__ 屬性就會執行protoAugment 方法，將arrayMethods 重寫到原型上。 


src\core\observer\index.js

```js
/**
 * Augment a target Object or Array by intercepting
 * the prototype chain using __proto__
 */
function protoAugment (target, src: Object) {
  /* eslint-disable no-proto */
  target.__proto__ = src
  /* eslint-enable no-proto */
}
```

arrayMethods 是對數組的方法進行重寫，定義在[core/observer/array.js](https://github.com/vuejs/vue/blob/dev/src/core/observer/array.js) 中

```js
// 复制数组构造函数的原型，Array.prototype也是一个数组。
const arrayProto = Array.prototype
// 创建对象，对象的__proto__指向arrayProto，所以arrayMethods的__proto__包含数组的所有方法。
export const arrayMethods = Object.create(arrayProto)

// 下面的数组是要进行重写的方法
const methodsToPatch = [
  'push',
  'pop',
  'shift',
  'unshift',
  'splice',
  'sort',
  'reverse'
]

/**
 * Intercept mutating methods and emit events
 */
// 遍历methodsToPatch数组，对其中的方法进行重写
methodsToPatch.forEach(function (method) {
  // cache original method
  const original = arrayProto[method]
  
  // def方法定义在lang.js文件中，是通过object.defineProperty对属性进行重新定义。
  // 在arrayMethods中找到我们要重写的方法，对其进行重新定义
  def(arrayMethods, method, function mutator (...args) {
    const result = original.apply(this, args)
    const ob = this.__ob__
    let inserted
    switch (method) {
      // 对于push，unshift会新增索引，所以需要手动observe
      case 'push':
      case 'unshift':
        inserted = args
        break
      case 'splice':
        inserted = args.slice(2)
        break
    }
    if (inserted) ob.observeArray(inserted)
    // notify change
    ob.dep.notify()
    return result
  })
})
```

[src\core\util\lang.js](https://github.com/vuejs/vue/blob/dev/src/core/util/lang.js)

```js
/**
 * Define a property.
 */
export function def (obj: Object, key: string, val: any, enumerable?: boolean) {
  Object.defineProperty(obj, key, {
    value: val,
    enumerable: !!enumerable,
    writable: true,
    configurable: true
  })
}
```

references: 
[【深入vue】為什麼Vue3.0不再使用defineProperty實現數據監聽？](https://mp.weixin.qq.com/s?__biz=Mzg2NTA4NTIwNA==&mid=2247485104&idx=1&sn=648f1850fb59f04c6ca52cdd794013b5&chksm=ce5e34cbf929bddd4325de7f78dc4ad5822cddff69c999d1225f860e917dfd3d6eea43527c56&token=1424393752&lang=zh_CN#rd)
What are your favorite bash aliases?
Tags: bash, linux, discuss, terminal
Published: 2020-02-21 09:52:07

# What are your favorite bash aliases?

I use a lot of bash aliases on a daily basis! I love the fact that you can bundle commands and actions behind a single alias and improve your productivity with such simple steps!

Here are my favorites:

```bash
# ------------- MAINTENANCE ALIASES ----------------
alias update='sudo apt-get update && sudo apt-get upgrade -y && sudo apt-get dist-upgrade -y && sudo apt autoremove -y'

# --------------- PHP/NPM ALIASES ------------------
alias artisan='php artisan'
alias serve='php artisan serve'
alias unit='./vendor/bin/phpunit'
alias unitwatch='./vendor/bin/phpunit-watcher watch'
alias coverage='php -d pcov.enabled=1 ./vendor/bin/phpunit --coverage-html coverage'
alias cov-watcher='php -d pcov.enabled=1 ./vendor/bin/phpunit-watcher watch --coverage-html coverage'
alias prod='npm run prod'
alias dev='npm run dev'
alias watch='npm run watch'

# ----------------- GIT ALIASES --------------------
alias status='git status'
alias add-all='git add .'
alias gpm='git pull origin master'
alias push='git push origin'
alias pull='git pull origin'
alias switch='git checkout'
alias remove='git branch -d'
alias branches='git branch'
alias tags='git tag'
alias create-tag='git tag -a'

# ----------------- FILE ALIASES -------------------
alias editrc='nano ~/.bashrc'
alias applyrc='source	~/.bashrc'
```

What are yours?
บันทึกความเข้าใจ Redux Toolkit 
Tags: redux, todayilearned
Published: 2020-02-21 09:48:36

---
title: บันทึกความเข้าใจ Redux Toolkit 
published: true
description: บันทึกความเข้าใจ Redux Toolkit 
tags: redux, todayilearned
---

ใครๆก็รู้ว่า redux มี store, reducer และ action 
- store มีหน้าที่ dispatch action 
- reducer เก็บ logic ที่จะเปลี่ยนแปลง state ที่เราสนใจ ตามประเภทของ action ที่กำหนด โดยอ้างอิงกับ state 
- action คือ constant ที่เรากำหนดสำหรับ component นั้นๆ

ตัวอย่างการเขียน redux แบบบ้านๆ
```js
function counter(state, action) {
  if (typeof state === 'undefined') {
    return 0
  }

  switch (action.type) {
    case 'INCREMENT':
      return state + 1
    case 'DECREMENT':
      return state - 1
    default:
      return state
  }
}

var store = Redux.createStore(counter)

document.getElementById('increment').addEventListener('click', function() {
  store.dispatch({ type: 'INCREMENT' })
  // state = 1
})
```

จากตัวอย่าง 
- counter() คือ reducer ที่คอยรับ action 
- action มี INCREMENT และ DECREMENT 
- เมื่อสั่ง dispatch({ type: INCREMENT }) เลยทำให้ state มีค่าเท่ากับ 1 

จากตัวอย่างข้างบน จะเห็นว่ามันอาจจะเกิดปัญหาบางอย่างในการเขียน เช่น ใช้ action ผิด, ไม่รู้ว่า action มีอะไรบ้าง, เขียนเยอะ ฯลฯ

ณ จุดนี้ เราสามารถใช้ redux-toolkit แก้ปัญหาได้ ดังนี้
```js
export const counterSlice = createSlice({
  name: 'counter',
  initialState: 0,
  reducers: {
    increment: state => state + 1,
    decrement: state => state - 1
  }
})

const store = configureStore({
  reducer: counterSlice.reducer
})

document.getElementById('increment').addEventListener('click', () => {
  store.dispatch(counterSlice.actions.increment())
  // state = 1
})
```

จากตัวอย่างของการใช้ createSlice จะเห็นว่า แค่ import counterSlice มาสร้าง store 
เราก็สามารถใช้ action ได้จาก counterSlice.actions ซึ่งก็จะ list มาเฉพาะตัวที่ระบุไว้ ไม่ต้องเดาหรือไปดูใน code

น่าเอาไปใช้ในโปรเจคอื่นๆเนอะ ลดบรรทัดลงไปเยอะ

## Note
1. เรียบเรียงจาก: [Basic Redux Toolkit Tutorial](https://redux-toolkit.js.org/tutorials/basic-tutorial)
2. Redux Toolkit [github](https://github.com/reduxjs/redux-toolkit), [npm](https://www.npmjs.com/package/@reduxjs/toolkit)
Generating HMAC Signatures on the Command Line with OpenSSL
Published: 2020-02-21 09:46:46

This post originally appeared [on my personal website](https://www.jvt.me/posts/2020/02/21/openssl-hmac/).

Proving authenticity of a message is important, even over transport methods such as HTTPS, as we may not be able to require full end-to-end encryption. One such method of producing a signature is using HMAC with a shared secret.

For instance, let us say that we want to use SHA256 as the hashing algorithm.

If using Java, we could write code similar to the below, leveraging the [commons-codec](https://mvnrepository.com/artifact/commons-codec/commons-codec) project:

```java
import org.apache.commons.codec.binary.Base64;
import org.apache.commons.codec.digest.HmacAlgorithms;
import org.apache.commons.codec.digest.HmacUtils;
// ...
String digest =
    new String(
        Base64.encodeBase64String(
            new HmacUtils(HmacAlgorithms.HMAC_SHA_256, "secret-key-here")
                .hmac("value-to-digest")));
// G73zFnFYggHRpmwuRFPgch6ctqEfyhZu33j5PQWYm+4=
```

However, this doesn't help when we want to script this from the command-line, and isn't as portable.

To do this we can utilise `openssl`:

```sh
$ echo -n "value-to-digest" | openssl dgst -sha256 -hmac "secret-key-here" -binary | openssl enc -base64 -A
// G73zFnFYggHRpmwuRFPgch6ctqEfyhZu33j5PQWYm+4=
```
how to expose aws resources deployed by terraform to other teams 
Tags: aws, terraform, tfstate, collaboration
Published: 2020-02-21 09:43:33

Hello community,

Currently i am working in platform team that provide some service to different teams. We are deploying the prod infrastructure basis (VPC, Security groups,...) using terraform in aws and we want to give teams the possibility to deploy their applications inside the infra that we provide.
Ma question is how can we provide/expose these resources to different teams ? "tfstate outputs" or "data source" or other ways...?
which one fit with best practices ? 
Thanks in advance!
Unified state management for Svelte, Angular, React and Vue
Published: 2020-02-21 09:37:02

State management library that you can use with not only Svelte, but Angular, React and Vue:

[Universal model on Medium](https://medium.com/better-programming/unified-state-management-for-angular-react-vue-and-svelte-36289d221afd)

[universal-model-vue on Github](https://github.com/universal-model/universal-model-svelte)
JavaScript Data Structures: Hash Table: Setup
Tags: beginners, tutorial, javascript, webdev
Published: 2020-02-21 09:36:03

---
title: "JavaScript Data Structures: Hash Table: Setup"
description: "JavaScript Data Structures: Hash Table: Setup"
published: true
tags: ["Beginners", "Tutorial", "JavaScript", "Webdev"]
series: JavaScript Data Structures
---

## Intro 🌐

[Last time](https://dev.to/miku86/javascript-data-structures-hash-table-collisions-lol), we learned how to handle hash collisions.

Today, we'll use all of the stuff we learned so far to setup our Hash Table.

---

## Requirements 💭

We need the following parts to setup our Hash Table:

- a Hash Table class
- a container for our data
- the size of the data
- a hash function that inputs a key and outputs an array index

---

## Implementation ⛑

```js
// a Hash Table class
class Hashtable {
  constructor() {
    // a container for our data
    this.data = []

    // the size of the data
    this.size = 0
  }

  // a hash function that inputs a key and outputs an array index
  hash(key) {
    const chars = key.split('')
    const charCodes = chars.map(char => char.charCodeAt())
    const charCodeSum = charCodes.reduce((acc, cur) => acc + cur)
    return charCodeSum
  }
}
```

If you are not familiar with the hash function, [re-read this post](https://dev.to/miku86/javascript-data-structures-hash-table-hash-function-2l71).

---

## Result

```js
// create a new hash table
const newHashtable = new Hashtable()

// hash table should have no data and size 0
console.log(newHashtable)
// Hashtable { data: [], size: 0 } ✅
```

## Next Part ➡️

We'll learn how to add data to our Hash Table.

Need some mentoring? [Click here](https://miku86.com/mentoring)!

---

## Further Reading 📖

- [Simple Wiki: Hash Table](https://simple.wikipedia.org/wiki/Hash_table)
- [Wikipedia: Hash Table](https://en.wikipedia.org/wiki/Hash_table)
- [Wikibooks: Hash Table](https://en.wikibooks.org/wiki/Data_Structures/Hash_Tables)

---

## Questions ❔

- How would you implement the Hash Table?
- How would you build the hash function? Why?
The Right Way vs. the Easy Right Way
Tags: java, testing
Published: 2020-02-21 09:35:42

**360 No Gradle**

I've always leant towards doing things the 'right' way even if it's slightly harder than doing it the easy way, so imagine my joy when I'm assigned a Java project without the use of an IDE or package managers.

**How's that working out?**

Nothing's working and I don't know why.

**Will you ever do it again?**

Probably not.

**What about Java itself?**

It's early to say, but the language differences don't seem as big as the general project management differences (when compared to Ruby or JavaScript).

**Notes for anyone trying the same thing**

Look up setting CLASSPATH to .jar files (for junit and hamcrest)

**Wrap it up**

What I've picked-up here is that the barrier to entry for test-driving Java programs is much higher when done the hard way. If IntelliJ or Gradle/Maven cuts any of that out in the future (and according the web results, things always 'just work' when using those tools) then I can mark that experiment as done and move on.
I start to create open-source for betting, Ask Me Anything!
Tags: ama
Published: 2020-02-21 09:21:30

---
title: I start to create open-source for betting, Ask Me Anything!
published: true
tags: ama
---


Hey, my name is Edward and i like esports/betting and programming.

One evening, I decided to start posting my small developments in open source.

I know quite a lot about the betting world and everything related to it if you want to learn something or want to have fun with me and write open-source, then welcome - https://github.com/BETTING-CODE

GL&HF!

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/ylrcicnzywwj46y9mrlj.png)
TIL: errors are good and important 
Tags: todayilearned, debugging, codenewbie, coaching
Published: 2020-02-21 09:17:46

A bit of a diary post but I realised today that I need to stop focusing on results only and enjoy the debugging journey.

![dear diary](https://media.giphy.com/media/3osxYB55Nnuqzws3ny/giphy.gif)

I suppose we all know this: You're coding and you've just written a few extra lines, suddenly your app crashes, nothing loads and you have this big fat error, warning, or nothing at all. Oops.
I used to see this as a failure, as my code not being good enough. It's important to realise that's not what it is.


It's a learning opportunity.

**"But how do I make sure that I don't lose too much time on this?"**

This was one of my big questions. I'm straight outta bootcamp and I am a junior so it's bound to happen a lot. Here is what I think can help:

*- Set a time-deadline after which you go ask for help*

Sometimes you have to deliver x or y by the end of the day and you can't afford too many hours on it. So, when you __start__ debugging, look at the clock and set a deadline after which you'll go ask.

*- Set a frustration-limit after which you go ask for help*

I once got so frustrated and flustered that I deleted my entire code, doing the digital equivalent of a tableflip ragequit. It was a good lesson that sometimes one can be too frustrated to continue working on something. It will probably take time to know when you reach that point, but if you notice you're there, step away from the computer, hands in the air, and go get a fresh pair of eyes to look at it.

*- Make notes of what you've learnt.*

Maybe you needed to dig through the entire structure of your linux distro, maybe it was your IDE, maybe you had to read up on OOP because you hadn't understood something. Once it works, open up a note-taking system and jot down quickly things like the language, the error, what was wrong, how you fixed it (and maybe a link to the Stack Exchange solution, or post that helped you). This keeps a trace of your learning and if weeks down the line it happens again, a quick search in that file can help.

The last tip especially helps me see bugs and errors as ways of learning, rather than mere obstacles. 

__If you have any tips or helpful methods, feel free to leave them in the comments below, as they might also help me and other beginners.__