teleren/devto huggingface dataset:
Introducing Island Time - A Kotlin Multiplatform library for working with dates and times
Tags: kotlin, android, ios, kotlinmultiplatform
Published: 2019-11-30 00:38:50

One major gap when writing multiplatform Kotlin code so far has been the lack of a quality date and time library. That is to say, something that doesn't feel like a big step backwards for those used to working with java.time or the ThreeTen backport.

Island Time is a project that seeks to rectify this situation. It's inspired heavily by the java.time library, embracing many of the core classes and concepts. But it's not a strict port either, taking inspiration from other date-time libraries as well with the goal being to (ultimately) create a powerful library that enables a wide array of use cases while providing a more friendly, extension-oriented API that takes full advantage of Kotlin language features.

It's still early days, but I'm pleased to announce the first versioned release -- 0.1.0.

Some of the current features include:
- A set of date-time primitives such as `Date`, `Time`, `DateTime`, `Instant`, and `ZonedDateTime`
- Time zone database support
- Date ranges and time intervals, integrating with Kotlin ranges and progressions
- Read and write strings in ISO formats
- DSL-based definition of custom parsers
- Operators like `date.next(MONDAY)` or `dateTime.startOfWeek`
- Works on JVM, Android, iOS, and macOS

Of course, there are limitations. Most notably:
- No custom and/or localized format strings
- No localized week fields
- Only supports the ISO calendar system
- Year range currently restricted to 1-9999
- No Javascript support

You can find a lot more information on the [Github page](https://github.com/erikc5000/island-time).

Development is "moving fast" and the API is likely to experience changes. In its current state though, it's a quite usable library that I suspect might satisfy the needs of quite a few of you. It certainly unblocked me in taking a chunk of my own Android app's code and making it multiplatform-friendly.

Feedback is much appreciated. There are plenty of warts and design issues that are yet to be resolved and your comments -- and contributions, if you're so inclined -- can all help make this a better library.
Stop writing silver bullets
Tags: devjournal
Published: 2019-11-30 00:14:34

When I create a library / abstraction, it's usually quite small maybe around 300 lines, it's purpose should be singular, and everything around naming, methods and public is considered, I do no more than I need too, I will attempt to be quite generic, and so you would think this must be reusable?

I find more and more that my code is reusable, I know because I do reuse it, but actually it's only chunks that I need from a previous solution, rarely will I need everything and often 50% gets cut. This got me thinking, if code should be reusable, why do I have to cut code?

I think I may have a form of overengineering addiction where my solutions are not actually focused enough. Why write a SVGCurve maker and it only does that, when you know what your making further down the line is more specific. The generic SvgCurve maker does need to make calculations that the consumer library could skip because part of the calculation is already known. The generic solution then needs to allow for overides to bypass the calculation... But by now, I'm thinking what's the point? 

There is no silver bullet, perhaps keep your functions pure, calculate before you pass values in, just return values out, be focused and maybe this means less cut code.

End of streaming consiusness. 😴
Finding A Method Declaration With Source Location
Tags: ruby, programming, debugging
Published: 2019-11-30 16:17:35

---
title: Finding A Method Declaration With Source Location
published: true
date: 2019-11-30 00:00:00 UTC
tags: ruby,programming,debugging
canonical_url: https://jsrn.net/programming/2019/11/30/finding-a-method-declaration-with-source-location.html
---

I recently had one of those moments where some code failed, but not in the way I expected it to. To create a contrived example, the scenario was basically this:

```ruby
class LocationsController < ApplicationController
  def update
    my_location = Location.find(params[:id])
    do_something_with(location)
  end
end
```

This code won’t do what I want it to because I have defined the variable `my_location` but then passed `location` to another method. What I initially expected upon finding the bug is that I would have seen a `NameError` complaining that the local variable `location` didn’t exist. But I didn’t. As far as I could tell, `location` existed and it was `nil`.

It wasn’t referenced anywhere else in `LocationsController`, nor in `ApplicationController`. So what is it? Fortunately, Ruby provides a great way to find out.

```ruby
class LocationsController < ApplicationController
  def update
    puts method(:location).source_location
    # "/usr/local/bundle/gems/actionpack-5.0.7.2/lib/action_controller/metal.rb"
    # 149
  end
end
```

That’s that mystery solved. There is a method called `location` implemented a layer or two up the inheritance hierarchy. We knew it had to come from _somewhere_, but `source_location` lets us determine the exact location.
Comic: The Lost Kitty
Tags: watercooler, random, comics
Published: 2019-11-30 02:43:10

---
title: Comic: The Lost Kitty
published: true
date: 2019-11-29 23:54:07 UTC
tags: ["watercooler","random","comics"]
cover_image: https://thepracticaldev.s3.amazonaws.com/i/2in3vas0oxe06t8cieoo.png
canonical_url: https://www.cristinaruth.com/posts/the-lost-kitty/
---

Randomly wrote this comic and wanted to share in case anybody would like it. 😄

![The Lost Kitty Comic](https://thepracticaldev.s3.amazonaws.com/i/2in3vas0oxe06t8cieoo.png)
with & without lambda in python
Tags: python, tutorial, functional
Published: 2019-11-29 23:02:39



A quick understanding of using functional methods like map, filter, & sorted with and without lambda functions. A great example of how lambda functions work in python.

## use the filter function to remove items from a list

### without lambda

```python

def filterFunc(x):
    if x % 2 == 0:
        return False
    return True


nums = (1, 8, 4, 5, 12, 26, 381, 58, 47)
odds = list(filter(filterFunc, nums))
```

[1, 5, 381, 47]


#### with lambda

```python
mylist = [1, 2, 3, 4, 5]

odds = list(filter((lambda x: x % 2 != 0), mylist))
```
[1, 5, 381, 47]


## remove uppercase from string

#### without lambda

```python
def filterFunc2(x):
    if x == x.upper():
        return False
    return True

chars  = "aBcDeFghoiJk"

lower = list(filter(filterFunc2, chars))
```

['a', 'c', 'e', 'g', 'h', 'o', 'i', 'k']


##### with lambda

```python
lower = list(filter((lambda x: x == x.upper()), chars))
```

['a', 'c', 'e', 'g', 'h', 'o', 'i', 'k']


##  return new list with index squared

#### without lambda

```python
def squareFunc(x):
    return x ** 2

ints = [1, 2, 3, 4, 5]
squared = list(map(squareFunc, ints))
```

[1, 4, 9, 16, 25]

#### with lambda

```python
squared = list(map(lambda x: x ** 2, ints))
```

[1, 4, 9, 16, 25]

## use sorted and map to change numbers to grades

```python

def toGrade(x):
    if x  >= 90:
        return "A"
    elif x >= 80:
        return "B"
    elif x >= 70:
        return "C"
    elif x >= 60:
        return "D"
    else:
        return "F"

grades = (81, 89, 94, 78, 61, 99, 74, 90)

order = sorted(grades)
final = list(map(toGrade, order))

```

['D', 'C', 'C', 'B', 'B', 'A', 'A', 'A']


## Challenge:

Is using a lambda function a good choice here? If so, how will you do it?
25일간의 서버리스 챌린지
Tags: serverless, 25daysofserverless, dotnet, azure
Published: 2019-11-29 23:01:12

[![advent-of-serverless.gif](https://s5.gifyu.com/images/advent-of-serverless.gif)](https://gifyu.com/image/vNo5)

여러분 안녕하세요!

[마이크로소프트 클라우드 아드보캇][ms ca] 팀에서는 이번에 [#25DaysOfServerless][25dos]라는 이름으로 [애저 펑션][az func]을 이용해서 25일간 25개의 서버리스 애플리케이션을 만들어 보는 이벤트를 시작합니다. 오는 12월 1일부터 25일간 저희 클라우드 아드보캇 팀에서 매일 하나씩 도전 과제를 드릴텐데요, 이를 함께 풀어 보도록 하시죠!


## 규칙 :triangular_ruler: ##

규칙은 아주 간단합니다. 저희 팀에서 내는 문제를 본인이 선호하는 프로그래밍 언어를 이용해서 풀면 됩니다. 그리고, 깃헙에 본인의 해법을 올리고 트위터와 같은 SNS에 공유해 주세요! 그러면 저희가 그것들을 다 모아 모아서 매주 큐레이팅 해 드릴 겁니다.

서버리스 기술을 잘 모르신다구요? 괜찮습니다. 매일 도전 과제가 나갈 때 힌트도 함께 드립니다. 오로지 필요한 건 뭐다? 깃헙 계정과 거기에 올라가는 해법, 그리고 본인의 호기심이면 충분합니다!

![](https://sa0blogs.blob.core.windows.net/aliencube/2019/11/25-days-of-serverless-01.jpg)


## 예제 :memo: ##

> 이번에 선물을 주기 전에 우리 선물 사진을 스포일러하겠습니다. 그런데 문제는 `.png` 파일만 공유할 거예요.
>
> 이를 위해서 우리는 애저 블롭 저장소에 사진이 올라올 때마다 애저 펑션을 실행시켜 사진이 `.png` 포맷이 아닐 경우 삭제하도록 하겠습니다.

이 경우에 [애저 펑션 블롭 트리거][az func blob trigger]를 만들어 볼 수 있겠죠? 아래는 간단한 C# 코드입니다.


{% gist https://gist.github.com/justinyoo/977295c0919f5e4fcd7a7eebc4455a27 file=blob-trigger.cs %}

사실, 여기서는 편의상 C# 코드를 사용했지만, 굳이 C# 언어를 사용하실 필요도 없어요. 본인이 편한 언어를 선택해서 코드를 작성하시면 됩니다. 심지어 굳이 애저를 사용하실 필요도 없어요. 하지만 애저를 사용하면 더욱 좋겠죠? :wink:


## 시작하기 :rocket: ##

오는 12월 1일부터 [www.25daysofserverless.com][25dos]를 통해 하루에 하나씩 확인하실 수 있습니다! 트위터에서 [@AzureAdvocates][az ca] 또는 [#25DaysOfServerless][25dos hashtag]를 통해 다른 개발자들이 어떻게 만들었는지도 꼭 확인해 보세요!

아직 애저 계정이 없으신가요? 괜찮습니다. 12월 1일 이전에 [무료로 계정을 만들어서][free az account] 준비하세요!


[ms ca]: https://developer.microsoft.com/ko-kr/advocates/?WT.mc_id=25days_devto-blog-cxa
[25dos]: https://www.25daysofserverless.com/
[az func]: https://azure.microsoft.com/ko-kr/services/functions?WT.mc_id=25days_devto-blog-cxa
[az func blob trigger]: https://docs.microsoft.com/ko-kr/azure/azure-functions/functions-create-storage-blob-triggered-function?WT.mc_id=25days_devto-blog-cxa
[az ca]: https://twitter.com/azureadvocates
[25dos hashtag]: https://twitter.com/search?q=%2325DaysOfServerless&src=typed_query
[free az account]: https://azure.microsoft.com/ko-kr/free/?WT.mc_id=25days_devto-blog-cxa
Module not found: Can't resolve 'react-dom' in 'C:\Users\Public\Desktop\mytestapp\src'"".
Tags: react, webpack
Published: 2019-11-29 22:09:59

Recently I installed node and configured create-react-app, I created one react app and when I am doing npm start it is giving an error "" ./src/index.js Module not found: Can't resolve 'react-dom' in 'C:\Users\Public\Desktop\mytestapp\src'"". then I removed this and again installed it, but the same error is giving again and again.
I am unable to solve this issue
Little tip: installing AWS CLI v2 on Mac OS X Mojave in 2019
Tags: aws, awscli, macosx
Published: 2019-11-29 22:07:42

Having Python 2.7, Python 3.6 and Python 3.7 on your Mac OS X at the same time turns your environment into a mess, when you try to use CLI tools distributed as PIP packages.

Digging into logs can take hours with no luck. I see here few guides about installing AWS CLI, but sadly none of them worked for me. If you reading this, I probably suggest you an obvious thing: just follow instruction on official doc @ docs.aws.amazon.com:

```
curl "https://d1vvhvl2y92vvt.cloudfront.net/awscli-exe-macos.zip" -o "awscliv2.zip"
unzip awscliv2.zip
sudo ./aws/install
```

Now `aws2 configure` and you are ready to go ahead.
Hello, World.
Published: 2019-11-29 22:05:58

Hi DEV - I'm new here. I used to post stuff over on [Medium](https://medium.com/@bengreenier) but have heard great things about this platform and wanted to give it a shot. Hell - if things are even remotely as easy to use as setup has been, I've got high hopes.


I'll be posting more and more (I hope) about [overlayed](https://overlayed.app) as I focus on building it out (live on [stream](https://twitch.tv/ben_greenier) btw)...so stick around.

Right well, that's all I've got for now - have a lovely evening.

💙🌈
-Ben
Infinity (javascript) 
Published: 2019-11-29 22:01:48

What is Infinity 
================
An infinite value that is used as numbers in variables, infinity is classified as a property of a window object 

![Alt Text](https://thepracticaldev.s3.amazonaws.com/i/lmfabnytg5l09n6seq9h.jpg)


![Alt Text](https://thepracticaldev.s3.amazonaws.com/i/mibffqj9j8m1hpx6ylff.jpg)


When is Infinity Returned? 
-------------------------
1-Infinity is returned when the value is more or less than the value spcified in your code that, if you set the value between 10 and 1000 and the value is more than 100,it returns infinity and if it is less than 10, it returns infinity. 

2-when do you write more than 308 numbers, it will give you infinity. 


![Alt Text](https://thepracticaldev.s3.amazonaws.com/i/n9yk8sgu0xssyhn0yytp.jpg)


![Alt Text](https://thepracticaldev.s3.amazonaws.com/i/9ki7ogjdvtjmfmrte19s.jpg)

3- Infinity will be returned when a number is divided by 0:

![Alt Text](https://thepracticaldev.s3.amazonaws.com/i/e47wyyycoll86fh3tubu.jpg)

![Alt Text](https://thepracticaldev.s3.amazonaws.com/i/dndk9gbs6rnqag2a6dag.jpg)

4- Number.POSITIVE_INFINITY
![Alt Text](https://thepracticaldev.s3.amazonaws.com/i/h5jl5vgwmv4o1fsfjdzk.jpg)

![Alt Text](https://thepracticaldev.s3.amazonaws.com/i/wcqrtbkeb5ix7r4ha300.jpg)

For more information about this read article about infinity link⬇️⬇️ :
https://www.impressivewebs.com/infinity-in-javascript/
Snippets
Tags: node, ejs, vscode, javascript
Published: 2019-11-29 21:57:05

Most of the time when I learn to code I discover there are a lot of repetitive tasks. Visual Studio Code allows you to create your own snippets for the purpose of reducing those repetitions. At the moment I'm learning `express.js` and some templating with `ejs`. Want to guess what was my first snippet? `express app` boilerplate followed by `ejs tags`.

You can access vscode snippets by clicking the Manage Gear on the bottom left corner and choosing `User snippets`. By default vscode stores them in the user folder under `C:\Users\user-name\AppData\Roaming\Code\User\snippets\`.

This is the content of my snippet files:

`express.code-snippets`
```
{
	"express boilerplate":{
		"scope":"javascript",
		"prefix": "exp",
		"body": [
			"const express = require('express');",
			"const serverPort = process.env.PORT || ${1:port_number};",
			"const app = express();\n",
			"app.get('/', (req, res) => {\n",
			"\tres.send('$2');\n",
			"});\n",
			"app.listen(serverPort, () => {",
			"console.log(`Server started on port < ${$serverPort} >`);",
			"});"
		]
	},

	"app.get boilerplate":{
		"scope": "javascript",
		"prefix": "app.get",
		"body": [
			"app.get('${1:/}', (req, res) => {\n",
			"\tres.send('$2');\n",
			"});"
		]
	},
	"app.post boilerplate":{
		"scope": "javascript",
		"prefix": "app.post",
		"body": [
			"app.post('${1:/}', (req, res) => {\n",
			"\tres.send('$2');\n",
			"});"
		]
	}

}
```

`esj.code-snippets`
```
{
	"Output value": {
		"scope": "ejs, html, javascript",
		"prefix": "ejs",
		"body": "<%= $1 %>$0",
		"description": "Outputs the value into the template (HTML escaped)"
	},

	"Scriptlet": {
		"scope": "ejs, html, javascript",
		"prefix": "ejs.scrip",
		"body": "<% $1 %>$0",
		"description": "'Scriptlet' tag, for control-flow, no output"
	},

	"Whitespace trim": {
		"scope": "ejs, html, javascript",
		"prefix": "ejs.trim",
		"body": "<%_ $1 _%>$0",
		"description": "Removes all whitespace before and after"
	},

	"Include": {
		"scope": "ejs, html, javascript",
		"prefix": "ejs.include",
		"body": "<%- include('$1'$2) -%>$0",
		"description": "Removes all whitespace before and after"
	}
	
}
```
Monitoring Kubernetes InitContainers with Prometheus
Tags: kubernetes, devops, prometheus, sre
Published: 2019-11-29 20:37:30

Kubernetes InitContainers are a neat way to run arbitrary code before your container starts. It ensures that certain pre-conditions are met before your app is up and running. For example it allows you to:

- run database migrations with Django or Rails before your app starts
- ensure a microservice or API you depend on to [is running](https://www.magalix.com/blog/kubernetes-patterns-the-init-container-pattern)

Unfortunately InitContainers can fail and when that happens you probably want to be notified because your app will never start. Kube-state-metrics exposes plenty of Kubernetes cluster metrics for Prometheus. Combining the two we can monitor and alert whenever we discover container problems. [Recently](https://github.com/kubernetes/kube-state-metrics/pull/762), a pull-request was merged that provides InitContainer data.

The metric `kube_pod_init_container_status_last_terminated_reason` tells us why a specific InitContainer failed to run; whether it's because it timed out or ran into errors.

To use the InitContainer metrics deploy Prometheus and kube-state-metrics. Then target the metrics server in your Prometheus scrape_configs to ensure we're pulling all the cluster metrics into Prometheus:

```yaml
- job_name: 'kube-state-metrics'
  static_configs:
    - targets: ['kube-state-metrics:8080']
```

`kube_pod_init_container_status_last_terminated_reason` contains the metric label `reason` that can be in five different states:

- Completed
- OOMKilled
- Error
- ContainerCannotRun
- DeadlineExceeded

We want to be alerted whenever a metric that is not 'Completed' is scraped because that means an InitContainer has failed to run. Here is an example alerting rule.

```yaml
groups:
  - name: Init container failure
    rules:
      - alert: InitContainersFailed
        expr: kube_pod_init_container_status_last_terminated_reason{reason!="Completed"} == 1
        annotations:
          summary: '{{ $labels.container }} init failed'
          description: '{{ $labels.container }} has not completed init containers with the reason {{ $labels.reason }}'
```

Happy monitoring!
Day #4 of #30DaysOfWebPerf
Tags: webperf, sitespeed, webdev, http2
Published: 2019-11-29 20:30:31

---
title: Day #4 of #30DaysOfWebPerf
published: true
description: Domain Sharding or HTTP2?
tags: web performance, site speed, webdev, http2
---

{% twitter 1200493328459915265 %}{% twitter 1200493332750667776 %}{% twitter 1200493333895770112 %}{% twitter 1200496791377993728 %}{% twitter 1200496793915510784 %}{% twitter 1200502319982370816 %}{% twitter 1200502321131577344 %}{% twitter 1200502322024960000 %}{% twitter 1200502322696052736 %}{% twitter 1200510719722049536 %}{% twitter 1200510720883875840 %}
What are the key skills necessary to be a competent developer?
Tags: discuss, webdev, news, watercooler
Published: 2019-11-29 20:24:13

Asked myself this question today. Wondered what others thought. 

——

Obviously we’d have to define competency. 

But interpret it as you wish.

It could mean the ability to produce optimised code that meets a set of criteria.

It could mean being able to consistently and reliably produce a solution from start to finish in code, that functions as intended, without bugs.

Whatever you interpret, what do you think are the bare essentials to be competent? 

I know it’s difficult without more specificity, but to counter that make it general or be specific by applying it to what you know/your expertise. 

What is the minimum, the most fundamental, that applies most broadly?
Restart all running docker containers
Tags: docker, todayilearned
Published: 2019-11-29 20:13:49

Save yourself the hassle of restarting your containers individually.

First see which containers are currently running:
`docker ps`

To restart an individual container you can run:
`docker restart <container id>`

It can be useful to feed the output of a docker command into another to save the effort and time of running the above, if you know you want to restart all the containers.

Restart all running containers:
`docker restart $(docker ps -q)`

Happy dockering!
My React Book is on Sale Again!
Tags: sale, react
Published: 2019-11-29 20:04:40

---
title: My React Book is on Sale Again!
published: true
description: 
tags: sale, react
---

Last year I wrote [React From Zero](https://www.fullstackreact.com/react-from-zero/) and today it's on sale again!

My Publisher \newline has a big [Black Friday sale!](https://www.newline.co/@eigenjoy/black-friday-2019-discounts-for-individual-books--43584b32)

Up to 50% off 

📖 individual books
📗📘 book bundles
📚📕📙 and the whole 12-book library

Learn React, Vue, Angular, Rust and more! 

[![Books](https://s3.amazonaws.com/assets.fullstack.io/n/20191129041853557_entire-collection-bundle.jpg)](https://www.newline.co/@eigenjoy/black-friday-2019-discounts-for-individual-books--43584b32)
Daily Challenge #127 - Playing with Passphrases
Tags: challenge
Published: 2019-11-29 19:30:36

---
title: Daily Challenge #127 - Playing with Passphrases
published: true
series: Daily Challenge
description: Write a fun password scrambler
tags: challenge
---
Everyone has to use passwords. One can choose a password from poems, songs, movies names and so on. Unfortunately, some passwords can be easily guessed from lists of common cultural references. You can make your passwords stronger through different means, such as writing a function to do the following:

**Rules:**
Select some text in capital letters, optionally including digits and non alphabetic characters,
Shift each letter by a given number but the transformed letter must be a letter (circular shift),
Replace each digit by its complement to 9,
Keep such as non alphabetic and non digit characters,
Lowercase each letter in odd position, uppercase each letter in even position (the first character is in position 0),
reverse the whole result.

**Example:**
<pre>
your text: "BORN IN 2015!", shift 1

1 + 2 + 3 -> "CPSO JO 7984!"

4 "CpSo jO 7984!"

5 "!4897 Oj oSpC"
</pre>

With longer passwords, isn't it better to have a small and easy program? How would you write it?

***
_This [challenge](https://www.codewars.com/kata/559536379512a64472000053) comes from g964 on CodeWars. Thank you to [CodeWars](<https://codewars.com/>), who has licensed redistribution of this challenge under the [2-Clause BSD License](<https://opensource.org/licenses/BSD-2-Clause>)!_

_Want to propose a challenge idea for a future post?  Email **yo+challenge@dev.to** with your suggestions!_
Introducing Marked.cc
Tags: vue, opensource, github, javascript
Published: 2019-11-29 19:19:33

Hey everyone!

I launched an open-source project called [Marked.cc](https://marked.cc), where you can create and share beautiful images of your notes. 

It's built with Vue.js.

🔗 Here's the Github repo: https://github.com/msjaber/marked.cc

🔗 Technical highlights article: [Introducing Marked](https://www.msjaber.com/introducing-marked/)

Hope you enjoy it!
VS Code October 2019 Release Highlights Video
Tags: discuss, vscode, javascript, webdev
Published: 2019-11-29 18:58:00

---
title: VS Code October 2019 Release Highlights Video
published: true
description: Highlights of some of the latest features found in the October 2019 release of Visual Studio Code.
tags: discuss,vscode,javascript,webdev
cover_image: https://thepracticaldev.s3.amazonaws.com/i/n1vbjl2ln2wrefub1vzr.jpg
series: vscode-release
---

## October 2019 VS Code Release
You can read through the [release notes](https://code.visualstudio.com/updates/v1_40?WT.mc_id=devto-blog-brcl) to find out more about them or watch this short video to see some of the highlights from it.

{% youtube B9yGOVWAag4 %}

### Features Highlighted

- [Control the sizing behavior when splitting editors](https://code.visualstudio.com/updates/v1_40?WT.mc_id=devto-blog-brcl#_control-the-sizing-behavior-when-splitting-editors)
- [Fewer notifications in Zen mode](https://code.visualstudio.com/updates/v1_40?WT.mc_id=devto-blog-brcl#_fewer-notifications-in-zen-mode)
- [New "paste" option for right-click behavior](https://code.visualstudio.com/updates/v1_40?WT.mc_id=devto-blog-brcl#_new-paste-option-for-rightclick-behavior)
- [Git: Improved untracked files management](https://code.visualstudio.com/updates/v1_40?WT.mc_id=devto-blog-brcl#_git-improved-untracked-files-management)
- [Activity Bar indicator](https://code.visualstudio.com/updates/v1_40?WT.mc_id=devto-blog-brcl#_activity-bar-indicator)
- And more...🙂


What's your favorite feature or improvement in this month's release? Share it below 👇