teleren/devto huggingface dataset:
How Big Brands are taking Marketing initiatives in the NFT world?
Tags: nft, marketing
Published: 2022-06-06 07:25:05

Metaverse & NFT are catching the imagination of people around the world. While the early adopters are making inroads into this lesser-known territory, it is largely an unexplored landscape with uncertainty & scepticism.  However, as consumers become more involved with the digital environment, which the future promises to hold, the brand owners & marketing team don’t want to be left behind, while their competition could rake in all the visibility they get as the first mover.
 
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/tmi9x4xwrepcfsys2fkq.jpg)
**What Is NFT?**

NFT (Non-Fungible Token) are non-interchangeable units of data that enable people or brands to tokenize digital files such as art, videos, audio & collectibles. NFT establishes ownership to an entity or a person at any point of time and is secured by the Ethereum blockchain. 

**Why is NFT valuable?**

As NFTs are minted (converting digital data into crypto collections or digital assets recorded on the blockchain) from JPEG, PNG, or GIF image formats, one may wonder how it will make a difference as they could take a screenshot of the NFT to store in their mobile or computer.  This is the same as walking into a gallery or museum to taking amazing digital pictures of works of art & claiming the value of the original. While there could be many ‘copies’, there will be only one owner with NFT who rightfully owns the asset. The NFT is like a ‘bill of copy’ within the blockchain which verifies who bought it, when and, if they later sold it, to whom. 

The buzz of NFT in marketing began with the auctioning off of the first digital-only NFT at Christie’s that sold for US $69.3 million. This led to brands experimenting with NFT, to be part of their marketing mix.

Some brands are releasing NFT collectibles on limited editions as a way to open up new revenue streams or raise money for a good cause, while others are using them as a way to boost their image, tell a story or reach a new audience.  With little data on acceptance or demand, the most common route taken by marketers had been auctioning their brand’s NFTs. 

**Click to Learn More :** [How Big Brands are taking Marketing initiatives in the NFT world](https://www.pixel-studios.com/blog/how-big-brands-are-taking-marketing-initiatives-in-the-nft-world/)
Reading GitHub secrets from GitHub actions using Golang
Tags: go, github, tutorial, testing
Published: 2022-06-06 07:18:11

Sometimes while doing CI/CD with GitHub Actions, you need to read environment variables stored in `GitHub Secrets` for your tests. Here I demonstrate how you can access `GitHub Secrets` stored in GitHub while doing CI/CD.

## Steps

- Go to **GitHub Repository > Settings**. From the left menu, selection **Secrets > Actions**

![Actions link](https://i.imgur.com/sFnQ2Zk.png)

- Select `New repository secret` and add a key-value pair. For our example, we have used the key name as `T1` and Value as `Hello world`. Then save it

![Save actions secret](https://i.imgur.com/MCPcOOU.png)

- Once you save it, it should be visible on the screen

![Secrets list](https://i.imgur.com/kcz1K0h.png)

- Now you need to add the secret in your GitHub Actions Workflow file. You need to call the secret using

```
env:
    T1: ${{secrets.T1}}
```

Here is my [Github Actions workflow](https://github.com/chilarai/go-env-github-actions/blob/master/.github/workflows/go.yml)

```
name: Go

on:
    push:
        branches: ["master"]
    pull_request:
        branches: ["master"]

env:
    T1: ${{secrets.T1}}

jobs:
    build:
        runs-on: ubuntu-latest
        steps:
            - uses: actions/checkout@v3

            - name: Set up Go
              uses: actions/setup-go@v3
              with:
                  go-version: 1.18

            - name: Build
              run: go build -v ./...

            - name: Test
              run: go test -v ./...

            - name: Environment list
              run: env

```

Once you do that, you should access this in your unit tests and code as

```
env1, err1 := os.LookupEnv("T1")
log.Println(env1, err1)
```

[Download source code](https://github.com/chilarai/go-env-github-actions)
Clickable SVG Demonstration
Tags: svg, css, transform, translate
Published: 2022-06-06 07:16:21

<p>Clicking on a section of this image creates an information box that looks like it starts where you click, then grows and appears in its final destination.  The information is customized to the section of image clicked.</p>

{% codepen https://codepen.io/terrifricker/pen/NWwgwxo %}
Angular - Array destructuring
Tags: angular, javascript, array, destructuring
Published: 2022-06-06 06:42:00

It's better to use array destructuring for some rxjs operators.

Instead of this:
```
return zip(paramOne$, paramTwo$).pipe(
     map((data) => { if(data[0]) {...} ...)})
);
```

You can do it by this:
```
return zip(paramOne$, paramTwo$).pipe(
     map(([paramOne, paramTwo]) => { if(paramOne) {...} ...)})
);
```
Ionic Angular: Project Structure Suggestion
Tags: angular, ionic, beginners, webdev
Published: 2022-06-06 06:13:49

I would like to share how I manage Ionic Angular project generally.

By using `ionic generate` command, we can get what Angular features are available in an Ionic Angular project:
```
> page 
  component 
  service 
  module 
  class 
  directive 
  guard 
  class 
  directive 
  guard 
  pipe 
  interface 
  enum 
```

I usually divide and group them according to their type (component, service, guard etc.) rather than use case. It can make the project structure cleaner and simplify the syntax of importing exported declarations or modules.

Here is an example of the structure I usually apply
```
src
├── app
    ├── components
        └── search
            ├── search.component.html
            ├── search.component.scss
            └── search.component.ts
    ├── directives
        ├── disable-click.directive.ts
        └── highlight.directive.ts
    ├── enums
        ├── colors.ts
        └── genders.ts
    ├── guards
        └── auth.guard.ts
    ├── modals
        └── student-info
            ├── student-info.module.ts
            ├── student-info.page.html
            ├── student-info.page.scss
            └── student-info.page.ts
    ├── models
        └── student.ts
    ├── pages
        └── home
            ├── home-routing.module.ts
            ├── home.module.ts
            ├── home.page.html
            ├── home.page.scss
            └── home.page.ts
        └── login
            ├── login-routing.module.ts
            ├── login.module.ts
            ├── login.page.html
            ├── login.page.scss
            └── login.page.ts
    ├── pipes
        └── date.pipe.ts
    ├── services
        ├── auth.service.ts
        └── env.service.ts
    ├── utils
        ├── animations.ts
        └── validators.ts
├── assets
├── environments
├── theme
├── global.scss
├── index.html
├── main.ts
├── polyfills.ts
├── test.ts
└── zone-flags.ts
``` 

## Key Points
`components`: This folder consists of all non-page components that is without module.

`directives`: This folder consists of all Angular directives.

`enums`: This folder consists of all enums.

`guards`: This folder consists of all Angular guards.

`modals`: This folder consists of all page components that is not used for routing but for Ionic modal.

`models`: This folder consists of all classes that is used to represent MVC's model or so-called DTO (Data Transfer Object).

`pages`: This folder consists of all page components that should be used for routing.

`pipes`: This folder consists of all Angular pipes.

`services`: This folder consists of all Angular injectable services.

`utils`: This folder consists of all helper classes or functions.

## Example
I did not create an example project to demonstrate this structure, but you can take my Ionic app - [Simple QR](https://github.com/tomfong/simple-qr) as a real-world reference.

Hope this can help you. Happy coding!
Remove All Adjacent Duplicates in String II
Tags: leetcode, dsa, theabbie
Published: 2022-06-06 06:30:41

You are given a string `s` and an integer `k`, a `k` **duplicate removal** consists of choosing `k` adjacent and equal letters from `s` and removing them, causing the left and the right side of the deleted substring to concatenate together.

We repeatedly make `k` **duplicate removals** on `s` until we no longer can.

Return the final string after all such duplicate removals have been made. It is guaranteed that the answer is unique.

**Example 1:**

**Input:** s = "abcd", k = 2
**Output:** "abcd"
**Explanation:** There's nothing to delete.

**Example 2:**

**Input:** s = "deeedbbcccbdaa", k = 3
**Output:** "aa"
**Explanation:** 
First delete "eee" and "ccc", get "ddbbbdaa"
Then delete "bbb", get "dddaa"
Finally delete "ddd", get "aa"

**Example 3:**

**Input:** s = "pbbcggttciiippooaais", k = 2
**Output:** "ps"

**Constraints:**

*   `1 <= s.length <= 105`
*   `2 <= k <= 104`
*   `s` only contains lower case English letters.

**SOLUTION:**

    class Solution:
        def removeDuplicates(self, s: str, k: int) -> str:
            stack = []
            for c in s:
                if len(stack) == 0 or c != stack[-1][0]:
                    stack.append([c, 1])
                else:
                    stack[-1][1] += 1
                    if stack[-1][1] == k:
                        stack.pop()
            return "".join([c[0] * c[1] for c in stack])
How to log query in Postgres container Docker to CSV file
Tags: postgres
Published: 2022-06-06 06:02:31

When I work with API that affects many tables in the database, It kinda frustrating to track them one by one in my backend code. So this solution saves me a lot of time.

first, you need to get into a running Postgres container 

use `docker ps` to find your docker name 

```
docker exec -it NAME_OF_CONTAINER bash
```

now you are in root path, go in side Postgres by running this 

```
psql -U YOUR_POSTGRES_USERNAME
```

locate config file by this command then exit with `\q`

```
postgres=# SHOW config_file;
postgres-# \q
```

I gonna use vim to edit the file. you can use nano if you like. Install by this command
```
apt-get update
apt-get install vim
```

after you exit from Postgres now you are in root path again go config file that you locate. mine was
`/var/lib/postgresql/data/postgresql.conf`

```
cd /var/lib/postgresql/data/
vi postgresql.conf
```

press `/` in vim to find `ERROR REPORTING AND LOGGING`
uncomment by remove `#`

##### in "Where to Log" section
```
log_destination = 'csvlog'
logging_collector = on
log_directory = 'pg_log'
log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log'
```

##### in "What to Log" section
```
log_statement=all
```

read more about Where When What to log [here](https://www.postgresql.org/docs/current/runtime-config-logging.html)

save it and restart Postgres or exit container by typing `exit` then restart Postgres container instead.

```
docker restart NAME_OF_CONTAINER
```
 
Now it's time to test with your API !!

Log CSV file should be in `pg_log` directory in this path `/var/lib/postgresql/data/`

To copy CSV file from container Docker to your computer use this command.
eg. I gonna copy to ~/Downloads/docker-log directory.

```
docker cp NAME_OF_CONTAINER:/var/lib/postgresql/data/pg_log ~/Downloads/docker-log
```

I recommend you add a header column to CSV file that we got so it's easy to implement and use a tool like [csvkit](https://github.com/wireservice/csvkit) to filter data.

Thanks for reading.
Remove Invalid Parentheses
Tags: leetcode, dsa, theabbie
Published: 2022-06-06 06:00:43

Given a string `s` that contains parentheses and letters, remove the minimum number of invalid parentheses to make the input string valid.

Return _all the possible results_. You may return the answer in **any order**.

**Example 1:**

**Input:** s = "()())()"
**Output:** \["(())()","()()()"\]

**Example 2:**

**Input:** s = "(a)())()"
**Output:** \["(a())()","(a)()()"\]

**Example 3:**

**Input:** s = ")("
**Output:** \[""\]

**Constraints:**

*   `1 <= s.length <= 25`
*   `s` consists of lowercase English letters and parentheses `'('` and `')'`.
*   There will be at most `20` parentheses in `s`.

**SOLUTION:**

    class Solution:
        def isValid(self, s: str) -> bool:
            stack = []
            valid = True
            for bracket in s:
                if bracket == '(':
                    stack.append(bracket)
                elif bracket == ')':
                    if len(stack) > 0:
                        if stack.pop() + bracket != '()':
                            valid = False
                            break
                    else:
                        valid = False
                        break
            if len(stack) > 0:
                valid = False
            return valid
        
        def removeInvalidParentheses(self, s: str) -> List[str]:
            n = len(s)
            paths = [("", 0, 0)]
            btoi = { '(': 1, ')': -1 }
            i = 0
            mindels = n
            op = set()
            visited = set()
            while i < len(paths):
                curr, j, currctr = paths[i]
                if j == n:
                    if self.isValid(curr):
                        if n - len(curr) < mindels:
                            mindels = n - len(curr)
                            op = { curr }
                        elif n - len(curr) == mindels:
                            op.add(curr)
                if j < n and j - len(curr) <= mindels:
                    nctr = currctr + btoi.get(s[j], 0)
                    if nctr >= 0 and (curr + s[j], j + 1) not in visited:
                        visited.add((curr + s[j], j + 1))
                        paths.append((curr + s[j], j + 1, nctr))
                    if s[j] == '(' or s[j] == ')' and (curr, j + 1) not in visited:
                        visited.add((curr, j + 1))
                        paths.append((curr, j + 1, currctr))
                i += 1
            return list(op)
Enumeration types as bit flags
Tags: csharp, dotnet
Published: 2022-06-06 05:40:03

Enumeration typelar kombinatsiyasini ifodalashini xohlasek, ushbu tanlovlar uchun enum a'zolarini belgilashimiz kere. Ya'ni, bu enum a'zolarining bog'langan qiymatlari ikkining vakolatlari bo'lishi kerak. Keyin, siz bitli mantiqiy operatorlardan foydalanishingiz mumkin `|` yoki `&` mos ravishda tanlovlarni birlashtirish yoki tanlovlar birikmalarini kesish uchun. Sanoq turi bit maydonlarini e'lon qilishini ko'rsatish uchun unga **Flags** atributini qo'llang:

```
[Flags]
public enum Days
{
    None      = 0b_0000_0000,  // 0
    Monday    = 0b_0000_0001,  // 1
    Tuesday   = 0b_0000_0010,  // 2
    Wednesday = 0b_0000_0100,  // 4
    Thursday  = 0b_0000_1000,  // 8
    Friday    = 0b_0001_0000,  // 16
    Saturday  = 0b_0010_0000,  // 32
    Sunday    = 0b_0100_0000,  // 64
    Weekend   = Saturday | Sunday
}

public class FlagsEnumExample
{
    public static void Main()
    {
        Days meetingDays = Days.Monday | Days.Wednesday | Days.Friday;
        Console.WriteLine(meetingDays);
        // Output:
        // Monday, Wednesday, Friday

        Days workingFromHomeDays = Days.Thursday | Days.Friday;
        Console.WriteLine($"Join a meeting by phone on {meetingDays & workingFromHomeDays}");
        // Output:
        // Join a meeting by phone on Friday

        bool isMeetingOnTuesday = (meetingDays & Days.Tuesday) == Days.Tuesday;
        Console.WriteLine($"Is there a meeting on Tuesday: {isMeetingOnTuesday}");
        // Output:
        // Is there a meeting on Tuesday: False

        var a = (Days)37;
        Console.WriteLine(a);
        // Output:
        // Monday, Wednesday, Saturday
    }
}
```


yesli cho' [Enumeration types as bit flags](https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/builtin-types/enum)
iTech | The eCommerce Web App we built for the HackFest Hackathon 🚀🔥
Tags: codedamn, hackfest, hackathon, programming
Published: 2022-06-06 05:37:23

## iTech
iTech is the eCommerce website we built for the HackFest Hackathon. Sounds good right? Let's see what it is and how it started by who!

![Landing Page](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/o6uuv64kzon3avk3w961.jpeg)

## What exactly is iTech?
iTech is an eCommerce Web App that helps users to shop only tech related items that only come from the bestsellers.

## Who built this?
iTech is built by a team of 3 members named "Fantastic Frontend", they include
- Arjun Vijay Prakash(Leader + Full-Stack Dev)
- Agrim Singh(Designer + HTML/CSS Dev)
- Pratyush Yadav(Designer + HTML/CSS Dev)

## How old are we?
We are in Middle School aged 11-13 years old.

![Fantastic Frontend](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/qxdjbp0mkazksna0uq6o.jpeg)

## Tech Stack
iTech is built with ReactJS, TailwindCSS and Firebase Authentication.
Check If It Is a Straight Line
Tags: leetcode, dsa, theabbie
Published: 2022-06-06 05:00:54

You are given an array `coordinates`, `coordinates[i] = [x, y]`, where `[x, y]` represents the coordinate of a point. Check if these points make a straight line in the XY plane.

**Example 1:**

![](https://assets.leetcode.com/uploads/2019/10/15/untitled-diagram-2.jpg)

**Input:** coordinates = \[\[1,2\],\[2,3\],\[3,4\],\[4,5\],\[5,6\],\[6,7\]\]
**Output:** true

**Example 2:**

**![](https://assets.leetcode.com/uploads/2019/10/09/untitled-diagram-1.jpg)**

**Input:** coordinates = \[\[1,1\],\[2,2\],\[3,4\],\[4,5\],\[5,6\],\[7,7\]\]
**Output:** false

**Constraints:**

*   `2 <= coordinates.length <= 1000`
*   `coordinates[i].length == 2`
*   `-10^4 <= coordinates[i][0], coordinates[i][1] <= 10^4`
*   `coordinates` contains no duplicate point.

**SOLUTION:**

    class Solution:
        def gcd(self, a, b):
            while b:
                a, b = b, a % b
            return a
        
        def checkStraightLine(self, coordinates: List[List[int]]) -> bool:
            n = len(coordinates)
            m = None
            for i in range(1, n):
                dy = coordinates[i][1] - coordinates[0][1]
                dx = coordinates[i][0] - coordinates[0][0]
                sign = -1 if (dx >= 0) ^ (dy >= 0) else 1
                if dx == 0 or dy == 0:
                    sign = 1
                curr = (sign, abs(dy), abs(dx))
                mul = self.gcd(curr[1], curr[2])
                if mul > 0:
                    curr = (curr[0], curr[1] // mul, curr[2] // mul)
                if m:
                    if curr != m:
                        return False
                else:
                    m = curr
            return True
Multi-Regional Private API Implementation
Tags: cloud, multiregional, api, aws
Published: 2022-06-06 04:54:24

Amazon Web Services (AWS)’ 𝙜𝙡𝙤𝙗𝙖𝙡 𝙞𝙣𝙛𝙧𝙖𝙨𝙩𝙧𝙪𝙘𝙩𝙪𝙧𝙚 enables customers to support applications with 𝙣𝙚𝙖𝙧-𝙯𝙚𝙧𝙤 recovery time objective (𝙍𝙏𝙊) requirements. 

𝘾𝙪𝙨𝙩𝙤𝙢𝙚𝙧𝙨 𝙘𝙖𝙣 𝙧𝙪𝙣 𝙬𝙤𝙧𝙠𝙡𝙤𝙖𝙙𝙨 in multiple Regions, in a multi-site active/active manner, and serve traffic from all Regions. To do so, 𝙙𝙚𝙫𝙚𝙡𝙤𝙥𝙚𝙧𝙨 𝙤𝙛𝙩𝙚𝙣 𝙢𝙪𝙨𝙩 𝙞𝙢𝙥𝙡𝙚𝙢𝙚𝙣𝙩 𝙥𝙧𝙞𝙫𝙖𝙩𝙚 𝙢𝙪𝙡𝙩𝙞-𝙧𝙚𝙜𝙞𝙤𝙣𝙖𝙡 𝘼𝙋𝙄𝙨 for use by the applications.

Using Amazon Web Services (AWS) 𝙎𝙚𝙧𝙫𝙚𝙧𝙡𝙚𝙨𝙨 𝘼𝙥𝙥𝙡𝙞𝙘𝙖𝙩𝙞𝙤𝙣 𝙈𝙤𝙙𝙚𝙡 (𝘼𝙒𝙎 𝙎𝘼𝙈), we could implement a 𝙈𝙪𝙡𝙩𝙞-𝙍𝙚𝙜𝙞𝙤𝙣𝙖𝙡 𝙋𝙧𝙞𝙫𝙖𝙩𝙚 𝘼𝙋𝙄 using API Gateway with 𝙘𝙪𝙨𝙩𝙤𝙢 𝙙𝙤𝙢𝙖𝙞𝙣 𝙣𝙖𝙢𝙚𝙨. 


This approach 𝙖𝙡𝙡𝙤𝙬𝙨 𝙙𝙚𝙫𝙚𝙡𝙤𝙥𝙚𝙧𝙨 to:
(1) make their internal applications and 𝙬𝙤𝙧𝙠𝙡𝙤𝙖𝙙𝙨 𝙢𝙤𝙧𝙚 𝙧𝙚𝙨𝙞𝙡𝙞𝙚𝙣𝙩,
(2) 𝙧𝙚𝙖𝙘𝙩 𝙩𝙤 𝙙𝙞𝙨𝙧𝙪𝙥𝙩𝙞𝙤𝙣𝙨, and 
(3) meet their 𝙙𝙞𝙨𝙖𝙨𝙩𝙚𝙧 𝙧𝙚𝙘𝙤𝙫𝙚𝙧𝙮 𝙨𝙘𝙚𝙣𝙖𝙧𝙞𝙤 objectives.


Thanks to Eric Johnson and Giedrius Praspaliauskas for their blog post:
𝘽𝙪𝙞𝙡𝙙𝙞𝙣𝙜 𝙧𝙚𝙨𝙞𝙡𝙞𝙚𝙣𝙩 𝙥𝙧𝙞𝙫𝙖𝙩𝙚 𝘼𝙋𝙄𝙨 𝙪𝙨𝙞𝙣𝙜 𝘼𝙢𝙖𝙯𝙤𝙣 𝘼𝙋𝙄 𝙂𝙖𝙩𝙚𝙬𝙖𝙮
https://aws.amazon.com/blogs/compute/building-resilient-private-apis-using-amazon-api-gateway/

𝙎𝙩𝙖𝙮 𝙩𝙪𝙣𝙚𝙙 𝙗𝙮 𝙛𝙤𝙡𝙡𝙤𝙬𝙞𝙣𝙜
https://www.linkedin.com/feed/hashtag/?keywords=did_you_know_that

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

https://www.linkedin.com/posts/mahmoudrabie2004_building-resilient-private-apis-using-amazon-activity-6939438092105728000-DEqn?utm_source=linkedin_share&utm_medium=member_desktop_web
Asteroid Trivia ☄️🐋
Tags: webdev, react, javascript, programming
Published: 2022-06-06 04:44:36

> Facts About Asteroids

## Project Overview

Asteroid trivia is a frontend project developed in 36 hours for the codedamn hackathon. In the website, you can see real data from NASA about asteroids together with size and speed comparisons with Animals. More details down below :) 

---

## About us

We are computer science students at UNESP, São Paulo State University, our team is consisting of [Cassiano Rodrigues](https://www.linkedin.com/in/kszinhu/) who has a background in Sap and 1 year of Ruby, JavaScript, MySQL, CSS, HTML, Bootstrap, AngularJS and React, [Kauã Steliano](https://www.linkedin.com/in/kaua-steliano/) who has experience of 2.5 years of Node.js, React Native and Typescript and [Vinicius Fiedler](https://www.linkedin.com/in/vinicius-fiedler) with 1.5 years of C, C++, and python. 

## Project Details

Projects without themes are hard to start with but they stimulate our creativity. That is why in this project we think creatively and let our imagination flow. 
 
Asteroid Trivia has a clean design and a straightforward proposition: show information about asteroids but in a remarkably interesting way. But just showing large numbers does not make us aware of the magnitude of those space objects. 
 
For this reason, we decided to compare their data with animals' data.  For example, we show approximately how many aligned blue whales would be necessary to achieve the average asteroid’s diameter.

## Used Resources
 
We used [Nasa’s API Asteroids – NeoWs](https://api.nasa.gov/) (Near-Earth Object Web Service) to get reliable data about asteroids including their id, name, diameter, speed, last approach, and if it is hazardous. 
 
We utilized the playground from [Codedamn](http://codedamn.com) to develop the project with a better workflow.
 
The main technologies that we have used to create our web app were React.js, with some helpful libraries such as styled-components, to better organize our CSS code and application as a whole,  font-awesome to get pretty icons and Framer motion, to implement some neat planet animations. 🌌
 
We have also used Axios, a promise-based HTTP client, to better organize our API calls and avoid code duplication. allowing us to communicate with APIs easily in our React apps.

[Github Repository](https://github.com/stelianok/codedamn-hackathon-project)

[Asteroid Trivia](https://asteroid-trivia-client-1a42-51rh07lta-stelianok.vercel.app/)
small-static-http
Tags: php, swoole, showdev
Published: 2022-06-06 04:41:35

small-static-http is a small http server, get reponse very fast by caching all static content in memory (response from localhost < 8ms).

Useful for fast serving single page applications.

[github](https://github.com/sebk69/small-static-http)
[docker](https://hub.docker.com/r/sebk69/small-static-http)