Online version of the Labyrinth board game. The game server runs on the host's browser and networking happens peer-to-peer.
Run commands concurrently. Like `npm run watch-js & npm run watch-less` but better.
Detect table football score from camera image with machine vision
This isn't a bug in code but a note from the documentation. I'm opening this up for knowledge sharing purposes. We've used krane for deployments for a few years now. Along the way we've had a few incidents including downtime where rendering an empty output (due to error during rendering), caused deploy command to prune all resources.
I spotted two references from the documentation where piping is mentioned. First under Using templates:
If you want dynamic templates, you may render ERB with krane render and then pipe that result to krane deploy -f -.
Second under Deploy walkthrough:
You can test this out for yourself by running the following command:
krane render -f test/fixtures/hello-cloud --current-sha 1 | krane deploy my-namespace my-k8s-cluster -f -
As soon as you run this, you'll start seeing some output being streamed to STDERR.
The latter reference says "you can test this" but nevertheless it ended up being the command used for our production deployments.
Bash piping starts both commands at the same time (ref), so krane deploy
doesn't have a way to know that krane render
exited with non-zero exit code. We use -o pipefail
, but it doesn't help to prevent this scenario. It only affects on the final exit code of the pipeline operation (ref). --no-prune
would prevent this but it's not recommended with reasoning I agree with:
Not recommended, as it allows your namespace to accumulate cruft that is not reflected in your deploy directory.
Would you be up for a documentation PR that removes the piping recommendations and adds a warning about it? We changed the render-deploy one liner to two separate commands: 1) render ... > output.yml 2) deploy -f output.yml. This in combination with set -e
makes the deployments commands safe.
There could be alternative solutions. For example deploy
command requiring e.g. a single empty line written in stdin to prune resources, and render command would be changed to reflect this. I'm not that familiar with krane so take the suggestion with a grain of salt.
During last week the discharge rate changed. I've been expecting something like this. Still the linear regression looks like it could last ~8months total, but I'm guessing the actual number is ~4-5months.
Fixes #322.
I was able to confirm this fixing the issue on my Mac 12.6, ruby 3.2.0.
Use File.exist over deprecated File.exists
Update:
Visual tweak to min max temp
Make temp and precipitation graphs more visible
Allow overflow of fitted image
Revert "Remove error.png from version control"
This reverts commit f94a7f41961566e6ce50f6cd363dad0632823d54.
Remove error.png from version control
Don't show next trophy when spectating
Improve small rain graphs
Tune visual to fit actual screen
Improve day min max visual look
Improve day min max visual look
Restructure assets
Implement today and tomorrow temp and rain graphs with d3
Add precipitation histograms and temp dots to short term forecast
I investigated this further within my own HA dev environment.
History.scrollRestoration is 'auto' by default and not overridden within HA frontend so browser will try and restore the scroll position.
When testing how scrollRestoration should work with my own minimal HTML (copied at the bottom of this post if interested), I noticed browser requires a precise sequencing of history.pushState
vs rendering new content to DOM. My example HTML at the bottom works as "regular" static websites (no history.pushState or dynamic DOM content) do.
Possible fix ideas that came to my mind:
manual
and implement a new mechanism in HA frontend to save and restore previous scroll positions.To solve my immediate pain, I implemented a pretty horrible hack. I do not recommend copying this, but sharing it here if it helps solving the core issue. In our default dashboard, I added a visually hidden button-card custom card which allows running arbitrary JS in the user's browser once the page is loaded. In that JS I monkey patch the global window.history.pushState
to implement the second fix I suggested above.
type: custom:button-card
styles:
card:
- height: 0px
- opacity: 0
name: |
[[[
if (!window.__monkeyPatchDone) {
window.__previousScrollY = 0;
const originalPushState = window.history.pushState;
window.history.pushState = (state, unused, url) => {
console.log('Monkey patched pushState called!')
window.__previousScrollY = window.scrollY;
originalPushState.apply(window.history, [state, unused, url]);
setTimeout(() => window.scrollTo({ top: 0 }), 1)
}
window.addEventListener('popstate', (event) => {
// This trick covers user bouncing back and forward
const currScrollY = window.scrollY;
const prevScrollY = window.__previousScrollY
window.__previousScrollY = currScrollY;
if (Number.isFinite(prevScrollY)) {
setTimeout(() => {
window.scrollTo({
top: prevScrollY
})
console.log(`Scrolled to ${prevScrollY}`);
}, 5);
setTimeout(() => console.log('Scroll now', window.scrollY), 200)
}
});
window.history.scrollRestoration = 'manual';
window.__previousScrollY = window.scrollY;
console.log('Monkey patch done!')
}
window.__monkeyPatchDone = true;
]]]
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Test</title>
<script>
function items(n) {
const items = [];
for (let i = 0; i < n; ++i) {
items.push(i)
}
return items
}
const router = {
'/': () => {
const content = document.querySelector('#content')
// XXX: Don't copy this for real apps (XSS-unsafe)
content.innerHTML = `<ul class="red">
${items(100).map(i => {
return `<li>
<button id="#link${i}">Push state "Subview"</button>
</li>`
}).join('\n')}
</ul>`
const elems = document.querySelectorAll("li > button");
elems.forEach((el) => el.addEventListener('click', () => {
render('/subview/')
}))
},
'/subview/': () => {
const content = document.querySelector('#content')
content.innerHTML = `<ul class="red">
${items(100).map(i => {
return `<li>
<button id="#link${i}">Push state "Home"</button>
</li>`
}).join('\n')}
</ul>`
const elems = document.querySelectorAll("li > button");
elems.forEach((el) => el.addEventListener('click', () => {
render('/')
}))
}
}
function render(route, replace = false) {
document.querySelector('#content').innerHTML = ''
if (replace) {
history.replaceState({}, '', route)
} else {
history.pushState({}, '', route)
}
const fn = router[route]
if (!fn) {
throw new Error(`Route ${route} not found`)
}
setTimeout(fn, 0)
}
window.addEventListener('load', () => {
render('/', true)
})
</script>
<style>
html, body {
width: 100%;
}
#content {
width: 100%;
}
ul {
list-style: none;
}
ul, li {
width: 100%;
margin: 0;
padding: 0;
}
li {
padding: 10px 0;
}
ul > li:nth-child(even) {
background: #ddd;
}
</style>
</head>
<body>
<div id="content"></div>
</body>
</html>
title: Dev Home
views:
- path: default_view
title: Home
cards:
- type: vertical-stack
cards:
- type: markdown
content: >-
## Section 1
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
Suspendisse quis rhoncus nulla. Nulla vel odio pulvinar, dapibus
massa at, dictum orci. Vestibulum eu ullamcorper ex, eget
hendrerit est. In ex est, cursus et faucibus et, luctus ut est.
Fusce at risus sapien. Vivamus egestas hendrerit eros, rhoncus
semper sem vestibulum ut. Aliquam fringilla diam ac facilisis
finibus. Lorem ipsum dolor sit amet, consectetur adipiscing elit.
Etiam sed risus in ex ultricies tincidunt rutrum et mauris.
Suspendisse egestas ante vel nibh congue maximus et eget orci.
Phasellus sagittis interdum ipsum et feugiat.
Phasellus dapibus tempor libero, et aliquet nisl bibendum id.
Praesent gravida felis id turpis sagittis, lacinia dignissim risus
suscipit. Maecenas lorem tortor, consectetur nec aliquet ac,
lobortis at diam. Integer molestie cursus fermentum. Nulla ut ante
augue. Pellentesque ligula velit, congue in lacus vel, efficitur
semper neque. Morbi id sapien ac justo fermentum aliquet. Nam
tempus sem at mauris efficitur, id placerat tellus mattis. Integer
lectus enim, blandit at ligula at, placerat interdum orci. Integer
quam sapien, fermentum nec blandit et, pretium placerat est.
For more information see the [Markdown
Cheatsheet](https://commonmark.org/help).
- type: horizontal-stack
cards:
- show_name: true
show_icon: true
type: button
entity: ''
icon: mdi:arrow-right-thin-circle-outline
hold_action:
action: none
name: All lights
tap_action:
action: navigate
navigation_path: /lovelace/all-lights
- show_name: true
show_icon: true
type: button
tap_action:
action: navigate
navigation_path: /lovelace/kitchen
entity: ''
icon: mdi:arrow-right-thin-circle-outline
name: Kitchen
hold_action:
action: none
- type: markdown
content: >-
## Section 2
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
Suspendisse quis rhoncus nulla. Nulla vel odio pulvinar, dapibus
massa at, dictum orci. Vestibulum eu ullamcorper ex, eget
hendrerit est. In ex est, cursus et faucibus et, luctus ut est.
Fusce at risus sapien. Vivamus egestas hendrerit eros, rhoncus
semper sem vestibulum ut. Aliquam fringilla diam ac facilisis
finibus. Lorem ipsum dolor sit amet, consectetur adipiscing elit.
Etiam sed risus in ex ultricies tincidunt rutrum et mauris.
Suspendisse egestas ante vel nibh congue maximus et eget orci.
Phasellus sagittis interdum ipsum et feugiat.
For more information see the [Markdown
Cheatsheet](https://commonmark.org/help).
- type: horizontal-stack
cards:
- show_name: true
show_icon: true
type: button
entity: ''
icon: mdi:arrow-right-thin-circle-outline
hold_action:
action: none
name: All lights
tap_action:
action: navigate
navigation_path: /lovelace/all-lights
- show_name: true
show_icon: true
type: button
tap_action:
action: navigate
navigation_path: /lovelace/kitchen
entity: ''
icon: mdi:arrow-right-thin-circle-outline
name: Kitchen
hold_action:
action: none
- type: markdown
content: >-
## Section 3
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
Suspendisse quis rhoncus nulla. Nulla vel odio pulvinar, dapibus
massa at, dictum orci. Vestibulum eu ullamcorper ex, eget
hendrerit est. In ex est, cursus et faucibus et, luctus ut est.
Fusce at risus sapien. Vivamus egestas hendrerit eros, rhoncus
semper sem vestibulum ut. Aliquam fringilla diam ac facilisis
finibus. Lorem ipsum dolor sit amet, consectetur adipiscing elit.
Etiam sed risus in ex ultricies tincidunt rutrum et mauris.
Suspendisse egestas ante vel nibh congue maximus et eget orci.
Phasellus sagittis interdum ipsum et feugiat.
For more information see the [Markdown
Cheatsheet](https://commonmark.org/help).
- type: markdown
content: >-
The **Markdown** card allows you to write any text. You can style
it **bold**, *italicized*, ~strikethrough~ etc. You can do images,
links, and more.
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
Suspendisse quis rhoncus nulla. Nulla vel odio pulvinar, dapibus
massa at, dictum orci. Vestibulum eu ullamcorper ex, eget
hendrerit est. In ex est, cursus et faucibus et, luctus ut est.
Fusce at risus sapien. Vivamus egestas hendrerit eros, rhoncus
semper sem vestibulum ut. Aliquam fringilla diam ac facilisis
finibus. Lorem ipsum dolor sit amet, consectetur adipiscing elit.
Etiam sed risus in ex ultricies tincidunt rutrum et mauris.
Suspendisse egestas ante vel nibh congue maximus et eget orci.
Phasellus sagittis interdum ipsum et feugiat.
For more information see the [Markdown
Cheatsheet](https://commonmark.org/help).
- type: horizontal-stack
cards:
- show_name: true
show_icon: true
type: button
entity: ''
icon: mdi:arrow-right-thin-circle-outline
hold_action:
action: none
name: All lights
tap_action:
action: navigate
navigation_path: /lovelace/all-lights
- show_name: true
show_icon: true
type: button
tap_action:
action: navigate
navigation_path: /lovelace/kitchen
entity: ''
icon: mdi:arrow-right-thin-circle-outline
name: Kitchen
hold_action:
action: none
- theme: Backend-selected
title: Kitchen
path: kitchen
subview: true
badges: []
cards:
- type: vertical-stack
cards:
- type: markdown
content: '# Kitchen'
- show_name: true
show_icon: true
type: button
entity: ''
icon: mdi:arrow-left-thin-circle-outline
hold_action:
action: none
name: Navigate home (pushState)
tap_action:
action: navigate
navigation_path: /lovelace/default_view
- type: markdown
content: >-
The **Markdown** card allows you to write any text. You can style
it **bold**, *italicized*, ~strikethrough~ etc. You can do images,
links, and more.
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
Suspendisse quis rhoncus nulla. Nulla vel odio pulvinar, dapibus
massa at, dictum orci. Vestibulum eu ullamcorper ex, eget
hendrerit est. In ex est, cursus et faucibus et, luctus ut est.
Fusce at risus sapien. Vivamus egestas hendrerit eros, rhoncus
semper sem vestibulum ut. Aliquam fringilla diam ac facilisis
finibus. Lorem ipsum dolor sit amet, consectetur adipiscing elit.
Etiam sed risus in ex ultricies tincidunt rutrum et mauris.
Suspendisse egestas ante vel nibh congue maximus et eget orci.
Phasellus sagittis interdum ipsum et feugiat.
Mauris interdum pulvinar tortor, non finibus nisi vestibulum ac.
Proin dapibus felis porta, accumsan risus eget, mattis nisl.
Curabitur commodo imperdiet diam, eget sagittis mi feugiat sed.
Morbi felis lectus, gravida non commodo sit amet, gravida id
tellus. Morbi erat ipsum, tristique vitae rutrum vitae, convallis
a eros. Sed a sem elementum metus fermentum facilisis. Proin
ornare nisi tortor, vitae semper justo sagittis vitae. Maecenas
neque neque, tincidunt eget tempus id, pretium at purus. Class
aptent taciti sociosqu ad litora torquent per conubia nostra, per
inceptos himenaeos. Mauris volutpat ullamcorper dolor at tempus.
Nam volutpat, libero vel ultricies consequat, dui tortor imperdiet
magna, vel lobortis nulla leo id enim. Aenean non tempor odio, in
vulputate ante. Nulla tristique ligula vel nibh congue, sit amet
varius nibh dapibus. Suspendisse in nisl ac massa egestas
vulputate in vitae nunc.
Phasellus dapibus tempor libero, et aliquet nisl bibendum id.
Praesent gravida felis id turpis sagittis, lacinia dignissim risus
suscipit. Maecenas lorem tortor, consectetur nec aliquet ac,
lobortis at diam. Integer molestie cursus fermentum. Nulla ut ante
augue. Pellentesque ligula velit, congue in lacus vel, efficitur
semper neque. Morbi id sapien ac justo fermentum aliquet. Nam
tempus sem at mauris efficitur, id placerat tellus mattis. Integer
lectus enim, blandit at ligula at, placerat interdum orci. Integer
quam sapien, fermentum nec blandit et, pretium placerat est.
For more information see the [Markdown
Cheatsheet](https://commonmark.org/help).
- type: markdown
content: >-
The **Markdown** card allows you to write any text. You can style
it **bold**, *italicized*, ~strikethrough~ etc. You can do images,
links, and more.
Phasellus dapibus tempor libero, et aliquet nisl bibendum id.
Praesent gravida felis id turpis sagittis, lacinia dignissim risus
suscipit. Maecenas lorem tortor, consectetur nec aliquet ac,
lobortis at diam. Integer molestie cursus fermentum. Nulla ut ante
augue. Pellentesque ligula velit, congue in lacus vel, efficitur
semper neque. Morbi id sapien ac justo fermentum aliquet. Nam
tempus sem at mauris efficitur, id placerat tellus mattis. Integer
lectus enim, blandit at ligula at, placerat interdum orci. Integer
quam sapien, fermentum nec blandit et, pretium placerat est.
For more information see the [Markdown
Cheatsheet](https://commonmark.org/help).
- show_name: true
show_icon: true
type: button
entity: ''
icon: mdi:arrow-left-thin-circle-outline
hold_action:
action: none
name: Navigate home (pushState)
tap_action:
action: navigate
navigation_path: /lovelace/default_view
- type: markdown
content: >-
The **Markdown** card allows you to write any text. You can style
it **bold**, *italicized*, ~strikethrough~ etc. You can do images,
links, and more.
Phasellus dapibus tempor libero, et aliquet nisl bibendum id.
Praesent gravida felis id turpis sagittis, lacinia dignissim risus
suscipit. Maecenas lorem tortor, consectetur nec aliquet ac,
lobortis at diam. Integer molestie cursus fermentum. Nulla ut ante
augue. Pellentesque ligula velit, congue in lacus vel, efficitur
semper neque. Morbi id sapien ac justo fermentum aliquet. Nam
tempus sem at mauris efficitur, id placerat tellus mattis. Integer
lectus enim, blandit at ligula at, placerat interdum orci. Integer
quam sapien, fermentum nec blandit et, pretium placerat est.
For more information see the [Markdown
Cheatsheet](https://commonmark.org/help).
- show_name: true
show_icon: true
type: button
entity: ''
icon: mdi:arrow-left-thin-circle-outline
hold_action:
action: none
name: Navigate home (pushState)
tap_action:
action: navigate
navigation_path: /lovelace/default_view
- theme: Backend-selected
title: All lights
path: all-lights
subview: true
badges: []
cards:
- type: vertical-stack
cards:
- type: markdown
content: '# All lights'
- show_name: true
show_icon: true
type: button
entity: ''
icon: mdi:arrow-left-thin-circle-outline
hold_action:
action: none
name: Navigate home (pushState)
tap_action:
action: navigate
navigation_path: /lovelace/default_view
- type: markdown
content: >-
The **Markdown** card allows you to write any text. You can style
it **bold**, *italicized*, ~strikethrough~ etc. You can do images,
links, and more.
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
Suspendisse quis rhoncus nulla. Nulla vel odio pulvinar, dapibus
massa at, dictum orci. Vestibulum eu ullamcorper ex, eget
hendrerit est. In ex est, cursus et faucibus et, luctus ut est.
Fusce at risus sapien. Vivamus egestas hendrerit eros, rhoncus
semper sem vestibulum ut. Aliquam fringilla diam ac facilisis
finibus. Lorem ipsum dolor sit amet, consectetur adipiscing elit.
Etiam sed risus in ex ultricies tincidunt rutrum et mauris.
Suspendisse egestas ante vel nibh congue maximus et eget orci.
Phasellus sagittis interdum ipsum et feugiat.
Mauris interdum pulvinar tortor, non finibus nisi vestibulum ac.
Proin dapibus felis porta, accumsan risus eget, mattis nisl.
Curabitur commodo imperdiet diam, eget sagittis mi feugiat sed.
Morbi felis lectus, gravida non commodo sit amet, gravida id
tellus. Morbi erat ipsum, tristique vitae rutrum vitae, convallis
a eros. Sed a sem elementum metus fermentum facilisis. Proin
ornare nisi tortor, vitae semper justo sagittis vitae. Maecenas
neque neque, tincidunt eget tempus id, pretium at purus. Class
aptent taciti sociosqu ad litora torquent per conubia nostra, per
inceptos himenaeos. Mauris volutpat ullamcorper dolor at tempus.
Nam volutpat, libero vel ultricies consequat, dui tortor imperdiet
magna, vel lobortis nulla leo id enim. Aenean non tempor odio, in
vulputate ante. Nulla tristique ligula vel nibh congue, sit amet
varius nibh dapibus. Suspendisse in nisl ac massa egestas
vulputate in vitae nunc.
Phasellus dapibus tempor libero, et aliquet nisl bibendum id.
Praesent gravida felis id turpis sagittis, lacinia dignissim risus
suscipit. Maecenas lorem tortor, consectetur nec aliquet ac,
lobortis at diam. Integer molestie cursus fermentum. Nulla ut ante
augue. Pellentesque ligula velit, congue in lacus vel, efficitur
semper neque. Morbi id sapien ac justo fermentum aliquet. Nam
tempus sem at mauris efficitur, id placerat tellus mattis. Integer
lectus enim, blandit at ligula at, placerat interdum orci. Integer
quam sapien, fermentum nec blandit et, pretium placerat est.
For more information see the [Markdown
Cheatsheet](https://commonmark.org/help).
- type: markdown
content: >-
The **Markdown** card allows you to write any text. You can style
it **bold**, *italicized*, ~strikethrough~ etc. You can do images,
links, and more.
Phasellus dapibus tempor libero, et aliquet nisl bibendum id.
Praesent gravida felis id turpis sagittis, lacinia dignissim risus
suscipit. Maecenas lorem tortor, consectetur nec aliquet ac,
lobortis at diam. Integer molestie cursus fermentum. Nulla ut ante
augue. Pellentesque ligula velit, congue in lacus vel, efficitur
semper neque. Morbi id sapien ac justo fermentum aliquet. Nam
tempus sem at mauris efficitur, id placerat tellus mattis. Integer
lectus enim, blandit at ligula at, placerat interdum orci. Integer
quam sapien, fermentum nec blandit et, pretium placerat est.
For more information see the [Markdown
Cheatsheet](https://commonmark.org/help).
- show_name: true
show_icon: true
type: button
entity: ''
icon: mdi:arrow-left-thin-circle-outline
hold_action:
action: none
name: Navigate home (pushState)
tap_action:
action: navigate
navigation_path: /lovelace/default_view
- type: markdown
content: >-
The **Markdown** card allows you to write any text. You can style
it **bold**, *italicized*, ~strikethrough~ etc. You can do images,
links, and more.
Phasellus dapibus tempor libero, et aliquet nisl bibendum id.
Praesent gravida felis id turpis sagittis, lacinia dignissim risus
suscipit. Maecenas lorem tortor, consectetur nec aliquet ac,
lobortis at diam. Integer molestie cursus fermentum. Nulla ut ante
augue. Pellentesque ligula velit, congue in lacus vel, efficitur
semper neque. Morbi id sapien ac justo fermentum aliquet. Nam
tempus sem at mauris efficitur, id placerat tellus mattis. Integer
lectus enim, blandit at ligula at, placerat interdum orci. Integer
quam sapien, fermentum nec blandit et, pretium placerat est.
For more information see the [Markdown
Cheatsheet](https://commonmark.org/help).
- show_name: true
show_icon: true
type: button
entity: ''
icon: mdi:arrow-left-thin-circle-outline
hold_action:
action: none
name: Navigate home (pushState)
tap_action:
action: navigate
navigation_path: /lovelace/default_view