From a56242b8184a520866ff10a24cb0a3c809a7f0b5 Mon Sep 17 00:00:00 2001 From: Davide Polonio Date: Mon, 26 Apr 2021 23:25:41 +0200 Subject: [PATCH 01/16] Add first article draft --- config.toml | 5 ++++- content/english/posts/hello-world.md | 18 ++++++++++++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) create mode 100644 content/english/posts/hello-world.md diff --git a/config.toml b/config.toml index 674f0d0..ea9144a 100644 --- a/config.toml +++ b/config.toml @@ -7,13 +7,16 @@ theme = "hermit" pygmentsCodefences = true pygmentsUseClasses = true rssLimit = 15 -copyright = "This work is licensed under a Creative Commons Attribution-ShareAlike 4.0 International 4.0 International License." +copyright = "This work is licensed under a Creative Commons Attribution-ShareAlike 4.0 International License." enableEmoji = true relativeUrls = true [author] name = "Davide Polonio" +[taxonomies] + tag = "tags" + [params] dateform = "2 Jan 2006" dateformShort = "2 Jan" diff --git a/content/english/posts/hello-world.md b/content/english/posts/hello-world.md new file mode 100644 index 0000000..a0659f9 --- /dev/null +++ b/content/english/posts/hello-world.md @@ -0,0 +1,18 @@ +--- +title: Hello world +description: The very first article of this blog +tags: +- blog +- tech +- hugo +--- + +If you are reading this it means either you are trying to understand who I'm +(are you a recruiter by any chance?) or you are simply bored. In any way, this +is the very first blog post, and it means you have come to the end of the road +(since this is the beginning). In this article I am going to write down my ideas +for this blog. I always loved to have a place where I can write down my thoughts +about a new technology, a new framework or what I did in order to achieve a goal +in a hobby project, but also where I can express my ideas regarding modern +dilemmas like privacy issues and decentralization. I am not the kind of guy who +likes social networks, so I never had the chance to express them. -- 2.40.1 From 3e5a6f67b4fa4d04881af98f9f185a4f83f4b4d3 Mon Sep 17 00:00:00 2001 From: Davide Polonio Date: Tue, 27 Apr 2021 22:27:41 +0200 Subject: [PATCH 02/16] Add basic CI integration --- .drone.yml | 14 ++++++++++++++ .markdownlint-cli2.yaml | 39 +++++++++++++++++++++++++++++++++++++++ package.json | 19 +++++++++++++++++++ 3 files changed, 72 insertions(+) create mode 100644 .drone.yml create mode 100644 .markdownlint-cli2.yaml create mode 100644 package.json diff --git a/.drone.yml b/.drone.yml new file mode 100644 index 0000000..e5b528c --- /dev/null +++ b/.drone.yml @@ -0,0 +1,14 @@ +kind: pipeline +type: docker +name: default + +steps: + - name: Lint checks + image: node:14.16-alpine + commands: + - npm install + - npm run lint + - name: Hugo build + image: klakegg/hugo:0.82.1-ext-alpine-ci + commands: + - hugo diff --git a/.markdownlint-cli2.yaml b/.markdownlint-cli2.yaml new file mode 100644 index 0000000..8d46f62 --- /dev/null +++ b/.markdownlint-cli2.yaml @@ -0,0 +1,39 @@ +# Disable some built-in rules +config: + no-inline-html: false + MD013: + code_block_line_length: 120 + MD024: + allow_different_nesting: true +# no-trailing-spaces: false +# no-multiple-blanks: false + +# Include a custom rule package +#customRules: +# - markdownlint-rule-titlecase + +# Fix any fixable errors +fix: false + +# Define a custom front matter pattern +#frontMatter: "[^]*<\/head>" + +# Define glob expressions to ignore +ignores: + - "*.autogen.md" + +# Use a plugin to recognize math +#markdownItPlugins: +# - +# - "@iktakahiro/markdown-it-katex" + +# Disable inline config comments +noInlineConfig: true + +# Disable progress on stdout +noProgress: true + +# Use a specific formatter +outputFormatters: + - + - markdownlint-cli2-formatter-default diff --git a/package.json b/package.json new file mode 100644 index 0000000..d265bd5 --- /dev/null +++ b/package.json @@ -0,0 +1,19 @@ +{ + "name": "bitdispenser.dev", + "version": "0.0.1", + "description": "Personal Hugo website", + "main": "none.js", + "scripts": { + "lint": "markdownlint-cli2 content/posts/" + }, + "repository": { + "type": "git", + "url": "git+https://git.poldebra.me/polpetta/bitdispenser.dev.git" + }, + "author": "Polonio Davide ", + "license": "CC-BY-SA 4.0", + "dependencies": {}, + "devDependencies": { + "markdownlint-cli2": "0.0.10", + } +} -- 2.40.1 From 3d4a37c17c340e14195e8d110e226e4853ebb613 Mon Sep 17 00:00:00 2001 From: Davide Polonio Date: Tue, 27 Apr 2021 22:29:54 +0200 Subject: [PATCH 03/16] Fix comma --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index d265bd5..bd1ec52 100644 --- a/package.json +++ b/package.json @@ -14,6 +14,6 @@ "license": "CC-BY-SA 4.0", "dependencies": {}, "devDependencies": { - "markdownlint-cli2": "0.0.10", + "markdownlint-cli2": "0.0.10" } } -- 2.40.1 From be267926b7a9f7471fbd0276f0f95e3cfd8000d0 Mon Sep 17 00:00:00 2001 From: Davide Polonio Date: Tue, 27 Apr 2021 22:35:01 +0200 Subject: [PATCH 04/16] Add submodules cloning --- .drone.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.drone.yml b/.drone.yml index e5b528c..999ce42 100644 --- a/.drone.yml +++ b/.drone.yml @@ -3,6 +3,10 @@ type: docker name: default steps: + - name: Submodules + image: alpine/git + commands: + - git submodule update --recursive --remote - name: Lint checks image: node:14.16-alpine commands: -- 2.40.1 From 996bc92876a8403758a135fded5366b45373d988 Mon Sep 17 00:00:00 2001 From: Davide Polonio Date: Tue, 27 Apr 2021 22:36:54 +0200 Subject: [PATCH 05/16] Add debug stuff --- .drone.yml | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/.drone.yml b/.drone.yml index 999ce42..1f85e34 100644 --- a/.drone.yml +++ b/.drone.yml @@ -3,16 +3,18 @@ type: docker name: default steps: - - name: Submodules + - name: submodules image: alpine/git commands: - git submodule update --recursive --remote - - name: Lint checks + - ls -lah + - ls -lah themes + - name: lint checks image: node:14.16-alpine commands: - npm install - npm run lint - - name: Hugo build + - name: hugo build image: klakegg/hugo:0.82.1-ext-alpine-ci commands: - hugo -- 2.40.1 From d2f179948334dc4ff173930e3bcb433bb0da744d Mon Sep 17 00:00:00 2001 From: Davide Polonio Date: Tue, 27 Apr 2021 22:44:55 +0200 Subject: [PATCH 06/16] Add lfs --- .drone.yml | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/.drone.yml b/.drone.yml index 1f85e34..dc4679c 100644 --- a/.drone.yml +++ b/.drone.yml @@ -3,12 +3,15 @@ type: docker name: default steps: + - name: lfs + image: alpine/git + commands: + - git lfs install + - git lfs pull - name: submodules image: alpine/git commands: - git submodule update --recursive --remote - - ls -lah - - ls -lah themes - name: lint checks image: node:14.16-alpine commands: -- 2.40.1 From 0836f87082c2000d68cc879d9bb1e307cce98070 Mon Sep 17 00:00:00 2001 From: Davide Polonio Date: Tue, 27 Apr 2021 22:46:08 +0200 Subject: [PATCH 07/16] Add lfs installation --- .drone.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.drone.yml b/.drone.yml index dc4679c..acfc34f 100644 --- a/.drone.yml +++ b/.drone.yml @@ -6,6 +6,7 @@ steps: - name: lfs image: alpine/git commands: + - apk add --no-cache git-lfs - git lfs install - git lfs pull - name: submodules -- 2.40.1 From f94c14a395ac684fe494c9430d52e23ec4bf848e Mon Sep 17 00:00:00 2001 From: Davide Polonio Date: Tue, 27 Apr 2021 22:47:25 +0200 Subject: [PATCH 08/16] Add debug --- .drone.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.drone.yml b/.drone.yml index acfc34f..ff43469 100644 --- a/.drone.yml +++ b/.drone.yml @@ -6,9 +6,11 @@ steps: - name: lfs image: alpine/git commands: + - ls -lah static/ - apk add --no-cache git-lfs - git lfs install - git lfs pull + - ls -lah static/ - name: submodules image: alpine/git commands: -- 2.40.1 From 7d6f6944785f65417d27e13af89b71ae7fb338fd Mon Sep 17 00:00:00 2001 From: Davide Polonio Date: Tue, 27 Apr 2021 22:48:24 +0200 Subject: [PATCH 09/16] We don't need lfs --- .drone.yml | 8 -------- 1 file changed, 8 deletions(-) diff --git a/.drone.yml b/.drone.yml index ff43469..ca6ddf7 100644 --- a/.drone.yml +++ b/.drone.yml @@ -3,14 +3,6 @@ type: docker name: default steps: - - name: lfs - image: alpine/git - commands: - - ls -lah static/ - - apk add --no-cache git-lfs - - git lfs install - - git lfs pull - - ls -lah static/ - name: submodules image: alpine/git commands: -- 2.40.1 From 7d39be48deb78b9ad091d8a0b6797981dbcde011 Mon Sep 17 00:00:00 2001 From: Davide Polonio Date: Tue, 27 Apr 2021 22:54:56 +0200 Subject: [PATCH 10/16] Change build name --- .drone.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.drone.yml b/.drone.yml index ca6ddf7..8c47ca3 100644 --- a/.drone.yml +++ b/.drone.yml @@ -1,6 +1,6 @@ kind: pipeline type: docker -name: default +name: build steps: - name: submodules -- 2.40.1 From 9ef3b2eb47ae3311ede9c0c53684cf6b29cea317 Mon Sep 17 00:00:00 2001 From: Davide Polonio Date: Tue, 27 Apr 2021 23:35:40 +0200 Subject: [PATCH 11/16] Add content to the first article --- content/english/posts/about-this-blog.md | 73 ++++++++++++++++++++++++ content/english/posts/hello-world.md | 18 ------ package.json | 2 +- 3 files changed, 74 insertions(+), 19 deletions(-) create mode 100644 content/english/posts/about-this-blog.md delete mode 100644 content/english/posts/hello-world.md diff --git a/content/english/posts/about-this-blog.md b/content/english/posts/about-this-blog.md new file mode 100644 index 0000000..5edbaad --- /dev/null +++ b/content/english/posts/about-this-blog.md @@ -0,0 +1,73 @@ +--- +title: About this blog +description: The very first article of this blog +tags: +- blog +- tech +- hugo +--- + +If you are reading this it means either you are trying to understand who I'm +(are you a recruiter by any chance?) or you are simply bored. In any way, this +is the very first blog post, and it means you have come to the end of the road +(since this is the beginning). I always loved to have a place where I can write +down my thoughts about a new technology, a framework or what I did in order to +achieve a goal in a hobby project. That is not all though: I was searching for a +place where I was also able to express my ideas regarding modern dilemmas like +privacy issues and decentralization. I am not the kind of guy who likes social +networks, so I never had the chance to express them. Until now. + +## How this blog is built + +### The website + +This blog is a very simple [Hugo](https://gohugo.io/) website. If you do not +know what it is, its basically a static website generator. It takes Markdown +documents and converts them in HTML pages. If you applied a specific theme then +it builds the page according to that theme. Hugo has a huge selection of themes +in his [dedicated page](https://themes.gohugo.io/), so basically picking up one +and starting from there is very simple. If you are curious about how I made it, +you can check out the source at my [personal git server +instance](https://git.poldebra.me/polpetta/bitdispenser.dev), where I started +hosting my code when [Microsoft bought +Github](https://news.microsoft.com/announcement/microsoft-acquires-github/). I +have simply picked up the simpler and cleanest blog theme out there, following +Ludwig Mies van der Rohe's idea: + +> less is more + +It will be a success if more than two people actually starts reading what I +write here, at least I want them to read without this blog without having their +eyes bleeding with an extravagant color combination. + +### Hosting + +The real problem of hosting a website nowday is not how to build it (as you can +see) but _where_ you can host it. There are plenty of cloud provides: AWS, +Google Cloud, DigitalOcean, Scaleway, etc... every day there is a new one +popping up. They all offers the possibility to host your website pretty easily, +especially if the website is a static one like this (e.g. using a S3 bucket). +Since I like challenges and I also like to learn new stuff, I though that +hosting the website in this way was boring. At the same time, I wanted to have a +good uptime and to not meddle too much under the hood. My (dream) requirements +were: +* always up +* good response time +* possibility to host as much data as I want +* using a hosting free as in beer and free as in freedom + +Now, reading this I imagine you are thinking I'm going crazy, and maybe I'm, but +that is not the case. In fact, multiple weeks prior to writing this article, +while trying to kill the boredom caused by COVID-19 lockdown, I discovered +[IPFS](https://ipfs.io/). I already heard of it at University, but I never +bothered too much to understand what was about. I though "well, it surely is +some sort of filesystem". I was somewhat right, but not the way I thought. + +IPFS acts like a peer-to-peer network, where nodes hash the content +they want to share to let other nodes grab it. You can grab this content using +your local node or using one of the many available gateways. Nodes can "pin" a +file too, in order to keep it locally and to serve it to other nodes. If a files +gets pinned by different nodes and gains traction it basically becomes +undeletable from the web. + + diff --git a/content/english/posts/hello-world.md b/content/english/posts/hello-world.md deleted file mode 100644 index a0659f9..0000000 --- a/content/english/posts/hello-world.md +++ /dev/null @@ -1,18 +0,0 @@ ---- -title: Hello world -description: The very first article of this blog -tags: -- blog -- tech -- hugo ---- - -If you are reading this it means either you are trying to understand who I'm -(are you a recruiter by any chance?) or you are simply bored. In any way, this -is the very first blog post, and it means you have come to the end of the road -(since this is the beginning). In this article I am going to write down my ideas -for this blog. I always loved to have a place where I can write down my thoughts -about a new technology, a new framework or what I did in order to achieve a goal -in a hobby project, but also where I can express my ideas regarding modern -dilemmas like privacy issues and decentralization. I am not the kind of guy who -likes social networks, so I never had the chance to express them. diff --git a/package.json b/package.json index bd1ec52..9042adc 100644 --- a/package.json +++ b/package.json @@ -11,7 +11,7 @@ "url": "git+https://git.poldebra.me/polpetta/bitdispenser.dev.git" }, "author": "Polonio Davide ", - "license": "CC-BY-SA 4.0", + "license": "CC-BY-SA-4.0", "dependencies": {}, "devDependencies": { "markdownlint-cli2": "0.0.10" -- 2.40.1 From 8bde138b531c541d7ba179d70f1335db805d80fd Mon Sep 17 00:00:00 2001 From: Davide Polonio Date: Tue, 27 Apr 2021 23:37:08 +0200 Subject: [PATCH 12/16] Ignore node_modules/ folder, add package-lock --- .gitignore | 1 + package-lock.json | 738 ++++++++++++++++++++++++++++++++++++++++++++++ package.json | 1 - 3 files changed, 739 insertions(+), 1 deletion(-) create mode 100644 package-lock.json diff --git a/.gitignore b/.gitignore index d89fa7d..9c6c972 100644 --- a/.gitignore +++ b/.gitignore @@ -8,3 +8,4 @@ hugo.exe hugo.darwin hugo.linux +node_modules/ diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..c30bfec --- /dev/null +++ b/package-lock.json @@ -0,0 +1,738 @@ +{ + "name": "bitdispenser.dev", + "version": "0.0.1", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "version": "0.0.1", + "license": "CC-BY-SA-4.0", + "devDependencies": { + "markdownlint-cli2": "0.0.10" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.4.tgz", + "integrity": "sha512-33g3pMJk3bg5nXbL/+CY6I2eJDzZAni49PfJnL5fghPTggPvBd/pFNSgJsdAgWptuFu7qq/ERvOYFlhvsLTCKA==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.4", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.4.tgz", + "integrity": "sha512-IYlHJA0clt2+Vg7bccq+TzRdJvv19c2INqBSsoOLp1je7xjtr7J26+WXR72MCdvU9q1qTzIWDfhMf+DRvQJK4Q==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.6.tgz", + "integrity": "sha512-8Broas6vTtW4GIXTAHDoE32hnN2M5ykgCpWGbuXHQ15vEMqr23pB76e/GZcYsZCHALv50ktd24qhEyKr6wBtow==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.4", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/entities": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.0.3.tgz", + "integrity": "sha512-MyoZ0jgnLvB2X3Lg5HqpFmn1kybDiIfEQmKzTb5apr51Rb+T3KdmMiqa70T+bhGnyv7bQ6WMj2QMHpGMmlrUYQ==", + "dev": true + }, + "node_modules/fast-glob": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.5.tgz", + "integrity": "sha512-2DtFcgT68wiTTiwZ2hNdJfcHNke9XOfnwmBRWXhmeKM8rF0TGwmC/Qto3S7RoZKp5cilZbxzO5iTNTQsJ+EeDg==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.0", + "merge2": "^1.3.0", + "micromatch": "^4.0.2", + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fastq": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.11.0.tgz", + "integrity": "sha512-7Eczs8gIPDrVzT+EksYBcupqMyxSHXXrHOLRRxU2/DicV8789MRBRR8+Hc2uWzUupOs4YS4JzBmBxjjCVBxD/g==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/globby": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.3.tgz", + "integrity": "sha512-ffdmosjA807y7+lA1NM0jELARVmYul/715xiILEjo3hBLPTcirgQNnXECn5g3mtR8TOLCVbkfua1Hpen25/Xcg==", + "dev": true, + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.1.1", + "ignore": "^5.1.4", + "merge2": "^1.3.0", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ignore": { + "version": "5.1.8", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", + "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/linkify-it": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-3.0.2.tgz", + "integrity": "sha512-gDBO4aHNZS6coiZCKVhSNh43F9ioIL4JwRjLZPkoLIY4yZFwg264Y5lu2x6rb1Js42Gh6Yqm2f6L2AJcnkzinQ==", + "dev": true, + "dependencies": { + "uc.micro": "^1.0.1" + } + }, + "node_modules/markdown-it": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-11.0.0.tgz", + "integrity": "sha512-+CvOnmbSubmQFSA9dKz1BRiaSMV7rhexl3sngKqFyXSagoA3fBdJQ8oZWtRy2knXdpDXaBw44euz37DeJQ9asg==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "entities": "~2.0.0", + "linkify-it": "^3.0.1", + "mdurl": "^1.0.1", + "uc.micro": "^1.0.5" + }, + "bin": { + "markdown-it": "bin/markdown-it.js" + } + }, + "node_modules/markdownlint": { + "version": "0.21.1", + "resolved": "https://registry.npmjs.org/markdownlint/-/markdownlint-0.21.1.tgz", + "integrity": "sha512-8kc88w5dyEzlmOWIElp8J17qBgzouOQfJ0LhCcpBFrwgyYK6JTKvILsk4FCEkiNqHkTxwxopT2RS2DYb/10qqg==", + "dev": true, + "dependencies": { + "markdown-it": "11.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/markdownlint-cli2": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/markdownlint-cli2/-/markdownlint-cli2-0.0.10.tgz", + "integrity": "sha512-tuWKncGgg0ic9YIWzPu1w2upoGNF/CQwb+CMzJmB8LMM2MhFKTUQSDyUt0kM022qs1R7KjxFXG7y5FBmqGVhUQ==", + "dev": true, + "dependencies": { + "globby": "~11.0.1", + "markdownlint": "~0.21.0", + "markdownlint-cli2-formatter-default": "~0.0.1", + "markdownlint-rule-helpers": "~0.12.0", + "micromatch": "~4.0.2", + "strip-json-comments": "~3.1.1", + "yaml": "~1.10.0" + }, + "bin": { + "markdownlint-cli2": "markdownlint-cli2.js" + }, + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/markdownlint-cli2-formatter-default": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/markdownlint-cli2-formatter-default/-/markdownlint-cli2-formatter-default-0.0.2.tgz", + "integrity": "sha512-jIz1X3SIC8sX4NDFqQFUXL+JEtfnDoN4i+xocEu+etcxGX455pHb6sx86f/yVk4mKJ2o7aNe2ydSx9an22BfBg==", + "dev": true, + "peerDependencies": { + "markdownlint-cli2": ">=0.0.4" + } + }, + "node_modules/markdownlint-rule-helpers": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/markdownlint-rule-helpers/-/markdownlint-rule-helpers-0.12.0.tgz", + "integrity": "sha512-Q7qfAk+AJvx82ZY52OByC4yjoQYryOZt6D8TKrZJIwCfhZvcj8vCQNuwDqILushtDBTvGFmUPq+uhOb1KIMi6A==", + "dev": true + }, + "node_modules/mdurl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", + "integrity": "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4=", + "dev": true + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "dev": true, + "dependencies": { + "braces": "^3.0.1", + "picomatch": "^2.2.3" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/picomatch": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.3.tgz", + "integrity": "sha512-KpELjfwcCDUb9PeigTs2mBJzXUPzAuP2oPcA989He8Rte0+YUAjw1JVedDhuTKPkHjSYzMN3npC9luThGYEKdg==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/uc.micro": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", + "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==", + "dev": true + }, + "node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "dev": true, + "engines": { + "node": ">= 6" + } + } + }, + "dependencies": { + "@nodelib/fs.scandir": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.4.tgz", + "integrity": "sha512-33g3pMJk3bg5nXbL/+CY6I2eJDzZAni49PfJnL5fghPTggPvBd/pFNSgJsdAgWptuFu7qq/ERvOYFlhvsLTCKA==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "2.0.4", + "run-parallel": "^1.1.9" + } + }, + "@nodelib/fs.stat": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.4.tgz", + "integrity": "sha512-IYlHJA0clt2+Vg7bccq+TzRdJvv19c2INqBSsoOLp1je7xjtr7J26+WXR72MCdvU9q1qTzIWDfhMf+DRvQJK4Q==", + "dev": true + }, + "@nodelib/fs.walk": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.6.tgz", + "integrity": "sha512-8Broas6vTtW4GIXTAHDoE32hnN2M5ykgCpWGbuXHQ15vEMqr23pB76e/GZcYsZCHALv50ktd24qhEyKr6wBtow==", + "dev": true, + "requires": { + "@nodelib/fs.scandir": "2.1.4", + "fastq": "^1.6.0" + } + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "requires": { + "path-type": "^4.0.0" + } + }, + "entities": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.0.3.tgz", + "integrity": "sha512-MyoZ0jgnLvB2X3Lg5HqpFmn1kybDiIfEQmKzTb5apr51Rb+T3KdmMiqa70T+bhGnyv7bQ6WMj2QMHpGMmlrUYQ==", + "dev": true + }, + "fast-glob": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.5.tgz", + "integrity": "sha512-2DtFcgT68wiTTiwZ2hNdJfcHNke9XOfnwmBRWXhmeKM8rF0TGwmC/Qto3S7RoZKp5cilZbxzO5iTNTQsJ+EeDg==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.0", + "merge2": "^1.3.0", + "micromatch": "^4.0.2", + "picomatch": "^2.2.1" + } + }, + "fastq": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.11.0.tgz", + "integrity": "sha512-7Eczs8gIPDrVzT+EksYBcupqMyxSHXXrHOLRRxU2/DicV8789MRBRR8+Hc2uWzUupOs4YS4JzBmBxjjCVBxD/g==", + "dev": true, + "requires": { + "reusify": "^1.0.4" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "globby": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.3.tgz", + "integrity": "sha512-ffdmosjA807y7+lA1NM0jELARVmYul/715xiILEjo3hBLPTcirgQNnXECn5g3mtR8TOLCVbkfua1Hpen25/Xcg==", + "dev": true, + "requires": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.1.1", + "ignore": "^5.1.4", + "merge2": "^1.3.0", + "slash": "^3.0.0" + } + }, + "ignore": { + "version": "5.1.8", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", + "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", + "dev": true + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "linkify-it": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-3.0.2.tgz", + "integrity": "sha512-gDBO4aHNZS6coiZCKVhSNh43F9ioIL4JwRjLZPkoLIY4yZFwg264Y5lu2x6rb1Js42Gh6Yqm2f6L2AJcnkzinQ==", + "dev": true, + "requires": { + "uc.micro": "^1.0.1" + } + }, + "markdown-it": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-11.0.0.tgz", + "integrity": "sha512-+CvOnmbSubmQFSA9dKz1BRiaSMV7rhexl3sngKqFyXSagoA3fBdJQ8oZWtRy2knXdpDXaBw44euz37DeJQ9asg==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "entities": "~2.0.0", + "linkify-it": "^3.0.1", + "mdurl": "^1.0.1", + "uc.micro": "^1.0.5" + } + }, + "markdownlint": { + "version": "0.21.1", + "resolved": "https://registry.npmjs.org/markdownlint/-/markdownlint-0.21.1.tgz", + "integrity": "sha512-8kc88w5dyEzlmOWIElp8J17qBgzouOQfJ0LhCcpBFrwgyYK6JTKvILsk4FCEkiNqHkTxwxopT2RS2DYb/10qqg==", + "dev": true, + "requires": { + "markdown-it": "11.0.0" + } + }, + "markdownlint-cli2": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/markdownlint-cli2/-/markdownlint-cli2-0.0.10.tgz", + "integrity": "sha512-tuWKncGgg0ic9YIWzPu1w2upoGNF/CQwb+CMzJmB8LMM2MhFKTUQSDyUt0kM022qs1R7KjxFXG7y5FBmqGVhUQ==", + "dev": true, + "requires": { + "globby": "~11.0.1", + "markdownlint": "~0.21.0", + "markdownlint-cli2-formatter-default": "~0.0.1", + "markdownlint-rule-helpers": "~0.12.0", + "micromatch": "~4.0.2", + "strip-json-comments": "~3.1.1", + "yaml": "~1.10.0" + } + }, + "markdownlint-cli2-formatter-default": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/markdownlint-cli2-formatter-default/-/markdownlint-cli2-formatter-default-0.0.2.tgz", + "integrity": "sha512-jIz1X3SIC8sX4NDFqQFUXL+JEtfnDoN4i+xocEu+etcxGX455pHb6sx86f/yVk4mKJ2o7aNe2ydSx9an22BfBg==", + "dev": true, + "requires": {} + }, + "markdownlint-rule-helpers": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/markdownlint-rule-helpers/-/markdownlint-rule-helpers-0.12.0.tgz", + "integrity": "sha512-Q7qfAk+AJvx82ZY52OByC4yjoQYryOZt6D8TKrZJIwCfhZvcj8vCQNuwDqILushtDBTvGFmUPq+uhOb1KIMi6A==", + "dev": true + }, + "mdurl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", + "integrity": "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4=", + "dev": true + }, + "merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true + }, + "micromatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "dev": true, + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.2.3" + } + }, + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true + }, + "picomatch": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.3.tgz", + "integrity": "sha512-KpELjfwcCDUb9PeigTs2mBJzXUPzAuP2oPcA989He8Rte0+YUAjw1JVedDhuTKPkHjSYzMN3npC9luThGYEKdg==", + "dev": true + }, + "queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true + }, + "reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true + }, + "run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "requires": { + "queue-microtask": "^1.2.2" + } + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + }, + "uc.micro": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", + "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==", + "dev": true + }, + "yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "dev": true + } + } +} diff --git a/package.json b/package.json index 9042adc..2eece5e 100644 --- a/package.json +++ b/package.json @@ -12,7 +12,6 @@ }, "author": "Polonio Davide ", "license": "CC-BY-SA-4.0", - "dependencies": {}, "devDependencies": { "markdownlint-cli2": "0.0.10" } -- 2.40.1 From 8e0c006ecd47a0642861a9cea996155efbbe6491 Mon Sep 17 00:00:00 2001 From: Davide Polonio Date: Tue, 18 May 2021 22:47:07 +0200 Subject: [PATCH 13/16] Finish first article --- .gitattributes | 2 + config.toml | 2 +- content/english/posts/about-this-blog.md | 73 ---------- content/english/posts/hello-world.md | 136 ++++++++++++++++++ .../content/hello-world/engiwithdispenser.png | 3 + static/content/hello-world/fleek.png | 3 + 6 files changed, 145 insertions(+), 74 deletions(-) delete mode 100644 content/english/posts/about-this-blog.md create mode 100644 content/english/posts/hello-world.md create mode 100644 static/content/hello-world/engiwithdispenser.png create mode 100644 static/content/hello-world/fleek.png diff --git a/.gitattributes b/.gitattributes index faf757d..262799b 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,2 +1,4 @@ *.png filter=lfs diff=lfs merge=lfs -text *.ico filter=lfs diff=lfs merge=lfs -text +*.jpg filter=lfs diff=lfs merge=lfs -text +*.jpeg filter=lfs diff=lfs merge=lfs -text diff --git a/config.toml b/config.toml index ea9144a..0f9af3c 100644 --- a/config.toml +++ b/config.toml @@ -21,7 +21,7 @@ relativeUrls = true dateform = "2 Jan 2006" dateformShort = "2 Jan" dateformNum = "02-01-2006" - dateformNumTime = "02-01-2006 15:04 -0700" + dateformNumTime = "02-01-2006" themeColor = "#494f5c" homeSubtitle = "Yet another ordered dispenser of bits" footerCopyright = ' · CC BY-SA 4.0' diff --git a/content/english/posts/about-this-blog.md b/content/english/posts/about-this-blog.md deleted file mode 100644 index 5edbaad..0000000 --- a/content/english/posts/about-this-blog.md +++ /dev/null @@ -1,73 +0,0 @@ ---- -title: About this blog -description: The very first article of this blog -tags: -- blog -- tech -- hugo ---- - -If you are reading this it means either you are trying to understand who I'm -(are you a recruiter by any chance?) or you are simply bored. In any way, this -is the very first blog post, and it means you have come to the end of the road -(since this is the beginning). I always loved to have a place where I can write -down my thoughts about a new technology, a framework or what I did in order to -achieve a goal in a hobby project. That is not all though: I was searching for a -place where I was also able to express my ideas regarding modern dilemmas like -privacy issues and decentralization. I am not the kind of guy who likes social -networks, so I never had the chance to express them. Until now. - -## How this blog is built - -### The website - -This blog is a very simple [Hugo](https://gohugo.io/) website. If you do not -know what it is, its basically a static website generator. It takes Markdown -documents and converts them in HTML pages. If you applied a specific theme then -it builds the page according to that theme. Hugo has a huge selection of themes -in his [dedicated page](https://themes.gohugo.io/), so basically picking up one -and starting from there is very simple. If you are curious about how I made it, -you can check out the source at my [personal git server -instance](https://git.poldebra.me/polpetta/bitdispenser.dev), where I started -hosting my code when [Microsoft bought -Github](https://news.microsoft.com/announcement/microsoft-acquires-github/). I -have simply picked up the simpler and cleanest blog theme out there, following -Ludwig Mies van der Rohe's idea: - -> less is more - -It will be a success if more than two people actually starts reading what I -write here, at least I want them to read without this blog without having their -eyes bleeding with an extravagant color combination. - -### Hosting - -The real problem of hosting a website nowday is not how to build it (as you can -see) but _where_ you can host it. There are plenty of cloud provides: AWS, -Google Cloud, DigitalOcean, Scaleway, etc... every day there is a new one -popping up. They all offers the possibility to host your website pretty easily, -especially if the website is a static one like this (e.g. using a S3 bucket). -Since I like challenges and I also like to learn new stuff, I though that -hosting the website in this way was boring. At the same time, I wanted to have a -good uptime and to not meddle too much under the hood. My (dream) requirements -were: -* always up -* good response time -* possibility to host as much data as I want -* using a hosting free as in beer and free as in freedom - -Now, reading this I imagine you are thinking I'm going crazy, and maybe I'm, but -that is not the case. In fact, multiple weeks prior to writing this article, -while trying to kill the boredom caused by COVID-19 lockdown, I discovered -[IPFS](https://ipfs.io/). I already heard of it at University, but I never -bothered too much to understand what was about. I though "well, it surely is -some sort of filesystem". I was somewhat right, but not the way I thought. - -IPFS acts like a peer-to-peer network, where nodes hash the content -they want to share to let other nodes grab it. You can grab this content using -your local node or using one of the many available gateways. Nodes can "pin" a -file too, in order to keep it locally and to serve it to other nodes. If a files -gets pinned by different nodes and gains traction it basically becomes -undeletable from the web. - - diff --git a/content/english/posts/hello-world.md b/content/english/posts/hello-world.md new file mode 100644 index 0000000..df18e5e --- /dev/null +++ b/content/english/posts/hello-world.md @@ -0,0 +1,136 @@ +--- +title: Hello world! +description: The very first article of this blog +tags: +- blog +- tech +- hugo +date: 2021-05-18T22:22:00+02:00 +--- + +If you are reading this it means either you are trying to understand who I am +(are you a recruiter by any chance?) or you are simply bored. In any way, this +is the very first blog post, and it means you have come to the end of the road +(since this is the beginning). I always loved to have a place where I can write +down my thoughts about a new technology, a framework or what I did in order to +achieve a goal in a hobby project. That is not all though: I was searching for a +place where I was also able to express my ideas regarding modern dilemmas like +privacy issues and decentralization. I am not the kind of guy who likes social +networks, so I never had the chance to express them. Until now. + +## How this blog is built + +### The website + +This blog is a very simple [Hugo](https://gohugo.io/) website. If you do not +know what it is, its basically a static website generator. It takes Markdown +documents and converts them in HTML pages. If you applied a specific theme then +it builds the page according to that theme. Hugo has a huge selection of themes +in its [dedicated themes page](https://themes.gohugo.io/), so basically picking +up one and starting from there is very simple. If you are curious about how I +made it, you can check out the source at my [personal git server +instance](https://git.poldebra.me/polpetta/bitdispenser.dev), where I started +hosting my code when [Microsoft bought +Github](https://news.microsoft.com/announcement/microsoft-acquires-github/) (you +can find a copy of the repository on Github too, visiting [my +profile](https://github.com/Polpetta)). I have simply picked up the simpler and +cleanest blog theme out there, following Ludwig Mies van der Rohe's idea: + +> less is more + +It will be a success if more than two people actually starts reading what I +write here, at least I want them to read this blog without having their +eyes bleeding with an extravagant color combination. + +Last but not least, the website icon is literally the Team Fortress 2 dispenser +(one of the games I love and one of the first game I started playing online as a +kid when a decent connection at home was finally available), taken from the RED +team and generated via a [favicon generator](https://realfavicongenerator.net/). +The name of the website partially came out from that, and from the fact that +basically every website is a dispenser of bits, and it is only thanks to our +beloved browsers we are able to actually "consume" what is distributed in the +first place. + +{{< figure src="/content/hello-world/engiwithdispenser.png" alt="Engineer with his dispenser" caption="Engineer class with a dispenser. Thanks to [Team Fortress wiki](https://wiki.teamfortress.com) for providing the image I shamelessly downloaded from them" >}} + +I hope Valve will not sue me for taking that assed as my website favicon. I +swear I will change it, a day. Pinky promise. + +### Hosting + +The real problem of hosting a website nowday is not how to build it (as you can +see) but _where_ you can host it. There are plenty of cloud provides: AWS, +Google Cloud, DigitalOcean, Scaleway, etc... every day there is a new one +popping up. They all offers the possibility to host your website pretty easily, +especially if the website is a static one like this (e.g. using a S3 bucket). +Since I like challenges and I also like to learn new stuff, I though that +hosting the website in this way was boring. At the same time, I wanted to have a +good uptime and to not meddle too much under the hood. My (dream) requirements +were: +* always up +* good response time +* possibility to host as much data as I want +* using a hosting free as in beer and (possibly) that could use free as in + freedom technologies + +Now, reading this I imagine you are thinking I am going crazy, and maybe I am, but +that is not the case. In fact, multiple weeks prior to writing this article, +while trying to kill the boredom caused by COVID-19 lockdown, I discovered +[IPFS](https://ipfs.io/). I already heard of it at University, but I never +bothered too much to understand what was about. I though "well, it surely is +some sort of filesystem". I was somewhat right, but not the way I thought. + +IPFS acts like a peer-to-peer network, where nodes hash the content +they want to share to let other nodes grab it. You can grab this content using +your local node or using one of the many available gateways. Nodes can "pin" a +file too, in order to keep it locally and to serve it to other nodes. If a file +gets pinned by different nodes and gains traction it basically becomes +undeletable from the web. + +#### Choosing the right tools + +Surely, as [the IPFS documentation +describes](https://docs.ipfs.io/how-to/websites-on-ipfs/multipage-website/), I +could have done it by myself. But there is a but. Holding all the infrastructure +manually means sacrifice the "always up" and "good response time" thingy for two +simple motives: + +1. the [server where I host my drafts & codebase](https://git.poldebra.me) is + hosted on a very small machine (2GB of RAM and 2vCPU), very easy to kill with + the slightest of loads +2. in order to achieve a good response time, a CDN or some sort of caching is + necessary (even if the application is stored in a distributed file system) + + +{{< figure src="/content/hello-world/fleek.png" caption="Fleek website, that I used to automate my deployment on IPFS and my DNS update" alt="The fleek website screenshot" class="right" >}} + +Finally, in order to achieve full automation with DNS updates, I would have +needed to implement and use NameCheap APIs (currently it is the DNS provider I +use for most of my websites). "What's the difficulty?" one would ask. [Here is +the official documentation](https://www.namecheap.com/support/api/intro/), and +even if the APIs look promising, while studing them my will to live decreased a +little bit, and so I decided that if I wanted to get up and running with less +maintenance as possible, with a good uptime while having the maximum +automatization possible I needed to rely on a dedicated service. Luckily +[fleek.co](https://fleek.co) was what I was searching for. They currently +provide the possibility to buy a domain from their website, giving them all the +hassle of updating the new website on IPFS, distributing it, refreshing a very +possible CDN and finally to update the DNS records accordingly. This, as you can +imagine, provides multiple benefits: + +* I do not have to care about my very little dev machine getting hugged to death + by request in the remote case any of my posts get any attention +* I do not have to focus on automating the process someone else has already done + for me +* I can focus on writing posts after dinner instead of scratching my head trying + to understand why the website does not load/the DNS is not properly updated + +## Future improvements + +For sure, this is only the beginning. Having an automatic workflow of spell +check, deployment and release would be the first milestone. Future features for +this website could be an automatic posting of every new article on a dedicated +Mastodon bot, so that people can possibly discuss about my thoughts on the +fediverse, a decentralized network. + +To conclude, the frequency of this blog will be...whenever I have time to post :grin: Of course I need content before posting something, and this require some time for myself for experimenting with new technologies and learning new stuff, so I do not expect very much posting, but only time will tell! diff --git a/static/content/hello-world/engiwithdispenser.png b/static/content/hello-world/engiwithdispenser.png new file mode 100644 index 0000000..f78e8d4 --- /dev/null +++ b/static/content/hello-world/engiwithdispenser.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f86668c8c920175a913fd5e0c9d71916e3866445561e1d0022bf01f326a063da +size 91140 diff --git a/static/content/hello-world/fleek.png b/static/content/hello-world/fleek.png new file mode 100644 index 0000000..8e52a71 --- /dev/null +++ b/static/content/hello-world/fleek.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7392daf8416f73cbd747154a21501a04498ec6893c2c46876449f4c8365cd69d +size 293702 -- 2.40.1 From 09cd0ba1a772e8f7fab26673f4455d19b55c30cd Mon Sep 17 00:00:00 2001 From: Davide Polonio Date: Tue, 18 May 2021 23:17:45 +0200 Subject: [PATCH 14/16] Fix lint --- content/english/posts/hello-world.md | 20 ++++++++++++++------ package.json | 2 +- 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/content/english/posts/hello-world.md b/content/english/posts/hello-world.md index df18e5e..33ed2f6 100644 --- a/content/english/posts/hello-world.md +++ b/content/english/posts/hello-world.md @@ -40,7 +40,7 @@ cleanest blog theme out there, following Ludwig Mies van der Rohe's idea: It will be a success if more than two people actually starts reading what I write here, at least I want them to read this blog without having their -eyes bleeding with an extravagant color combination. +eyes bleeding with an extravagant color combination. Last but not least, the website icon is literally the Team Fortress 2 dispenser (one of the games I love and one of the first game I started playing online as a @@ -51,7 +51,10 @@ basically every website is a dispenser of bits, and it is only thanks to our beloved browsers we are able to actually "consume" what is distributed in the first place. -{{< figure src="/content/hello-world/engiwithdispenser.png" alt="Engineer with his dispenser" caption="Engineer class with a dispenser. Thanks to [Team Fortress wiki](https://wiki.teamfortress.com) for providing the image I shamelessly downloaded from them" >}} +{{< figure src="/content/hello-world/engiwithdispenser.png" alt="Engineer with +his dispenser" caption="Engineer class with a dispenser. Thanks to [Team +Fortress wiki](https://wiki.teamfortress.com) for providing the image I +shamelessly downloaded from them" >}} I hope Valve will not sue me for taking that assed as my website favicon. I swear I will change it, a day. Pinky promise. @@ -67,6 +70,7 @@ Since I like challenges and I also like to learn new stuff, I though that hosting the website in this way was boring. At the same time, I wanted to have a good uptime and to not meddle too much under the hood. My (dream) requirements were: + * always up * good response time * possibility to host as much data as I want @@ -100,9 +104,10 @@ simple motives: the slightest of loads 2. in order to achieve a good response time, a CDN or some sort of caching is necessary (even if the application is stored in a distributed file system) - - -{{< figure src="/content/hello-world/fleek.png" caption="Fleek website, that I used to automate my deployment on IPFS and my DNS update" alt="The fleek website screenshot" class="right" >}} + +{{< figure src="/content/hello-world/fleek.png" caption="Fleek website, that I +used to automate my deployment on IPFS and my DNS update" alt="The fleek website +screenshot" class="right" >}} Finally, in order to achieve full automation with DNS updates, I would have needed to implement and use NameCheap APIs (currently it is the DNS provider I @@ -133,4 +138,7 @@ this website could be an automatic posting of every new article on a dedicated Mastodon bot, so that people can possibly discuss about my thoughts on the fediverse, a decentralized network. -To conclude, the frequency of this blog will be...whenever I have time to post :grin: Of course I need content before posting something, and this require some time for myself for experimenting with new technologies and learning new stuff, so I do not expect very much posting, but only time will tell! +To conclude, the frequency of this blog will be...whenever I have time to post +:grin: Of course I need content before posting something, and this require some +time for myself for experimenting with new technologies and learning new stuff, +so I do not expect very much posting, but only time will tell! diff --git a/package.json b/package.json index 2eece5e..258f3dc 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,7 @@ "description": "Personal Hugo website", "main": "none.js", "scripts": { - "lint": "markdownlint-cli2 content/posts/" + "lint": "markdownlint-cli2 content/" }, "repository": { "type": "git", -- 2.40.1 From 5c09f1ea0c615b4c1a2a42321b10a051e66211d3 Mon Sep 17 00:00:00 2001 From: Davide Polonio Date: Wed, 19 May 2021 10:09:27 +0200 Subject: [PATCH 15/16] Fix build & add downside aspects of using Fleek --- content/english/posts/hello-world.md | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/content/english/posts/hello-world.md b/content/english/posts/hello-world.md index 33ed2f6..bdb65c5 100644 --- a/content/english/posts/hello-world.md +++ b/content/english/posts/hello-world.md @@ -51,10 +51,10 @@ basically every website is a dispenser of bits, and it is only thanks to our beloved browsers we are able to actually "consume" what is distributed in the first place. -{{< figure src="/content/hello-world/engiwithdispenser.png" alt="Engineer with -his dispenser" caption="Engineer class with a dispenser. Thanks to [Team +{{< figure src="/content/hello-world/engiwithdispenser.png" alt=`Engineer with +his dispenser` caption=`Engineer class with a dispenser. Thanks to [Team Fortress wiki](https://wiki.teamfortress.com) for providing the image I -shamelessly downloaded from them" >}} +shamelessly downloaded from them` >}} I hope Valve will not sue me for taking that assed as my website favicon. I swear I will change it, a day. Pinky promise. @@ -105,9 +105,9 @@ simple motives: 2. in order to achieve a good response time, a CDN or some sort of caching is necessary (even if the application is stored in a distributed file system) -{{< figure src="/content/hello-world/fleek.png" caption="Fleek website, that I -used to automate my deployment on IPFS and my DNS update" alt="The fleek website -screenshot" class="right" >}} +{{< figure src="/content/hello-world/fleek.png" caption=`Fleek website, that I +used to automate my deployment on IPFS and my DNS update` alt=`The fleek website +screenshot` class="right" >}} Finally, in order to achieve full automation with DNS updates, I would have needed to implement and use NameCheap APIs (currently it is the DNS provider I @@ -129,6 +129,12 @@ imagine, provides multiple benefits: for me * I can focus on writing posts after dinner instead of scratching my head trying to understand why the website does not load/the DNS is not properly updated + +The only downside to this approach is that Fleek provides limitations on how +much data and bandwith you can host. At the time of writing, you can only host +up to 3GB (enough for this website) and have a 50GB bandwith (that's ok for now) +for the free version. [Upgrading you account](https://fleek.co/pricing/) to one +of the available plans give you extra space and bandwith. ## Future improvements -- 2.40.1 From 1eacafe1b398c9bcdda2983572cd062c0791d65d Mon Sep 17 00:00:00 2001 From: Davide Polonio Date: Wed, 19 May 2021 10:10:50 +0200 Subject: [PATCH 16/16] Remove submodules step in pipeline --- .drone.yml | 4 ---- 1 file changed, 4 deletions(-) diff --git a/.drone.yml b/.drone.yml index 8c47ca3..1ba824e 100644 --- a/.drone.yml +++ b/.drone.yml @@ -3,10 +3,6 @@ type: docker name: build steps: - - name: submodules - image: alpine/git - commands: - - git submodule update --recursive --remote - name: lint checks image: node:14.16-alpine commands: -- 2.40.1