teleren/devto huggingface dataset:
Using MLflow with Hugging Face Transformers
Tags: datascience, tutorial, machinelearning, mlops
Published: 2022-07-15 16:03:06

---
title: Using MLflow with Hugging Face Transformers
published: true
date: 2022-07-15 13:30:10 UTC
tags: datascience,tutorial,machinelearning,mlops
canonical_url: https://julsimon.medium.com/using-mlflow-with-hugging-face-transformers-4f69093a6c04
---

In this video, I show how to use [MLflow](https://mlflow.org) with the [Transformers](https://github.com/huggingface/transformers) library, and why it’s a good idea to store the logs on the [Hugging Face hub](https://huggingface.co) :)

Let us know how you’d like to use MLflow with Transformers and the Hugging Face hub! Please join the discussion at [https://discuss.huggingface.co/t/calling-mlflow-users/20420](https://discuss.huggingface.co/t/calling-mlflow-users/20420)

{% youtube vmfaDZjeB4M %}

Doc: [https://huggingface.co/docs/transformers/v4.20.1/en/main\_classes/callback#transformers.integrations.MLflowCallback](https://huggingface.co/docs/transformers/v4.20.1/en/main_classes/callback#transformers.integrations.MLflowCallback)

Notebook: [https://gitlab.com/juliensimon/huggingface-demos/-/tree/main/mlflow](https://gitlab.com/juliensimon/huggingface-demos/-/tree/main/mlflow)
🗾️ TypeScript Customers Info With MapBox
Tags: typescript, map, mapbox, axios
Published: 2022-07-15 13:22:57

Working with _typescript_ especially in the beginning (I am a beginner 🤔️),
declaring the type of each variable, the syntax not always intuitive, can be very frustrating! 😤️

The code stretches a lot but the advantages in the long run are undeniable! 🤓️

In this video guide i created a litle customer page to get familiar with typescript sintax, for example, when you fetch some customer info you need to declare in advance the object type using ** interface **

```
// User Interface
interface User {
    name: string;
    username: string;
    email: string;
    address:{
        street: string;
        suite: string;
        city: string;
        zipcode: string;
        geo:{
            lat: string;
            lng: string;
        }
    };
    phone: string;
    website: string;
    company: {
        name:string;
        catchPhrase: string;
        bs:string;
    };
};

```
In this way typescript knows what kind of data to expect, and if there is something wrong, report it in advance!

To view the customer coordinates I used [MapBox](https://www.mapbox.com/) 

Hope this little exercise helps you better understand the importance of typescript in your code!

{% embed https://youtu.be/VWMB_3h8RSg %}

[Video Guide](https://youtu.be/VWMB_3h8RSg)

Have a nice day!
🖐️
Are cover letters worth the time?
Tags: discuss, anonymous, career
Published: 2022-07-15 13:11:39

_This is an anonymous post sent in by a member who does not want their name disclosed. Please be thoughtful with your responses, as these are usually tough posts to write. Email sloan@dev.to if you'd like to leave an anonymous comment or if you want to ask your own anonymous question._ 

***


I've just re-entered the job market after about 3 years at one company. Just wondering if putting all my energy into writing different cover letters for each job is actually worth it. Thanks.
[Rails][Sorbet] Define Rails enum using T::Enum
Tags: ruby, sorbet, rails
Published: 2022-08-21 05:23:39

---
title: [Rails][Sorbet] Define Rails enum using T::Enum
published: true
date: 2022-07-15 13:04:07 UTC
tags: ["Ruby", "Sorbet", "Rails"]
canonical_url: https://note.hiko1129.com/posts/1657890247/
---

<a href="https://note-hiko1129-com.translate.goog/posts/1657890247/?_x_tr_sl=ja&_x_tr_tl=en&_x_tr_hl=ja&_x_tr_pto=wapp" target="_blank" rel=”noopener noreferrer”>Translate ja to en</a>

T::Enumからindex付きのhashに変換するやつを書いてRailsのenum設定に使っています。  
sorbet-rails使っている場合には逆にenum書くと型定義できた気がする（自分の使っているバージョンだと破損しているのでよく知らず）。

```
class AAA < ApplicationRecord
  extend T::Sig

  class A < T::Enum # 共通メソッドとしてto_symやto_hashはconcernsなりにあるとよいかと
    extend T::Sig

    enums do
      Hoge = new('hoge')
      Fuga = new('fuga')
      Piyo = new('piyo')
    end

    sig { returns(Symbol) }
    def to_sym
      serialize.to_sym
    end

    class << self
      extend T::Sig

      sig { returns(T::Hash[Symbol, Integer]) }
      def to_hash
        values.each.with_index.each_with_object({}) do |(item, idx), result|
          result[item.to_sym] = idx
        end
      end
    end
  end

  # AAA::A.to_hash => {:hoge=>0, :fuga=>1, :piyo=>2}
  enum a: A.to_hash

  sig { returns(A) }
  def deserialize_a
    A.deserialize(a)
  end
end
```
Context: Zephyr OS _kernel.threads points to 'NULL'
Published: 2022-07-15 12:58:32

Hello All,

I am new to this platform and not sure if this is the right place to ask this question here. Please let me know if not then I will take out my post.

Here is my question:
I have just started using Zephyr os and working with basic QEMU 'synchronisation' sample. My application runs fine and can see thread 'a' and 'b'. I am using iSYSTEM debugger tool. Why  '_kernel.threads' always points to NULL(0x0000'0000)? Is there any configuration has to be enables? I have already enables below:
CONFIG_DEBUG_THREAD_INFO=y
CONFIG_THREAD_MONITOR=y

Attaching image.
Please share your knowledge...thanks a lot :)

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/k0exdhl89rv9vrksa2j3.JPG)
How to Make a Real Estate Website Using Html CSS JavaScript
Tags: css, javascript, beginners, tutorial
Published: 2022-07-15 12:56:52

{% youtube 3meTfAgVvg8 %}

How to Make a Real Estate Website Using Html CSS JavaScript

This video will show you how to make a real estate website using html css javascript

[Live Website](https://codewithsadee.github.io/realvine)
[Github Repo](https://github.com/codewithsadee/realvine)

---

HI 👋
I'm Sadee (webdev)
In this channel I make videos about Complete Responsive website.
You can checkout my channel 👇

📺 My Channel : [codewithsadee](https://www.youtube.com/channel/UC1PZHWV6VvICTL1LgFUZq6g)
🔔 Subscribe : [subscribe now](https://www.youtube.com/channel/UC1PZHWV6VvICTL1LgFUZq6g?sub_confirmation=1)

---

🔗 Essential links
-----------------------------
[Starter file](https://drive.google.com/file/d/1SxUHKyypi6XbpByyniapYQ9CfK-R5ve7/view?usp=sharing)

---

⏱️ Timestamps
-----------------------------
0:00 - Demo
3:43 - File structure
4:13 - Project initial
10:03 - Header
25:20 - Hero section
43:35 - About section
49:37 - Service section
54:11 - Property section
1:07:19 - Contact section
1:10:03 - Newsletter section
1:14:39 - Footer
1:32:37 - Media queries

---

[![Become a patreon](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/fnjl14kdm5qf08hu5lop.png)](https://www.patreon.com/bePatron?u=62535867)
[Ruby][Sorbet] You should pass arguments to new in T::Enum
Tags: sorbet, ruby, rails
Published: 2022-08-21 05:27:06

---
title: [Ruby][Sorbet] You should pass arguments to new in T::Enum
published: true
date: 2022-07-15 12:47:55 UTC
tags: ["Sorbet", "Ruby", "Rails"]
canonical_url: https://note.hiko1129.com/posts/1657889275/
---

<a href="https://note-hiko1129-com.translate.goog/posts/1657889275/?_x_tr_sl=ja&_x_tr_tl=en&_x_tr_hl=ja&_x_tr_pto=wapp" target="_blank" rel=”noopener noreferrer”>Translate ja to en</a>

下記のように特段設定しなければserializeしてもスネークケースにならない（キャメルはスネークになってほしいのだが...）。  
Railsのenumと組み合わせる形で使うときも使い勝手が悪い。

```
class A < T::Enum
  enums do
    HogeHoge = new
  end
end

A::HogeHoge.serialize # -> hogehoge
```

newに引数を渡すとそれがserializeの結果になる。  
deserializeも引数に渡した文字列でできる。

```
class A < T::Enum
  enums do
    HogeHoge = new('hoge_hoge')
  end
end

A::HogeHoge.serialize # -> hoge_hoge
A.deserialize('hoge_hoge') # -> <A::HogeHoge>
```
What's the best way to store your passwords?
Tags: discuss, security, productivity, notanad
Published: 2022-07-15 12:45:49

## Hackers.
Some of you reading this probably are hackers too... but don't worry if you are a white hat hacker, I understand your role.
<br>
### But the other side?
Yep, there ARE hackers that steal your info for the thrill of it or maybe for more evil intents. And, you probably have a password. Like, you have Discord, Google, GitHub, DEV, Facebook, Amazon and much more!
<br>
### But here's the problem
There are some people who store their passwords on a Password Manager, and others have the same password for EVERY account. That's because we can't ___Remember___ them!
<br>
### You know what's the real problem by now...
It's the fact that these are so easy to exploit! A hacker might be able to access all of your accounts if you use the same passwords, and don't rule out the fact that the hackers can hack into your password manager too!
<br>
<br>
## Here's the solution. And, it is a ___Foolproof___ one
Simply, use ___Pen And Paper___. Just write it down on a notebook, don't go printing it, __write__ it down.
<br>
Simple. Don't go too overboard with tech and save your passwords THERE. I am pretty sure some of you already do this, so would have less likeliness of your passwords being stolen :)
<br>
### So what's the conclusion?
Tech is moving rapidly because of the developer community creating new stuff. This is also dangerous as it is becoming more and more ___realistic___. There is now AI, video conferencing and websites. The _convenience_ is undeniable. But because of that, criminals ain't robbin' banks now. They robbin' online bank. Yeah.
<br>
<br>
Lessgoooooooo![999 views!](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/cetjpphlww507q50spwe.png)
[Ruby][Sorbet] Write also the type of the side that depends on the type definition of concerns, safely and cleanly
Tags: sorbet, ruby, rails
Published: 2022-08-21 05:34:26

---
title: [Ruby][Sorbet] Write also the type of the side that depends on the type definition of concerns, safely and cleanly
published: true
date: 2022-07-15 12:25:29 UTC
tags: ["Sorbet", "Ruby", "Rails"]
canonical_url: https://note.hiko1129.com/posts/1657887928/
---

<a href="https://note-hiko1129-com.translate.goog/posts/1657887928/?_x_tr_sl=ja&_x_tr_tl=en&_x_tr_hl=ja&_x_tr_pto=wapp" target="_blank" rel=”noopener noreferrer”>Translate ja to en</a>

最近concernsの型定義には下記のように依存する側の型も書くようにしてる。

```
module Hoge
  extend T::Sig
  extend ActiveSupport::Concern

  Includer = T.type_alias {T.all(Hoge, Fuga)} # 依存する側のFugaクラスを追加してHogeとFugaの交差型に
  private_constant :Includer

  sig { returns(String) }
  def hoge
    'hoge'
  end

  sig { returns(String) }
  def hoge_fuga
    includer.hoge + includer.fuga # includerは自身とFugaクラスの交差型なので、自身のhogeメソッドも見えるし、Fugaにあるfugaメソッドも参照できる
  end

  private

    sig { returns(Includer) }
    def includer # 名前が適切かと聞かれたら微妙だが、とりあえず自身と依存する側両方の型を返すメソッドを用意してこれに依存してメソッド呼び出す形にすることできれいに書ける
      T.bind(self, Includer)
      self
    end
end

class Fuga
  extend T::Sig

  sig { returns(String) }
  def fuga
    'fuga'
  end
end
```
Poll 3 : Preferred IDE ?
Tags: discuss, community, poll
Published: 2022-07-15 12:03:08

## 🔥 What's your preferred IDE ( Integrated Development Environment )?
1. Visual Studio Code
2. Vim
3. Intellij
4. Notepad++

Click here 👇 to answer ❗ and comment 💭 below why you think so ❓
[![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/jb4k1pcw07w1wmxvka3v.png)](https://twitter.com/heydrdev/status/1547911944501280769)

---

Let's connect together 🤝, post your favorite dev article and tag me on twitter. I will retweet and give you my honest opinion 😇

[![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/hi9jmkirwc9g9ppwbc1o.png)](https://twitter.com/heydrdev)
This Week in Python (July 15, 2022)
Published: 2022-07-15 14:10:37

---
title: This Week in Python (July 15, 2022)
published: true
date: 2022-07-15 12:00:00 UTC
tags: 
canonical_url: https://bas.codes/posts/this-week-python-020
---

 **Fri, July 15, 2022**

This Week in Python is a concise reading list about what happened in the past week in the Python universe.

## [<svg aria-hidden="true" focusable="false" height="16" version="1.1" viewbox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg>](#python-articles)Python Articles

- [How I built my ideal daily Python newsletter with AWS and Python](https://cloudconsultant.dev/building-an-automated-email-newsletter-with-aws-and-python/)
- [Automate Internet Life with Python](https://hackaday.com/2022/07/12/automate-internet-life-with-python/) 
- [Apply constraints with ‘assert’ in Python](https://rednafi.github.io/reflections/apply-constraints-with-assert-in-python.html)
- [Jargon from the functional programming world in simple terms](https://github.com/jmesyou/functional-programming-jargon.py)
- [Just use Dictionaries](https://davidvujic.blogspot.com/2022/07/just-use-dictionaries.html)

## [<svg aria-hidden="true" focusable="false" height="16" version="1.1" viewbox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg>](#projects)Projects

- [design-by-contract](https://github.com/StefanUlbrich/design-by-contract) – Handy decorator for elegant design-by-contract in 3.10+
- [django-test-migrations](https://github.com/wemake-services/django-test-migrations) – Test django schema and data migrations, including migrations’ order and best practices
- [bytewax](https://github.com/bytewax/bytewax) – A Python framework for building highly scalable dataflows
- [pyKeylogger](https://github.com/kartikmehta8/pyKeylogger) – A Python-based Keylogger that can track your keystrokes, clipboard text, take screenshots at regular intervals
- [healthchecks](https://github.com/healthchecks/healthchecks) – A cron monitoring tool written in Python & Django
<!-- https://guicommits.com/organize-python-code-like-a-pro/ -->
TensorFlow for Commodore 65s
Tags: testing
Published: 2022-07-15 11:57:22

Given that TF Lite for Microcontrollers runs on some heavily resource-constrained devices, I got to wondering whether or not I could run inferences against these models on a Commodore 64.

To do this, I chose not to use an interpreter. The TF Lite Micro team explains why they did in their paper (i.e. portability, maintainability). And that was a good choice for the project to be sure, but I'm dealing with nearly 40 year old hardware, so I cannot afford the overhead of an interpreter. Instead, I modified the TF Lite Micro source code so that when running an interpreter on the host computer, it will emit all of the important details about the model, e.g.: operations to perform, filter values, biases, etc. Additionally, I analyzed the source code for all operations involved with running the model so that I could reproduce the functionality.

CH then parsed that output with a Python script to turn it into C64-compatible BASIC (this could be updated to produce 6502 assembly code, but for this proof of concept, BASIC was actually fast enough).

To test things out, I built TensorFlow's Hello World example that builds and trains a small, 3 layer neural network that learns to approximate the sine function. After running it on the host computer and emitting the model info, I used my parser to create this BASIC code that can be used to run arbitrary inferences against the neural network on a Commodore 64. Each inference takes a few seconds to run on a physical C64 computer.

Since the code running on the C64 is the same thing logically as what runs on the host computer (or microcontroller), it performs equally well in all environments. There is no accuracy reduction from running on the C64.
How to get data from two collection in NO SQL Database MongoDB
Tags: mongodb, node, webdev, database
Published: 2022-07-15 11:52:07

Like I have two collection first is Employee collection and second is Department collection.

**Employee collection having below data:**

    {
      "_id": "kcXtyaB7jGPw9Ks",
      "name": "Test name",
      "post": "Manager",
      "departmentId": "xQQrzRgi8",
      "dateCreated": "2022-07-12T13:09:16.270Z",
      "dateModified": "2022-07-12T13:09:16.270Z"
    },
    {
      "_id": "mNkyaB6jGPw7KB",
      "name": "Test2 name",
      "post": "Manager",
      "departmentId": "56sgAeKfx",
      "dateCreated": "2022-07-12T13:09:16.270Z",
      "dateModified": "2022-07-12T13:09:16.270Z"
    }
    

**Department collection having data like below:**

 

```
    {
      "_id": "xQQrzRgi8",
      "departmentName": "Testing department"
    },
    {
      "_id": "56sgAeKfx",
      "departmentName": "HR department"
    }
```

**In response of Employee data we want department name with departmentId like below we want response:**

 

```
{
    "_id": "kcXtyaB7jGPw9Ks",
    "dateCreated": "2022-07-12T13:09:16.270Z",
    "dateModified": "2022-07-12T13:09:16.270Z",
    "departmentId": "xQQrzRgi8",
    "departmentName": "Testing department",
    "name": "Test name",
    "post": "Manager"
  },
  {
    "_id": "mNkyaB6jGPw7KB",
    "dateCreated": "2022-07-12T13:09:16.270Z",
    "dateModified": "2022-07-12T13:09:16.270Z",
    "departmentId": "56sgAeKfx",
    "departmentName": "HR department",
    "name": "Test2 name",
    "post": "Manager"
  }
```

**For above solution we have to aggregate in MongoDB like below:** 

**Here is Example with Query**: https://mongoplayground.net/p/V-SC5pmKQR7

```
db.Employee.aggregate([
  {
    $lookup: {
      from: "Department",
      localField: "departmentId",
      foreignField: "_id",
      as: "departmentName",
    },
  },
  {
    $set: {
      departmentName: {
        $first: "$departmentName.departmentName"
      },   
    }, 
  }
])
```


**In response of employee data want department name only Instead departmentId Then Query will be like below:**

```
db.Employee.aggregate([
  {
    $lookup: {
      from: "Department",
      localField: "departmentId",
      foreignField: "_id",
      as: "departmentName",
    },
  },
  {
    $set: {
      departmentName: {
        $first: "$departmentName.departmentName"
      },
    },
  },
  {
    $project: {
      departmentId: 0
    },
  },
])
```

**HERE is Query with example:** https://mongoplayground.net/p/M4Nn7ud33KL

Happy coding!!!
How to install SSL on apache
Tags: devops, programming, webdev, beginners
Published: 2022-07-15 11:49:05


Steps to install SSL on apache

Navigate to Apache configuration files

```
/etc/httpd/conf
```

Here you will get httpd.conf file. First of all, you have to set the file permission to edit the file. After that, you have to create a new virtual directive into it. open your httpd.conf file and update the below code at the end of the file.

example how to install SSL on apache.

```
<VirtualHost *:443>
ServerName www.yourdomain.com
DocumentRoot YOURDOCUMENTROOT
SSLEngine on
SSLCertificateFile Path to certificate file
SSLCertificateKeyFile Path to key file
</VirtualHost>
```
In the Above code replace your domain name and certificate file paths.Save the above file and restart the apache by command.

```
Sudo service httpd restart
```
After restarting the server you may face below listed error
```
Starting httpd: AH00526: Syntax error on line 356 of /etc/httpd/conf/httpd.conf:
Invalid command 'SSLEngine', perhaps misspelled or defined by a module not included in the server configuration
```

Fire below command

```
yum install mod24_ssl 
```
After this command again restart your apache server. 
That's all :). 

Now your domain will work with HTTPS.


[install SSL on nginx](https://cmsinstallation.blogspot.com/2021/06/how-to-install-ssl-on-nginx.html)
Inline switch statements in javascript?
Tags: javascript, webdev, react, discuss
Published: 2022-07-15 11:35:44

In some languages like `C#` we have the possiblity of returning values from a `switch` statement or in functional like `Scala` we have pattern matching that is even better, making it more readable in case our goal is to return a value (even after some computation).

Javascript does not have such a function, natively.

---

Not a life changer, but I think it would be cool to be able to do something like

```ts
const result = switch(key) { case 'foo': 4 ...
```

A cool usage is in React when you're in need of a switch inside your JSX code.

Let's recap the advantages of such a thing:

- No need to reassign a variable
- Can use immutability with a const - safer code
- Can be easily used in JSX
- Can support validation in case there are duplicated cases
- No longer have bugs because you forgot to reassign, return or add break at the end

---

Mostly for fun, I created a little library to do so, you can already find it on https://www.npmjs.com/package/iswitch

Just run `npm install iswitch` in your project and you're good to go!

Some examples:
```ts
const myKey = 'foo';

// Single case
const result = iswitch(myKey, ['foo', () => 1], ['bar', () => 8]); // 1

// Multiple case
const result = iswitch(myKey, [['foo', 'bar'], () => 1]); // 1

// Default
const result = iswitch(myKey, [['bar'], () => 1], [[], () => 5]); // 5

```

---

What do you think? Will you stick to the usual switch or will you give this a try? Let me know!
What is CLS(Cumulative Layout Shift) the main part of Google Core Web Vitals?
Published: 2022-07-15 11:20:01

**CLS is the main part of Google Core Web Vitals.**
CLS is a measure of the largest burst of layout shift scores for every unexpected layout shift that occurs during the entire lifespan of a page.

A layout shift occurs any time a visible element changes its position from one rendered frame to the next.

A burst of layout shifts, known as a [session window](https://web.dev/evolving-cls/#why-a-session-window), is when one or more individual layout shifts occur in rapid succession with less than 1-second in between each shift and a maximum of 5 seconds for the total window duration.

The largest burst is the session window with the maximum cumulative score of all layout shifts within that window.

**

## What is a good CLS score?
**
To provide a good user experience, sites should strive to have a CLS score of 0.1 or less. To ensure you're hitting this target for most of your users, a good threshold to measure is the 75th percentile of page loads, segmented across mobile and desktop devices.


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/88y8ty8j218pz72hh8i1.png)
iOS — Animations in SwiftUI with Examples — Part 2
Tags: swift, swiftui, ios, iosdev
Published: 2022-07-15 11:12:50

**Wanna learn Canvas drawing and keyframe [animations](https://blog.canopas.com/animations-in-swiftui-with-examples-dfb616fe467f) using [SwiftUI](https://blog.canopas.com/swiftui-mvvm-state-management-in-a-simple-way-61efc8929b2f)?**

Hi guys, today we are going to explore how we can implement animations in SwiftUI. The full source code of this project is available on [Github](https://github.com/canopas/Swiftui-animations-examples), feel free to fork or directly use required animations in your applications.

**This post consists of 3 animations:**

1.  **Progress Dots animation** — 3 dots that go up and down in a rhythm

2. ** Pacman animation **—We all know and love Pacman right?

3. **TwinCircle animation** —Two circles animates horizontally while changing size and colors and kind of merge into one.

That’s it for today. Hope you learned something new!

This just touches the base of the SwiftUI animations. It’s possible to design much more complex animations using Canvas, animations API and Math.

For implementation details, visit [our company blog](https://blog.canopas.com/ios-animations-in-swiftui-with-examples-part-2-980a2df69145).