apply crd.yaml Error

version 0.35.1 ---update ---> version 0.36.1
items:map[description:Volume represents a named volume in a pod that may be accessed by any container in the pod. required:[name] type:object x-kubernetes-preserve-unknown-fields:true] type:array]] type:object] status:map[description:Most recent observed status of the VMAlertmanager cluster. Operator API itself. More info: https://github.com/kubernetes/community/blob/master/contributors/devel/sig-architecture/api-conventions.md#spec-and-status properties:map[availableReplicas:map[description:AvailableReplicas Total number of available pods (ready for at least minReadySeconds) targeted by this VMAlertmanager cluster. format:int32 type:integer] paused:map[description:Paused Represents whether any actions on the underlaying managed objects are being performed. Only delete actions will be performed. type:boolean] replicas:map[description:ReplicaCount Total number of non-terminated pods targeted by this VMAlertmanager cluster (their labels match the selector). format:int32 type:integer] unavailableReplicas:map[description:UnavailableReplicas Total number of unavailable pods targeted by this VMAlertmanager cluster. format:int32 type:integer] updatedReplicas:map[description:UpdatedReplicas Total number of non-terminated pods targeted by this VMAlertmanager cluster that have the desired version spec. format:int32 type:integer]] required:[availableReplicas paused replicas unavailableReplicas updatedReplicas] type:object]] required:[spec] type:object]] served:true storage:true subresources:map[]]]]]": cannot convert int64 to float64

kubectl delete CustomResourceDefinition vmalertmanagers.operator.victoriametrics.com

apply crd.yaml.  is ok !

@Haleygo could you please take a look?

Hello @jicki
Do you get crd yaml from https://github.com/VictoriaMetrics/operator/blob/master/config/crd/bases/operator.victoriametrics.com_vmalertmanagerconfigs.yaml and do you use kubectl apply to upgrade it?
The upgrade works on my test. And I checked the change from 0.35.1 to 0.36.1 on operator.victoriametrics.com_vmalertmanagerconfigs.yaml and nothing really changed.

Hello @jicki Do you get crd yaml from https://github.com/VictoriaMetrics/operator/blob/master/config/crd/bases/operator.victoriametrics.com_vmalertmanagerconfigs.yaml and do you use kubectl apply to upgrade it? The upgrade works on my test. And I checked the change from 0.35.1 to 0.36.1 on operator.victoriametrics.com_vmalertmanagerconfigs.yaml and nothing really changed.

get crd yaml from  https://github.com/VictoriaMetrics/operator/releases

Weird, still works for me.

Could you please recreate it and paste full logs?

Weird, still works for me.  Could you please recreate it and paste full logs?

I just tested it and didn't have any issues. I'm unable to reproduce the error. If I come across it again somewhere else, I'll come back and let you know.

@Haleygo
v0.37.1 update to v0.39.0 encounter the same error, full log is as follows
error.log

Did you use helm or kubectl to do the upgrade? And which version their are?

Did you use helm or kubectl to do the upgrade? And which version their are?

use kubectl  apply    to upgrade .  kubectl version v1.22.x

Did you use helm or kubectl to do the upgrade? And which version their are?

@Haleygo
Upgrade 0.93.3.  I still have this error
kubectl get vmalertmanagers.operator.victoriametrics.com  -A
No resources found

@jicki
Could you please give some reproduce steps?
What's your pre-installed CRD version, and you use kubectl all the time, right?
ps. could releated to https://github.com/helm/helm/issues/5806#issuecomment-782224318, but according to the discussion, the issue should be resolved for k8s 1.20+.

@jicki Could you please give some reproduce steps? What's your pre-installed CRD version, and you use kubectl all the time, right?
ps. could releated to helm/helm#5806 (comment), but according to the discussion, the issue should be resolved for k8s 1.20+.

version 0.35.1 ---upgrade ---> version 0.36.1
version 0.37.1 ---upgrade ---> version 0.39.0
version 0.39.0 -- upgrade ---> version 0.39.3
hhis error occurred
crd update use kubectl apply -f crd.yaml

version 0.35.1 ---upgrade ---> version 0.36.1
version 0.37.1 ---upgrade ---> version 0.39.0
version 0.39.0 -- upgrade ---> version 0.39.3

So you applied 0.35.1's crd.yaml on a clean environment, then just download the newer crd.yaml and kubectl apply again?
I don't see there is relevant changes between v0.39.3 and v0.35.1. Besides descriptions, the only change is adding useStrictSecurity. Maybe your environment already installed older CRD?
And what's your k8s version now? Can you test with newer version?
➜  operator git:(master) ✗ git --no-pager diff v0.35.1 v0.39.3 -- config/crd/bases/operator.victoriametrics.com_vmalertmanagers.yaml
diff --git a/config/crd/bases/operator.victoriametrics.com_vmalertmanagers.yaml b/config/crd/bases/operator.victoriametrics.com_vmalertmanagers.yaml
index d3b2aac..86cbaf3 100644
--- a/config/crd/bases/operator.victoriametrics.com_vmalertmanagers.yaml
+++ b/config/crd/bases/operator.victoriametrics.com_vmalertmanagers.yaml
@@ -2,7 +2,7 @@ apiVersion: apiextensions.k8s.io/v1
 kind: CustomResourceDefinition
 metadata:
   annotations:
-    controller-gen.kubebuilder.io/version: v0.10.0
+    controller-gen.kubebuilder.io/version: v0.12.1
   name: vmalertmanagers.operator.victoriametrics.com
 spec:
   group: operator.victoriametrics.com
@@ -592,7 +592,7 @@ spec:
               imagePullSecrets:
                 description: ImagePullSecrets An optional list of references to secrets
                   in the same namespace to use for pulling images from registries
-                  see http://kubernetes.io/docs/user-guide/images#specifying-imagepullsecrets-on-a-pod
+                  see https://kubernetes.io/docs/concepts/containers/images/#referring-to-an-imagepullsecrets-on-a-pod
                 items:
                   description: LocalObjectReference contains enough information to
                     let you locate the referenced object inside the same namespace.
@@ -688,7 +688,7 @@ spec:
                     description: 'Annotations is an unstructured key value map stored
                       with a resource that may be set by external tools to store and
                       retrieve arbitrary metadata. They are not queryable and should
-                      be preserved when modifying objects. More info: http://kubernetes.io/docs/user-guide/annotations'
+                      be preserved when modifying objects. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations'
                     type: object
                   labels:
                     additionalProperties:
@@ -696,14 +696,14 @@ spec:
                     description: 'Labels Map of string keys and values that can be
                       used to organize and categorize (scope and select) objects.
                       May match selectors of replication controllers and services.
 Is required
                       when creating resources, although some resources may allow a
                       client to request the generation of an appropriate name automatically.
                       Name is primarily intended for creation idempotence and configuration
-                      definition. Cannot be updated. More info: http://kubernetes.io/docs/user-guide/identifiers#names'
+                      definition. Cannot be updated. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names#names'
                     type: string
                 type: object
               podSecurityPolicyName:
@@ -816,8 +816,8 @@ spec:
                   to use
                 type: string
               serviceScrapeSpec:
-                description: ServiceScrapeSpec that will be added to vmselect VMServiceScrape
-                  spec
+                description: ServiceScrapeSpec that will be added to vmalertmanager
+                  VMServiceScrape spec
                 required:
                 - endpoints
                 type: object
@@ -837,7 +837,7 @@ spec:
                           stored with a resource that may be set by external tools
                           to store and retrieve arbitrary metadata. They are not queryable
                           and should be preserved when modifying objects. More info:
-                          http://kubernetes.io/docs/user-guide/annotations'
+                          https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations'
                         type: object
                       labels:
                         additionalProperties:
@@ -845,7 +845,7 @@ spec:
                         description: 'Labels Map of string keys and values that can
                           be used to organize and categorize (scope and select) objects.
                           May match selectors of replication controllers and services.
 Is required
@@ -853,7 +853,7 @@ spec:
                           a client to request the generation of an appropriate name
                           automatically. Name is primarily intended for creation idempotence
                           and configuration definition. Cannot be updated. More info:
-                          http://kubernetes.io/docs/user-guide/identifiers#names'
+                          https://kubernetes.io/docs/concepts/overview/working-with-objects/names#names'
                         type: string
                     type: object
                   spec:
@@ -928,7 +928,7 @@ spec:
                               map stored with a resource that may be set by external
                               tools to store and retrieve arbitrary metadata. They
                               are not queryable and should be preserved when modifying
-                              objects. More info: http://kubernetes.io/docs/user-guide/annotations'
+                              objects. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations'
                             type: object
                           labels:
                             additionalProperties:
@@ -936,7 +936,7 @@ spec:
                             description: 'Labels Map of string keys and values that
                               can be used to organize and categorize (scope and select)
                               objects. May match selectors of replication controllers
-                              and services. More info: http://kubernetes.io/docs/user-guide/labels'
+                              and services. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/labels'
                             type: object
                           name:
                             description: 'Name must be unique within a namespace.
@@ -944,7 +944,7 @@ spec:
                               may allow a client to request the generation of an appropriate
                               name automatically. Name is primarily intended for creation
                               idempotence and configuration definition. Cannot be
-                              updated. More info: http://kubernetes.io/docs/user-guide/identifiers#names'
+                              updated. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names#names'
                             type: string
                         type: object
                       spec:
@@ -1291,6 +1291,11 @@ spec:
                   type: object
                   x-kubernetes-preserve-unknown-fields: true
                 type: array
+              useStrictSecurity:
+                description: UseStrictSecurity enables strict security mode for component
+                  it restricts disk writes access uses non-root user out of the box
+                  drops not needed security permissions
+                type: boolean
               volumeMounts:
                 description: VolumeMounts allows configuration of additional VolumeMounts
                   on the output StatefulSet definition. VolumeMounts specified will

version 0.35.1 ---upgrade ---> version 0.36.1
version 0.37.1 ---upgrade ---> version 0.39.0
version 0.39.0 -- upgrade ---> version 0.39.3

So you applied 0.35.1's crd.yaml on a clean environment, then just download the newer crd.yaml and kubectl apply again? I don't see there is relevant changes between v0.39.3 and v0.35.1. Besides descriptions, the only change is adding useStrictSecurity. Maybe your environment already installed older CRD? And what's your k8s version now? Can you test with newer version?
➜  operator git:(master) ✗ git --no-pager diff v0.35.1 v0.39.3 -- config/crd/bases/operator.victoriametrics.com_vmalertmanagers.yaml
diff --git a/config/crd/bases/operator.victoriametrics.com_vmalertmanagers.yaml b/config/crd/bases/operator.victoriametrics.com_vmalertmanagers.yaml
index d3b2aac..86cbaf3 100644
--- a/config/crd/bases/operator.victoriametrics.com_vmalertmanagers.yaml
+++ b/config/crd/bases/operator.victoriametrics.com_vmalertmanagers.yaml
@@ -2,7 +2,7 @@ apiVersion: apiextensions.k8s.io/v1
 kind: CustomResourceDefinition
 metadata:
   annotations:
-    controller-gen.kubebuilder.io/version: v0.10.0
+    controller-gen.kubebuilder.io/version: v0.12.1
   name: vmalertmanagers.operator.victoriametrics.com
 spec:
   group: operator.victoriametrics.com
@@ -592,7 +592,7 @@ spec:
               imagePullSecrets:
                 description: ImagePullSecrets An optional list of references to secrets
                   in the same namespace to use for pulling images from registries
-                  see http://kubernetes.io/docs/user-guide/images#specifying-imagepullsecrets-on-a-pod
+                  see https://kubernetes.io/docs/concepts/containers/images/#referring-to-an-imagepullsecrets-on-a-pod
                 items:
                   description: LocalObjectReference contains enough information to
                     let you locate the referenced object inside the same namespace.
@@ -688,7 +688,7 @@ spec:
                     description: 'Annotations is an unstructured key value map stored
                       with a resource that may be set by external tools to store and
                       retrieve arbitrary metadata. They are not queryable and should
-                      be preserved when modifying objects. More info: http://kubernetes.io/docs/user-guide/annotations'
+                      be preserved when modifying objects. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations'
                     type: object
                   labels:
                     additionalProperties:
@@ -696,14 +696,14 @@ spec:
                     description: 'Labels Map of string keys and values that can be
                       used to organize and categorize (scope and select) objects.
                       May match selectors of replication controllers and services.
 Is required
                       when creating resources, although some resources may allow a
                       client to request the generation of an appropriate name automatically.
                       Name is primarily intended for creation idempotence and configuration
-                      definition. Cannot be updated. More info: http://kubernetes.io/docs/user-guide/identifiers#names'
+                      definition. Cannot be updated. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names#names'
                     type: string
                 type: object
               podSecurityPolicyName:
@@ -816,8 +816,8 @@ spec:
                   to use
                 type: string
               serviceScrapeSpec:
-                description: ServiceScrapeSpec that will be added to vmselect VMServiceScrape
-                  spec
+                description: ServiceScrapeSpec that will be added to vmalertmanager
+                  VMServiceScrape spec
                 required:
                 - endpoints
                 type: object
@@ -837,7 +837,7 @@ spec:
                           stored with a resource that may be set by external tools
                           to store and retrieve arbitrary metadata. They are not queryable
                           and should be preserved when modifying objects. More info:
-                          http://kubernetes.io/docs/user-guide/annotations'
+                          https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations'
                         type: object
                       labels:
                         additionalProperties:
@@ -845,7 +845,7 @@ spec:
                         description: 'Labels Map of string keys and values that can
                           be used to organize and categorize (scope and select) objects.
                           May match selectors of replication controllers and services.
 Is required
@@ -853,7 +853,7 @@ spec:
                           a client to request the generation of an appropriate name
                           automatically. Name is primarily intended for creation idempotence
                           and configuration definition. Cannot be updated. More info:
-                          http://kubernetes.io/docs/user-guide/identifiers#names'
+                          https://kubernetes.io/docs/concepts/overview/working-with-objects/names#names'
                         type: string
                     type: object
                   spec:
@@ -928,7 +928,7 @@ spec:
                               map stored with a resource that may be set by external
                               tools to store and retrieve arbitrary metadata. They
                               are not queryable and should be preserved when modifying
-                              objects. More info: http://kubernetes.io/docs/user-guide/annotations'
+                              objects. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations'
                             type: object
                           labels:
                             additionalProperties:
@@ -936,7 +936,7 @@ spec:
                             description: 'Labels Map of string keys and values that
                               can be used to organize and categorize (scope and select)
                               objects. May match selectors of replication controllers
-                              and services. More info: http://kubernetes.io/docs/user-guide/labels'
+                              and services. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/labels'
                             type: object
                           name:
                             description: 'Name must be unique within a namespace.
@@ -944,7 +944,7 @@ spec:
                               may allow a client to request the generation of an appropriate
                               name automatically. Name is primarily intended for creation
                               idempotence and configuration definition. Cannot be
-                              updated. More info: http://kubernetes.io/docs/user-guide/identifiers#names'
+                              updated. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names#names'
                             type: string
                         type: object
                       spec:
@@ -1291,6 +1291,11 @@ spec:
                   type: object
                   x-kubernetes-preserve-unknown-fields: true
                 type: array
+              useStrictSecurity:
+                description: UseStrictSecurity enables strict security mode for component
+                  it restricts disk writes access uses non-root user out of the box
+                  drops not needed security permissions
+                type: boolean
               volumeMounts:
                 description: VolumeMounts allows configuration of additional VolumeMounts
                   on the output StatefulSet definition. VolumeMounts specified will

OK  In the next update I will test it in several different versions .

"I still have this issue."
just only.  CustomResourceDefinition  vmalertmanagers.operator.victoriametrics.com


Make the whole SALE component clickable and linked

Please make it so that I can click anywhere on the sale component and be brought to an external URL.

Fixed here. deec231


Tables should not show text filter if there are not results

Need to ensure the text filter still shows when there's a text filter value and no results


build error

Failed to resolve: cn.jzvd:jiaozivideoplayer:6.1.0_preview

This is a preview version
Development work has not yet completed，You can download demo to test scroll in list, I will fix these bugs I found, next week will complete.


Introduce Secret Backends implementation and CRDs

It is possible to specify a Backend attribute in an ExternalSecret resource, however this value is ignored.
In fact, the AWS Secret Manager backend is configured using environment variable.
We could introduce an ExternalSecretBackend CRD that helps configure multiple backends. For example:
apiVersion: "externalsecret-operator.container-solutions.com/v1alpha1"
kind: "ExternalSecretBackend"
metadata:
  name: "production-secrets"
spec:
  BackendType: "asm"
  AccessKeyID: "AKIAIOSFODNN7EXAMPLE"
  SecretKey: "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY"

And then reference it from the ExternalSecret resources as in:
apiVersion: "externalsecret-operator.container-solutions.com/v1alpha1"
kind: "ExternalSecret"
metadata:
  name: "asecret"
spec:
  Key: "asecret"
  Backend: "production-secrets"

WIP in https://github.com/ContainerSolutions/externalsecret-operator/tree/externalsecretbackend

Going to drop this in favor of https://github.com/ContainerSolutions/externalsecret-operator/tree/pluggablebackends

After discussion in #10 we decided to merge #18 instead.


Add postMessage for Windows WebView

Summary
Added postMessage function.
Also switched to react-native-windows 0.61.0 stable.

Hi @kaiguo could you make sure to update the docs with this new addition

Hi @kaiguo Kai Guo FTE could you make sure to update the docs with this new addition

@safaiyeh updated : )

@kaiguo Would you mind fixing conflicts? I started to but I think it needs your eyes on it.

@jamonholmgren I just resolved the conflicts, could you help get this in when you get a chance? Thanks!


Documentation for The Actual Physical Setup?

Thank you all for this ground breaking work!! I really want to make my DIY PNN, but I ran into some questions after reading the docs. I'm wondering if you could publish a bit more documentations about the actual building process of the PNN?
For instance, in Example 1, the first oscillator network is composed of 196 oscillators. If I construct an audio-frequency mechanical oscillator from a commercially available speaker, just like you what did in the paper, does it mean that I would need to buy 196 speakers? And how would you connect them to form a "layer", and how would you make this layer coupled with the next layer?
I'm been working with digital NN only and I have some experience making some hobbyist breadboard circuits, but never in a scale like this. It would be a dream come true if I can make my own PNN..
Any help / directions / references would be appreciated!

Hi and thank you for the interest!
More documentation about the building process of the PNNs is published in section 2 of the supplementary material. The mechanical oscillator PNN is described in section 2.C. The 196 refers to the number of time-domain inputs to the oscillator which are fed into a single commercially available speaker!
To create multi-layer PNNs, we reused each physical system by recording the analog output signal, processing it in the digital domain and reinjecting it into the same system. Eliminating the analog-to-digital conversion and directly coupling multiple physical systems is a promising direction to pursue--a discussion of the benefits can be found supplementary section 5, specifically subsection 5.D.1.
To get into the details of making a DIY PNN, it might also help you to take a look at the code to train each PNN. We published the code on Zenodo (https://doi.org/10.5281/zenodo.4719150). I think the notebooks most relevant to your question are analog_transistor_PNN/1 generate digital model training data and train physical neural network.ipynb and oscillating_plate_PNN/2 take data for differentiable digital model.ipynb.
Please let us know if you have further questions! We are happy to keep discussing.


Initial Setup and Project Scaffolding

Issue Title: Set up project structure and environment
Description: Initialize the project with Next.js (or any other framework), TailwindCSS, and basic dependencies (e.g., file upload libraries, date libraries).
Tasks:

Create the file structure (pages, components, assets, etc.).
Add TailwindCSS and configure it.
Set up version control (.gitignore, README, etc.).

Please comment on this issue if you'd like to work on any of these tasks or if you have any questions or suggestions.
#hacktoberfest

can i be assigned this


ardour: 6.9 -> 7.0

Description of changes

Release notes for 7.0: https://ardour.org/whatsnew.html
Note: I retrieved the sha256 hash by setting it to "" and then taking the expected sum upon running the derivation. It doesn't match the same number of characters as the old hash though, so please double-check. I was confused between a base32 and base64 hashes. Have updated to use the hash keyword.
Things done
Tested:

Importing multiple songs and playing them via JACK
Messing around with the new clip launcher
Exporting a song to flac

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)
[x] 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

[x] 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/)
22.11 Release Notes (or backporting 22.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
[ ] (Release notes changes) Ran nixos/doc/manual/md-to-db.sh to update generated release notes

[x] Fits CONTRIBUTING.md.

@magnetophon Right, I think I've done the right thing? Let me know otherwise :grin:

Oh, sorry, I just noticed it's 2 separate commits.
Could you squash them into one?

@magnetophon have squashed!

Me neither! :)

I can't wait to try it out :)

@ofborg build ardour6

Thanks for the reviews @winterqt @SuperSandro2000. I've applied any suggestions for improving derivation(s) to default.nix (ardour7) only and left ardour6 alone, as it's been suggested to only remove version 6 once 7 stabilizes a bit. I've created an issue to remember to do this and for future context: https://github.com/NixOS/nixpkgs/issues/196841

Please follow the contributing guide when naming your commits.

@anoadragon453 I just learned that Ardour comes with a smal amount of bundled content:
https://github.com/Ardour/ardour/blob/14da117bc880ebcc8a805348a97acdae31b2753b/tools/linux_packaging/build#L749-L759
Could you include that?

@SuperSandro2000 rebased! Apologies, just learning now that nixpkgs prefers rebasing/squashing commits during the PR process. Thanks!
@magnetophon I'm still getting to grips with nix packaging. I think to do this, I'd slot a fetchzip pointing to http://stuff.ardour.org/loops/ArdourBundledMedia.zip somewhere, then put the contents in the correct place during the install phase?

@anoadragon453 Yes, that is how you'd do it.
Thanks!

Please use a web.archive.org link for unversioned downloads like https://web.archive.org/web/20221026200824/http://stuff.ardour.org/loops/ArdourBundledMedia.zip

7.1 should be out tomorrow (according to paul davis)

Thanks for the heads up @pyrotek45. I'll update this PR to point to 7.1 instead.
@magnetophon and others, do we still want to keep ardour 6.9 around now that 7.1 is out? Is 7.1 considered a stable enough release to drop 6.9?

@anoadragon453 I've been running 7.1 for a little bit and while it seems better, I think it's good to leave 6.9 in for a couple of months, so people can finish any running projects they have in 6.9 and transfer to 7.x when they are done.
If others have strong feelings on removing 6.9, I'd be (reluctantly) OK with that as well.

@anoadragon453 That doesn't build for me, I get:
Automatic merge went well; stopped before committing as requested
$ nix-env --option system x86_64-linux -f /home/bart/.cache/nixpkgs-review/pr-196290-5/nixpkgs -qaP --xml --out-path --show-trace --meta
1 package added:
ardour_6 (init at 6.9)

1 package updated:
ardour (6.9 → 7.1)

$ nix --experimental-features nix-command build --no-link --keep-going --option build-use-sandbox relaxed -f /home/bart/.cache/nixpkgs-review/pr-196290-5/build.nix
error: build of '/nix/store/f96dn18w8scqs3imsk5ccb27201cf9k6-ardour-7.1.drv' on 'ssh://nixBuild@builder' failed: builder for '/nix/store/f96dn18w8scqs3imsk5ccb27201cf9k6-ardour-7.1.drv' failed with exit code 1;
       last 10 log lines:
       > removed '/nix/store/wmcsp68ckzidh5b1sxfx17bcpx9ss6qp-ardour-7.1/share/icons/hicolor/256x256/apps/ardour7.png'
       > 'gtk2_ardour/resources/Ardour-icon_256px.png' -> '/nix/store/wmcsp68ckzidh5b1sxfx17bcpx9ss6qp-ardour-7.1/share/icons/hicolor/256x256/apps/ardour7.png'
       > removed '/nix/store/wmcsp68ckzidh5b1sxfx17bcpx9ss6qp-ardour-7.1/share/icons/hicolor/512x512/apps/ardour7.png'
       > 'gtk2_ardour/resources/Ardour-icon_512px.png' -> '/nix/store/wmcsp68ckzidh5b1sxfx17bcpx9ss6qp-ardour-7.1/share/icons/hicolor/512x512/apps/ardour7.png'
       > install: creating directory '/nix/store/wmcsp68ckzidh5b1sxfx17bcpx9ss6qp-ardour-7.1/share/man'
       > install: creating directory '/nix/store/wmcsp68ckzidh5b1sxfx17bcpx9ss6qp-ardour-7.1/share/man/man1'
       > 'ardour.1' -> '/nix/store/wmcsp68ckzidh5b1sxfx17bcpx9ss6qp-ardour-7.1/share/man/man1/ardour.1'
       > 'MIDI Beats'  'MIDI Chords'  'MIDI Progressions'
       > install: creating directory '/nix/store/wmcsp68ckzidh5b1sxfx17bcpx9ss6qp-ardour-7.1/share/media'
       > install: omitting directory '/nix/store/vzmx96hjs7k1czfb0c8akpfzj8wbxac6-source'
       For full logs, run 'nix log /nix/store/f96dn18w8scqs3imsk5ccb27201cf9k6-ardour-7.1.drv'.

@magnetophon Mmm yes, because https://github.com/NixOS/nixpkgs/pull/196290/commits/69c3b46dcfe0c06e391a1ed941c77848b4b2fbab is still included. Happy to drop it if we think we should add the bundled content in a separate PR (https://github.com/NixOS/nixpkgs/pull/196290#discussion_r1014833812).

@magnetophon Mmm yes, because 69c3b46 is still included. Happy to drop it if we think we should add the bundled content in a separate PR (#196290 (comment)).

The Ardour devs worked hard to be able to include this content, I think we should try to present the users the full version.
@cillianderoiste @mitchmindtree What do you think?

Note that I'm happy to include it -- but will need some guidance on writing the nix needed to do so :)

Note that I'm happy to include it -- but will need some guidance on writing the nix needed to do so :)

I just got it to install by replacing the install command by:
    mkdir -p "$out/share/media"
    cp -rp "${bundledContent}"/* "$out/share/media"

The media are in $out/share/media, but they do not show up in ardour yet.  :/

To be explicit: I believe this is ready to be merged.

@anoadragon453 For me, the bundled content does not show up in ardour.

@magnetophon I just tried it out, it does work.


Fixed issue intoruduced after adding check() calls

My sincere apologies because my ignorance resulted into broken build.
To fix this issue, now check() calls are configured to match for Match.Any (Matches any value) type.

Modified documentation to provide styling of upload button and progress-bar (based on semantic-ui).
Added a known issue when used with meteor-easy-security

Lol, ok, I repaired it with my latest commit. I've had this package very abandoned, I'm going to see if I can make it work like my S3 package so that we can get it to version 4 this week.

Woohoo! I got signed uploads working easily, lol. Expect breaking changes soon.


Strange phenomenon in flame rendering text

What happened?
The ball with text if over about 50, balls will collapse, overlap and always shaking.

What do you expect?

How can we reproduce this?
Just modify the contact_callbacks_example code.
contact_callbacks_example.dart
import 'dart:math' as math;

import 'package:examples/stories/bridge_libraries/flame_forge2d/utils/balls.dart';
import 'package:examples/stories/bridge_libraries/flame_forge2d/utils/boundaries.dart';
import 'package:flame/components.dart';
import 'package:flame/events.dart';
import 'package:flame_forge2d/flame_forge2d.dart';

class ContactCallbacksExample extends Forge2DGame {
  static const description = '''
    This example shows how `BodyComponent`s can react to collisions with other
    bodies.

  ''';

  ContactCallbacksExample()
      : super(gravity: Vector2(0, 10.0), world: ContactCallbackWorld());
}

class ContactCallbackWorld extends Forge2DWorld
    with TapCallbacks, HasGameReference<Forge2DGame> {
  @override
  Future<void> onLoad() async {
    super.onLoad();
    final boundaries = createBoundaries(game);
    addAll(boundaries);
  }

  @override
  void onTapDown(TapDownEvent info) {
    super.onTapDown(info);
    final position = info.localPosition;
    if (math.Random().nextInt(10) < 2) {
      add(WhiteBall(position));
    } else {
      add(Ball(position));
    }
  }
}

balls.dart
import 'package:examples/stories/bridge_libraries/flame_forge2d/utils/boundaries.dart';
import 'package:flame/palette.dart';
import 'package:flame_forge2d/flame_forge2d.dart';
import 'package:flutter/material.dart';

class Ball extends BodyComponent with ContactCallbacks {
  late Paint originalPaint;
  bool giveNudge = false;
  final double radius;
  final BodyType bodyType;
  final Vector2 _position;

  final textPainter = TextPainter(textDirection: TextDirection.ltr);
  late Offset textOffset;

  Ball(
    this._position, {
    this.radius = 3.5,
    this.bodyType = BodyType.dynamic,
    Color? color,
  }) {
    if (color != null) {
      originalPaint = PaletteEntry(color).paint();
    } else {
      originalPaint = randomPaint();
    }
    paint = originalPaint;
  }

  Paint randomPaint() => PaintExtension.random(withAlpha: 0.9, base: 100);

  @override
  Future<void> onLoad() {
    textPainter.text = const TextSpan(text: '💊', style: TextStyle(fontSize: 3));
    textPainter.layout();
    textOffset = Offset(-textPainter.width/2, -textPainter.height/2);
    return super.onLoad();
  }

  @override
  Body createBody() {
    final shape = CircleShape();
    shape.radius = radius;

    final fixtureDef = FixtureDef(
      shape,
      restitution: 0.8,
      friction: 0.4,
    );

    final bodyDef = BodyDef(
      userData: this,
      angularDamping: 0.8,
      position: _position,
      type: bodyType,
    );

    return world.createBody(bodyDef)..createFixture(fixtureDef);
  }

  @override
  void renderCircle(Canvas canvas, Offset center, double radius) {
    super.renderCircle(canvas, center, radius);
    textPainter.paint(canvas, textOffset);
  }
}

class WhiteBall extends Ball with ContactCallbacks {
  WhiteBall(super.position) {
    originalPaint = BasicPalette.white.paint();
    paint = originalPaint;
  }

  @override
  void beginContact(Object other, Contact contact) {
    if (other is Ball) {
      other.giveNudge = true;
    }
  }
}

What steps should take to fix this?
If comment the line textPainter.paint(canvas, textOffset); will work as expected, it seems like flame text(or emoji) rendering performance issue?
Do have an example of where the bug occurs?
No response
Relevant log output
No response
Execute in a terminal and put output into the code block below
Output of: flutter doctor -v
[✓] Flutter (Channel stable, 3.19.2, on macOS 13.6 22G120 darwin-arm64 (Rosetta), locale en-US)
• Flutter version 3.19.2 on channel stable at /Users/taotao/Documents/flutter
• Upstream repository https://github.com/flutter/flutter.git
• Framework revision<PHONE_NUMBER> (12 days ago), 2024-02-27 16:51:22 -0500
• Engine revision 04817c99c9
• Dart version 3.3.0
• DevTools version 2.31.1
[✓] Android toolchain - develop for Android devices (Android SDK version 34.0.0)
• Android SDK at /Users/taotao/Library/Android/sdk
• Platform android-34, build-tools 34.0.0
• ANDROID_HOME = /Users/taotao/Library/Android/sdk
• Java binary at: /Applications/Android Studio.app/Contents/jbr/Contents/Home/bin/java
• Java version OpenJDK Runtime Environment (build 17.0.9+0-17.0.9b1087.7-11185874)
• All Android licenses accepted.
Affected platforms
Android
Other information
Only test on android emulator
  flame: ^1.16.0
  flame_forge2d: ^0.17.0

Are you interested in working on a PR for this?

[ ] I want to work on this

Supplementary video
untitled-2.webm

Are you losing FPS when this happens?

@spydon Yes, there seems to be some losing FPS.

I guess when dt starts growing when the FPS goes down it will hit max force between the balls and the calculations start to break down. I didn't know the text painter would be that heavy though, have you tried this on multiple platforms?

@spydon The performance is still normal when I test up to 100 balls on the Android physical device. As it stands now, it is acceptable.

Ah alright, this was only in the emulator? Performance issues are quite common on the emulators.

I'll close this since it only seems to happen on emulators


Add version command to tessera CLI

Codecov Report

Merging #1220 (34f98ff) into master (89ab051) will increase coverage by 0.01%.
The diff coverage is 100.00%.

@@             Coverage Diff              @@
##             master    #1220      +/-   ##
============================================
+ Coverage     99.50%   99.52%   +0.01%
+ Complexity     3086     3077       -9
============================================
  Files           470      469       -1
  Lines          9082     9042      -40
  Branches        480      469      -11
============================================
- Hits           9037     8999      -38
  Misses            5        5
+ Partials         40       38       -2

Flag
Coverage Δ
Complexity Δ

unittests
99.52% <100.00%> (+0.01%)
0.00 <18.00> (ø)

Flags with carried forward coverage won't be shown. Click here to find out more.

Impacted Files
Coverage Δ
Complexity Δ

...main/java/com/quorum/tessera/cli/CliException.java
100.00% <ø> (ø)
1.00 <0.00> (ø)

...a/com/quorum/tessera/config/cli/KeyGenCommand.java
97.91% <ø> (-0.05%)
26.00 <0.00> (-2.00)

...om/quorum/tessera/config/cli/KeyUpdateCommand.java
100.00% <ø> (ø)
18.00 <0.00> (ø)

...a/com/quorum/tessera/cli/CLIExceptionCapturer.java
100.00% <100.00%> (ø)
5.00 <3.00> (ø)

...a/com/quorum/tessera/cli/parsers/PidFileMixin.java
100.00% <100.00%> (ø)
7.00 <2.00> (+1.00)

...config/cli/NoTesseraConfigfileOptionException.java
100.00% <100.00%> (ø)
1.00 <1.00> (ø)

...com/quorum/tessera/config/cli/PicoCliDelegate.java
100.00% <100.00%> (+2.10%)
7.00 <0.00> (-13.00)
:arrow_up:

.../com/quorum/tessera/config/cli/TesseraCommand.java
100.00% <100.00%> (ø)
8.00 <8.00> (+7.00)

.../com/quorum/tessera/config/cli/VersionCommand.java
100.00% <100.00%> (ø)
2.00 <2.00> (?)

...orum/tessera/enclave/server/EnclaveCliAdapter.java
100.00% <100.00%> (ø)
6.00 <2.00> (ø)

... and 1 more

Continue to review full report at Codecov.

Legend - Click here to learn more
Δ = absolute <relative> (impact), ø = not affected, ? = missing data
Powered by Codecov. Last update 89ab051...a75e2d0. Read the comment docs.

Codecov Report

Merging #1220 (34f98ff) into master (89ab051) will increase coverage by 0.01%.
The diff coverage is 100.00%.

@@             Coverage Diff              @@
##             master    #1220      +/-   ##
============================================
+ Coverage     99.50%   99.52%   +0.01%
+ Complexity     3086     3077       -9
============================================
  Files           470      469       -1
  Lines          9082     9042      -40
  Branches        480      469      -11
============================================
- Hits           9037     8999      -38
  Misses            5        5
+ Partials         40       38       -2

Flag
Coverage Δ
Complexity Δ

unittests
99.52% <100.00%> (+0.01%)
0.00 <18.00> (ø)

Flags with carried forward coverage won't be shown. Click here to find out more.

Impacted Files
Coverage Δ
Complexity Δ

...main/java/com/quorum/tessera/cli/CliException.java
100.00% <ø> (ø)
1.00 <0.00> (ø)

...a/com/quorum/tessera/config/cli/KeyGenCommand.java
97.91% <ø> (-0.05%)
26.00 <0.00> (-2.00)

...om/quorum/tessera/config/cli/KeyUpdateCommand.java
100.00% <ø> (ø)
18.00 <0.00> (ø)

...a/com/quorum/tessera/cli/CLIExceptionCapturer.java
100.00% <100.00%> (ø)
5.00 <3.00> (ø)

...a/com/quorum/tessera/cli/parsers/PidFileMixin.java
100.00% <100.00%> (ø)
7.00 <2.00> (+1.00)

...config/cli/NoTesseraConfigfileOptionException.java
100.00% <100.00%> (ø)
1.00 <1.00> (ø)

...com/quorum/tessera/config/cli/PicoCliDelegate.java
100.00% <100.00%> (+2.10%)
7.00 <0.00> (-13.00)
:arrow_up:

.../com/quorum/tessera/config/cli/TesseraCommand.java
100.00% <100.00%> (ø)
8.00 <8.00> (+7.00)

.../com/quorum/tessera/config/cli/VersionCommand.java
100.00% <100.00%> (ø)
2.00 <2.00> (?)

...orum/tessera/enclave/server/EnclaveCliAdapter.java
100.00% <100.00%> (ø)
6.00 <2.00> (ø)

... and 1 more

Continue to review full report at Codecov.

Legend - Click here to learn more
Δ = absolute <relative> (impact), ø = not affected, ? = missing data
Powered by Codecov. Last update 89ab051...a75e2d0. Read the comment docs.


feature: minimize container image

Rearrange Dockerfile so it creates as little layers as possible and removes everything temporary in the same RUN step as it is downloaded. Like this these downloads are never in any layer and just hidden by deleting them later.

Beside the indentations, looks good to me (we can fix it later if needed. GH UI seems to be contradicting any fixing attempts). Tested locally as well, runs fine.

Will let @bwbohl have another look.

I created a PR with the fixed against @simar0at ’s
Many thanks; that really compresses the image by about 300MB!
I was wondering whether we should also move the download of ANT, Saxon, and Xerces (line 27) into the RUN (line 35). Doing so, we would drop another layer, and this should further reduce image size, correct?

Deleting the zips after deploying them would be absolutely fine

145.2 E: Failed to fetch https://packages.adoptium.net/artifactory/deb/pool/main/t/temurin-17/temurin-17-jdk_<IP_ADDRESS>.0%2b7_arm64.deb  Error reading from server. Remote end closed connection [IP: <IP_ADDRESS> 443]

Either the logic for getting temurin is broken or this is a one off and just rerunning will du.

Rerun was fine

Thank you @simar0at for this helpful contribution!


findFirstOrThrow / findUniqueOrThrow errors are not reported via error event

Bug description
When findFirstOrThrow or findUniqueOrThrow can't find a model instance, an error is thrown. This error is not currently catchable as it doesn't trigger a Prisma error event, nor is it thrown by next inside of middlewares.
This is the issue which was described by @bbenezech in this comment and confirmed to be a bug by @janpio .
For us the immediate effect is that the error is not logged by our custom logger, which results in 5 or 6 error lines in Datadog (triggering error alerting).
How to reproduce

Setup a prisma.$on("error", ...) event hook
Setup a prisma.$use(...) middleware
Use the Prisma client to make a findFirstOrThrow query that is guaranteed to fail
The error is thrown and logged directly in console without going through the error event hook, or being thrown inside the middleware

Expected behavior
I would expect one of those two behaviours (or both) :

The error event hook is called
The error is thrown by next in the middleware so i can catch it and treat it accordingly

Prisma information

This happens for all models but should be reproducible with this minimal schema :
datasource db {
  provider = "postgresql"
  url      = env("DB_URL")
}

generator client {
  provider        = "prisma-client-js"
  previewFeatures = ["interactiveTransactions", "orderByNulls"]
}

model User {
  id                 Int                       @id @default(autoincrement())
  email              String                    @unique
}

Client queries :
  const prisma = new PrismaClient({
    datasources: {
      db: {
        url: config.database.url,
      },
    },
    log: [
      { level: "query", emit: "event" },
      { level: "info", emit: "event" },
      { level: "warn", emit: "event" },
      { level: "error", emit: "event" },
    ],
  });

  prisma.$on("info", (event) => {
    log.info(`[prisma] ${event.message}`, {
      target: event.target,
    });
  });

  prisma.$on("warn", (event) => {
    log.warn(`[prisma] ${event.message}`, {
      target: event.target,
    });
  });

  prisma.$on("error", (event) => {
    // This code does not appear to be called when throwing
    log.error(`[prisma] ${event.message}`, {
      target: event.target,
    });
  });

  prisma.$use(async (params, next) => {
    console.log(1, params);
    // here, `params.action` is marked as `findUnique` so we can't determine that an `...OrThrow` variant has been used
    const res = await next(params);
    console.log(2, res);
    // here, `res` is `null`. This line is displayed in console before the error message
    return res;
  });

  // There is no user with ID 0 in db
  const test = await prisma.user.findUniqueOrThrow({ where: { id: 0 } });

  console.log(3, test);

:point_up: The above code returns the following in console :
1 {
  args: { where: { id: 0 } },
  dataPath: [],
  runInTransaction: false,
  action: 'findUnique',
  model: 'User'
}
2 null
NotFoundError: No User found

Environment & setup
The code runs on this Docker image : node:16-alpine

OS: Alpine Linux
Database: PostgreSQL
Node.js version: 16.17.0

Prisma Version
prisma                  : 4.2.0
@prisma/client          : 4.2.0
Current platform        : linux-musl
Query Engine (Node-API) : libquery-engine 2920a97877e12e055c1333079b8d19cee7f33826 (at<EMAIL_ADDRESS>Migration Engine        : migration-engine-cli 2920a97877e12e055c1333079b8d19cee7f33826 (at node_modules/@prisma/engines/migration-engine-linux-musl)
Introspection Engine    : introspection-core 2920a97877e12e055c1333079b8d19cee7f33826 (at node_modules/@prisma/engines/introspection-engine-linux-musl)
Format Binary           : prisma-fmt 2920a97877e12e055c1333079b8d19cee7f33826 (at node_modules/@prisma/engines/prisma-fmt-linux-musl)
Default Engines Hash    : 2920a97877e12e055c1333079b8d19cee7f33826
Studio                  : 0.469.0
Preview Features        : interactiveTransactions, orderByNulls

Reopening until client changes to use the server endpoints have landed xref: https://github.com/prisma/prisma/pull/16162

Superseded by https://github.com/prisma/prisma/issues/16226

Hello!
Sorry for writing on a closed issue but, after updating @prisma/client from 4.6.1 to 4.7.0 I'm having an issue with findUniqueOrThrow methods. I'm writing on this issue because I think that the PR that was merged to fix this was actually what "broke" it for me.
For instance, for this code:
  try {
    const secret = await prisma.jwtSecrets.findUniqueOrThrow({
      where: { userId: userId },
    });

    if (secret.jwtSecret === null) {
      throw new Error();
    } else {
      return { jwtSecret: secret.jwtSecret };
    }
  } catch {
    return { message: 'Something went wrong!' };
  }

it is throwing me some errors on the console like so:
prisma:error
Invalid `prisma.jwtSecrets.findUniqueOrThrow()` invocation:

Failed to validate the query: `Field does not exist on enclosing type.` at `Query.findManyJwtSecretsOrThrow`

A way to get around that is to ditch the OrThrow method and use findUnique and throw and error manually if there is no secret:
const secret = await prisma.jwtSecrets.findUnique({
      where: { userId: userId },
    });

    if (!secret || secret.jwtSecret === null) {
      throw new Error();
    } else {
      return { jwtSecret: secret.jwtSecret };
    }

Though, this approach is undesirable because I'm not using a prisma functionality that is quite useful.
Am I doing something wrong? Can anybody help me?
Thank you in advance, and I apologize if I lack the knowledge to proper do something, my basis is from Electric Engineering and not IT.

@SpecialAro no need to report anymore. Your report was also captured by https://github.com/prisma/prisma/issues/16549. A fix is on the way. https://github.com/prisma/prisma-engines/pull/3458

@SpecialAro no need to report anymore. Your report was also captured by https://github.com/prisma/prisma/issues/16549. A fix is on the way. https://github.com/prisma/prisma-engines/pull/3458

Thank you so much @miguelff ! Got caught up with work and didn't had time to open an issue sooner, sorry.
Nevertheless, I'm really glad that a fix is already on the way 😁 I'll hold back the update until further notice, then.
Thank you again, loving prisma so far ❤


2.1.0 Tenant routes should be loaded after application routes

Describe the bug
You cannot have conflicting routes like
xyz.com <-> tenant1.xyz.com or
xyz.com/login <-> tenant1.xyz.com/login or
xyz.com/xyz <-> tenant1.xyz.com/xyz ...
Expected behavior
I should be able to have xyz.com and tenant1.xyz.com without any conflict.
Proposed Fix
Tenant routes should be loaded after main application routes so the central domain will always have priority over the subdomain. Also a route domain must be specified on the main domain Route::middleware('web')->domain(parse_url(config('app.url'))['host']) in order for it to work.
Disclaimer
I'm not sure this will fix the issue in all scenarios, but there must be a way to avoid conflicts between routes as they are not the same, the subdomain is different. https://laravel.com/docs/6.x/routing#route-group-sub-domain-routing

This is not a bug, the documentation explains that this is the expected behavior.
Also, this is something Laravel is not built for, so it's quite problematic.
You can't just use domain routing, because it doesn't let you register the route for multiple domains.
Route:list wouldn't work.
You need to make sure you can't access central routes on tenant domains and vice versa.
I'm not aware of a solution with fewer tradeoffs than prefixing your tenant routes with /app.

With this
<?php

declare(strict_types=1);

namespace Stancl\Tenancy;

use Illuminate\Foundation\Support\Providers\RouteServiceProvider;
use Illuminate\Support\Facades\Route;

class TenantRouteServiceProvider extends RouteServiceProvider
{
    public function map()
    {
        if (file_exists(base_path('routes/tenant.php'))) {
            Route::middleware(['web', 'tenancy'])
                ->domain(in_array(request()->getHost(), config('tenancy.exempt_domains')) ? false:request()->getHost())
                ->namespace($this->app['config']['tenancy.tenant_route_namespace'] ?? 'App\Http\Controllers')
                ->group(base_path('routes/tenant.php'));
        }
    }
}

and  this
<?php

declare(strict_types=1);

namespace Stancl\Tenancy\Middleware;

use Closure;
use Illuminate\Routing\Route;
use Illuminate\Support\Facades\Route as Router;

/**
 * Prevent access from tenant domains to central routes and vice versa.
 */
class PreventAccessFromTenantDomains
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        // If the domain is not in exempt domains, it's a tenant domain.
        // Tenant domains can't have routes without tenancy middleware.
        $isExemptDomain = in_array($request->getHost(), config('tenancy.exempt_domains'));
        $isTenantDomain = ! $isExemptDomain;

        $isTenantRoute = $this->isTenantRoute($request->route());

        if ($isTenantDomain && ! $isTenantRoute) { // accessing web routes from tenant domains
            return redirect(config('tenancy.home_url'));
        }

        if ($isExemptDomain && $isTenantRoute && $request->route()->uri !== '/') { // accessing tenant routes on web domains
            abort(404);
        }

        return $next($request);
    }

    public function isTenantRoute(Route $route): bool
    {
        if (in_array('tenancy', $route->middleware(), true)) {
            return true;
        }

        // Loop one level deep and check if the route's middleware
        // groups have a `tenancy` middleware group inside them
        $middlewareGroups = Router::getMiddlewareGroups();
        foreach ($route->gatherMiddleware() as $middleware) {
            if (isset($middlewareGroups[$middleware]) && in_array('tenancy', $middlewareGroups[$middleware], true)) {
                return true;
            }
        }

        return false;
    }
}

this && $request->route()->uri !== '/' is not necessary

Laravel is built with a default main url that you must define:
// .env
APP_URL=http://xyz.com

So similar to what @stockhausen did, for the most common use case where that main domain is used, with additional tenant subdomains (tenant1.xyz.com,  tenant2.xyz.com ...) here is a simpler solution:
This package will load the tenant.php routes before the main routes here:
// TenantRouteServiceProvider.php
if (file_exists(base_path('routes/tenant.php'))) {
    /...
}

So you can delete tenant.php' and create your own routes with a different file name, for example app.php and then manually load it with the tenancy middleware and load the main routes with the domain specified:
// RouteServiceProvider.php

// load regular central routes before tenant routes
Route::middleware('web')
    ->domain(parse_url(config('app.url'))['host']) // xyz.com
    ->group(base_path('routes/web.php'));

// load tenants routes and apply 'tenancy' middleware
Route::middleware(['web', 'tenancy'])
    ->group(base_path('routes/app.php'));

Now you can have have the same path in both routes:
// routes/web.php
Route::get('/', function () {
    return 'Home for: xyz.com';
});

// routes/app.php
Route::get('/', function () {
    return 'Home for: ' . tenant('id');
});

@jonagoldman You can definitely do that. But I don't want to do this inside the package, because I support multiple exempt domains, which would mean registering the central routes for every single exempt (=central) domain using a foreach loop. I don't like that solution.
When I have more time I'll take a look at what @stockhausen suggested.

@stancl I agree but I think the tenant routes should not be loaded automatically.
It is super easy to add your own routes and apply the tenancy middleware to them, and that gives you flexibility. You could also remove the tenant_route_namespace because that can also be easily defined in the route.
I just don't see why those things are preconfigured when it only takes 2 lines of code to add it yourself:
Route::middleware(['web', 'tenancy'])->group(base_path('routes/app.php'));

In 1.x I think the conflicting routes were working, but there was some ugliness with the route:list and similar things. I believe what we have now (non-conflicting, always-registered routes in separate files) are good defaults that let users get started quickly.
Perhaps we could have a section in documentation about how it's possible to set up domain routing that lets you have conflicting routes? I just don't want that to be the default because of multiple exempt domains support & possible issues with route:list.

@stancl I just recently came across this package and I'm very gratuful for it! I'm sure there is a reason for how things are done, probably better than they were before and I find this package really useful! But it's just very strange to me that this is not valid: xyz.com, tenant1.xyz.com by default.

If Laravel domain routing supported multiple domains, I would have registered central routes for tenancy.exempt_domains domains. But unfortunately, the only solution that would allow that would be to register all routes for each domain separately, like I said.
So since we can't use domain routing, we have to use path routing to avoid conflicting routes.
I do realize that this isn't ideal, so I'm still very open to suggestions regarding this issue.

Solution is just to add one Line to class TenantRouteServiceProvider extends RouteServiceProvider and keep all ADN of your package but offre possibilités to have same route un same class without conflict with php artisan route:list

shouldn't this solve the problem?

also if we want to support custom domains
protected function mapRoutes()
{
    if (file_exists(base_path('routes/tenant.php'))) {
        Route::domain("{domain}")
            ->where(['domain' => '^(?!'. implode('|', config('tenancy.central_domains')) .').*'])
            ->namespace(static::$controllerNamespace)
            ->group(base_path('routes/tenant.php'));
    }
}

chỉ dành cho tuyến đường về nhà "/"
<?php

/*
|--------------------------------------------------------------------------
| Tenant Routes
|--------------------------------------------------------------------------
|
| Here you can register the tenant routes for your application.
| These routes are loaded by the TenantRouteServiceProvider
| with the tenancy and web middleware groups. Good luck!
|
*/

    Route::get('/', function () {
        return 'This is your multi-tenant application. The id of the current tenant is ' . tenant('id');
    });

    Auth::routes();

<?php

declare(strict_types=1);

namespace Stancl\Tenancy;

use Illuminate\Foundation\Support\Providers\RouteServiceProvider;
use Illuminate\Support\Facades\Route;

class TenantRouteServiceProvider extends RouteServiceProvider
{
    public function map()
    {
        if (file_exists(base_path('routes/tenant.php'))) {
            Route::middleware(['web', 'tenancy'])
                ->domain(in_array(request()->getHost(), config('tenancy.exempt_domains')) ? null:request()->getHost())
                ->namespace($this->app['config']['tenancy.tenant_route_namespace'] ?? 'App\Http\Controllers')
                ->group(base_path('routes/tenant.php'));
        }
    }
}

và cái này
<?php

declare(strict_types=1);

namespace Stancl\Tenancy\Middleware;

use Closure;
use Illuminate\Routing\Route;
use Illuminate\Support\Facades\Route as Router;

/**
 * Prevent access from tenant domains to central routes and vice versa.
 */
class PreventAccessFromTenantDomains
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        // If the domain is not in exempt domains, it's a tenant domain.
        // Tenant domains can't have routes without tenancy middleware.
        $isExemptDomain = in_array($request->getHost(), config('tenancy.exempt_domains'));
        $isTenantDomain = ! $isExemptDomain;

        $isTenantRoute = $this->isTenantRoute($request->route());

        if ($isTenantDomain && ! $isTenantRoute) { // accessing web routes from tenant domains
            return redirect(config('tenancy.home_url'));
        }

        if ($isExemptDomain && $isTenantRoute && $request->route()->uri !== '/') { // accessing tenant routes on web domains
            abort(404);
        }

        return $next($request);
    }

    public function isTenantRoute(Route $route): bool
    {
        if (in_array('tenancy', $route->middleware(), true)) {
            return true;
        }

        // Loop one level deep and check if the route's middleware
        // groups have a `tenancy` middleware group inside them
        $middlewareGroups = Router::getMiddlewareGroups();
        foreach ($route->gatherMiddleware() as $middleware) {
            if (isset($middlewareGroups[$middleware]) && in_array('tenancy', $middlewareGroups[$middleware], true)) {
                return true;
            }
        }

        return false;
    }
}

+-----------+----------+------------------------+----------------------+------------------------------------------------------------------------+-------------------+
| Domain    | Method   | URI                    | Name                 | Action                                                                 | Middleware        |
+-----------+----------+------------------------+----------------------+------------------------------------------------------------------------+-------------------+
|           | GET|HEAD | /                      |                      | Closure                                                                | web               |
| localhost | GET|HEAD | /                     |                      | Closure                                                                | web,tenancy       |
|           | GET|HEAD | api/companies          |                      | Closure                                                                | api,auth:api      |
|           | POST     | api/companies          |                      | Closure                                                                | api,auth:api      |
|           | GET|HEAD | api/user               |                      | Closure                                                                | api,auth:api      |
|           | GET|HEAD | home                   | home                 | App\Http\Controllers\HomeController@index                              | web               |
|           | GET|HEAD | login                  | login                | App\Http\Controllers\Auth\LoginController@showLoginForm                | web,guest         |
|           | POST     | login                  |                      | App\Http\Controllers\Auth\LoginController@login                        | web,guest         |
| localhost | POST     | login                  |                      | App\Http\Controllers\Auth\LoginController@login                        | web,tenancy,guest |
| localhost | GET|HEAD | login                  | login                | App\Http\Controllers\Auth\LoginController@showLoginForm                | web,tenancy,guest |
|           | POST     | logout                 | logout               | App\Http\Controllers\Auth\LoginController@logout                       | web               |
| localhost | POST     | logout                 | logout               | App\Http\Controllers\Auth\LoginController@logout                       | web,tenancy       |
| localhost | POST     | password/confirm       |                      | App\Http\Controllers\Auth\ConfirmPasswordController@confirm            | web,tenancy,auth  |
| localhost | GET|HEAD | password/confirm       | password.confirm     | App\Http\Controllers\Auth\ConfirmPasswordController@showConfirmForm    | web,tenancy,auth  |
|           | POST     | password/confirm       |                      | App\Http\Controllers\Auth\ConfirmPasswordController@confirm            | web,auth          |
|           | GET|HEAD | password/confirm       | password.confirm     | App\Http\Controllers\Auth\ConfirmPasswordController@showConfirmForm    | web,auth          |
| localhost | POST     | password/email         | password.email       | App\Http\Controllers\Auth\ForgotPasswordController@sendResetLinkEmail  | web,tenancy       |
|           | POST     | password/email         | password.email       | App\Http\Controllers\Auth\ForgotPasswordController@sendResetLinkEmail  | web               |
|           | POST     | password/reset         | password.update      | App\Http\Controllers\Auth\ResetPasswordController@reset                | web               |
| localhost | POST     | password/reset         | password.update      | App\Http\Controllers\Auth\ResetPasswordController@reset                | web,tenancy       |
| localhost | GET|HEAD | password/reset         | password.request     | App\Http\Controllers\Auth\ForgotPasswordController@showLinkRequestForm | web,tenancy       |
|           | GET|HEAD | password/reset         | password.request     | App\Http\Controllers\Auth\ForgotPasswordController@showLinkRequestForm | web               |
| localhost | GET|HEAD | password/reset/{token} | password.reset       | App\Http\Controllers\Auth\ResetPasswordController@showResetForm        | web,tenancy       |
|           | GET|HEAD | password/reset/{token} | password.reset       | App\Http\Controllers\Auth\ResetPasswordController@showResetForm        | web               |
|           | GET|HEAD | qr                     | home                 | App\Http\Controllers\HomeController@index                              | web               |
|           | GET|HEAD | qr/{token}             | home                 | App\Http\Controllers\HomeController@index                              | web               |
|           | POST     | register               |                      | App\Http\Controllers\Auth\RegisterController@register                  | web,guest         |
|           | GET|HEAD | register               | register             | App\Http\Controllers\Auth\RegisterController@showRegistrationForm      | web,guest         |
| localhost | POST     | register               |                      | App\Http\Controllers\Auth\RegisterController@register                  | web,tenancy,guest |
| localhost | GET|HEAD | register               | register             | App\Http\Controllers\Auth\RegisterController@showRegistrationForm      | web,tenancy,guest |
|           | GET|HEAD | tenancy/assets/{path}  | stancl.tenancy.asset | Stancl\Tenancy\Controllers\TenantAssetsController@asset                | tenancy           |
+-----------+----------+------------------------+----------------------+------------------------------------------------------------------------+-------------------+

thanks support


8.2.1456 - shift+o broken when used on top line that wraps to multiple screen lines

Describe the bug
SHIFT+O does not work properly when used on the top line of the buffer and the top line wraps to occupy two or more screen lines. It clears the top screen line instead of shifting it down. Undo does not work properly after that command.
To Reproduce
Detailed steps to reproduce the behavior:

Run mvim --clean
Type in any placeholder text to make the top line occupy multiple screen lines. Add one or two more logical lines as well to see the Undo corruption in steps 5 & 6.
Escape to command mode. With the cursor on the top line, press SHIFT+O.
The top screen line will clear instead of shifting down.
Press ESCAPE and then u to undo.
The top line is restored but one or more lines under it disappears. The number of following lines that disappear is equal to the number of screen lines that the top line occupies, minus one.

Expected behavior
SHIFT+O should work a long top line the same as on any other line. Note: this bug does not occur on the previous release, 8.2.539.
Environment

Vim 8.2.1456
macOS 10.15.5

I think this is fixed upstream in v8.2.1488 (9dc1917f42b23277e143fc58bbe27482b0b76bad). Will be fixed next release in release 166.


Crash when used with Nullius

Description
When Ultimate Research Queue and Nulllius are used together, the 'Creating new map' loading screens loads and loads and loads and eventually the game crashes. Used Mods: Nullius Maximus + a few QoL mods. I tried creating a game without URQ mod and it worked fine, so this mod is causing the crash. I use ModMyFactory2, if that matters.
factorio-previous.log
Reproduction

Install the mod and Nullius Maximus.
Create new map.
Game crashes.

This also happens when I try to load a save. The mod seems to have a problem with the milestone system from nullius...


Add a possibilty to define custom diff/merge tool

In Preference-Integration I can select diff/merge tool from the list of predefined values. It would be nice to set custom diff/merge tool, than is not on the list. There is a option "Use Git Settings" but the possibility to set own tools is much quicker.

If your preferred diff/merge tool is not in the currently supported list, you can provide the tool's official website, DIFF/MERGE command line parameters, and supported platforms. We'll add it later.

My idea was to have something like this:

I see...
Tool: Diffinity
Params: REMOTE LOCAL
Platform: Windows only

One more question, what's the command for merging?

I'm very sorry. Since Diffinity can only be opened as difftool, SourceGit will not add it to the built-in support.


PanoViewer gyroMode not working on IOS

It seems that the gyroMode is not working on IOS. I couldn't see it working in the demo page https://naver.github.io/egjs-view360/examples/panoviewer/controls/motion-touch.html
Is there some setting I am missing? Is it possible to have the gyroMode working on IOS?
Thanks!

This solved it, gyroscope is by default disabled on IOS safari: https://www.macrumors.com/2019/02/04/ios-12-2-safari-motion-orientation-access-toggle/


[BUG] Process causes leftover artifacts in output

[x] I've checked docs and closed issues for possible solutions.
[x] I can't find my issue in the FAQ.

Describe the bug
Based on your downloader example, I created a script starting multiple processes in a ThreadPool. If processes fail, I print out the return code and the stderr-output of that process, stop the task and set the process visibility to false to hide that bar.
Sometimes the output contains leftover artifacts of those invisible process bars, probably caused by logging from another worker.
import signal
import subprocess
import random
from threading import Event
from typing import Iterable
from concurrent.futures import ThreadPoolExecutor

from rich.progress import (
    BarColumn,
    Progress,
    TaskID,
    TextColumn,
    TimeRemainingColumn,
    SpinnerColumn,
    MofNCompleteColumn
)

progress = Progress(
    TextColumn("[bold blue]{task.description}", justify="right"),
    BarColumn(),
    "[progress.percentage]{task.percentage:>3.1f}%",
    "•",
    MofNCompleteColumn(separator=" of "),
    "•",
    TimeRemainingColumn(elapsed_when_finished=True),
    SpinnerColumn()
)

done_event = Event()

def handle_sigint(signum, frame):
    done_event.set()

signal.signal(signal.SIGINT, handle_sigint)

def execute(task_id: TaskID, commands: Iterable[str]):
    """Execute multiple commands."""

    # Set number of commands as total for progress bar
    progress.update(task_id, total=len(commands))

    for command in commands:
        process = subprocess.Popen(
            command,
            shell=True,
            stdin=subprocess.PIPE,
            stdout=subprocess.PIPE,
            stderr=subprocess.PIPE,
        )

        # Start the progress bar
        progress.start_task(task_id)

        # Wait for the process to finish
        while True:
            return_code = process.poll()
            if return_code is not None:
                if return_code == 0:
                    progress.advance(task_id)
                    break
                else:
                    progress.stop_task(task_id)
                    progress.update(task_id, visible=False)

                    progress.console.log(
                        f"[red bold]Failed[/bold red]: {command} (Return code: {return_code})")

                    for output in process.stderr.readlines():
                        progress.console.log(
                            output.decode().strip(), end="\n\n")
                    break

            if done_event.is_set():
                return

def main():
    # define a list of dicts with a description of the steps to be executed and an array of commands per step
    steps = []

    for i in range(random.randint(10, 100)):
        commands = []
        for j in range(random.randint(1, 10)):
            sleep_time = round(random.uniform(0, 0.5), 1)
            command = f'sleep {sleep_time} && echo "Running mocked command {j+1}"'
            if random.random() < 0.2:
                command += ' && idontexist'
            commands.append(command)
        steps.append({
            "description": f"Mocked step {i+1}",
            "commands": commands
        })

    with progress:
        with ThreadPoolExecutor(max_workers=4) as pool:
            for step in steps:
                task_id = progress.add_task(step["description"], start=False)
                pool.submit(execute, task_id, commands=step["commands"])

if __name__ == "__main__":
    main()

Platform

Click to expand
What platform (Win/Linux/Mac) are you running on? What terminal software are you using?
Linux, in a docker container. Using the vscode integrated terminal.
If you're using Rich in a terminal:
╭───────────────────────── <class 'rich.console.Console'> ─────────────────────────╮
│ A high level console interface.                                                  │
│                                                                                │
│ ╭──────────────────────────────────────────────────────────────────────────────╮ │
│ │ <console width=183 ColorSystem.TRUECOLOR>                                    │ │
│ ╰──────────────────────────────────────────────────────────────────────────────╯ │
│                                                                                │
│     color_system = 'truecolor'                                                   │
│         encoding = 'utf-8'                                                       │
│             file = <_io.TextIOWrapper name='<stdout>' mode='w' encoding='utf-8'> │
│           height = 15                                                            │
│    is_alt_screen = False                                                         │
│ is_dumb_terminal = False                                                         │
│   is_interactive = True                                                          │
│       is_jupyter = False                                                         │
│      is_terminal = True                                                          │
│   legacy_windows = False                                                         │
│         no_color = False                                                         │
│          options = ConsoleOptions(                                               │
│                        size=ConsoleDimensions(width=183, height=15),             │
│                        legacy_windows=False,                                     │
│                        min_width=1,                                              │
│                        max_width=183,                                            │
│                        is_terminal=True,                                         │
│                        encoding='utf-8',                                         │
│                        max_height=15,                                            │
│                        justify=None,                                             │
│                        overflow=None,                                            │
│                        no_wrap=False,                                            │
│                        highlight=None,                                           │
│                        markup=None,                                              │
│                        height=None                                               │
│                    )                                                             │
│            quiet = False                                                         │
│           record = False                                                         │
│         safe_box = True                                                          │
│             size = ConsoleDimensions(width=183, height=15)                       │
│        soft_wrap = False                                                         │
│           stderr = False                                                         │
│            style = None                                                          │
│         tab_size = 8                                                             │
│            width = 183                                                           │
╰──────────────────────────────────────────────────────────────────────────────────╯
╭─── <class 'rich._windows.WindowsConsoleFeatures'> ────╮
│ Windows features available.                           │
│                                                       │
│ ╭───────────────────────────────────────────────────╮ │
│ │ WindowsConsoleFeatures(vt=False, truecolor=False) │ │
│ ╰───────────────────────────────────────────────────╯ │
│                                                       │
│ truecolor = False                                     │
│        vt = False                                     │
╰───────────────────────────────────────────────────────╯
╭────── Environment Variables ───────╮
│ {                                  │
│     'TERM': 'xterm-256color',      │
│     'COLORTERM': 'truecolor',      │
│     'CLICOLOR': None,              │
│     'NO_COLOR': None,              │
│     'TERM_PROGRAM': 'vscode',      │
│     'COLUMNS': None,               │
│     'LINES': None,                 │
│     'JUPYTER_COLUMNS': None,       │
│     'JUPYTER_LINES': None,         │
│     'JPY_PARENT_PID': None,        │
│     'VSCODE_VERBOSE_LOGGING': None │
│ }                                  │
╰────────────────────────────────────╯
platform="Linux"

rich==13.6.0

I am a system engineer, no developer. I'm sorry if I made a simple rookie mistake...
Output (trimmed some error messages):
[17:39:04] Failed: sleep 0.3 && echo "Running mocked command 1" && idontexist (Return code: 127)                                                                              new.sh:98
 Mocked step 1 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 0.0%  • 0 of 2     • -:--:-- ⠴
           /bin/sh: 1: idontexist: not found                                                                                new.sh:103
[17:39:05] Failed: sleep 0.0 && echo "Running mocked command 2" && idontexist (Return code: 127)                                                                              new.sh:98
           /bin/sh: 1: idontexist: not found                                                                                new.sh:103

           Failed: sleep 0.0 && echo "Running mocked command 1" && idontexist (Return code: 127)                                                                              new.sh:98
           /bin/sh: 1: idontexist: not found                                                                                new.sh:103

[17:39:06] Failed: sleep 0.4 && echo "Running mocked command 2" && idontexist (Return code: 127)                                                                              new.sh:98
           /bin/sh: 1: idontexist: not found                                                                                new.sh:103

...

[17:39:27] Failed: sleep 0.1 && echo "Running mocked command 5" && idontexist (Return code: 127)                                                                              new.sh:98
           /bin/sh: 1: idontexist: not found                                                                                new.sh:103

 Mocked step 3 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100.0% • 3 of 3   • 0:00:00
 Mocked step 4 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100.0% • 3 of 3   • 0:00:00
 Mocked step 8 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100.0% • 4 of 4   • 0:00:00
Mocked step 14 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100.0% • 10 of 10 • 0:00:02
Mocked step 15 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100.0% • 1 of 1   • 0:00:00
Mocked step 17 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100.0% • 3 of 3   • 0:00:00
Mocked step 22 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100.0% • 1 of 1   • 0:00:00
Mocked step 23 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100.0% • 8 of 8   • 0:00:01
Mocked step 24 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100.0% • 4 of 4   • 0:00:01
Mocked step 26 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100.0% • 3 of 3   • 0:00:01
Mocked step 28 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100.0% • 5 of 5   • 0:00:01
Mocked step 29 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100.0% • 2 of 2   • 0:00:00
Mocked step 30 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100.0% • 6 of 6   • 0:00:01
Mocked step 35 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100.0% • 8 of 8   • 0:00:01
Mocked step 37 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100.0% • 8 of 8   • 0:00:01
Mocked step 39 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100.0% • 2 of 2   • 0:00:00
Mocked step 49 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100.0% • 2 of 2   • 0:00:00
Mocked step 51 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100.0% • 1 of 1   • 0:00:00
Mocked step 53 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100.0% • 4 of 4   • 0:00:00
Mocked step 54 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100.0% • 3 of 3   • 0:00:00
Mocked step 58 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100.0% • 10 of 10 • 0:00:02

Anyone home?

Seems like the artifacts stop if you set it to invisible before stopping it:
                    progress.update(task_id, visible=False)
                    progress.stop_task(task_id)

Sorry for the delay, I had no time to follow up on this.
Changing the order to stop after update makes it worse:

You might want to produce a minimally reproducable example for this. Reduce the code to its simplest form that demonstrates the issue. You may find that helps you find the bug, or at least narrows it down. As it stands, this are a bit too many moving parts to offer a suggestion.

I'll try to... it's basically a race-condition created by simultaneously outputting log output and updated/removed progress-bars from different threads, and I'm not really sure how I can create a reliable reproduction without it.
Please stay tuned, I'll be back.

Alright. Small example.
#!/usr/bin/env python3

import time
from rich.progress import Progress
from concurrent.futures import ThreadPoolExecutor

def task(task_obj, advance):
    while True:
        progress.console.log(f"Task {task_obj}")
        progress.console.log(f"Advance {advance}")
        progress.update(task_obj, advance=advance)
        time.sleep(0.1)

progress = Progress()

with progress:
    tasks = [
        ("Downloading", "red", 0.5),
        ("Processing", "green", 0.3),
        ("Cooking", "cyan", 0.9),
        ("Eating", "magenta", 0.01)
    ]

    with ThreadPoolExecutor(max_workers=4) as pool:
        for name, color, advance in tasks:
            task_obj = progress.add_task(f"[{color}]{name}...", total=1000)
            pool.submit(task, task_obj, advance)

You can interrupt this programm almost right after the start.


Time Series Retention Policy

Description
Pilosa allows users to configure a Time Quantum to bucket time series SetBits.
These buckets are internally managed per Frame in Views with new Views created as time progresses.
Currently these Views are never removed.  A rolling data retention window would be useful.  Similar to an ELK stack with a 30 day retention policy.  Since we already have a built in aggregation system with the Time Quanta we can support more granular data retention policies.
Currently supported Time Quanta
Y - Year
M - Month
D - Day
H - Hour
i.e. A incoming SetBit with a time stamp of<PHONE_NUMBER> would create the following Views:
2016
201601
20160102
2016010215
Looking back, Graphite's Carbon database had a similar tiered time series aggregation policy.  For example you could store metrics quantized to every 15 seconds for 15 days.  And you could combine these into complex overlapping aggregations policies for any time quantum.  While offering unlimited flexibility, this system likely provided too much complexity, missing the point of what users really needed in a simplified interface.
I would propose that we expand Pilosa's time quantum configuration with a retention period for each quantum.
If you specified YMDH for 1 month
We would maintain views for:
Years - to ∞
Months - 1
Days - Max days for current month
Hours - All hour quanta for current month
We could then layer on 48 hours
Years - to ∞
Months - 1
Days - Max days for current month
Hours - Last 48 hours
Retention Policie
Could be specified in the follow structure:
{	"timeQuantum": "YMDH", 	"retention": { 		"year": 10, 		"month": 1, 		"day": 7, 		"hour": 48 	} }
Default assumption is to store a quantum to ∞ unless explicitly stated
Lower time quanta are only kept up until the highest retention rule unless explicitly stated.

I'm a little confused by this proposal. Let's use your example for discussion:
{ "timeQuantum": "YMDH", "retention": { "year": 10, "month": 1, "day": 7, "hour": 48 } }

When I first read this, I thought perhaps this means that Pilosa would retain up to:

10 year views
1 month view
7 day views
48 hour views

If that's the case, I believe there may be a couple of issues with that strategy. First, does this mean on the first of every month, Pilosa would delete the previous month and leave itself with only 1 month representing today? Or does the retention mean "1 month" in addition to this month? Second, we would need to verify what the query builder is including when you perform a query that covers a range that no longer has the expected granularity. For example, if today is 2017-08-24 and I query:
Range(start="2016-01-01T00:00", end="2017-08-31T00:00")

my query is going to be made up of three views:

2016
2017-07 (assuming 1-month retention means last month and this month)
2017-08

Obviously this wouldn't be very meaningful. Was your intention that the user would understand that they can't perform this query and still get accurate data with the retention policy they have? Would we instead raise an error for any query that is not supported by the current retention policy? Thinking about this, with that retention policy, the only queries that would make sense would be whole year(s) queries, whole day(s) queries, or whole hour(s) queries. No combination of those would be useful. Maybe that's fine, but it's not clear to me that that's your intention.
Now, that was all based on my assumption of how the proposed retention policy would work. When I got to this statement:
Lower time quanta are only kept up until the highest retention rule unless explicitly stated.

I wondered if perhaps I'm not understanding the proposal. Either way, maybe you can provide some other examples for how the user would configure the retention policy and what queries that would support. I kind of see the benefit of storing, for example, 10 year views while only storing 48 hour views, but I wonder if the complexity/confusion of that is worth the benefit over having a retention policy that just stores "the last 48 hours".

@travisturner my example retention policy { "timeQuantum": "YMDH", "retention": { "year": 10, "month": 1, "day": 7, "hour": 48 } } was perhaps a poor choice.  I included it to show the full scope of possibilities for each time quantum.
Instead I would imagine a more common retention policy like the last month:
{ "timeQuantum": "MDH", "retention": { "month": 1} }
In this example an incoming SetBits with a time stamp of<PHONE_NUMBER> would create the following Views:

201602
20160202
2016020215

To support range queries for a rolling 30 day window I envisioned we would maintain views for the current and past month.  Once the current time progresses to<PHONE_NUMBER> all views associated with year 2016 month 01 would be deleted.  This enforces the implicit rule:
Lower time quanta are only kept up until the highest retention rule unless explicitly stated.  As all Day and Hour Views that fall under month 01 are also deleted.
More complicated retention policies with explicit granularity of lower time quanta could save memory and disk space. This could be useful for some applications with the  understanding that certain range queries are no longer possible when the Views are truncated. There is a tradeoff between flexibility and complexity. My goal is simplifying setup while supporting the most likely use cases.

that makes sense.
should we restrict the retention value to have only one attribute? (i.e. return an error if the user defines a retention with more than one value, like: { "timeQuantum": "YMDH", "retention": { "year": 5, "month": 1} }
Now that I think about it, it still seems odd not to have the retention value be in a common unit if that's how we are expecting to use it. Why the need for different keys in the retention map? Why not just "retention": "30d" or something like that?

I like your suggestion of a single retention key.  This make the configuration simpler and eliminates the problem of overlapping policies.

So how is this issue going now?

@young118 we haven't put much work into time fields at all lately. we definitely have some improvements that we want to make to time fields, including things like data expiration, but realistically that work won't begin until mid 2020.


When try to run tests on Real device,failed with information "terminating app due to uncaught exception 'NSInternalInconsistencyException', reason:Bundle's executable code doesn't support nor i386, nor x86_64 CPU types. "

I want to run tests on Real device.
When I'm trying with below command:

xctool test  -workspace MyAPP.xcworkspace -scheme MyAPPUITest -sdk iphoneos -configuration Debug -destination 'platform=iOS,id=1b986fbb163f6508d00911ae4fb87f57b9089944'

I'm getting below error:

Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Bundle's executable code doesn't support nor i386, nor x86_64 CPU types.

Please help me .

xctool only runs on the simulator. It's a low priority "TODO" by the xctool maintainers to get it working on a real device. I would do it if I knew how. I'm also requested this functionality some months back. If I knew how to reverse engineer xcodebuild in order to extract the commands, functionality and environment for cherry picking, I would. I don't even know where to start. If you know how, please do. I'll collaborate.

We currently don't support running tests on real devices. Original github issue to track the progress is https://github.com/facebook/xctool/issues/326.

Thank you !
I tried xcodebuild commend. And it worked.


Will Pod IPs in PodCIDRs Allocated from Multiple ClusterCIDR Objects be Duplicated?

While using the controller, I am considering a question: suppose there are two nodes, each using a PodCIDR allocated from different ClusterCIDR objects. If I schedule several pods on these two nodes, is it possible for the pod IPs to be duplicated? If duplication occurs, it would be a significant issue.

The key to this issue is whether different PodCIDRs allocated from different ClusterCIDRs will have overlapping IP ranges.