-
-
Notifications
You must be signed in to change notification settings - Fork 29
/
index.html
252 lines (212 loc) · 11 KB
/
index.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
<!DOCTYPE html>
<html style="height: 100%; margin: 0;">
<head>
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" >
<meta name="viewport" content="width=device-width" />
<link rel="stylesheet" data-name="vs/editor/editor.main" href="https://microsoft.github.io/monaco-editor/node_modules/monaco-editor/min/vs/editor/editor.main.css">
<title>🚨🚨 That's a lot of YAML 🚨🚨</title>
<style>
.nojs {
font-family: monospace;
white-space: pre;
padding: 0 2em;
}
</style>
</head>
<body style="height: calc(100% - 75px); margin: 35px 0 0 0;">
<div id="container" style="height: 100%" class="nojs">
# Made with 💖 by https://ghuntley.com after one too many CustomResourceDefinitions
# Improvements welcome, mash the ↗️ Octocat ↗️ and share how YAML makes your life better.
No:
Body:
Wants:
To:
Write:
- YAML
# 🤔 Why YAML is the right devops technology for you 🤔
#
# - 100% test coverage, always compiles just fine with no errors or warnings, always shippable
# - no enforced error handling during development because runtime "panic at the disco" in production is dope
# - "something broke" is way better than stack traces with line numbers
# - you need to burn hours as part of setting up a new CI pipeline
# - safe choice with unquestionable industry adoption, "used by kubernetes"
# - is marginally better than windows.ini
# - unlike json [1][2], YAML supports comments
# - no official documentation (other than a specification for implementers) is totally fine
# - you need a super safe way to "execute this code"
# 🍿 wait a sec, did you say "executable yaml"?? 🍿
# - https://ruby-doc.org/stdlib-2.4.0/libdoc/yaml/rdoc/YAML.html#module-YAML-label-Security
# - https://www.php.net/manual/en/function.yaml-parse.php#refsect1-function.yaml-parse-notes
# - https://securitylab.github.com/research/swagger-yaml-parser-vulnerability/
# - https://github.com/yaml/pyyaml/wiki/PyYAML-yaml.load(input)-Deprecation
# 🚨 Anyone who uses YAML long enough will eventually get burned when attempting to abbreviate Norway 🚨
# `NO` is parsed as a boolean type, which with the YAML 1.1 spec, there are 22 options to write "true" or "false."
# You have to wrap "NO" in quotes to get the expected result.
NI: Nicaragua
NL: Netherlands
NO: Norway # 💣!
# 🚨 Anyone wondering why their first seven Kubernetes clusters deploy just fine, and the eighth fails? 🚨
- 07
- 08
# Results in
[ 7, "08" ]
# YAML knows that, when you have something that looks like the time of day,
# what you _really_ wanted is the time of seconds since midnight
timeOfDay:
whatYouWrote: 04:30 # And when you parse this file and serialize it again, you get ...
whatYouSurelyMeant: 16200 # Have fun debugging this one!
whatYouShouldHaveWritten: !!str 04:30
# YAML is the super best way to encode Octal (tm) and learning the hard way that Kubernetes uses YAML 1.1
# is a DevOps rite of passage. Below YAML 1.2 a large integer is automatically converted to octal.
- YAML 1.1 uses `0666` notation.
- YAML 1.2 uses `0o666` notation
# 🤢 I have recently been learning GitHub Actions
#
# I just made 8 commits/pushes in one hour, and the last commit message, in its entirety, was:
#
# "I don't really like yml"
- https://twitter.com/eric_sink/status/1430954572848287744
# 😭 If SQL were built on YAML 😭
SELECT:
- num
- name
FROM:
- customers
WHERE EXISTS:
SELECT:
- name
FROM:
- orders
WHERE:
AND:
- EQUALS:
- customers.num
- orders.customer_num
- LT:
- price
- 50
# Speaking of CI, did you know that 8-character SHAs could be all numbers?
# If the system that parses `my.flaky_version` is typed, it will happily explode 2% of the time.
my:
# this will be a string ~98% of the time
flaky_version: ${GIT_SHORT_SHA}
# this will be a string ~100% of the time
string_version: "${GIT_SHORT_SHA}"
# him: "Look, I bought a box of DevOps"
# her: "You can't just buy a box of DevOps"
# 🤣 https://twitter.com/mike_kaufmann/status/1454712996933025794
# "Don't forget the extra line break otherwise all shit goes to hell"
# 👉 https://github.com/IronScheme/IronScheme/commit/2f847793946935bd9143cdfb064f9006f763df68
# 🤡 Doing the same thing with different CI providers 🤡
# Azure devops
jobs:
- job: job1
steps:
- script: chmod +x ./script.sh
- script: ./script.sh
# CircleCI
jobs:
job1:
steps:
- checkout
- run: "execute-script-for-job1"
# Some future CI system, probably
jobs:
- steps: job1
- step1:
- script: chmod +x ./script.sh
- step2:
- run: "execute-script-for-job1-inside-step2"
# If you're building a YAML file for Cloudformation for a DashboardBody for Cloudwatch
# and theres a SEARCH function? you need to escape the already-escaped and close the
# whole JSON with double-quotes:
"{
\"search(' var=\\\"blue\\\" .
# 🍻 Overhead in a pub
- The problem with YAML they did one thing well. Shitty boiler plate. Then everyone thought it was a good idea.
# 💊 Mega twitter thread of pain
# 👉 https://twitter.com/brunoborges/status/1098472238469111808 👈
# 📢 Mandatory reading 📢
#
# "Today we’re going to look at some general problems with the YAML format"
# 👉 https://arp242.net/yaml-config.html 👈
#
# "We replaced 1,000 lines of YAML with 10 structs and people started contributing again"
# 👉 https://tinyurl.com/lessons-in-over-engineering 👈
#
# "What if you used the same language and tools you use to define your app to define your infrastructure?"
# 👉 https://twitter.com/ellism/status/1008728148131733504 👈
#
# "A YAML file is almost always still 'valid' even if it is trunca"
# 👉 https://twitter.com/colmmacc/status/1057316977457324032 👈
#
# "the bug was that the YAML parser ignored the negative signs ... so negative GPS coordinates became positive ones"
# 👉 https://twitter.com/colmmacc/status/1063470541464461312 👈
#
# "Every YAML parser is a custom YAML parser"
# 👉 https://matrix.yaml.info/valid.html 👈
#
# "There are 63 different ways to write multi-line strings in YAML"
# 👉 https://stackoverflow.com/a/21699210/1094085 👈
# 💭 Alternative options and approaches to DevOps (cough yamlops cough) 💭
# - https://media.ccc.de/v/36c3-11172-leaving_legacy_behind
# - https://nickel-lang.org/
# - https://dhall-lang.org/
# - https://cuelang.org/
# - https://jsonnet.org/
# - https://www.youtube.com/watch?v=tl9I-R83lKo
# - https://github.com/xtruder/kubenix/tree/kubenix-2.0/examples/nginx-deployment
# - https://github.com/nin-jin/tree.d
# 🏁 If you are vendor of developer tooling that is configurable via YAML, please do this 🏁
# - https://twitter.com/kzu/status/1163864030911578112
# - https://twitter.com/timeyoutakeit/status/1431052862138769408
# 📖 Footnotes 📖
# [1] You can do comments in json by `{"//": "A way to use comments in json"}` but it's icky.
# [2] "Does ansible have a json schema? Yaml aint so bad with a schema."?
# and finally, here's some ⭐️⭐️⭐️⭐️⭐️ feedback from reddit.com:
- I need to burn the very motherboard this site runs from. It’s that awful.
- This is the worst website I've ever seen
- I agree with the author in principle but that website is inexcusable. I'm going to add YAML config to my projects on Monday just to spite that horrific "website".
- Wtf is this website and why does it repeatedly pop up my phone's keyboard
- This Website is a giant editable textfield
- Why?!?
- Because it’s a good idea to demonstrate good standards while standing on one’s soapbox
- The author of THAT website wants to tell the rest of us how to program.
- While I agree with the spirit of the website (fuck yaml), the design decisions of the author are questionable to say the least.
- The good news (I realised) was that you can select all the text of the site, and then delete it. Problem solved.
- Fuck this website. Maybe if this person stopped bitching about yaml their website wouldn't blow.
- Yeah, I’m not going to take advice on best practices from a guy whose website is a giant editable text field with unclickable hyperlinks.
# ps. By design, this website is as usable as YAML. 💕
</div>
<script>var require = { paths: { 'vs': 'https://microsoft.github.io/monaco-editor/node_modules/monaco-editor/min/vs' } };</script>
<script src="https://microsoft.github.io/monaco-editor/node_modules/monaco-editor/min/vs/loader.js"></script>
<script src="https://microsoft.github.io/monaco-editor/node_modules/monaco-editor/min/vs/editor/editor.main.nls.js"></script>
<script src="https://microsoft.github.io/monaco-editor/node_modules/monaco-editor/min/vs/editor/editor.main.js"></script>
<a href="https://github.com/ghuntley/noyaml" class="github-corner" aria-label="View source on Github"><svg width="80" height="80" viewBox="0 0 250 250" style="fill:#fff; color:#151513; position: absolute; top: 0; border: 0; right: 0;" aria-hidden="true"><path d="M0,0 L115,115 L130,115 L142,142 L250,250 L250,0 Z"></path><path d="M128.3,109.0 C113.8,99.7 119.0,89.6 119.0,89.6 C122.0,82.7 120.5,78.6 120.5,78.6 C119.2,72.0 123.4,76.3 123.4,76.3 C127.3,80.9 125.5,87.3 125.5,87.3 C122.9,97.6 130.6,101.9 134.4,103.2" fill="currentColor" style="transform-origin: 130px 106px;" class="octo-arm"></path><path d="M115.0,115.0 C114.9,115.1 118.7,116.5 119.8,115.4 L133.7,101.6 C136.9,99.2 139.9,98.4 142.2,98.6 C133.8,88.0 127.5,74.4 143.8,58.0 C148.5,53.4 154.0,51.2 159.7,51.0 C160.3,49.4 163.2,43.6 171.4,40.1 C171.4,40.1 176.1,42.5 178.8,56.2 C183.1,58.6 187.2,61.8 190.9,65.4 C194.5,69.0 197.7,73.2 200.1,77.6 C213.8,80.2 216.3,84.9 216.3,84.9 C212.7,93.1 206.9,96.0 205.4,96.6 C205.1,102.4 203.0,107.8 198.3,112.5 C181.9,128.9 168.3,122.5 157.7,114.1 C157.9,116.9 156.7,120.9 152.7,124.9 L141.0,136.5 C139.8,137.7 141.6,141.9 141.8,141.8 Z" fill="currentColor" class="octo-body"></path></svg></a><style>.github-corner:hover .octo-arm{animation:octocat-wave 560ms ease-in-out}@keyframes octocat-wave{0%,100%{transform:rotate(0)}20%,60%{transform:rotate(-25deg)}40%,80%{transform:rotate(10deg)}}@media (max-width:500px){.github-corner:hover .octo-arm{animation:none}.github-corner .octo-arm{animation:octocat-wave 560ms ease-in-out}}</style>
<script>
(function () {
// Exit early if the libraries have not loaded
if (!window.monaco)
return;
var container = document.getElementById('container');
var content = container.textContent.trim(); // Trim off the leading and trailing newline
// Clear the fallback content and styling
container.innerHTML = '';
container.className = '';
monaco.editor.create(container, {
value: content,
language: 'yaml',
fontSize: 13,
codeLens: false,
colorDecorators: false,
scrollBeyondLastLine: false,
minimap: {
enabled: false
},
automaticLayout: true
});
}());
</script>
</body>
</html>