Get Datasette Lite working without loading external resources

If I'm going to eventually have it work offline as a PWA:

#26

The first step is going to be having it work based entirely on files in this repository - with no external HTTP requests made at all.
I need that for both Pyodide and its WASM build as well as all of the Python wheels that Datasette Lite needs to install using micropip.

I think I've figured out how to do it: https://pyodide.org/en/stable/usage/loading-packages.html#installing-wheels-from-arbitrary-urls

Pure Python wheels can also be installed from any URL with micropip,
import micropip
micropip.install(
    'https://example.com/files/snowballstemmer-2.0.0-py2.py3-none-any.whl'
)

Micropip decides whether a file is a URL based on whether it ends in ".whl" or not.

Originally posted by @simonw in https://github.com/simonw/datasette-lite/issues/26#issuecomment-1215916845

For simplicity here I'm inclined to have this https://github.com/simonw/datasette-lite Git repository contain vendored copies of all of the dependencies needed to run Datasette Lite.
That way anyone who clones this repo will have everything they need to run Datasette Lite themselves.
I like the privacy benefits of having everything loaded from the same domain, with no requests made at all to other domains.

I used Firefox to fully load Datasette Lite, then copied out a HAR file from the network pane (13.5MB of JSON).
Then I ran this:
cat /tmp/har.json | jq '.log.entries | map(.request.url)'  | sort | uniq

Resulting in this:
  "https://cdn.jsdelivr.net/pyodide/v0.20.0/full/MarkupSafe-2.1.1-cp310-cp310-emscripten_wasm32.whl",
  "https://cdn.jsdelivr.net/pyodide/v0.20.0/full/PyYAML-6.0-cp310-cp310-emscripten_wasm32.whl",
  "https://cdn.jsdelivr.net/pyodide/v0.20.0/full/distutils.tar",
  "https://cdn.jsdelivr.net/pyodide/v0.20.0/full/micropip-0.1-py3-none-any.whl",
  "https://cdn.jsdelivr.net/pyodide/v0.20.0/full/openssl-1.1.1n.zip",
  "https://cdn.jsdelivr.net/pyodide/v0.20.0/full/packages.json",
  "https://cdn.jsdelivr.net/pyodide/v0.20.0/full/packaging-21.3-py3-none-any.whl",
  "https://cdn.jsdelivr.net/pyodide/v0.20.0/full/pluggy-1.0.0-py2.py3-none-any.whl",
  "https://cdn.jsdelivr.net/pyodide/v0.20.0/full/pyodide.asm.data",
  "https://cdn.jsdelivr.net/pyodide/v0.20.0/full/pyodide.asm.js",
  "https://cdn.jsdelivr.net/pyodide/v0.20.0/full/pyodide.asm.wasm",
  "https://cdn.jsdelivr.net/pyodide/v0.20.0/full/pyodide.js",
  "https://cdn.jsdelivr.net/pyodide/v0.20.0/full/pyodide_py.tar",
  "https://cdn.jsdelivr.net/pyodide/v0.20.0/full/pyparsing-3.0.7-py3-none-any.whl",
  "https://cdn.jsdelivr.net/pyodide/v0.20.0/full/setuptools-62.0.0-py3-none-any.whl",
  "https://cdn.jsdelivr.net/pyodide/v0.20.0/full/six-1.16.0-py2.py3-none-any.whl",
  "https://cdn.jsdelivr.net/pyodide/v0.20.0/full/ssl-1.0.0.zip",
  "https://cdn.jsdelivr.net/pyodide/v0.20.0/full/typing_extensions-4.1.1-py3-none-any.whl",
  "https://datasette.io/content.db",
  "https://files.pythonhosted.org/packages/04/a2/d918dcd22354d8958fe113e1a3630137e0fc8b44859ade3063982eacd2a4/idna-3.3-py3-none-any.whl",
  "https://files.pythonhosted.org/packages/09/73/06cd6609f6f01b2336f26654a1e62ca8d02a0fdb86ec1055904124d76992/asgi_csrf-0.9-py3-none-any.whl",
  "https://files.pythonhosted.org/packages/0a/98/98b3c6d954b6bd8531c611fb24be53ccc66438f493b05ec4b107942e27b7/Pint-0.18-py2.py3-none-any.whl",
  "https://files.pythonhosted.org/packages/0b/77/dbf4952b05efe08ab0ef4be14b6137717c00d0504f5a56ee6e80c010e6d0/click_default_group_wheel-1.2.2-py3-none-any.whl",
  "https://files.pythonhosted.org/packages/12/d0/d998e0b558fd5808a4fdb48e906e6f57a4fda2177fa11ba2a9d16248ce92/uvicorn-0.18.2-py3-none-any.whl",
  "https://files.pythonhosted.org/packages/20/9a/e5d9ec41927401e41aea8af6d16e78b5e612bca4699d417f646a9610a076/Jinja2-3.0.3-py3-none-any.whl",
  "https://files.pythonhosted.org/packages/2c/19/04f9b178c2d8a15b076c8b5140708fa6ffc5601fb6f1e975537072df5b2a/mergedeep-1.3.4-py3-none-any.whl",
  "https://files.pythonhosted.org/packages/4b/5b/6fc4a322c8ae1349d3cecf83f8412ec10a67b06b7518dea686cfef594b07/python_multipart-0.0.4-py3-none-any.whl",
  "https://files.pythonhosted.org/packages/50/0e/73f7c45526aebb98d4bf22b91da3e1347b3fd8ae9d338e2999f806d070f6/datasette-0.62-py3-none-any.whl",
  "https://files.pythonhosted.org/packages/52/b0/7b2e028b63d092804b6794595871f936aafa5e9322dcaaad50ebf67445b3/sniffio-1.2.0-py3-none-any.whl",
  "https://files.pythonhosted.org/packages/60/0f/7a0eeea938eaf61074f29fed9717f2010e8d0e0905d36b38d3275a1e4622/h11-0.12.0-py3-none-any.whl",
  "https://files.pythonhosted.org/packages/68/5f/447e04e828f47465eeab35b5d408b7ebaaaee207f48b7136c5a7267a30ae/itsdangerous-2.1.2-py3-none-any.whl",
  "https://files.pythonhosted.org/packages/9a/cb/d30896ad0d288358bbae60576556df78422179fc08c630f863258a7800ea/hupper-1.10.3-py2.py3-none-any.whl",
  "https://files.pythonhosted.org/packages/ad/b9/260603ca0913072a10a4367c2dca9998706812a8c1f4558eca510f85ae16/httpcore-0.15.0-py3-none-any.whl",
  "https://files.pythonhosted.org/packages/af/6d/ea3a5c3027c3f14b0321cd4f7e594c776ebe64e4b927432ca6917512a4f7/asgiref-3.5.2-py3-none-any.whl",
  "https://files.pythonhosted.org/packages/c1/84/7bfe436fa6a4943eecb17c2cca9c84215299684575376d664ea6bf294439/janus-1.0.0-py3-none-any.whl",
  "https://files.pythonhosted.org/packages/c2/f1/df59e28c642d583f7dacffb1e0965d0e00b218e0186d7858ac5233dce840/click-8.1.3-py3-none-any.whl",
  "https://files.pythonhosted.org/packages/c3/22/4cba7e1b4f45ffbefd2ca817a6800ba1c671c26f288d7705f20289872012/anyio-3.6.1-py3-none-any.whl",
  "https://files.pythonhosted.org/packages/c4/e5/63ca2c4edf4e00657584608bee1001302bbf8c5f569340b78304f2f446cb/rfc3986-1.5.0-py2.py3-none-any.whl",
  "https://files.pythonhosted.org/packages/ca/e4/b78d049f7cc7ed053ddbfdd59b2dcc7bd387458e2c2869b602975685d65e/aiofiles-0.8.0-py3-none-any.whl",
  "https://files.pythonhosted.org/packages/e9/06/d3d367b7af6305b16f0d28ae2aaeb86154fa91f144f036c2d5002a5a202b/certifi-2022.6.15-py3-none-any.whl",
  "https://files.pythonhosted.org/packages/e9/fd/d8ff4bbf7ade1c9d60b53bf8234b44dcb2a9fcc7ae6933ae80ba38582f3e/httpx-0.23.0-py3-none-any.whl",
  "https://latest.datasette.io/-/static/app.css?cead5a",
  "https://latest.datasette.io/fixtures.db",
  "https://lite.datasette.io/",
  "https://lite.datasette.io/-/static/app.css?cead5a"
  "https://lite.datasette.io/favicon.ico",
  "https://lite.datasette.io/webworker.js",
  "https://plausible.io/api/event",
  "https://plausible.io/js/script.manual.js",
  "https://pypi.org/pypi/aiofiles/json",
  "https://pypi.org/pypi/anyio/json",
  "https://pypi.org/pypi/asgi-csrf/json",
  "https://pypi.org/pypi/asgiref/json",
  "https://pypi.org/pypi/certifi/json",
  "https://pypi.org/pypi/click-default-group-wheel/json",
  "https://pypi.org/pypi/click/json",
  "https://pypi.org/pypi/datasette/json",
  "https://pypi.org/pypi/h11/json",
  "https://pypi.org/pypi/httpcore/json",
  "https://pypi.org/pypi/httpx/json",
  "https://pypi.org/pypi/hupper/json",
  "https://pypi.org/pypi/idna/json",
  "https://pypi.org/pypi/itsdangerous/json",
  "https://pypi.org/pypi/janus/json",
  "https://pypi.org/pypi/jinja2/json",
  "https://pypi.org/pypi/mergedeep/json",
  "https://pypi.org/pypi/pint/json",
  "https://pypi.org/pypi/python-multipart/json",
  "https://pypi.org/pypi/rfc3986/json",
  "https://pypi.org/pypi/sniffio/json",
  "https://pypi.org/pypi/uvicorn/json",
[
]

Downloading all those wheels:
wget https://files.pythonhosted.org/packages/04/a2/d918dcd22354d8958fe113e1a3630137e0fc8b44859ade3063982eacd2a4/idna-3.3-py3-none-any.whl
wget https://files.pythonhosted.org/packages/09/73/06cd6609f6f01b2336f26654a1e62ca8d02a0fdb86ec1055904124d76992/asgi_csrf-0.9-py3-none-any.whl
wget https://files.pythonhosted.org/packages/0a/98/98b3c6d954b6bd8531c611fb24be53ccc66438f493b05ec4b107942e27b7/Pint-0.18-py2.py3-none-any.whl
wget https://files.pythonhosted.org/packages/0b/77/dbf4952b05efe08ab0ef4be14b6137717c00d0504f5a56ee6e80c010e6d0/click_default_group_wheel-1.2.2-py3-none-any.whl
wget https://files.pythonhosted.org/packages/12/d0/d998e0b558fd5808a4fdb48e906e6f57a4fda2177fa11ba2a9d16248ce92/uvicorn-0.18.2-py3-none-any.whl
wget https://files.pythonhosted.org/packages/20/9a/e5d9ec41927401e41aea8af6d16e78b5e612bca4699d417f646a9610a076/Jinja2-3.0.3-py3-none-any.whl
wget https://files.pythonhosted.org/packages/2c/19/04f9b178c2d8a15b076c8b5140708fa6ffc5601fb6f1e975537072df5b2a/mergedeep-1.3.4-py3-none-any.whl
wget https://files.pythonhosted.org/packages/4b/5b/6fc4a322c8ae1349d3cecf83f8412ec10a67b06b7518dea686cfef594b07/python_multipart-0.0.4-py3-none-any.whl
wget https://files.pythonhosted.org/packages/50/0e/73f7c45526aebb98d4bf22b91da3e1347b3fd8ae9d338e2999f806d070f6/datasette-0.62-py3-none-any.whl
wget https://files.pythonhosted.org/packages/52/b0/7b2e028b63d092804b6794595871f936aafa5e9322dcaaad50ebf67445b3/sniffio-1.2.0-py3-none-any.whl
wget https://files.pythonhosted.org/packages/60/0f/7a0eeea938eaf61074f29fed9717f2010e8d0e0905d36b38d3275a1e4622/h11-0.12.0-py3-none-any.whl
wget https://files.pythonhosted.org/packages/68/5f/447e04e828f47465eeab35b5d408b7ebaaaee207f48b7136c5a7267a30ae/itsdangerous-2.1.2-py3-none-any.whl
wget https://files.pythonhosted.org/packages/9a/cb/d30896ad0d288358bbae60576556df78422179fc08c630f863258a7800ea/hupper-1.10.3-py2.py3-none-any.whl
wget https://files.pythonhosted.org/packages/ad/b9/260603ca0913072a10a4367c2dca9998706812a8c1f4558eca510f85ae16/httpcore-0.15.0-py3-none-any.whl
wget https://files.pythonhosted.org/packages/af/6d/ea3a5c3027c3f14b0321cd4f7e594c776ebe64e4b927432ca6917512a4f7/asgiref-3.5.2-py3-none-any.whl
wget https://files.pythonhosted.org/packages/c1/84/7bfe436fa6a4943eecb17c2cca9c84215299684575376d664ea6bf294439/janus-1.0.0-py3-none-any.whl
wget https://files.pythonhosted.org/packages/c2/f1/df59e28c642d583f7dacffb1e0965d0e00b218e0186d7858ac5233dce840/click-8.1.3-py3-none-any.whl
wget https://files.pythonhosted.org/packages/c3/22/4cba7e1b4f45ffbefd2ca817a6800ba1c671c26f288d7705f20289872012/anyio-3.6.1-py3-none-any.whl
wget https://files.pythonhosted.org/packages/c4/e5/63ca2c4edf4e00657584608bee1001302bbf8c5f569340b78304f2f446cb/rfc3986-1.5.0-py2.py3-none-any.whl
wget https://files.pythonhosted.org/packages/ca/e4/b78d049f7cc7ed053ddbfdd59b2dcc7bd387458e2c2869b602975685d65e/aiofiles-0.8.0-py3-none-any.whl
wget https://files.pythonhosted.org/packages/e9/06/d3d367b7af6305b16f0d28ae2aaeb86154fa91f144f036c2d5002a5a202b/certifi-2022.6.15-py3-none-any.whl
wget https://files.pythonhosted.org/packages/e9/fd/d8ff4bbf7ade1c9d60b53bf8234b44dcb2a9fcc7ae6933ae80ba38582f3e/httpx-0.23.0-py3-none-any.whl

I tried this:
diff --git a/webworker.js b/webworker.js
index e27ff78..6abe837 100644
--- a/webworker.js
+++ b/webworker.js
@@ -50,9 +50,28 @@ async function startDatasette(settings) {
         names.append(name)

     import micropip
-    # Workaround for Requested 'h11<0.13,>=0.11', but h11==0.13.0 is already installed
-    await micropip.install("h11==0.12.0")
-    await micropip.install("datasette")
+    await micropip.install("wheels/certifi-2022.6.15-py3-none-any.whl")
+    await micropip.install("wheels/python_multipart-0.0.4-py3-none-any.whl")
+    await micropip.install("wheels/itsdangerous-2.1.2-py3-none-any.whl")
+    await micropip.install("wheels/click-8.1.3-py3-none-any.whl")
+    await micropip.install("wheels/click_default_group_wheel-1.2.2-py3-none-any.whl")
+    await micropip.install("wheels/asgiref-3.5.2-py3-none-any.whl")
+    await micropip.install("wheels/h11-0.12.0-py3-none-any.whl")
+    await micropip.install("wheels/idna-3.3-py3-none-any.whl")
+    await micropip.install("wheels/sniffio-1.2.0-py3-none-any.whl")
+    await micropip.install("wheels/anyio-3.6.1-py3-none-any.whl")
+    await micropip.install("wheels/aiofiles-0.8.0-py3-none-any.whl")
+    await micropip.install("wheels/asgi_csrf-0.9-py3-none-any.whl")
+    await micropip.install("wheels/Pint-0.18-py2.py3-none-any.whl")
+    await micropip.install("wheels/uvicorn-0.18.2-py3-none-any.whl")
+    await micropip.install("wheels/Jinja2-3.0.3-py3-none-any.whl")
+    await micropip.install("wheels/mergedeep-1.3.4-py3-none-any.whl")
+    await micropip.install("wheels/hupper-1.10.3-py2.py3-none-any.whl")
+    await micropip.install("wheels/httpcore-0.15.0-py3-none-any.whl")
+    await micropip.install("wheels/janus-1.0.0-py3-none-any.whl")
+    await micropip.install("wheels/rfc3986-1.5.0-py2.py3-none-any.whl")
+    await micropip.install("wheels/httpx-0.23.0-py3-none-any.whl")
+    await micropip.install("wheels/datasette-0.62-py3-none-any.whl")
     # Install any extra ?install= dependencies
     install_urls = ${JSON.stringify(settings.installUrls)}
     if install_urls:

You have to get the order of installation exactly right, or one of the wheels will trigger another wheel to be loaded from PyPI.
I kept tweaking the order and watching the network pane in Firefox. The above diff almost gets it but there are still three wheels coming from PyPI:

Not sure how best to automate the process of figuring out those dependencies, grabbing the right wheel versions, caching them locally in the repo AND figuring out the right import order for them.

Just spotted this in the docs:

Micropip will also install the dependencies of the wheel. If dependency resolution is not desired, you may pass deps=False.

Upgrading to 0.21.0 and using deps=False almost worked but I got this error:
  File "/lib/python3.10/site-packages/datasette/utils/__init__.py", line 9, in <module>
    import markupsafe
ModuleNotFoundError: No module named 'markupsafe'

My guess is that markupsafe needs a C extension and hence the wheel has to be loaded from somewhere inside https://cdn.jsdelivr.net/pyodide/v0.21.0/full/
This looks like a useful way to look up files in there<EMAIL_ADDRESS>    "markupsafe": {
      "name": "MarkupSafe",
      "version": "2.1.1",
      "file_name": "MarkupSafe-2.1.1-cp310-cp310-emscripten_3_1_14_wasm32.whl",
      "install_dir": "site",
      "sha256": "c3cfbcc5f7927add3de4b3c698afe234730452cb0a2e566336b55ecdf16857c5",
      "depends": [],
      "imports": [
        "markupsafe"
      ]
    },

And sure enough this is a working URL: https://cdn.jsdelivr.net/pyodide/v0.21.0/full/MarkupSafe-2.1.1-cp310-cp310-emscripten_3_1_14_wasm32.whl

Same problem for:

PyYAML-6.0-cp310-cp310-emscripten_3_1_14_wasm32.whl
pluggy-1.0.0-py2.py3-none-any.whl
six-1.16.0-py2.py3-none-any.whl
and more

I'm just going to grab all of these wheels:
  "https://cdn.jsdelivr.net/pyodide/v0.20.0/full/MarkupSafe-2.1.1-cp310-cp310-emscripten_wasm32.whl",
  "https://cdn.jsdelivr.net/pyodide/v0.20.0/full/PyYAML-6.0-cp310-cp310-emscripten_wasm32.whl",
  "https://cdn.jsdelivr.net/pyodide/v0.20.0/full/packaging-21.3-py3-none-any.whl",
  "https://cdn.jsdelivr.net/pyodide/v0.20.0/full/pluggy-1.0.0-py2.py3-none-any.whl",
  "https://cdn.jsdelivr.net/pyodide/v0.20.0/full/pyparsing-3.0.7-py3-none-any.whl",
  "https://cdn.jsdelivr.net/pyodide/v0.20.0/full/setuptools-62.0.0-py3-none-any.whl",
  "https://cdn.jsdelivr.net/pyodide/v0.20.0/full/six-1.16.0-py2.py3-none-any.whl",
  "https://cdn.jsdelivr.net/pyodide/v0.20.0/full/typing_extensions-4.1.1-py3-none-any.whl",

This loaded successfully (once I had the wheels/ folder populated):
diff --git a/webworker.js b/webworker.js
index e27ff78..cc9578e 100644
--- a/webworker.js
+++ b/webworker.js
@@ -1,4 +1,4 @@
-importScripts("https://cdn.jsdelivr.net/pyodide/v0.20.0/full/pyodide.js");
+importScripts("https://cdn.jsdelivr.net/pyodide/v0.21.0/full/pyodide.js");

 function log(line) {
   console.log({line})
@@ -29,7 +29,7 @@ async function startDatasette(settings) {
     toLoad.push(["content.db", "https://datasette.io/content.db"]);
   }
   self.pyodide = await loadPyodide({
-    indexURL: "https://cdn.jsdelivr.net/pyodide/v0.20.0/full/"
+    indexURL: "https://cdn.jsdelivr.net/pyodide/v0.21.0/full/"
   });
   await pyodide.loadPackage('micropip', log);
   await pyodide.loadPackage('ssl', log);
@@ -50,9 +50,35 @@ async function startDatasette(settings) {
         names.append(name)

     import micropip
-    # Workaround for Requested 'h11<0.13,>=0.11', but h11==0.13.0 is already installed
-    await micropip.install("h11==0.12.0")
-    await micropip.install("datasette")
+    await micropip.install("wheels/packaging-21.3-py3-none-any.whl", deps=False)
+    await micropip.install("wheels/pyparsing-3.0.7-py3-none-any.whl", deps=False)
+    await micropip.install("wheels/typing_extensions-4.1.1-py3-none-any.whl", deps=False)
+    await micropip.install("wheels/six-1.16.0-py2.py3-none-any.whl", deps=False)
+    await micropip.install("wheels/MarkupSafe-2.1.1-cp310-cp310-emscripten_3_1_14_wasm32.whl", deps=False)
+    await micropip.install("wheels/PyYAML-6.0-cp310-cp310-emscripten_3_1_14_wasm32.whl", deps=False)
+    await micropip.install("wheels/pluggy-1.0.0-py2.py3-none-any.whl", deps=False)
+    await micropip.install("wheels/certifi-2022.6.15-py3-none-any.whl", deps=False)
+    await micropip.install("wheels/python_multipart-0.0.4-py3-none-any.whl", deps=False)
+    await micropip.install("wheels/itsdangerous-2.1.2-py3-none-any.whl", deps=False)
+    await micropip.install("wheels/click-8.1.3-py3-none-any.whl", deps=False)
+    await micropip.install("wheels/click_default_group_wheel-1.2.2-py3-none-any.whl", deps=False)
+    await micropip.install("wheels/asgiref-3.5.2-py3-none-any.whl", deps=False)
+    await micropip.install("wheels/h11-0.12.0-py3-none-any.whl", deps=False)
+    await micropip.install("wheels/idna-3.3-py3-none-any.whl", deps=False)
+    await micropip.install("wheels/sniffio-1.2.0-py3-none-any.whl", deps=False)
+    await micropip.install("wheels/anyio-3.6.1-py3-none-any.whl", deps=False)
+    await micropip.install("wheels/aiofiles-0.8.0-py3-none-any.whl", deps=False)
+    await micropip.install("wheels/asgi_csrf-0.9-py3-none-any.whl", deps=False)
+    await micropip.install("wheels/Pint-0.18-py2.py3-none-any.whl", deps=False)
+    await micropip.install("wheels/uvicorn-0.18.2-py3-none-any.whl", deps=False)
+    await micropip.install("wheels/Jinja2-3.0.3-py3-none-any.whl", deps=False)
+    await micropip.install("wheels/mergedeep-1.3.4-py3-none-any.whl", deps=False)
+    await micropip.install("wheels/hupper-1.10.3-py2.py3-none-any.whl", deps=False)
+    await micropip.install("wheels/httpcore-0.15.0-py3-none-any.whl", deps=False)
+    await micropip.install("wheels/janus-1.0.0-py3-none-any.whl", deps=False)
+    await micropip.install("wheels/rfc3986-1.5.0-py2.py3-none-any.whl", deps=False)
+    await micropip.install("wheels/httpx-0.23.0-py3-none-any.whl", deps=False)
+    await micropip.install("wheels/datasette-0.62-py3-none-any.whl", deps=False)
     # Install any extra ?install= dependencies
     install_urls = ${JSON.stringify(settings.installUrls)}
     if install_urls:

I got it to work offline with my WiFi turned off!
I had to run this in the root directory:
wget https://latest.datasette.io/-/static/app.css

Then I had to grab the latest Pyodide release from https://github.com/pyodide/pyodide/releases/tag/0.21.0 - then uncompress it and move the pyodide folder into my datasette-lite folder.
Then I applied this diff and started the server and it worked:
diff --git a/index.html b/index.html
index de860bb..e2b1ede 100644
--- a/index.html
+++ b/index.html
@@ -2,7 +2,7 @@
 <html>
 <head>
   <title>Datasette</title>
-  <link rel="stylesheet" href="https://latest.datasette.io/-/static/app.css?cead5a">
+  <link rel="stylesheet" href="app.css">
 <style>
 #loading-indicator {
   text-align: center;
diff --git a/webworker.js b/webworker.js
index e27ff78..8b3a444 100644
--- a/webworker.js
+++ b/webworker.js
@@ -1,4 +1,4 @@
-importScripts("https://cdn.jsdelivr.net/pyodide/v0.20.0/full/pyodide.js");
+importScripts("/pyodide/pyodide.js");

 function log(line) {
   console.log({line})
@@ -25,11 +25,10 @@ async function startDatasette(settings) {
   if (needsDataDb) {
     toLoad.push(["data.db", 0]);
   } else {
-    toLoad.push(["fixtures.db", "https://latest.datasette.io/fixtures.db"]);
-    toLoad.push(["content.db", "https://datasette.io/content.db"]);
+    toLoad.push(["fixtures.db", "/fixtures.db"]);
   }
   self.pyodide = await loadPyodide({
-    indexURL: "https://cdn.jsdelivr.net/pyodide/v0.20.0/full/"
+    indexURL: "/pyodide/"
   });
   await pyodide.loadPackage('micropip', log);
   await pyodide.loadPackage('ssl', log);
@@ -50,9 +49,35 @@ async function startDatasette(settings) {
         names.append(name)

     import micropip
-    # Workaround for Requested 'h11<0.13,>=0.11', but h11==0.13.0 is already installed
-    await micropip.install("h11==0.12.0")
-    await micropip.install("datasette")
+    await micropip.install("wheels/packaging-21.3-py3-none-any.whl", deps=False)
+    await micropip.install("wheels/pyparsing-3.0.7-py3-none-any.whl", deps=False)
+    await micropip.install("wheels/typing_extensions-4.1.1-py3-none-any.whl", deps=False)
+    await micropip.install("wheels/six-1.16.0-py2.py3-none-any.whl", deps=False)
+    await micropip.install("wheels/MarkupSafe-2.1.1-cp310-cp310-emscripten_3_1_14_wasm32.whl", deps=False)
+    await micropip.install("wheels/PyYAML-6.0-cp310-cp310-emscripten_3_1_14_wasm32.whl", deps=False)
+    await micropip.install("wheels/pluggy-1.0.0-py2.py3-none-any.whl", deps=False)
+    await micropip.install("wheels/certifi-2022.6.15-py3-none-any.whl", deps=False)
+    await micropip.install("wheels/python_multipart-0.0.4-py3-none-any.whl", deps=False)
+    await micropip.install("wheels/itsdangerous-2.1.2-py3-none-any.whl", deps=False)
+    await micropip.install("wheels/click-8.1.3-py3-none-any.whl", deps=False)
+    await micropip.install("wheels/click_default_group_wheel-1.2.2-py3-none-any.whl", deps=False)
+    await micropip.install("wheels/asgiref-3.5.2-py3-none-any.whl", deps=False)
+    await micropip.install("wheels/h11-0.12.0-py3-none-any.whl", deps=False)
+    await micropip.install("wheels/idna-3.3-py3-none-any.whl", deps=False)
+    await micropip.install("wheels/sniffio-1.2.0-py3-none-any.whl", deps=False)
+    await micropip.install("wheels/anyio-3.6.1-py3-none-any.whl", deps=False)
+    await micropip.install("wheels/aiofiles-0.8.0-py3-none-any.whl", deps=False)
+    await micropip.install("wheels/asgi_csrf-0.9-py3-none-any.whl", deps=False)
+    await micropip.install("wheels/Pint-0.18-py2.py3-none-any.whl", deps=False)
+    await micropip.install("wheels/uvicorn-0.18.2-py3-none-any.whl", deps=False)
+    await micropip.install("wheels/Jinja2-3.0.3-py3-none-any.whl", deps=False)
+    await micropip.install("wheels/mergedeep-1.3.4-py3-none-any.whl", deps=False)
+    await micropip.install("wheels/hupper-1.10.3-py2.py3-none-any.whl", deps=False)
+    await micropip.install("wheels/httpcore-0.15.0-py3-none-any.whl", deps=False)
+    await micropip.install("wheels/janus-1.0.0-py3-none-any.whl", deps=False)
+    await micropip.install("wheels/rfc3986-1.5.0-py2.py3-none-any.whl", deps=False)
+    await micropip.install("wheels/httpx-0.23.0-py3-none-any.whl", deps=False)
+    await micropip.install("wheels/datasette-0.62-py3-none-any.whl", deps=False)
     # Install any extra ?install= dependencies
     install_urls = ${JSON.stringify(settings.installUrls)}
     if install_urls:

One catch: the decompressed Pyodide folder is HUGE:
datasette-lite % du -h pyodide
6.7M	pyodide/fonts
282M	pyodide

Because it has wheels for every Python wheel that Pyodide provides special WASM compiled versions of.
I only need a fraction of those. Maybe I don't need any of the wheels at all?

I tried deleting the fonts and ALL of the .whl files and ALL of the files with test in the name (since they seemed to be .tar files with tests for things).
Got it down to 21M for the pyodide folder... but also broke it!
  File "/lib/python3.10/site-packages/_pyodide/_base.py", line 359, in run_async
    await coroutine
  File "<exec>", line 15, in <module>
ModuleNotFoundError: No module named 'micropip'

Evidently not every .whl should be deleted. Here are the 404s I'm seeing:

I think the better way to approach this will be to create a pyodide folder with just the files I see Datasette Lite loading.

I shipped that feature in shot-scraper. Now I can do this:
shot-scraper https://lite.datasette.io/ \
  --wait-for 'document.querySelector("h2")' \
  --log-requests - | \
  sqlite-utils memory stdin:nl 'select * from t' --flatten --dump | pbcopy

To generate this SQL file: https://gist.github.com/simonw/7f41a43ba0f177238ed7bdd95078a0d4
Which I can then open in Datasette Lite like this: https://lite.datasette.io/?sql=https://gist.githubusercontent.com/simonw/7f41a43ba0f177238ed7bdd95078a0d4/raw/4fc0f80decce4e1ea1e925cdc2bf3f05d73034ed/datasette-lite.sql#/data/stdin
And run this query to see just select url from t where url like '%.whl':
https://lite.datasette.io/?sql=https://gist.githubusercontent.com/simonw/7f41a43ba0f177238ed7bdd95078a0d4/raw/4fc0f80decce4e1ea1e925cdc2bf3f05d73034ed/datasette-lite.sql#/data?sql=select+url+from+t+where+url+like+'%25.whl'

I think the next step is to build a script which loops through those URLs and downloads them into the wheels/ directory, then figure out how to have that script run as part of the deployment to GitHub Pages.

Downloading all of those wheels produces a folder with 2.5M of total data in it. They don't compress well (since they are compressed already) - running gzip *.whl only drops that to 2.4M.

The size of those files:
wheels % ls -lh | awk '{print $5, "\t", $9}'

130K 	 Jinja2-3.0.3-py3-none-any.whl
12K 	 MarkupSafe-2.1.1-cp310-cp310-emscripten_wasm32.whl
205K 	 Pint-0.18-py2.py3-none-any.whl
120K 	 PyYAML-6.0-cp310-cp310-emscripten_wasm32.whl
14K 	 aiofiles-0.8.0-py3-none-any.whl
79K 	 anyio-3.6.1-py3-none-any.whl
10K 	 asgi_csrf-0.9-py3-none-any.whl
22K 	 asgiref-3.5.2-py3-none-any.whl
159K 	 certifi-2022.9.14-py3-none-any.whl
94K 	 click-8.1.3-py3-none-any.whl
3.9K 	 click_default_group_wheel-1.2.2-py3-none-any.whl
224K 	 datasette-0.62-py3-none-any.whl
54K 	 h11-0.12.0-py3-none-any.whl
67K 	 httpcore-0.15.0-py3-none-any.whl
83K 	 httpx-0.23.0-py3-none-any.whl
26K 	 hupper-1.10.3-py2.py3-none-any.whl
60K 	 idna-3.4-py3-none-any.whl
15K 	 itsdangerous-2.1.2-py3-none-any.whl
6.7K 	 janus-1.0.0-py3-none-any.whl
6.2K 	 mergedeep-1.3.4-py3-none-any.whl
16K 	 micropip-0.1-py3-none-any.whl
40K 	 packaging-21.3-py3-none-any.whl
13K 	 pluggy-1.0.0-py2.py3-none-any.whl
96K 	 pyparsing-3.0.7-py3-none-any.whl
31K 	 python_multipart-0.0.4-py3-none-any.whl
31K 	 rfc3986-1.5.0-py2.py3-none-any.whl
772K 	 setuptools-62.0.0-py3-none-any.whl
11K 	 six-1.16.0-py2.py3-none-any.whl
9.9K 	 sniffio-1.3.0-py3-none-any.whl
26K 	 typing_extensions-4.1.1-py3-none-any.whl
56K 	 uvicorn-0.18.3-py3-none-any.whl

Looking at those, it would be nice if I could get rid of:
205K 	 Pint-0.18-py2.py3-none-any.whl
159K 	 certifi-2022.9.14-py3-none-any.whl (since we don't do any TLS)
26K 	 hupper-1.10.3-py2.py3-none-any.whl (no restarts)
56K 	 uvicorn-0.18.3-py3-none-any.whl (we don't run a server)

Also setuptools is surprisingly big:
772K 	 setuptools-62.0.0-py3-none-any.whl

Honestly though, it's not really worth the effort right now - those four only add up to <400KB.

Loading https://lite.datasette.io/ a second time only transfers 22.55KB! Of 25.5MB total - but the vast majority of those assets are correctly cached already, which is nice.

Here's a fun thing: I took a Firefox Profile of the initial load experience and uploaded it here: https://profiler.firefox.com/public/48aw3a07gj8s0y81f4wyqywa69q4csbmykbs550/calltree/?globalTrackOrder=xu0wxt&hiddenGlobalTracks=1wxs&hiddenLocalTracksByPid=1272-02w8~48832-0~76615-0~2594-0~15591-0~72954-0~8975-0~8852-0~773-0~73168-01~55239-0w5~7928-0&implementation=js&thread=ym&v=7

If we're willing to let the client fetch external resources for themselves on the first load, we can use the service-worker cache. I implemented one in my fork:
https://github.com/hydrosquall/datasette-lite/pull/6


News items from multi-site incorrectly displayed in Main site

Found a bug? Please fill out the sections below. 👍
Issue Summary
Articles end up on two websites, even though only created at 1 website within the multi-site structure. The strange thing is that it is 1 way, the main site lists items from other sites, but not the other way around.
Steps to Reproduce
I have created a Wagtail multi-site. Within it, I have a BlogOverviewPage where all Blog items are listed. The problem is that the "main site" also lists Blog items for other sites. I have been experimenting using different queries in get_context, but without any luck.
def get_context(self, request):
    context = super().get_context(request)
    context['blogpages'] = self.get_children().live().order_by('-go_live_at')
    return context

Any other relevant information. For example, why do you consider this a bug and what did you expect to happen instead?
I consider it a bug, since the article ends up on two websites. Even though the particular article isn't a CHILD of the MAIN SITE.

I have confirmed that this issue can be reproduced as described on a fresh Wagtail project: (yes / no)

Haven't tried this
Technical details

Python version: Run python --version. Python 3.7.9
Django version: Look in your requirements.txt, or run pip show django | grep Version. Django 3.1
Wagtail version: Look at the bottom of the Settings menu in the Wagtail admin, or run pip show wagtail | grep Version:. Version 2.10.2
Browser version: You can use https://www.whatsmybrowser.org/ to find this out. Chrome 85

Not sure we'll be able to do much here without a full reproducible test case... however, one thing to try is running ./manage.py fixtree and see if reports any issues.

When running fixtree, there were no issues. I have however managed to solve it through:
        site = Site.find_for_request(request)
        return BlogPage.objects.live().in_site(site).order_by('-go_live_at')

I will see if this was a local problem, or not, at a later stage and inform you accordingly (and re-open the ticket). Thanks!


[Memory Leak] -  Disable specific dates

Greetings all ,
I have run into this problem , I need to implement functionality to select dates Semi-Montly , for example :
User can select the 16th date and the last day of the month .
We have disabledDates props, I have done two solutions

A function that will generate an array of dates to be disabled in three loops.
ts file with a ready made constant

For example I have captured only 2022-2023 which is about 2-3k lines of code.
When I pass this array to props a terrible trolling happens, especially when scrolling through the months .
I understand that disabled dates are rendered immediately .
Perhaps I am doing something wrong or there is another way.

Related to #107?

Related to #107?

If I understand correctly you want to have the opposite function disabledDates to the avaliableDates example ?
If so, it would seem quite logical and useful.
But as I understand it from the source code, there is too much integration and iteration of the library via forEach and rendering of all the elements, and this also needs to be optimized.

@onesine Thanks, the community would be very grateful if avaliableDates props could at least be implemented , I am currently working on a PR but it's related to the input mask .

has anyone started working on this fix?


Implement all functions of ListStructure(#137 ID 1~13)

Your development efficiency looks pretty good.   I have reviewed your code, there is an error and an unreasonable place in the code, please modify it in time.   After the newly modified commit passes the ci, I will merge it into the main branch.

看来你的开发效率还不错。我已经检查了您的代码，代码中存在错误和不合理的地方，请及时修改。新修改的commit通过ci后，我会将其合并到主分支中。

我已经修改了编译出错的地方，并合并成了一个commit

Your development efficiency looks pretty good. I have reviewed your code, there is an error and an unreasonable place in the code, please modify it in time. After the newly modified commit passes the ci, I will merge it into the main branch.
I have fixed the compilation error and merged it into a commit

Your development efficiency looks pretty good. I have reviewed your code, there is an error and an unreasonable place in the code, please modify it in time. After the newly modified commit passes the ci, I will merge it into the main branch.

I have fixed the compilation error and merged it into a commit

Thank you for your contributions.


TypeError: EnumType.call() missing 1 required positional argument: 'value'

Describe the bug
Getting a 500 error when trying to access a particular job (either in the active or in the failed column)
To Reproduce
Hard to reproduce, I'm still investigating, but probably an unhandled Exception.
Expected behavior
If the error is not critical, fail gracefully, omitting the values that have an issue.
Screenshots
N/A
Desktop (please complete the following information):

alpine, python 3.12
django-tasks-scheduler==1.3.1
django==5.0.3

Additional context
(Still under investigation)

probably related to: #87
will upgrade the version.
Closing, will reopen if not fixed.


wttrbar: init at 0.3.2

Description of changes
Adding new package to repo. https://github.com/bjesus/wttrbar is a Waybar module for displaying weather information.

Things done

Built on platform(s)

[x] x86_64-linux
[ ] aarch64-linux
[ ] x86_64-darwin
[ ] aarch64-darwin

[ ] For non-Linux: Is sandbox = true set in nix.conf? (See Nix manual)
[ ] Tested, as applicable:

NixOS test(s) (look inside nixos/tests)
and/or package tests
or, for functions and "core" functionality, tests in lib/tests or pkgs/test
made sure NixOS tests are linked to the relevant packages

[ ] Tested compilation of all packages that depend on this change using nix-shell -p nixpkgs-review --run "nixpkgs-review rev HEAD". Note: all changes have to be committed, also see nixpkgs-review usage
[x] Tested basic functionality of all binary files (usually in ./result/bin/)
23.11 Release Notes (or backporting 23.05 Release notes)

[ ] (Package updates) Added a release notes entry if the change is major or breaking
[ ] (Module updates) Added a release notes entry if the change is significant
[ ] (Module addition) Added a release notes entry if adding a new NixOS module

[x] Fits CONTRIBUTING.md.

@AndersonTorres Should be good, now.

Fixed to build on darwin

@AndersonTorres  fourth times the charm? :P


Broken dependency - libfmt missing

Upgrading rspamd to 3.1 fails for me on Fedora 35. Looks like fmt-devel is missing.
Dependencies resolved.

 Problem: cannot install the best update candidate for package rspamd-2.7-1.fc35.x86_64
  - nothing provides libfmt.so.7()(64bit) needed by rspamd-3.1-1.fc35.x86_64
==============================================================================================================================
 Package            Architecture       Version                 Repository                                                Size
==============================================================================================================================
Skipping packages with broken dependencies:
 rspamd             x86_64             3.1-1.fc35              copr:copr.fedorainfracloud.org:lorbus:rspamd             3.6 M

Transaction Summary
==============================================================================================================================
Skip  1 Package

Nothing to do.
Complete!

This might be missing a Requires: fmt in the spec now. Can you try installing fmt manually before updating rspamd?

I did, but still received the same error. I saw that BuildRequires: fmt-devel was added for 3.1 in this commit.

Thanks, I successfully updated to 3.1-3.


python27Packages.nevow: fix build, 0.14.2->0.14.3

Motivation for this change
didn't build (error in test setup).
/cc ZHF #36453
Things done

[x] Tested using sandboxing (nix.useSandbox on NixOS, or option build-use-sandbox in nix.conf on non-NixOS)
Built on platform(s)

[x] NixOS
[ ] macOS
[ ] other Linux distributions

[ ] Tested via one or more NixOS test(s) if existing and applicable for the change (look inside nixos/tests)
[ ] Tested compilation of all pkgs that depend on this change using nix-shell -p nox --run "nox-review wip"
[ ] Tested execution of all binary files (usually in ./result/bin/)
[ ] Fits CONTRIBUTING.md.

Success on x86_64-linux (full log)
Attempted: python27Packages.nevow
Partial log (click to expand)
post-installation fixup
moving /nix/store/zzc035sr9x04scmyz29sfmn9vmfwcy1m-python2.7-nevow-0.14.2/doc to /nix/store/zzc035sr9x04scmyz29sfmn9vmfwcy1m-python2.7-nevow-0.14.2/share/doc
shrinking RPATHs of ELF executables and libraries in /nix/store/zzc035sr9x04scmyz29sfmn9vmfwcy1m-python2.7-nevow-0.14.2
strip is /nix/store/b0zlxla7dmy1iwc3g459rjznx59797xy-binutils-2.28.1/bin/strip
stripping (with command strip and flags -S) in /nix/store/zzc035sr9x04scmyz29sfmn9vmfwcy1m-python2.7-nevow-0.14.2/lib  /nix/store/zzc035sr9x04scmyz29sfmn9vmfwcy1m-python2.7-nevow-0.14.2/bin
patching script interpreter paths in /nix/store/zzc035sr9x04scmyz29sfmn9vmfwcy1m-python2.7-nevow-0.14.2
checking for references to /build in /nix/store/zzc035sr9x04scmyz29sfmn9vmfwcy1m-python2.7-nevow-0.14.2...
wrapping `/nix/store/zzc035sr9x04scmyz29sfmn9vmfwcy1m-python2.7-nevow-0.14.2/bin/nit'...
wrapping `/nix/store/zzc035sr9x04scmyz29sfmn9vmfwcy1m-python2.7-nevow-0.14.2/bin/nevow-xmlgettext'...
/nix/store/zzc035sr9x04scmyz29sfmn9vmfwcy1m-python2.7-nevow-0.14.2

Success on aarch64-linux (full log)
Attempted: python27Packages.nevow
Partial log (click to expand)
post-installation fixup
moving /nix/store/ijm42mycjmx7vpb7qa24a9wihl19441r-python2.7-nevow-0.14.2/doc to /nix/store/ijm42mycjmx7vpb7qa24a9wihl19441r-python2.7-nevow-0.14.2/share/doc
shrinking RPATHs of ELF executables and libraries in /nix/store/ijm42mycjmx7vpb7qa24a9wihl19441r-python2.7-nevow-0.14.2
strip is /nix/store/lvx1acn1ig1j2km8jds5x3ggh3f2wa8v-binutils-2.28.1/bin/strip
stripping (with command strip and flags -S) in /nix/store/ijm42mycjmx7vpb7qa24a9wihl19441r-python2.7-nevow-0.14.2/lib  /nix/store/ijm42mycjmx7vpb7qa24a9wihl19441r-python2.7-nevow-0.14.2/bin
patching script interpreter paths in /nix/store/ijm42mycjmx7vpb7qa24a9wihl19441r-python2.7-nevow-0.14.2
checking for references to /build in /nix/store/ijm42mycjmx7vpb7qa24a9wihl19441r-python2.7-nevow-0.14.2...
wrapping `/nix/store/ijm42mycjmx7vpb7qa24a9wihl19441r-python2.7-nevow-0.14.2/bin/nevow-xmlgettext'...
wrapping `/nix/store/ijm42mycjmx7vpb7qa24a9wihl19441r-python2.7-nevow-0.14.2/bin/nit'...
/nix/store/ijm42mycjmx7vpb7qa24a9wihl19441r-python2.7-nevow-0.14.2

may I ask what broke the tests?

See this hydra log. The error occurs in setting up some javascript-related test case.
Strangely though, nevow wasn't changed since 17.09, and the same expression builds in 17.09 without running any tests. So the broken test case may have been there for much longer.
No idea what change triggered the tests to be run now. That's why I propose to disable them.

It seems like
checkPhase = ''
  trial formless nevow
'';

makes the tests work.
I'd also ask you to move the expression to a dedicated directory in pkgs/development/python-modules.

Thank you, will do. Do we have a policy/criteria what should go in python-modules/ vs. python-packages.nix ?

Nothing should go in python-packages.nix, just the callPackage stuff.

Makes sense, looks kinda mixed right now.

tests run fine now. moved to python-modules/ , plus a little cleanup and a minor version bump.

@dotlambda thank you for the review, done.

@GrahamcOfBorg build python2.pkgs.nevow

Success on x86_64-linux (full log)
Attempted: python2.pkgs.nevow
Partial log (click to expand)
    assertion_func(first, second, msg=msg)
  File "/nix/store/7b2z0vfbs9539ga4pxx5gmli47rz5y3n-python-2.7.14/lib/python2.7/unittest/case.py", line 506, in _baseAssertEqual
    raise self.failureException(msg)
twisted.trial.unittest.FailTest: 'g:h' != 'g:///h'

nevow.test.test_url.Serialization.test_rfc1808
-------------------------------------------------------------------------------
Ran 902 tests in 1.446s

PASSED (skips=29, expectedFailures=4, successes=869)

Success on aarch64-linux (full log)
Attempted: python2.pkgs.nevow
Partial log (click to expand)
    assertion_func(first, second, msg=msg)
  File "/nix/store/5crgsfgy8n7v50hrihx4mhxdqa01nrmw-python-2.7.14/lib/python2.7/unittest/case.py", line 506, in _baseAssertEqual
    raise self.failureException(msg)
twisted.trial.unittest.FailTest: 'g:h' != 'g:///h'

nevow.test.test_url.Serialization.test_rfc1808
-------------------------------------------------------------------------------
Ran 902 tests in 7.481s

PASSED (skips=29, expectedFailures=4, successes=869)

Cherry-picked to release-18.03 in f2d24b8ec6229d32d2c450c48d8f3ca7693f4d9b.

@FRidh I accidentally cherry-picked to staging before. But I don't think this is a problem, is it?


flutter initialization

Hello everyone,
when i write < flutter > in terminal on ubuntu for initialize flutter sdk, it return some error:
Initializing Flutter
Downloading https://storage.googleapis.com/flutter_infra/releases/stable/linux/flutter_linux_1.22.5-stable.tar.xz
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   193  100   193    0     0    342      0 --:--:-- --:--:-- --:--:--   342
tar: This does not look like a tar archive
xz: (stdin): File format not recognized
tar: Child returned status 1
tar: Error is not recoverable: exiting now
Flutter initialization failed
Could not find working copy of Flutter

i dont know what is really happend!!

Hi @mehranshoqi
Which flutter version you've installed and what method you used to install it? snapd or git clone?
Can you please provide your flutter doctor -v?
Thank you

Hi @mehranshoqi
Which flutter version you've installed and what method you used to install it? snapd or git clone?
Can you please provide your flutter doctor -v?
Thank you

Without additional information, we are unfortunately not sure how to resolve this issue.
We are therefore reluctantly going to close this bug for now.
Please don't hesitate to comment on the bug if you have any more information for us; we will reopen it right away!
Thanks for your contribution.
Could everyone who still has this problem please file a new issue with the exact description of what happens, logs, and the output of flutter doctor -v.
All system setups can be slightly different, so it's always better to open new issues and reference related issues.


Data completion function results in duplicates

When a dataset with missing rows is passed to a line or area chart, it results in duplication of rows in the tooltip of the chart. This seems to be caused by the getCompletedData function.
This may happen with other chart types as well.
This issue needs reproducing and more information, but flagging so it’s on the issues list.

@hughess could you give some clarification as to how getCompletedData is supposed to work? Is it just adding missing columns in rows?

@csjh for sure.
There are 2 purposes:

Fill in missing rows in a multi-series dataset so ECharts displays the results correctly
Allows for the handleMissing option so user can choose how nulls or missing values should be displayed (e.g., should there be gaps, or should the line interpolate?)

ECharts handles missing values inconsistently across chart types and situations, so getCompletedData attempts to return a full dataset that will make the results consistent every time.
In example-project, the Chart Testing folder has pages dedicated to these situations. It might be easiest to look at those and turn off the function to see what the difference is.
I have a bunch more info about the individual situations it solves for if that would be helpful. A couple simple examples below.
There might be a better way to implement the handling of missing values in general, though I believe that would involve a rethinking of how we pass data to the ECharts component.
Example Situations
Example 1 - "missing X"

You have dataset of revenue for 2 countries (Canada and US) from 2010 to 2019
There is no year 2005 in the dataset
Depending on the chart type, the x-axis might not show 2005 (i.e. it would skip straight from 2004 to 2006 without additional space in between)
What we want here is to show 2005 on the axis with no data

Example 2 - "missing Y"

You have dataset of revenue for 2 countries (Canada and US) from 2010 to 2019
The US is missing 2006, so only has 9 rows vs. Canada's 10
Depending on the chart type, the US data can get shifted off the correct x-axis values if it's not filled in


Close toast after 5 seconds

User story
As a user using the toast component, I want to be able to see the toast get dismissed on its own after 5 seconds, so I can I don't have to dismiss it myself.
Outline subtasks or tasks
Specific steps required to deliver this work.

[ ] Include appropriate animation for toast dismissal
[ ] Add function to automatically close toast if there is not user interaction after 5 seconds

Definition of “Done” (exit criteria)
The story is “done” when the reviewer can validate the outlined tasks and UI matches the expectations of the designed element spec.

https://github.com/AlaskaAirlines/auro-toast/issues/1

Has been tested in all browsers

[ ] Chrome
[ ] Firefox
[ ] Edge (79 +)
[ ] Safari
[ ] Mobile Safari

Has been tested for accessibility

[ ] Axe / Google Lighthouse (baseline standard)
[ ] Screenreader (determine usability of experience via screenreader)
[ ] Keyboard use (a user must be able to navigate to key parts via a keyboard)

Auro component features

[ ] README doc completed with all relative information
[ ] API documentation created
[ ] Bundled version tested and documented
[ ] Examples and use case info created
[ ] Demo page created for the Auro Doc Site

for this first initial version of the toast, we would like to set the duration to 5 seconds for all use cases. at a later time, we can bring in the +1 second for every 120 seconds. will discuss with @leeejune


[Taiwan/Taipei/大安] 華城電機股份有限公司 Rust Backend Engineer

Company
Fortune Electric - 華城電機股份有限公司
CakeResume Profile
Official Website
工作地點
Taipei Office, 臺北大安
遠端規定
NA
Summary
We are looking for a skilled Backend Rust Engineer to join our team. The candidate should know Rust backend frameworks like Actix-Web, rust database ORMs like Diesel, and have a good understanding of Relational Databases like PostgreSQL. Knowledge in SQL, CI/CD, Git, Linux, multi-threading, and Rust Async programming is also essential. You will be responsible for developing and maintaining the Backend of a battery management system which is composed of several cross-field components. The project is quite multi-disciplinary and is a great opportunity to learn and work on different technical problems. The backend needs you to know how to manage threads and futures, design modular and reusable code, and create REST APIs as well as handling SSE(Server Sent Events). Effective communication and being a strong team player are crucial for this role. While not mandatory, knowledge of embedded systems, real-time operating systems, and serial communications like CAN and SPI would be quite valuable for this position. Our team as great interest in Open-Source technologies and contribution to the open-source community.
工作內容

Backend Development:

Develop and maintain the backend of our systems in Rust. Ensure optimal performance and reliability while designing modular code. Write unit and integration tests.

Database Integration:

Utilize Rust database ORM Diesel to interface with a Postgresql database. Write SQL migrations and manage a Postgresql Datase.

CI/CD and Version Control:

Implement Continuous Integration/Continuous Deployment (CI/CD) pipelines and use Git for version control. We are currently using Gitea Actions (same as Github actions) for our CI.

Linux Environment:

Work within a Linux environment, configuring and maintaining the distribution of your choice.

Team Collaboration:

Collaborate effectively with cross-functional teams and fellow engineers to deliver high-quality software solutions. Work in collaboration with the Frontend Team to design REST APIs and other web communication channels like SSE

能力需求

Bachelor's or higher degree in Computer Science, Software Engineering, or a related field.
Proficiency in Rust, Actix-Web, and Diesel ORM.
Strong knowledge of relational databases, particularly PostgreSQL, and expertise in SQL.
Experience with CI/CD pipelines and Git for version control.
Familiarity with Linux environments and system configuration.
Capability to work with multi-threading and Rust Async programming.
Previous experience in REST API development.
Effective communication skills and a strong team player.
Nice to have: Knowledge of embedded systems, real-time operating systems, and serial communications like CAN and SPI.

薪資範圍
40,000 ~ 90,000 TWD / month
工時
Monday to Friday, 8 hours a day, 40 hours a week.
聯絡方式
For applying: Official CakeResume Job Listing
For more information: Technical Project Manager email<EMAIL_ADDRESS>

Close as a duplicate.

Close as duplicate.


Any easier/faster way to obtain data?

I'm trying to use a dataset of 100k of my own messages among 3.5mil of other messages. The data collection takes over 5hr, but I'm not letting it finish due to time constraints. Is there any faster way to obtain training data as opposed to mining it from the server itself?

@piee-kun
Off the top of my head I know of one alternative, which is basically a web scraper but I would imagine that is even slower (I'll link this solution later today).
Another thing you could do is request (download) your data from discord itself (assuming that they offer it, I'll look into that later today), preprocess it as necessary and reformat it so you train it with your own data. On the README's video you can see how that works.

I already have both my data and a DiscordChatExporter capture of the entire 3.5mil message channel. Is that able to be used or not?

@piee-kun
Yes its able to be used but not out of the box you need to format the data to fulfill these requirements:

Create a messages.csv file with two columns author_id (id of user) and content (message of user)
The rows must be organized from newest to oldest so that the newest message is of index 0
Then simply run the forge command and set it as "individually ran bot" (which will require your messages file)

Fill the rest of the data.

The pipeline will then train the model with your messages file.

Thanks so much for the info and for the time out of your day in order to help me. I'll get back to you with the results.

Well, I've formatted the data properly and now I'm stuck on step 2 of initializing, I left it for basically the entire day and nothing came of it.

@piee-kun Im sorry to hear that. Could you please share the logs and anything else you think may be useful to figure out what is wrong?
At the current state Mimicbot is not too fault tolerant so I can imagine a couple things that could go wrong but your logs will help a lot.

Where are the logs stored? I see none generated.

Okay scratch that, I got to training but now it's stuck on the training itself.

@piee-kun Hi sorry for the late reply. The loading bar unfortunately is broken and will never move, despite training actually making progress.
That is due to the utilization of tqdm in the train.py file in areas like the following:
https://github.com/CakeCrusher/mimicbot/blob/039c95bd124cb788c46664b110ede937a572ce43/mimicbot_cli/train.py#L436-L437
The error is notifying you that after the first epoch, on the first save that the repo name is invalid. I am not sure if you explicitly set the repo name, if you did then try to change the name to the satisfy the requirements on the error, otherwise if you did not, I suggest explicitly setting a name (it is prompted at the beggining of the forge command). Please let me know if you did explicitly set the name (i may need to update the repo if you didnt).
https://github.com/d8ahazard/sd_dreambooth_extension/issues/626
Let me know how it goes.


L1 : Fix Bubble Sort

https://github.com/srm-kzilla/slither-into-open-source/blob/main/Level-I/bubbleSort.c
Expected Behavior

Take input from the user for unsorted array

Current Behavior

Array is hardcoded
Code returns numerous errors

hey @Kevin-Aaaquil can you assign this issue to me i can work on it

@Kevin-Aaaquil can the code be rewritten?

Yeah sure make a pr.
On Sun, 23 Oct, 2022, 12:05 am Idris Musa, @.***> wrote:

@Kevin-Aaaquil https://github.com/Kevin-Aaaquil can the code be
rewritten?
—
Reply to this email directly, view it on GitHub
https://github.com/srm-kzilla/slither-into-open-source/issues/14#issuecomment-1287877647,
or unsubscribe
https://github.com/notifications/unsubscribe-auth/AR22P3P3KP5A3C3TASE4HSLWEQXVTANCNFSM6AAAAAARLHNK2E
.
You are receiving this because you are subscribed to this thread.Message
ID: @.***>

@shawshankkumar please accept my PR


fifix(alarms-security-group): Add more configurable options to alarms

Goal

Add more configuration options to ECS/ALB alarms.
Add workaround for security group bug.
Stop using escape hatch for lambda env variables (fixed in latest cdktf: 0.0.19)
Update constructs from 3.2.9 to 3.2.71

:tada: This PR is included in version 1.6.8 :tada:
The release is available on:

npm package (@latest dist-tag)
GitHub release

Your semantic-release bot :package::rocket:


[docs]: tooltip missing screenshot image

Tooltip missing screenshot image on all elements page:

@zeroedin All elements page thumbnail images are below.
https://www.dropbox.com/sh/vlpos6ghlv1oabj/AACpCj-9gKQVDXY3o8mvxK5aa?dl=0


Use Codecov for coverage measurement

because codeacy doesnt work for prs

Yes that is a divide by zero because there is no coverage of master. We might want to tweak the report/failure  levels down the line


[UI] MeshModel: Import model package

Current Behavior
Meshery UI users have a way of browsing the capabilities registry, but no mechanism to import new models.
Desired Behavior
Allow user to import a folder containing a model, which consists of one or more components, relationships, and policies.
Implementation

Acceptance Tests

Mockups

Contributor Guides and Handbook

🎨 Wireframes and designs for Meshery UI in Figma
🖥 Contributing to Meshery UI
🙋🏾🙋🏼 Questions: Discussion Forum and Community Slack

@leecalcote is backend API implemented?

@leecalcote can you please provide some more details about where the problem is, it would be very helpful for me to solve it.

@leecalcote Can you provide little more information about this issue.

Folks, understanding that, generally speaking, new contributors will lack the necessary context to make a positive impact here, the lack of help wanted and good first issue labels is intentional. Please note the use of the design-required label and the comment above about the necessity of a design spec needing to be written prior to implementation. If you'd like to draft the design spec, please do.

Thank you for volunteering. If writing this design spec isn't an area of comfort, let's get another issue assigned to you. Here's a very helpful search that lists all issues with the "help wanted" label assigned. I encourage to you inquire on issues even if they are assigned, if this issues don't have recent activity. A well-intended contributor might be accidentally squatting on an issue that they are no longer working on.

@leecalcote I think I have found the issue. The issue persists in the meshery docs page In docs/pages/index.md file where different sections are displayed statically like direct heading of the section are written and then links are embedded there. In this way introducing a new section from backened is not possible for now. I think you want to make this dynamic like user can Introduce a new section from backend or user will be allowed to import a folder containing model.

No, @AdityaRaimec22 , this issue has nothing to do with docs.


[luajit]move luajit headers to the directory "include/luajit/" to avoid file conflicts.

There are some file conflicts between them when building lua and luajit. So I modified the code to install the headers.
See #4019.
And I suggest that new port requests should also do this.

This breaks sol2 with luajit, because it assumes it can include <lua.h> and not <luajit/lua.h>. As LuaJIT is a drop-in replacement of Lua, it should simply not be allowed to install them both. The old behavior that resulted in an error is imho the right thing to do.

This breaks sol2 with luajit

No. luajit wasn't a dependency of sol2.

The old behavior that resulted in an error is imho the right thing to do.

No.

sol2 depends on a Lua implementation. Officially supported are PUC Lua, LuaJIT and MoonJIT. I would say lua is not any more a dependency of sol2 than luajit is. sol2 just needs one (any) of them and I think it should be supported to use sol2 with any of them when installed through vcpkg.

Keep the discussion in https://github.com/microsoft/vcpkg/discussions/31702.


Add ibis-substrait example

It'd be nice to have an example using ibis-substrait using the compiler to generate substrait and then run it with duckdb. We might be able to crib some of the example from this blogpost.

I can take this on if no one else has yet.

Fixed by #16.


Control panel needs better resizing capabilities

From @leigh.orf
See Leigh's "Orf Notes For Vapor Team" for context
So, I can't get that window to get any bigger. The "Data Set" text is pretty useless as you can see. I can drag the handle to the right of the smaller white box but that nukes the "New Delete Duplicate In:" buttons, and still doesn't display enough text in the Data Set region. Not sure what to suggest here, using the file name as the Data Set clearly is an issue with this configuration. Since this window tears off nicely, perhaps the easiest solution is to make it such that the window can get bigger than its current locked in horizontal geometry.

@sgpearse please see if you can find Leigh's notes

@sgpearse please see if you can find Leigh's notes

Leigh is referring to the renderer table, and how we name our data sets as their corresponding file-name.  The file-name is usually long, and gets clipped.  Expanding the left panel has been improved since this report, so we can display more text, but I don't think anybody wants to use Vapor with the control panel taking up half of the window.
While this problem has a workaround, we might be able to do better by removing one of the columns in the renderer table.  Since all of the renderers are named after their type, ihe "Type" column is redundant, imo.

Leigh is referring to the renderer table, and how we name our data sets as their corresponding file-name.  The file-name is usually long, and gets clipped.  Expanding the left panel has been improved since this report, so we can display more text, but I don't think anybody wants to use Vapor with the control panel taking up half of the window.
While this problem has a workaround, we might be able to do better by removing one of the columns in the renderer table.  Since all of the renderers are named after their type, ihe "Type" column is redundant, imo.


Set ownership control to BucketOwnerPreferred

ACLs are no longer supported by default on S3 buckets, so attempting to create ACLs for buckets fails unless additional steps are taken. See https://github.com/hashicorp/terraform-provider-aws/issues/28353
Encountered this error via dependency on cn-terraform/terraform-aws-ecs-fargate-service which our code depends on here.
│ Error: error creating S3 bucket ACL for bion-dev-civiform-lb-logs-yuvyztq: AccessControlListNotSupported: The bucket does not allow ACLs
│ 	status code: 400, request id: N8HFPCG868GXEFV8, host id: EsZ6XRp8D81sKcExWgaeVGc3EEHTV8qeFpCziDb8Nq3FZDts1fHu1rqXPRxHntffJes8rfRIYos=
│
│   with module.ecs_fargate_service.module.ecs-alb[0].module.lb_logs_s3[0].aws_s3_bucket_acl.logs,
│   on .terraform/modules/ecs_fargate_service.ecs-alb.lb_logs_s3/main.tf line 26, in resource "aws_s3_bucket_acl" "logs":
│   26: resource "aws_s3_bucket_acl" "logs" {

Hi @bion, there are some formatting issues. Please run terraform fmt -recursive and submit the changes. Pipeline is working except for that. Do not worry about infracost job.

@jnonino done, thanks!


chore: basic structure for implementation of tabular containers with polars

Closes partially #712
Summary of Changes
Add (mostly empty) classes for a new implementation of the tabular containers with polars.

:tada: This PR is included in version 0.24.0 :tada:
The release is available on:

v0.24.0
GitHub release

Your semantic-release bot :package::rocket:


Make 'toggle_node' act like 'close_node' if on a file

close_node will close node when cursor is on file within that node. toggle_node has to be on directory itself. Could toggle_node also toggle node if cursor is on file within that node?
Originally posted by @gegoune in https://github.com/nvim-neo-tree/neo-tree.nvim/discussions/258#discussioncomment-2540781

It could, but is that an intuitive behavior? I'm not quite sure if it is or not. Does anyone else have any opinions on that?
If you want to have this functionality now, you can use this custom command:
    require("neo-tree").setup({
      window = {
        mappings = {
          ["<space>"] = function (state)
            local node = state.tree:get_node()
            if require("neo-tree.utils").is_expandable(node) then
              state.commands["toggle_directory"](state)
            else
              state.commands["close_node"](state)
            end
          end,
    ...

Actually, that made me think and I double checked what it is like in nvim-tree. And I am actually not using toggle at all, so close_node and open will do for me. Apologies about the noise, and since you questioned it straight away you are probably right and issue can be closed.


small change

Description
Changes proposed in this pull request:

...
...
...

Related issue(s)

/retest


How to add "Categories" to the bottom of the page?

Hello developer,your themes is so coooool,and i want to know how to add "Categories" to the bottom of the page just like your demo page .

And why not to add a function named "Frinedlyship Links",between the "About" and "Rencent Post",i think it's also someone need :)

To display the categories section you need to have at least on post with a category set up.

To change the footer layout, you need to modify

https://github.com/klugjo/hexo-theme-alpha-dust/blob/master/layout/_partial/footer.ejs

It works.Thanks so much.:)


Normalize stacktrace diffs

Reference: https://github.com/python/mypy/pull/10686#issuecomment-905110424
It would be nice if mypy-primer didn't tell us that the stacktrace for a crash now uses "new_mypy" instead of "old_mypy" in its path, or that the version of mypy changed due to a new commit hash.

Also, we could filter out line numbers from tracebacks.
Somewhat unrelated: What about always reporting crashes, even if they happen with old mypy? These are usually something we'd want to fix quickly.

I pushed b4e8559 to normalise filenames. So for typeshed's CI should no longer see mypy crashes (that were not caused by the relevant typeshed change).
Given this, I'll probably add an option to always report a crash, since for mypy's CI, we're still very interested in seeing all crashes. However this is low pri:

In practice it seems like people are good about paying attention to new crashes in PRs, which is the chief avenue I'd expect to see them. So I don't think we need to worry too much about merging a change that causes a crash and then needing reminders about it.
I believe there are no crashes with mypy master.
That leaves the case where one of the projects we check makes a change that causes a crash. I don't think this has happened. Most projects with crashes are from me trying to find projects where mypy breaks.


AjaxMin Version Dependency in Nuget

Cassette has a AjaxMin dependency on version 4.84 or greater.

I was updating AjaxMin to the latest version (4.97.4951.28483) and get an assembly load error:
System.Exception: Bundle collection rebuild failed. See inner exception for details. --->
Cassette.TinyIoC.TinyIoCResolutionException: Unable to resolve type: Cassette.BundleProcessing.IBundlePipeline`1[[Cassette.Scripts.ScriptBundle, Cassette, Version=<IP_ADDRESS>609, Culture=neutral, PublicKeyToken=null]] --->
Cassette.TinyIoC.TinyIoCResolutionException: Unable to resolve type: Cassette.Scripts.ScriptPipeline ---> System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. --->
Cassette.TinyIoC.TinyIoCResolutionException: Unable to resolve type: Cassette.Scripts.IJavaScriptMinifier ---> System.IO.FileLoadException: Could not load file or assembly 'AjaxMin, Version=4.84.4790.14405, Culture=neutral, PublicKeyToken=21ef50ce11b5d80f' or one of its dependencies. The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040)

I figured out that cassette has a fix version dependency!

I tried to add a <bindingRedirect> like that into my web.config with success:
<runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
        <dependentAssembly>
            <assemblyIdentity name="AjaxMin" publicKeyToken="21ef50ce11b5d80f" />
            <bindingRedirect oldVersion="4.84.4790.14405" newVersion="4.97.4951.28478" />
        </dependentAssembly>
    </assemblyBinding>
    <legacyHMACWarning enabled="0" />
</runtime>

To bypass this workaround please remove the version-dependency from Cassette to AjaxMin because many people don't know how to deal with this Problem and the documentation doesn't tell anything about that.
Thanks
Btw: the steps above were discovered during writing the issue. It's an example how long one will need to get around that.

<assemblyIdentity name="AjaxMin" publicKeyToken="21ef50ce11b5d80f" />

You saved my life today. I'm using version AjaxMin 5.14.5506.26196. I'm getting the sae issue that you have mentioned.Thanks a lot

I'm glad to hear that this is still saving lifes 😅


Update Workflows, Add Dependabot

@x87 review?

well, what to say? I don't think we need dependabot, also what the test build is for? other than bumping action packages to more recent versions I don't see actual improvements.
https://github.com/cleolibrary/CLEO5/issues/11 this would be more useful if you have experience with github ci

I see. I had mostly negative experience with dependabot in my projects as I was overwhelmed with minor package updates (see here for example).
We can try it out and if it get too annoying, we will disable.


Warnings with react native upgrade

Version
Tell us which versions you are using:

react-native-router-flux ^3.30.2
react-native ^0.28.0
react 15.3.0

Expected behaviour
No warnings
Actual behaviour
ExceptionsManager.js:70 Warning: You are manually calling a React.PropTypes validation function for the heightprop onStyleSheet tabbarView. This is deprecated and will not work in the next major version. You may be seeing this warning due to a third-party PropTypes library. See https://fb.me/react-warning-dont-call-proptypes for details.
I get this warning for most files (scene, tabbar etc)

I have a bunch of similar warnings:
Versions

"react": "^15.2.0",
"react-native": "^
"react-native-router-flux": "^3.32.0",

ExceptionsManager.js:76Warning: You are manually calling a React.PropTypes validation function for the left prop on StyleSheet leftButton. This is deprecated and will not work in the next major version. You may be seeing this warning due to a third-party PropTypes library. See https://fb.me/react-warning-dont-call-proptypes for details.
ExceptionsManager.js:76Warning: You are manually calling a React.PropTypes validation function for the fontSize prop on StyleSheet barRightButtonText. This is deprecated and will not work in the next major version. You may be seeing this warning due to a third-party PropTypes library. See https://fb.me/react-warning-dont-call-proptypes for details.

Same problem here.

same issue
"react": "^15.2.1"
"react-native": "^0.31.0"
"react-native-router-flux": "^3.34.0"

Same problem


sort input files

when building packages (e.g. for openSUSE Linux)
(random) filesystem order of input files
influences ordering of functions in the output,
thus without the patch, builds (in disposable VMs) would always differ.
See https://reproducible-builds.org/ for why this matters.

I signed it! (now)

Thanks for the patch!


Unsure about completion behaviour

Hi
I am using neovim (--HEAD) on macOS (with deoplete). Recently I installed racer and also the rls with vim-ale. From reading the documentation it appears that racer is a subset of the rust language server. This to me would imply that using rls would give me the same completion (or more) than just racer. But looking at the autocomplete for something simple like
"random string".to<autocomplete here>

shows the methods to_owned, to_lowercase etc. with racer but none with rls. For a different completion:
"random string".in<autocomplete here>

the autocomplete results are identical between rls+ale/vim-racer.
My question is if this is intended behaviour and racer is a good idea even if rls is used or if this is a bug somwhere in my setup?
Best, tostr

I don't know why the behavior occur.
You should ask it in rls issues instead of here.


Is this compatible with Raspberry Pi 4?

Is this version or any fork compatible with the current version of raspberry pi 4?

I can't say anything about forks, but there are release candidates for the Pi4 available: https://github.com/futurice/chilipie-kiosk/releases

This is indeed true, and we'll try to get a non-RC release out soon, too.
Thanks for providing support @ThisIsTenou!


App dockerised

Will not use bare uploader install, because it's difficult to get working. Using a docker image is easier.
Other changes include some behaviour of the runtime script:

samplesheet name coercion
case metadata autogeneration
running the container and launching executions

This change is

src/script.sh line 54 at r1 (raw file):
Previously, PolarisAstrum-NHS (Polaris Astrum) wrote…
Why is this line here if you have commented below that that you can't use it?

As discussed on Slack, I do this to download all of the inputs that aren't the run folder, or I'd have to download them all individually. I'll add a comment to clarify this


Prevent infinite gas consumption in simulation queries

configurable per node
default to block gas limit
must not affect consensus

After some deeper analysis and discussion on #655 in our internal discord with @ethanfrey and @webmaster128 ,
we decided on a new path to solve the root cause. Or what may was the the root cause from the original issue on T.
No further infos provided 🤷♂
The problem described in #655 addresses only a subset of fraud scenarios as simulations run in the sdk with infinite gas

good one


Abandoned layers no longer regenerate. Layers stay in order after abandoning and drilling more. Target new layer shows depth. Layer ore density is configurable.

Fixed behavior of abandoned layers being re-generated the next time the player digs down. Ensured the list remains in order.
Added depth reading to "Target: New Layer" in UI so that it will read "Target: New layer at depth: ##m"
Now players can keep digging down without having all of the previous layers loaded.

Added option to configure new layer ore density.

Used deepL api for translations. Am curious how Mlie does it (because you have to change xml keys without translating them. I just pasted the stuff in manually but I can imagine a script which compares xml files for differences and re-translates stuff when there's a change.

You cannot change the existing keys for translation. That will make them not work for the previous versions of the game (<1.4)
If you need to change keys you need to create new keys and use the new translation there.

You cannot change the existing keys for translation. That will make them not work for the previous versions of the game (<1.4) If you need to change keys you need to create new keys and use the new translation there.

O I didn't know that. Ok.

Since I wont be able to change the code in the previous assemblies they will still use the same keys making their translations look wierd if changed

I added new entries so there won't be conflicts anymore 👌

Ensured UI new depth variable will update to (lowest layer currently dug + 1) when loaded into an existing save that used an older version of the mod.

Hopefully those last two are the only problems left for me to run into xD.
Last one also fixed if a player put down a mine inside of a camp and left it the layers would have remained.

I'll reopen this in a bit when I'm done messing around with it. I'm renaming branches. Should have done it earlier.


feat(tutorial): complete step 4

Closes #
{{short description}}
Changelog
New

{{new thing}}

Changed

{{change thing}}

Removed

{{removed thing}}

Looks good, marking step 4 complete.


[Colors docs] Add missing backticks (`) to step number

[x] Use a meaningful title for the pull request. Include the name of the package modified.
[ ] Test the change in your own code.
[ ] Include the URL where we can test the change in the body of your PR.

This pull request:

[ ] Fixes a bug
[ ] Adds additional features/functionality
[x] Updates documentation or example code
[ ] Other

@colmtuite delegating to you

Thanks @williamhzo 🙏


Consider a new release

There is interesting things committed since 2.4.0, like Dotenv\Dotenv::safeLoad() to allow to use an .env file or class environment variables.
Could be interesting to have a new release,  to be able to require a version with the safeLoad method present, instead to use dev-master.

No need to use dev-master. You can still use 2.5.* or ^2.5 so long as you allow composer to resolve non-stable releases, since composer knows the master branch represents the development state of 2.5.x.
That said, I am planning to get a release out today. :)


Fix typo in validateWithCustomRules.ts

determing -> determining

Merging this without changeset, as it's just a change in a code comment.


[Feature] Support FileIO cache for iceberg table

What type of PR is this：

[ ] bug
[x] feature
[ ] enhancement
[ ] others

Which issues of this PR fixes ：

Fixes  #6235
Problem Summary(Required) ：

I use   this pr: https://github.com/apache/iceberg/pull/4518
and copy  ByteBufferInputStream,    MultiBufferInputStream , SingleBufferInputStream class, becase iceberg master branch  hava implements this interface SeekableInputStream .
I only expose fileIO.cache.max-total-bytes  to limit max cache size and to evict data if reach this limit.

 Thank you for your submission! We really appreciate it. Like many open source projects, we ask that you sign our Contributor License Agreement before we can accept your contribution.honglichang seems not to be a GitHub user. You need a GitHub account to be able to sign the CLA. If you have already a GitHub account, please add the email address used for this commit to your account.You have signed the CLA already but the status is still pending? Let us recheck it.

@hongli-my Plz sign the CAL

for  starrocks_fe_unittest : testWithResourceName run  on my env:      is no this table(because my env no this table), but the  github fe unittest  error is  can not connect to metastore.
2022-05-20 14:56:10 [main] INFO  HiveMetaStoreThriftClient:416 - Trying to connect to metastore with URI thrift://VM-72-127-centos:9083
2022-05-20 14:56:10 [main] INFO  HiveMetaStoreThriftClient:496 - Opened a connection to metastore, current connections: 1
2022-05-20 14:56:10 [main] INFO  HiveMetaStoreThriftClient:551 - Connected to metastore.
[ERROR] Tests run: 1, Failures: 0, Errors: 1, Skipped: 0, Time elapsed: 2.991 s <<< FAILURE! - in com.starrocks.catalog.IcebergTableTest
[ERROR] testWithResourceName(com.starrocks.catalog.IcebergTableTest)  Time elapsed: 2.874 s  <<< ERROR!
com.starrocks.external.iceberg.StarRocksIcebergException: Failed to load Iceberg table with id: db0.table0
	at com.starrocks.catalog.IcebergTableTest.testWithResourceName(IcebergTableTest.java:94)
Caused by: org.apache.iceberg.exceptions.NoSuchTableException: Table does not exist: db0.table0
	at com.starrocks.catalog.IcebergTableTest.testWithResourceName(IcebergTableTest.java:94)

run starrocks_fe_unittest

Plz fix the unit test of IcebergTable @hongli-my thanks

Error Message
Missing 1 invocation to:
com.starrocks.server.GlobalStateMgr#getCurrentSystemInfo()
Stacktrace
Missing 1 invocation to:
com.starrocks.server.GlobalStateMgr#getCurrentSystemInfo()
Caused by: Missing invocations
	at com.starrocks.task.AgentBatchTask.run(AgentBatchTask.java:160)
	at java.lang.Thread.run(Thread.java:750)

i run  this command local mvn test -Dtest=RollupJobV2Test  -DskipTests=false -DfailIfNoTests=false, everything is ok,
can i run starrocks_fe_unittest local?

run starrocks_fe_unittest

run starrocks_fe_unittest

[FE PR Coverage check]
:disappointed: fail : 80 / 341 (23.46%)
file detail

path
covered line
new line
coverage

:large_blue_circle:
com/starrocks/external/iceberg/io/MultiBufferInputStream.java
0
154
00.00%

:large_blue_circle:
com/starrocks/server/GlobalStateMgr.java
0
3
00.00%

:large_blue_circle:
com/starrocks/external/iceberg/io/SingleBufferInputStream.java
9
70
12.86%

:large_blue_circle:
com/starrocks/external/iceberg/io/ByteBufferInputStream.java
3
13
23.08%

:large_blue_circle:
com/starrocks/catalog/IcebergTable.java
4
8
50.00%

:large_blue_circle:
com/starrocks/external/iceberg/IcebergUtil.java
1
2
50.00%

:large_blue_circle:
com/starrocks/external/iceberg/io/IOUtil.java
9
14
64.29%

:large_blue_circle:
com/starrocks/external/iceberg/io/IcebergCachingFileIO.java
51
74
68.92%

:large_blue_circle:
com/starrocks/external/iceberg/IcebergHiveCatalog.java
3
3
100.00%

[FE PR Coverage check]
:disappointed: fail : 79 / 339 (23.30%)
file detail

path
covered line
new line
coverage

:large_blue_circle:
com/starrocks/external/iceberg/io/MultiBufferInputStream.java
0
154
00.00%

:large_blue_circle:
com/starrocks/server/GlobalStateMgr.java
0
3
00.00%

:large_blue_circle:
com/starrocks/external/iceberg/io/SingleBufferInputStream.java
9
70
12.86%

:large_blue_circle:
com/starrocks/external/iceberg/io/ByteBufferInputStream.java
3
13
23.08%

:large_blue_circle:
com/starrocks/catalog/IcebergTable.java
3
6
50.00%

:large_blue_circle:
com/starrocks/external/iceberg/IcebergUtil.java
1
2
50.00%

:large_blue_circle:
com/starrocks/external/iceberg/io/IOUtil.java
9
14
64.29%

:large_blue_circle:
com/starrocks/external/iceberg/io/IcebergCachingFileIO.java
51
74
68.92%

:large_blue_circle:
com/starrocks/external/iceberg/IcebergHiveCatalog.java
3
3
100.00%

[FE PR Coverage check]
:disappointed: fail : 79 / 339 (23.30%)
file detail

path
covered line
new line
coverage

:large_blue_circle:
com/starrocks/external/iceberg/io/MultiBufferInputStream.java
0
154
00.00%

:large_blue_circle:
com/starrocks/server/GlobalStateMgr.java
0
3
00.00%

:large_blue_circle:
com/starrocks/external/iceberg/io/SingleBufferInputStream.java
9
70
12.86%

:large_blue_circle:
com/starrocks/external/iceberg/io/ByteBufferInputStream.java
3
13
23.08%

:large_blue_circle:
com/starrocks/catalog/IcebergTable.java
3
6
50.00%

:large_blue_circle:
com/starrocks/external/iceberg/IcebergUtil.java
1
2
50.00%

:large_blue_circle:
com/starrocks/external/iceberg/io/IOUtil.java
9
14
64.29%

:large_blue_circle:
com/starrocks/external/iceberg/io/IcebergCachingFileIO.java
51
74
68.92%

:large_blue_circle:
com/starrocks/external/iceberg/IcebergHiveCatalog.java
3
3
100.00%


Import Old Resolved Issues Here To Preserve Legacy

Component your feature request relates to

This repo

Problem your feature solves? Please describe.
Moving the repo was announced but it'll be nice to import the old resolved issues to as they were very helpful, (like that one issue to fix the memory leak in UE5.3)
Describe the solution you'd like
import relevant closed issues as well if possible.

I can't import them, but I have restored them on the archived repo.
https://github.com/EpicGames/PixelStreamingInfrastructure/issues?q=is%3Aissue+is%3Aclosed
Closing this one.


JURY - highlighted juror

We would like to highlight one of the jury - Arne Vogt Head of Jury. Business Development im E-Commerce @ ARTAVO
He is a head of jury and we cooperate with him.
page - JURY MEMBERS - highlight juror
Is it possible to put him right below the text: "The jury will evaluate the finalists and choose the winning companies." and above the other jurors? It would be perfect to put him in the middle of the section.

page - HOME - change the order
Is it possible to put him as a first person in the row? We are aware that there are two rows of jury only and it may be difficult to put him above the others.

@az I can't assign a person and add any label.

@klaudia2209 no it is not possible to do it this way but i can show 2 separate jury widgets

one will have only 1 member (via filtering function)
second one will have the rest (with one excluded via filtering function)
the con is that it will consume a lot of space.....decision?

@az I can't assign a person and add any label.

its good :) i am self-assigning issues only when i understand them (and they follow guidelines) and they will be processed :)

OK, I understand. I think that on the "JURY MEMBERS" page we can go with this option :)
What about this solution below on the homepage?
page - HOME - change the order
Is it possible to put him as a first person in the row? We are aware that there are two rows of jury only and it may be difficult to put him above the others.

assigning issues - ok, good! it's better for me ;)

@klaudia2209
"What about this solution below on the homepage?"
i will do some experiment with sorting options but i cannot guarantee the result now (maybe if we set "featured" =1 in the profile and set sort by featured descending (1,0,0,0) we will achieve this ...but i do not know now. i will create separate issue for this)

Ok, thank you so much.


[FEATURE] Enable Google OAuth 2.0

Description
I'd like to use Supabase Auth to enable users to sign in and/or sign up with just 1 click using Google OAuth.

We already have PR #94 implementing it. It's not at the top of our priority list right now, but it might be in the future. You can read more about it here.


[INTERPRETER] Make sure interpreter works with float16 by reusing NumPy HALF-related code

Closes #4992

https://github.com/triton-lang/triton/issues/4992#issuecomment-2442836437

Hi @Jokeren, please take a look.

Looks good to me


Added better support for computing bokeh plot size

The current BokehRenderer.get_size method only supports very simple plots that are not part of a layout grid, or contain toolbars and tables. This PR computes the size of a bokeh plot more accurately for all these cases, which can be very useful when wanting to embed the plot in HTML and know the size ahead of time.

Ready for review and merge.

I made one comment (although I can't say I follow all the detailed size computation logic!) but generally it looks good.
The main thing I checked was that get_size is defined as a @bothmethod which means it is easy to get the size of bokeh plot as long as you can import the BokehRenderer class.
Happy to merge once you address my comment.

@jlstevens Ready to merge.

Looks good. Merging.


Add smart contract unit tests

On #33
Smart contracts for incentive and dispute have been moved into wasm-client/contracts. However, I have not added the relevant unit tests for those smart contracts.
We need to add these tests to the test directory

main challenge here is those modules rely on truffle and truebit-os does not.

in progress.

Most of this has been resolved with #84 will open another issue with more specifics


Merge google -> main

188d61bbb Merge pull request #7530 from not-jenni:main-to-google
ac20abe4e Integrate LLVM at llvm/llvm-project@7277d2e1c86b
d10bb8e0c Integrate LLVM at llvm/llvm-project@d36dd1f842c1
86d7af1b4 Synchronize submodules with LLVM at llvm/llvm-project@3d32218d1af2
97a428b49 Run bazel_to_cmake on iree/compiler/Codegen/Common/CMakeLists.txt
fe4a6efee Integrate LLVM at llvm/llvm-project@3d32218d1af2
f9316dae6 [compiler] reenable test broken by MLIR upstream changes
5c20099f8 Disable broken comprehensive bufferize test at head test
4caceffd8 Integrate LLVM at llvm/llvm-project@bcad20bc6591

I think the bazel_to_cmake failure is related to the update to bazel_to_cmake_targets.py in https://github.com/google/iree/pull/7372.  I think it is looking for "@llvm-project//lld" instead of "@llvm-project//lld:lld", although I am not sure where the targets were updated to this...

I think the bazel_to_cmake failure is related to the update to bazel_to_cmake_targets.py in #7372. I think it is looking for "@llvm-project//lld" instead of "@llvm-project//lld:lld", although I am not sure where the targets were updated to this...

Oh, good catch. Yeah, we can update https://github.com/google/iree/blob/cf9540a6f0569485c639bece7749415dae307159/build_tools/bazel_to_cmake/bazel_to_cmake_targets.py#L22 to
 "@llvm-project//lld": ["lld"],

and keep the changes from lld:lld to lld

I think the bazel_to_cmake failure is related to the update to bazel_to_cmake_targets.py in #7372. I think it is looking for "@llvm-project//lld" instead of "@llvm-project//lld:lld", although I am not sure where the targets were updated to this...

Oh, good catch. Yeah, we can update
https://github.com/google/iree/blob/cf9540a6f0569485c639bece7749415dae307159/build_tools/bazel_to_cmake/bazel_to_cmake_targets.py#L22
to
 "@llvm-project//lld": ["lld"],

and keep the changes from lld:lld to lld

(BUILD file formatting run on import into google's source control probably pruned the :lld off of those deps)

I think the bazel_to_cmake failure is related to the update to bazel_to_cmake_targets.py in #7372. I think it is looking for "@llvm-project//lld" instead of "@llvm-project//lld:lld", although I am not sure where the targets were updated to this...

Oh, good catch. Yeah, we can update
https://github.com/google/iree/blob/cf9540a6f0569485c639bece7749415dae307159/build_tools/bazel_to_cmake/bazel_to_cmake_targets.py#L22
to
 "@llvm-project//lld": ["lld"],

and keep the changes from lld:lld to lld

(BUILD file formatting run on import into google's source control probably pruned the :lld off of those deps)

Ah I see, I updated the dep then.  Thank you!


ENH: add metadata support to TabularMSA

Constructor accepts optional metadata parameter. Added TabularMSA.metadata property with getter, setter, and deleter. Added TabularMSA.has_metadata.  Updated __eq__/__ne__ to account for metadata.
Very similar to Sequence.metadata implementation. One more class requiring arbitrary metadata will necessitate a mixin.
Fixes #1090.

Automated report
Benchmark run completed successfully. Results available at
http://powertrip.mggen.nau.edu:5000/runs/jairideout/issue-1090/html/index.html


History and Electrocardiogram-only Manchester Acute Coronary Syndromes (HE-MACS)

HE-MACS was merged to master with pull request #845.


Reducer tests

These test cover the reducers.  There may be opportunity to abstract some of the tests, especially for the reducers that are using the handle function.

Thanks @mfpiccolo for the pull request!
Per the CONTRIBUTING.md file displayed when you created this pull request, we need to add you to the list of approved contributors for the Mattermost project.
Please help complete the Mattermost contribution license agreement?
This is a standard procedure for many open source projects. Your form should be processed within 24 hours and reviewers for your pull request will be able to proceed.
Please let us know if you have any questions.
We are very happy to have you join our growing community! If you're not yet a member, please consider joining our Contributors community channel to meet other contributors and discuss new opportunities with the core team.

Thanks @mfpiccolo for the pull request!
Per the CONTRIBUTING.md file displayed when you created this pull request, we need to add you to the list of approved contributors for the Mattermost project.
Please help complete the Mattermost contribution license agreement?
This is a standard procedure for many open source projects. Your form should be processed within 24 hours and reviewers for your pull request will be able to proceed.
Please let us know if you have any questions.
We are very happy to have you join our growing community! If you're not yet a member, please consider joining our Contributors community channel to meet other contributors and discuss new opportunities with the core team.


[RFC] Enable HSDP

Stack from ghstack (oldest at bottom):

-> #518

This PR enables HSDP.
Discussions
1. How does trainer get DP mesh?
Right now, we flatten ["dp_replicate", "dp_shard"] into a flattened dimension. Because DeviceMesh currently does not support slicing a flattened dimension, we need to either a) flatten again, or b) bookkeep the flattened result. Why do we initialize all the device mesh in the beginning? That's a good strategy to avoid possible deadlock and timeout and it is easier for users to debug -- initializing a brand-new device mesh requires all ranks to participate.
What is the alternative solution? If DeviceMesh can support slicing a flattened dimension, then we can just slice out from the world mesh. Moreover, we may have to support slicing a flattened dimension. With HSDP + CP, we need to pass the following DeviceMesh to fully_shard, ["dp_replicate", "dp_shard_cp"] where dp_shard_cp is a flattened dimension.
However, if DeviceMesh supports slicing a flattened dimension, what will be the name? Currently, DeviceMesh implicitly concatenate the dimension names that form the flattened dimension. Is this too implicit? We also need to discuss this issue.
Conclusion: use named flatten + slicing
2. How does TorchTitan expose HSDP to users?
Another UX issue is that how does TorchTitan expose HSDP? There are two ways, one is to expose dp_shard and dp_replicate to user. For DDP, dp_shard==1 and dp_replicate>1. For HSDP, dp_shard>1 and dp_replicate>1. For FSDP, dp_shard>1 and dp_replicate==1.
An alternative, which this PR uses, is to expose dp_type. Users explicitly specify FSDP, HSDP, DDP.  So we need another way to express the two degrees. This PR currently expose dp_replicate but another suggestion is to let dp accept both int and Tuple[int, int].
Conclusion: data_parallel_replicate and data_parallel_shard
3. Buffers synchronization
DTensor will implicitly synchronize the RNG status. However, there are buffers that are not DTensor. How do we ensure that these buffers are synchronized? This PR currently uses _sync_module_states_with_mesh to synchronize the module states including parameters and buffers. Another proposal is that users should set the random seed correctly and ensure the buffers are the same.
Conclusion: let users handle the RNG status.
FSDP with 8 GPUs, llama3 8B

HSDP with 8 GPUs (replicate 4, shard2), llama3 8B

mark

@tianyu-l I changed data_parallel_replicate_degree default to 1. But I don't see why ParallelDims logic would be simplified. It's true that toml files and test_runner.py can be simplified but I would prefer to explicitly for these files now that we have 2 data parallelism degrees. So I just leave them in the files.


Can PyScript turn list comprehensions in map()?

The generated code for a list comprehension is big and hard to read. I wonder if we can make it smarter and generate code that uses map() and reduce().

Though rewriting list comprehensions to lambda's that have complex if/else statements isn't much fun either

Doesn't need to be a lambda; functions work too

Yeah, but then each list comprehension will need a small custom function, which can get tedious too

@ivoflipse, list comprehension will be map function in JS. Nothing will change in python, you can use list comprehensions the same as before.

While I'm in here ... does it make sense to prevent unselecting an item in certain cases? Right now an item can be unselected by clicking on it.

I think that my feeling is that the tree view should not try to be a radiobutton-thing and that code that wants to behave it like that can probably make it so quite easily (if the last event is an unselect event, select it again).

A radio-button generally only allows you to select one thing, wheres a tree (at least in Explorer/Qt/Wx) allows you to select multiple items at the same time. But to trigger the selected_index event, you generally have to double click, which you can only do on one item

@ivoflipse the Flexx TreeWidget has a max_selected property by which one can specify how many items can be selected. Clicking on an item that is already selected will unselect it, which makes the most sense, I think.

@almarklein my opinion is that if the tree item is disabled, selection or deselection should not work, and the item should be grayed out.

@Maxyme what do you mean by disabled?


[5.3] New release

Checklist

[x] I checked the Contributing Guidelines before creating this request.
[ ] New extensions are written in Swift 5.0.
[ ] New extensions support iOS 10.0+ / tvOS 9.0+ / macOS 10.10+ / watchOS 2.0+, or use @available if not.
[ ] I have added tests for new extensions, and they passed.
[ ] All extensions have a clear comments explaining their functionality, all parameters and return type in English.
[ ] All extensions are declared as public.
[ ] I have added a changelog entry describing my changes.

          2 Warnings

:warning:
ld: dylib (/Applications/Xcode_12.4.app/Contents/Developer/Platforms/MacOSX.platform/Developer/Library/Frameworks/XCTest.framework/XCTest) was built for newer macOS version (10.15) than being linked (10.12)

:warning:
ld: dylib (/Applications/Xcode_12.4.app/Contents/Developer/Platforms/MacOSX.platform/Developer/usr/lib/libXCTestSwiftSupport.dylib) was built for newer macOS version (10.15) than being linked (10.12)

          1 Message

:book:
Thank you for submitting a pull request to SwifterSwift. The team will review your submission as soon as possible.

  Generated by :no_entry_sign: Danger


Adds autocompletion support for zsh and bash

Address proposal in https://github.com/temporalio/proposals/blob/master/cli/003-cli-autocomplete.md

 Thank you for your submission! We really appreciate it. Like many open source projects, we ask that you sign our Contributor License Agreement before we can accept your contribution.You have signed the CLA already but the status is still pending? Let us recheck it.

ty for the PR

i'll send a copy to our new single binary cli (unless you send first) https://github.com/temporalio/cli

Hi @feedmeapples  thank you,
What is the difference between tctl and cli?

Hi @feedmeapples thank you,
What is the difference between tctl and cli?

just saw this .cli is going to be a replacement for tctl:

it comes with similar Temporal management commands but with updated UX
has a built-in temporal dev server and UI (via a new temporal server start-dev command)


Migrate Gravatar service

Coverage increased (+0.1%) to 96.688% when pulling 25bdc8d988ac194bced6c11c3246b10759c9fb9e on akkie:gravatar into b2f5e0aea818ba2785938f9e98f261ab59cb069c on minutemen:master.


Preset: modules selected and deselected

Strange behavior. The initial modules are selected or deselected when switching between presets
To reproduce the issue:

go to https://lite.jhipster.tech/landscape
select 1st preset

the module application-service-hexagonal-architecture-documentation is selected

select the 2nd preset

the module application-service-hexagonal-architecture-documentation is not selected anymore, but in config it is

I can't fix it right now. Only on Monday or Tuesday 👍


Adding related property to Activity

Failed to add a relevant property to the Activity model for get_related_activities in previous pull request.

Thanks, I think this also refs #41


The effect of generating human bodies is vastly different from what's shown in the Readme.

https://github.com/hpcaitech/Open-Sora/assets/115919287/be3bc504-4242-42c4-9d21-cbc934b69de7
https://github.com/hpcaitech/Open-Sora/assets/115919287/4ceef340-ccdf-49f5-b2b4-6ea36ca70c87
so bad...
command:
python scripts/inference.py configs/opensora-v1-2/inference/sample.py   --num-frames 8s --resolution 720p --aspect-ratio 1:1   --prompt "a  woman shows her hands"  "A father with a beard and glasses, wearing casual jeans and a t-shirt, pushes his laughing daughter on a swing in a sunny park. His face beams with happiness and love."  --num-sampling-steps 100  --aes 8  --loop 2 --condition-frame-length 10

Consistently generating a stable human body is quite a hard task. We admit that there are many failure cases for our current model, and we cherry-pick some good results as our demos. However, the following tricks may help improve the results:

Use the --llm-refine with gpt4o refinement
--aes 7 as the training data rarely has 8
--flow 5 to reduce motion strength
Also, you can try generating an image with our model first, and then generate the video with image2video.

@zhengzangw This is amazing!  Just got it running and am so happy to have any kind of video creation running.  Thanks for the hard work!


click event

it would be great to have some option to avoid clicks when scrolling.
It can be done manually, comparing coordinates in mousedown with coordinates in click, but I think it is a common use case, so I think an option would be better.

Sorry for late reply and thank you for suggestion! Yes, you absolutely right, it is a common use case. I'll implement a click hook with event in it to decide if we need to prevent default or some other kind of logic.

Added onClick hook.

I am a bit confused, I cannot tell the diference between a simple click and a click involved in a scroll
I am getting always  isDragging: false, isRunning: true, isScrolling: false  no matter what, even if i just click or I scroll.

+1 same issue here, I need to be able to determine if click is during dragging or not ... now there is no way to do this, which defeats the purpose of this plugin for me

For anyone else having the same issue you can use data.dragOffsetPosition as a heuristic to know whether the click is involved in a drag or not.
I'm using the following to give a little leniency:
onClick: (data, event) => {
    if (Math.abs(data.dragOffsetPosition.x) > 5) {
        event.stopPropagation();
    }
},

Thanks bobby. You saved my day!

Thanks Bobby! You saved my day too!

Thanks! tripeh  event.preventDefault(); It's work for me too. Good Job


Rolling update of an application

Show rolling update of an application, basic sample at: https://github.com/arun-gupta/kubernetes-java-sample/tree/master/rolling-update

Similar to #2

@arun-gupta @CloudyMind Do you think this is already sufficiently shown by PR #26 or do we want to go into more detail?

@w0mbat PR #26 covers it well