[WIP] Cloud Run pre/postprocessing workflow.

Here is a WIP branch that explores using Cloud Run for pre/postprocessing.
TODO:

[ ] Figure out how to publish a public image via CI/CD. I believe the google.com GCP account forbids public artifact repos.
[ ] Improve logging (including the output of run.sh). At the moment, logging is very sparse and crude in some places and very verbose in others.
[ ] Comment run.sh.
[ ] Tests.
[ ] README.

The main benefit of this approach is the customer only needs to install gcloud/gsutil i.e. no Python version/dependency headaches.
Other benefits include:

We control the execution environment.
Multithreaded upload/download of local files to/from GCS via gsutil -m rsync.
All logs are captured in Cloud Logging which makes it easier for CEs/SCEs/TSEs/TAMs to debug.
It is clear when the customer has injected custom code as this requires building a custom image instead of using the image from the public artifact repo. This is also the main drawback.
Should be easier to integrate into the PSO end to end migration project which is driven by Composer (ping me for internal link).
Theoretically, everything can be configured and launched from the Google Cloud Console UI as gcloud and gsutil are the only tools used.

Some refactorings unrelated to Cloud Run include:

Multithreaded pre/postprocessing.
A clear location for customers to put their custom pre/postprocessing logic (e.g. a regex to comment out nzsql slash commands): preprocess and postprocess functions in hooks.py. These functions are called regardless of whether macro mapping is used.
Refactored BatchSqlTranslator and MacroProcessor (not MapBasedExpander which is now renamed MacroProcessor). This was required for the points above but will also make implementing tests and  embedded SQL extractors much more straightforward.

To test it out:

Follow the instructions in the build section of CONTRIBUTING.md to build an image in your project. Once there is a public image, this will not be required by customers unless they want to implement their own custom logic.
Follow the instructions in README.md to execute the Cloud Run job.

I haven't used Cloud Run before. But it seems not free. Who is gonna pay for it then?

The customer. In my experience, most customers ran CW on a VM in their cloud or on-prem data center which costs money. Cloud Run could actually be cheaper because I don't think customers were shutting these VMs down between translations. Also, depending on whether or not the customer has other Cloud Run workloads, this will be well within the monthly free tier. Finally, there's nothing stoping them from using a local docker container or just running it on their local machine.

I wonder how comfortable the users are regarding modifying the code now? Do we know any feedback from existing users?

I don't have any data on this. It seems to me that most customers are asking us to add features instead of adding them themselves.

Another benefit of Cloud Run that I forgot to mention is that it can be triggered in response to events. So instead of using our run.sh script, customers can create their own workflows that export code to be translated to GCS which then triggers Cloud Run. Very convenient to run translation jobs overnight or without a human in the loop.

I haven't used Cloud Run before. But it seems not free. Who is gonna pay for it then?

The customer. In my experience, most customers ran CW on a VM in their cloud or on-prem data center which costs money. Cloud Run could actually be cheaper because I don't think customers were shutting these VMs down between translations. Also, depending on whether or not the customer has other Cloud Run workloads, this will be well within the monthly free tier. Finally, there's nothing stoping them from using a local docker container or just running it on their local machine.

I wonder how comfortable the users are regarding modifying the code now? Do we know any feedback from existing users?

I don't have any data on this. It seems to me that most customers are asking us to add features instead of adding them themselves.

I think the starting point of this tool is to make the onboarding step so simple that any potential user who doesn't have a dedicated PSO/CE/sale can get a taske of Batch Translation in just 30 sec.  This type of users may have bare minimum knowledge about Python or Google cloud.
I feel we are shutting the door to lots of potential users now especially by telling them that the service is not free.  But it is actually free.
I understand that we are trying to support premium users who don't have any concern on resources.  And this is critical for the business.
I feel we may want to clarify the CUJ and priorities before adding more constraints to the tool. If the top priority is to support a few existing enterprise users and we will keep developing more features in the Python tooling, I wonder what model we will adapt in terms of design, support, and maintenance in the long term?  Maybe we can set up a meeting to discuss?

I will comment here on multi-threading since this PR is WIP:
Please consider single-thread as the default behavior because:

The tool runs on user machine.  There could be unexpected behavior like crashing the system depending on the status of machine, e.g., the user could be doing other stuff at the same time that consumes the CPU like streaming a movie, running other programs.
I believe gsutil multi-threading is not the default mode for a reason.  I have experienced multiple cases where the uploading with multi-threads get stuck at 99% with many files.

I think the starting point of this tool is to make the onboarding step so simple that any potential user who doesn't have a dedicated PSO/CE/sale can get a taske of Batch Translation in just 30 sec. This type of users may have bare minimum knowledge about Python or Google cloud.

I don't quite understand why this can't be used in 30 seconds but a local client can? Once we have a public image, it seems to me there is one less step:
Local client:

Install gcloud
git clone
pip install
Edit config files
dwh-migration-client

Cloud run:

Install gcloud
git clone
Edit config files
./run.sh

In fact, the step that goes away is pip install which is Python-specific. So in a way it requires less Python knowledge. Also, as I mentioned before, there's nothing stopping a customer from running this locally (even without docker) and we can document that use case.

I feel we are shutting the door to lots of potential users now especially by telling them that the service is not free. But it is actually free.

I understand that we are trying to support premium users who don't have any concern on resources. And this is critical for the business.

I feel we may want to clarify the CUJ and priorities before adding more constraints to the tool. If the top priority is to support a few existing enterprise users and we will keep developing more features in the Python tooling, I wonder what model we will adapt in terms of design, support, and maintenance in the long term? Maybe we can set up a meeting to discuss?

That is fair. I am admittedly enterprise-oriented. And I would agree that perhaps the CUJ needs to be clarified. Perhaps there are two CUJs? I did put this in its own directory so the client dir can still exist. Happy to discuss.
One point I do want to make re: cost. Assuming a 30 second translation time and a 2 vCPU 8 GB container for the "prosumer" use case results in a cost of (($0.00001800*2vCPU/s)+($0.00000200*8GB/s))*30s=$0.00156. Even if translation takes much longer than 30s and is run many times a month we're still only talking about a few cups of coffee so to speak. And that's only if you go above the free tier which I believe is geared towards the prosumer use case.

Please consider single-thread as the default behavior because:

The tool runs on user machine. There could be unexpected behavior like crashing the system depending on the status of machine, e.g., the user could be doing other stuff at the same time that consumes the CPU like streaming a movie, running other programs.

I think this goes back to clarifying the CUJ. I am definitely not imagining laptops that may also be streaming video, etc. as the environment users run this in.
In terms of crashing the system, I would hope we could write multi-threaded software that avoids this. Also, be aware that threads in Python are mainly for IO. Due to the GIL, only one thread will ever run at a time. So it mainly beneifts reading/writing to GCS during pre/postprocessing. In fact, we could use green threads and avoid OS threads altogether but I don't think that's necessary.

I believe gsutil multi-threading is not the default mode for a reason. I have experienced multiple cases where the uploading with multi-threads get stuck at 99% with many files.

Have we filed that as a bug? That's pretty bad, especially since it warns you to use -m if you are uploading multiple files:
==> NOTE: You are performing a sequence of gsutil operations that may
run significantly faster if you instead use gsutil -m rsync ... Please
see the -m section under "gsutil help options" for further information
about when gsutil -m can be advantageous.

I haven't experienced this but if this is the case I think ideally we should fix gsutil instead of telling our users to suffer single-threaded uploads.

I think the starting point of this tool is to make the onboarding step so simple that any potential user who doesn't have a dedicated PSO/CE/sale can get a taske of Batch Translation in just 30 sec. This type of users may have bare minimum knowledge about Python or Google cloud.

I don't quite understand why this can't be used in 30 seconds but a local client can? Once we have a public image, it seems to me there is one less step:
Local client:

Install gcloud
git clone
pip install
Edit config files
dwh-migration-client

Cloud run:

Install gcloud
git clone
Edit config files
./run.sh

In fact, the step that goes away is pip install which is Python-specific. So in a way it requires less Python knowledge. Also, as I mentioned before, there's nothing stopping a customer from running this locally (even without docker) and we can document that use case.

I feel we are shutting the door to lots of potential users now especially by telling them that the service is not free. But it is actually free.

I understand that we are trying to support premium users who don't have any concern on resources. And this is critical for the business.

I feel we may want to clarify the CUJ and priorities before adding more constraints to the tool. If the top priority is to support a few existing enterprise users and we will keep developing more features in the Python tooling, I wonder what model we will adapt in terms of design, support, and maintenance in the long term? Maybe we can set up a meeting to discuss?

That is fair. I am admittedly enterprise-oriented. And I would agree that perhaps the CUJ needs to be clarified. Perhaps there are two CUJs? I did put this in its own directory so the client dir can still exist. Happy to discuss.
One point I do want to make re: cost. Assuming a 30 second translation time and a 2 vCPU 8 GB container for the "prosumer" use case results in a cost of (($0.00001800*2vCPU/s)+($0.00000200*8GB/s))*30s=$0.00156. Even if translation takes much longer than 30s and is run many times a month we're still only talking about a few cups of coffee so to speak. And that's only if you go above the free tier which I believe is geared towards the prosumer use case.

Please consider single-thread as the default behavior because:

The tool runs on user machine. There could be unexpected behavior like crashing the system depending on the status of machine, e.g., the user could be doing other stuff at the same time that consumes the CPU like streaming a movie, running other programs.

I think this goes back to clarifying the CUJ. I am definitely not imagining laptops that may also be streaming video, etc. as our target user's environment.
In terms of crashing the system, I would hope we could write multi-threaded software that avoids this. Also, be aware that threads in Python are mainly for IO. Due to the GIL, only one thread will ever run at a time. So it mainly beneifts reading/writing to GCS during pre/postprocessing. In fact, we could use green threads and avoid OS threads altogether but I don't think that's necessary.

I believe gsutil multi-threading is not the default mode for a reason. I have experienced multiple cases where the uploading with multi-threads get stuck at 99% with many files.

Have we filed that as a bug? That's pretty bad, especially since it warns you to use -m if you are uploading multiple files:
==> NOTE: You are performing a sequence of gsutil operations that may
run significantly faster if you instead use gsutil -m rsync ... Please
see the -m section under "gsutil help options" for further information
about when gsutil -m can be advantageous.

I haven't experienced this but if this is the case I think ideally we should fix gsutil instead of telling our users to suffer single-threaded uploads.

Sorry, I accidentally closed this PR earlier when I was trying to cancel my draft comment ;)

QQ: so a user doesn't need to config the Cloud Run first before using that? How does Cloud Run figure out who will charge for cost then?

The project is passed to run.sh via the BQMS_PROJECT env var.
Currently run.sh enables the Cloud Run service in the project and creates the service account the container will use. I think I am going to pull this out into a separate provision.sh script. This will make it clear what resources/permissions are needed to run run.sh. It will also simplify run.sh so that it only uses gsutil and gcloud run. A project owner could run provision.sh (or port it to terraform or whatever devops tool they'd like) and a translation user with minimal permissions could run run.sh.
I am also going to make it clear how to run this locally via pure Python without Cloud Run or docker. I hope to demo both the pure Python and Cloud Run workflows next Wednesday during office hours.

QQ: so a user doesn't need to config the Cloud Run first before using that? How does Cloud Run figure out who will charge for cost then?

The project is passed to run.sh via the BQMS_PROJECT env var.
Currently run.sh enables the Cloud Run service in the project and creates the service account the container will use. I think I am going to pull this out into a separate provision.sh script. This will make it clear what resources/permissions need to be provisioned to run run.sh. It will also simplify run.sh so that it only uses gsutil and gcloud run. A project owner could run provision.sh (or port it to terraform or whatever devops tool they'd like) and a translation user with minimal permissions could run run.sh.
I am also going to make it clear how to run this locally via pure Python without Cloud Run or docker. I hope to demo both the pure Python and Cloud Run workflows next Wednesday during office hours.

Sounds good. Let's discuss this Wednesday morning then.  Feel free to use the 10am slot as well if you need more audience.
About multi-threading, my recommendation is still to avoid it as the default behavior because we don't have control over user's machine status, network, etc.
For example, gsutil -m has documented the limitation. Quoted from the doc "Similarly, the -m option can make your performance worse, especially for cases that perform all operations locally, because it can "thrash" your local disk.
To prevent such issues, reduce the values for parallel_thread_count and parallel_process_count, or stop using the -m option entirely. "
I don't think it's a good idea for us to just enable it by default.

About multi-threading, my recommendation is still to avoid it as the default behavior because we don't have control over user's machine status, network, etc.

For example, gsutil -m has documented the limitations. Quoted from the doc "Similarly, the -m option can make your performance worse, especially for cases that perform all operations locally, because it can "thrash" your local disk.
To prevent such issues, reduce the values for parallel_thread_count and parallel_process_count, or stop using the -m option entirely. "
I don't think it's a good idea for us to just enable it by default.

Ok, I will make it an option the user has to enable.

Brief review suggests that installing gcloud requires us to install Python: https://cloud.google.com/sdk/docs/install#mac - so is this more about Python dependencies than version?

I think it is partially about one less thing to install during the OOTB experience i.e. no python -m venv venv && source venv/bin/activate && pip install. The customer likely has gcloud installed already or they will once they start using GCP in any serious way. And gcloud will support all the way back to Python 3.5 for us.
But I think it is also about giving customers a cloud native option to deploy the workflow. Cloud Run can be triggered via UI, API, client lib, there's even an "easy button". I'm particularly interested in demonstrating how to trigger the Cloud Run job off a trigger file that is written to GCS once all the input and config files have been uploaded. For use cases that require ongoing transpilation (e.g. running the legacy system in parallel until cutover, stressed exit), you could image creating a cron job to upload files from on-prem to GCS and then letting Cloud Run take it from there.

Also, having the logs saved in Cloud Logging is nice for debugging.

I've re-requested reviews from reviewers in the group delegated to do this collectively.

I've re-requested reviews from reviewers in the group delegated to do this collectively.

Briefly looked it through. I think this PR is still WIP with some processing logics (e.g., preprocess, postprocess, and workflow executor) missing at this point. Let me know if I am wrong or it is ready for review.
A high-level comment, @ajwelch4  do you think it will be easier to use google doc to describe the high-level dataflow first instead of jumping to coding?
Some questions that I have in mind now are:

how does cloud-run handle the data for the intermediate states like pre/post processing. Are we gonna use GCS to store them?
It seems the executor is likely to take additional processing units in the future. Do we want to store them in the cloud-run environment or in GCS?
What if the user doesn't need any pre/post processing.

Another thing is documentation about we can try out this fancy feature.
Thanks

I think this PR is still WIP with some processing logics (e.g., preprocess, postprocess, and workflow executor) missing at this point. Let me know if I am wrong or it is ready for review.

These are all there. See the execute function in run/workflow.py.
The original PR description contains the tasks that are outstanding WIPs.

A high-level comment, @ajwelch4 do you think it will be easier to use google doc to describe the high-level dataflow first instead of jumping to coding?
Some questions that I have in mind now are:

how does cloud-run handle the data for the intermediate states like pre/post processing. Are we gonna use GCS to store them?

The Python tool accepts the following path-related environment vars:

BQMS_INPUT_PATH: The path that the Python tool reads raw input from. This can either be a local path or a path that begins with the gs:// scheme. The tool reads from the local filesystem or GCS accordingly.
BQMS_PREPROCESSED_PATH: The path that the Python tool writes preprocessed output to and the path that BQMS reads preprocessed input from. It must be a path that begins with the gs:// scheme and thus always resides on GCS.
BQMS_TRANSLATED_PATH: The path that BQMS writes translated output to and the path that the Python tool reads translated input from. It must be a path that begins with the gs:// scheme and thus always resides on GCS.
BQMS_POSTPROCESSED_PATH: The path that the Python tool writes postprocessed output to. This can either be a local path or a path that begins with the gs:// scheme. The tool writes to the local filesystem or GCS accordingly.

The run.sh script uses gsutil rsync when necessary to sync GCS and the local filesystem. So the IO for Cloud Run vs local is roughly as follows if you look at run.sh:

Cloud Run

run.sh executes gsutil rsync to sync input and config to GCS.
Python tool within Cloud Run container reads input from GCS and writes preprocessed output to GCS.
BQMS reads preprocessed input from GCS.
BQMS writes translated output to GCS.
Python tool within Cloud Run container reads translated output from GCS and writes postprocessed output to GCS.
run.sh executes gsutil rsync to sync preprocessed, translated and postprocessed paths to local filesystem.

local

Python tool running locally reads input and config from local file system.
Python tool running locally writes preprocessed output to GCS.
BQMS reads preprocessed input from GCS.
BQMS writes translated output to GCS.
Python tool running locally reads translated input from GCS.
Python tool running locally writes postprocessed output to local filesystem.
run.sh executes gsutil rsync to sync preprocessed and translated paths to local filesystem

It seems the executor is likely to take additional processing units in the future. Do we want to store them in the cloud-run environment or in GCS?

I am not sure what is meant by additional processing units? Can you please clarify?

What if the user doesn't need any pre/post processing.

The user-provided pre/postprocessing logic is meant to go in the preprocess and postprocess stubs in run/hooks.py. If the user doesn't need to provide pre/postprocessing logic, they can use the publicly published image which will just use the stubs as no-ops. If they do need to provide pre/postprocessing logic, they can edit the stubs and create their own private image.

Another thing is documentation about we can try out this fancy feature.

If you want to test this out, the README currently contains all of the commands I ran in the demo. It is not meant as a true README which is why it remains one of the WIP tasks outstanding. Let me complete that this week. Hopefully it will address all of the points above. Let's reconvene once it is complete (perhaps on a call?) and ensure that is the case.

Thanks for the explanation. So it seems cloud run can use GCS as storage just like local disk. That's pretty cool.  I didn't know this.  And this resolved most of my earlier questions.
Another comment is about cross-region data processing regulation, which could be a hard requirement for bank users in Europe.  Can we create the cloud-run instance in the same region defined in the config.yaml file?  Feel free to address this in a follow-up PR, tho.

So it seems cloud run can use GCS as storage just like local disk. That's pretty cool.  I didn't know this.  And this resolved most of my earlier questions.

Actually, I am using cloudpathlib which abstracts over local paths and cloud paths like GCS paths (see run/paths.py). It's a very handy small library with just a few classes. In fact, if we installed the object store libs from AWS and Azure (right now we only install the GCS lib), we could support reading and writing raw input and postprocessed output to those clouds as well simply based on the URI scheme.

Another comment is about cross-region data processing regulation, which could be a hard requirement for bank users in Europe. Can we create the cloud-run instance in the same region defined in the config.yaml file? Feel free to address this in a follow-up PR, tho.

The config.yaml key/values have been moved into env vars specifically so they can be used with Cloud Run. There is a BQMS_CLOUD_RUN_REGION env var that you can pass to run.sh to specify where the container runs. I have not looked into GCS regionality. I will add this as a TODO. Do you have any tips? Thanks!

So it seems cloud run can use GCS as storage just like local disk. That's pretty cool.  I didn't know this.  And this resolved most of my earlier questions.

Actually, I am using cloudpathlib which abstracts over local paths and cloud paths like GCS paths (see run/paths.py). It's a very handy small library with just a few classes. In fact, if we installed the object store libs from AWS and Azure (right now we only install the GCS lib), we could support reading and writing raw input and postprocessed output to those clouds as well simply based on the URI scheme.

Another comment is about cross-region data processing regulation, which could be a hard requirement for bank users in Europe. Can we create the cloud-run instance in the same region defined in the config.yaml file? Feel free to address this in a follow-up PR, tho.

The config.yaml keys/values have been moved into env vars specifically so they can be used with Cloud Run. There is a BQMS_CLOUD_RUN_REGION env var that you can pass to run.sh to specify where the container runs. I have not looked into GCS regionality. I will add this as a TODO. Do you have any tips? Thanks!

GCS region is defined at creation time and users need to provide the GCS bucket in the config. As long as all the intermediate data are stored within the same bucket I think we should be fine.

The run.sh script uses gsutil rsync when necessary to sync GCS and the local filesystem. So the IO for Cloud Run vs local execution is roughly as follows if you look at run.sh:

Cloud Run

run.sh executes gsutil rsync to sync input and config to GCS.
Python tool within Cloud Run container reads input from GCS
Python tool within Cloud Run container writes preprocessed output to GCS.
BQMS reads preprocessed input from GCS.
BQMS writes translated output to GCS.
Python tool within Cloud Run container reads translated output from GCS
Python tool within Cloud Run container writes postprocessed output to GCS.
run.sh executes gsutil rsync to sync preprocessed, translated and postprocessed paths to local filesystem.

local execution

Python tool running locally reads input and config from local file system.
Python tool running locally writes preprocessed output to GCS.
BQMS reads preprocessed input from GCS.
BQMS writes translated output to GCS.
Python tool running locally reads translated input from GCS.
Python tool running locally writes postprocessed output to local filesystem.
run.sh executes gsutil rsync to sync preprocessed and translated paths to local filesystem

A minor note on this (not to block this PR): GCS IO could be one of the most time consuming steps, especially for big jobs.  The GCS IO within BQMA is already optimized. Not sure if we will need to re-visit this logic in the future if performance becomes a concern.

A minor note on this (not to block this PR): GCS IO could be one of the most time consuming steps, especially for big jobs. The GCS IO within BQMA is already optimized. Not sure if we will need to re-visit this logic in the future if performance becomes a concern.

Right. This is why multithreading was included in this PR. Each thread gets its own thread-local GCS client (see run/gcp/gcs.py). Further optimizations around batching each thread-local client's requests could be done but I think it's worth waiting to see if multithreading is enough before exploring that.

GCS region is defined at creation time and users need to provide the GCS bucket in the config. As long as all the intermediate data are stored within the same bucket I think we should be fine.

There is now a BQMS_GCS_BUCKET_LOCATION env var that is passed to gsutil mb -l in provision.sh. The run.sh always uses this same bucket that is created in provision.sh.

to be honest I would prefer to have still possibility to run it outside of cloud run. I don't have problems with pip dependencies and I feel that having wrapper closer to my laptop I can work a bit faster in comparison to cloud run approach but I agree that more mature migrations would benefit from continuous translation with container.

to be honest I would prefer to have still possibility to run it outside of cloud run. I don't have problems with pip dependencies and I feel that having wrapper closer to my laptop I can work a bit faster in comparison to cloud run approach but I agree that more mature migrations would benefit from continuous translation with container.

There is still first class support for running it locally. See the Local section of the README. You don't need docker or anything. Just Python. You can skip the provision step if you already have a project with a bucket and the migration service enabled.
Please try it out and let me know if there are any issues. Logging needs to be improved which I am working on as I have time. Other than that it should work.

@stankiewicz see this comment for more details about how local vs cloud run execution works: https://github.com/google/dwh-migration-tools/pull/94#issuecomment-1257310396


Correctly filter helm charts with display-name annotation

When calculating available extension helm charts and combining them with uiplugins the chart item name must be set to chartName instead of chartDisplayName.
Fixes https://github.com/rancher/dashboard/issues/9496

Digging a bit @jtomasek , if I had to guess, them problem lies with the different all.find((c) => c.name === p.name), line 303 as an example, which I believe it should reflect something like the logic around line 308.
https://github.com/rancher/dashboard/blob/master/shell/pages/c/_cluster/uiplugins/index.vue#L303-L308
This is just an educated guess, not the exact solution or exactly where the problem lies. I would start from there.
Cheers

Yes, but If a display-name annotation is supposed to be used as a human readable label I believe that that logic is correct. The name should not be overwritten by display-name annotation contents. Only label should (and it is). On the other hand, the logic which my PR is changing is I believe incorrect as it sets the name to display-name annotation contents which it shouldn't. It should set just the label which it correctly does.

Closed in favor of https://github.com/rancher/dashboard/pull/9544


Fix small typos in README.md

Capitalization, verb conjugation, spelling ... mundane stuff like that.

FWIF, "toots" are called "posts" in the meantime in mainstream Mastodon, see release v3.4.0 and PR 16080 over at mastodon/mastodon (but I don't link directly to avoid the irrelevant cross-ref showing up there.)

Thank you!

I'll consider the toot/post thing.


Dependency conflict mdbom and mkdocs-material

mdbom requires jinja2 in 2.x.x whereas mkdocs-material requires 3.x.x

Update as I was implementing it - still not resolved. I was using another theme - solved.
Seems like mdbom is not really maintained?!

It is but from my understanding btw upgrading jinja2 is not easy as it comes from another dependency.


Bug Report: Voices file error

Please check for duplicates or similar issues, as well performing simple troubleshooting steps (such as clearing cookies, clearing AppData, trying another browser) before submitting an issue.
If you are playing a downloaded version of the game, what operating system are you using?
Windows 10
What version of the game are you using? Look in the bottom left corner of the main menu.
1.4 kade dev engine
Have you identified any steps to reproduce the bug? If so, please describe them below. Use images if possible.
Well it seems as if it happens when the original song SHOULD have ended
Please describe your issue. Provide extensive detail and images if possible.
The voice track seems to cut out for little to no reason. I worked again after the section that it first cut out on once I put notes there, but that section still had no voice even after I put notes.

oh and the song was bopeebo

was it the only song that glitched?

no glitchs on my end

huh. might just be my copy of the game then. the song was 5 mins long so that could have something to do with it

could the voice file and inst file being slightly different lengths have something to do with it?

section 32 seems to be where it is happening. Ill check the JSON to see if that's messing with it.

The game code automatically runs the "endSong" function once the instrumentals are completed, meaning it's probably the voice files.

I mean, the song still goes on. and it's only a 2-second difference between the inst and the voices

hold on it could have something to do with the difference

the problem is still there even after I made them the same length

Can you post a video of it so we can see it?

This is mainly a mod for my friend so keep that in mind. I don't wanna get sued for making a mod I'm not gonna post. but still, I want to know a fix for this if it happens with a song/chart I intend to post. (also I just made the chart. the song and other mods are not mine) also, I know the audio quality is absolute garbage.
https://user-images.githubusercontent.com/77013267/113493369-b2347480-94ac-11eb-9aa3-52421821f8a7.mp4

Bopeebo does have some beats that are hard coded to be muted for some reason, but it's only three of them. Is the charted part without vocals supposed to be the problem?

yea but now that I know what the problem is I can just switch over to fresh in order to fix it.


Regression on injected pod startup time.

Describe the bug
Startup time of pod/service increased for a recent 1.1 build when compared with 1.0.3. This can be observed in the chart below showing the startup time of a single pod when a number of pods/services are already present in the cluster. The startup time is better in 1.1 only when there is a large number of services.

There was  a big improvement in Pilot cpu consumption though:

Expected behavior
No regression in pod+sidecar startup time.
Steps to reproduce the bug
Measure the time to start a pod with sidecar, from the deployment command until it responds a request.
Version
K8s version: 1.11.7_1543
Installation
Helm chart template
Environment
IKS

@mandarjog Could you pls add the Perf and scalability tag

/cc @rshriram @costinm

@jnativio how do you measure this?
In the large clusters with 1000 to 2000 services,
It takes less than 5s to see “envoy is ready” message and a few seconds more for k8s to pick it up.

@mandarjog The times in the chart were measured based on when the service responds a valid request, not in log messages.


Accept redis password in configuration and client

Loggo works only with empty password now. It's needed to pass this dial option.

Closed by #13 .


Add missing LICENSE file

Context
Currently LICENSE just says TODO. It should be a 3-clause BSD license.
Proposal
No response
Updates and actions
No response

Added in https://github.com/2i2c-org/binderhub-service/commit/98c3312854dca67c68d56e552e21c81760de17d7


git-verify

The command would pass after adding 'reporobot' as a collaborator on my forked copy.

I'm not sure what the issue is here? That is what the challenge is supposed to do :smile:
Closing but feel free to re-open with more details on the issue :+1:


Issue 55 scrimp bug

It was a simple 0 vs 1 index based logic difference between Matlab and Python. The computation of the end_idx was the culprit. In many cases the minimum value did not evaluate out to use the bugged piece of code.

Haha! I had the same bug too. I've fixed it in my fork as well. This error only occurs when the time-series length is not a multiple of the subsequence length.


added new data dictionary authoring guidelines

Guidelines for data dictionaries authoring.

This is awesome @hxnoyd ! I have to give it a few more reads. Thank you very much for doing this!! I will build on the top of that doc and add a few things 👍 🙏

Thank you @hxnoyd !! :)


Subscription timeout after 3000ms. Check network and/or increase 'timeout' parameter.

Hi. We use redis for distributed lock, storing some cache data and listen some key notification events. For this purposes we have a redis cluster with 3 masters and 3 slaves. Our team is experiencing the issue with Subscription timeout in production after some couple of time (a few days) after start/restart our services. We can't understand the reason of this issue from stack trace:
Subscription timeout after 3000ms. Check network and/or increase 'timeout' parameter.  org.redisson.client.RedisTimeoutException: Subscription timeout after 3000ms. Check network and/or increase 'timeout' parameter. 	at org.redisson.pubsub.PubSubConnectionEntry.lambda$subscribe$0(PubSubConnectionEntry.java:177) 	at io.netty.util.HashedWheelTimer$HashedWheelTimeout.expire(HashedWheelTimer.java:672) 	at io.netty.util.HashedWheelTimer$HashedWheelBucket.expireTimeouts(HashedWheelTimer.java:747) 	at io.netty.util.HashedWheelTimer$Worker.run(HashedWheelTimer.java:472) 	at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30) 	at java.base/java.lang.Thread.run(Thread.java:829)
It's not clear what method/service... can't subscribe and how we can debug it.
We don't have any issues with network. Also, we monitor redis and don't see any issues there.
We have already increased:
subscriptionsPerConnection: 20
subscriptionConnectionPoolSize: 120
nettyThreads: 64
threads: 64
But it didn't help. Could you advice what config we can change to fix this issue or how we can debug this issue to understand a root cause of this issue?
Redisson version
3.17.6

I saw this happening with 3.19.1 version too. I am trying to rule out that there is no network glitch.
Caused by: org.redisson.client.RedisTimeoutException: Subscription timeout after 5000ms. Check network and/or increase 'timeout' parameter. 	at org.redisson.pubsub.PubSubConnectionEntry.lambda$subscribe$0(PubSubConnectionEntry.java:181) 	at io.netty.util.HashedWheelTimer$HashedWheelTimeout.run(HashedWheelTimer.java:715) 	at io.netty.util.concurrent.ImmediateExecutor.execute(ImmediateExecutor.java:34) 	at io.netty.util.HashedWheelTimer$HashedWheelTimeout.expire(HashedWheelTimer.java:703) 	at io.netty.util.HashedWheelTimer$HashedWheelBucket.expireTimeouts(HashedWheelTimer.java:790) 	at io.netty.util.HashedWheelTimer$Worker.run(HashedWheelTimer.java:503) 	at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)

Is there any way to reproduce it?

still produce the same error with nettyThreads = 64 or 128

@khuynhthanhchiluyen
Is there any code to reproduce the issue?

Incorrect handling of "unknown command" response may cause to this issue. Fixed in https://github.com/redisson/redisson/issues/5128


Cargo build may stall when compiling project using SQLx

I having been using SQLx's query and query_as macros to statically verify queries to a MariaDB database using sqlx::MySqlPool. It was working well until today when I turned on my MacBook and cargo build was stuck on compiling my project source code. Only after rebooting my MacBook was cargo build able to complete the compilation.
Expected behaviour:
cargo build takes at most a few seconds to compile my projects binary after compiling all dependencies
Actual behaviour:
cargo build hangs indefinitely. Running cargo build -vv to see the rustc command cargo build is stuck on and removing the --extern sqlx=... option resolves the hanging.
OS: MacOS Catalina
Database: MariaDB 10.4.11 (Installed through XAMPP with DATABASE_URL=mysql://root@localhost/mydatabase)
sqlx = {version="0.3.5", default-features = false, features = [ "runtime-tokio", "macros", "mysql", "chrono" ]}

When cargo build is stalled can you still connect to your MariaDB instance and issue commands?

Unfortunately I didn't investigate that and I'm not sure how to reproduce the stall. I only know that MariaDB server was running according to XAMPP

Not really sure what we can do about this right now, so there's kinda dubious utility in keeping it open. Thanks for reporting this, if you manage to reproduce it or if anyone else runs into this and has some actionable information please let us know and we'll reopen this to address it.


Bug report

Describe what happened:
What was your system configuration?
Product and Version [VS/VSCode]:
OS Version[macOS/Windows]:
Live Share Extension Version:
Target Platform or Language [e.g. Node.js]:
Steps to Reproduce / Scenario:

Go to '...'
Click on '....'
Scroll down to '....'
See error

Please attach logs to this issue:
You can access them via the Live Share: Export Logs command from the command palette (ctrl + shift + p) and attach them to this issue
Screenshots
If applicable, add screenshots to help explain your problem.

What was the error/bug you were running into?
Unfortunately there isn't enough here for us to investigate further to I'm closing this but feel free to comment with additional information.


Add GitHub actions setup for CI instead of Travis & Appveyour (where possible)

Look here for the current builds: https://github.com/sergregory/opencv-python/actions/runs/778972321


[node-administrator:endpoints] For role assignment

GET /roles
GET /users (paginate)
PUT /user/${user_id}/revoke_role_assignment/${role_id}
POST /user/${user_id}/assign_role/${role_id}

Why can't we just hardcode the roles? It would be brittle. Imagine the seed data for the DB changed from system to system. That's not great either, but if we just GET roles we don't need to worry.

Ended up parametrizing assign/revoke at /role


[WIP] feat: Token-based login for dev

Ticket: #43
Impact: minor
Type: feat
Issue
Implement a token based authentication system
Solution

Added a login dropdown with an input field with a save button
Used a Popover and omitted "Cancel" button as you cancel by clicking outside the popover.
Added a mobx authStore for saving the token in state as well has saving / getting token from cookies
Saved the token as a cookie and providing it to the client that way as well as storing it in mobx
Didn't use Localstorage as it's redundant to the cookies
Provide the token to apollo on both client and server
Removed login token from env vars and various places where it was used from those vars

Breaking
Login token must be supplied using the login dropdown.
Testing

Start app
Use the Account icon in the navigation
Enter a valid meteor login token and hit save
App should load with data

Adding tests now, should be ready soon.

Ready for review


[Request deployment] New hub projectpythia.2i2c.cloud

We have Cloudbank funding to deploy a Project Pythia/Pangeo JupyterHub and BinderHub on GCP.
Cluster deployment:

https://github.com/2i2c-org/infrastructure/issues/3652

This is flowing from a grant from NSF:
Rose, Brian E. J., Clyne, John, May, Ryan, Munroe, James, Snyder, Amelia, Eroglu, Orhan, & Tyle, Kevin. (2023). Collaborative Research: GEO OSE TRACK 2: Project Pythia and Pangeo: Building an inclusive geoscience community through accessible, reusable, and reproducible workflows. Zenodo. https://doi.org/10.5281/zenodo.8184298
This JupyterHub will support Project Pythia workflows for use by the broader Pangeo community.
I think we'll want both a persistent storage JupyterHub and ephemeral storage BinderHub both running on the same cluster.  This is a pattern of JupyterHub for a smaller set of authorized, core users who create content, and a BinderHub for a much larger user group who do not require persistent storage.
We have a few projects with this access pattern requirement (HPOSS, HHMI, ProjectPythia, Catalyst) so it make some sense to first plan this kind of deployment as being just one instance of a JupyterHub/BinderHub combination on a dedicated cluster.
Phase 3 : Hub setup
There's going to be a number of hubs, and this starts specifying them.
Hub 1: Staging (Ready)
Phase 3.1: Initial setup

Question
Answer
Notes

Name of the hub
staging

Dask gateway?
no

Splash image
https://projectpythia.org/_static/pythia_logo-white-rtext.svg

URL
https://projectpythia.org/

funded_by
NSF
Rose, Brian E. J., Clyne, John, May, Ryan, Munroe, James, Snyder, Amelia, Eroglu, Orhan, & Tyle, Kevin. (2023). Collaborative Research: GEO OSE TRACK 2: Project Pythia and Pangeo: Building an inclusive geoscience community through accessible, reusable, and reproducible workflows. Zenodo. https://doi.org/10.5281/zenodo.8184298

Authentication Mechanism
GitHub (via GitHubOAuthenticator)

Admin Users
@jmunroe @ktyle

At the end of this phase, both 2i2c engineers and the admin users mentioned can login to the hub.
Phase 3.2: Object storage access

Question
Answer
Notes

Scratch bucket enabled?
Yes

Persistent bucket enabled?
no

Requestor pays requests to external buckets allowed?
no

Phase 3.3: Profile List
These are the standard profile list options we want to start with. Can be customized later

Question
Answer
Notes

Pangeo Notebook?
Yes
Use latest available date tag for pangeo-notebook

RStudio (with Rocker)?
No

Allow users to specify any image they want to use?
Yes
Enable unlisted_choice

Max RAM option allowed
30GB
Output of deployer generate resource-allocation choices r5.xlarge --num-allocations 5 should be used

GPU enabled?
yes

Default Interface
JupyterLab

Allow multiple concurrent servers per user?
Yes
Translates to allowNamedServers

Phase 3.4: Authentication tuning (NOT READY)

Question
Answer

Authentication Mechanism
GitHub (via GitHubOAuthenticator)

Org based access?
yes

List of GitHub orgs / teams to be granted access
https://github.com/orgs/ProjectPythia

Phase 3.5: Profile List finetuning

Question
Answer
Notes

Custom image to be specified?
no

Hub 2: prod (Ready)
same as staging but for production
Hub 3: binder-like hub (Not Ready)
https://binder.projectpythia.2i2c.cloud
Equivalent functionality to https://binder.projectpythia.org
Authentication: requires a discussion with engineering on options.

@jmunroe @yuvipanda @AIDEA775 Is the Jupyterhub instance ready? If so, could you please grant my GitHub ID access to the hub?

Hi @ktyle -- as soon as the hub is deployed, we will let you know. This hub is @AIDEA775 next task to pick up.

Hi @ktyle and @jmunroe!  I changed the logo to the blue version (https://projectpythia.org/_static/images/logos/pythia_logo-blue-rtext.svg) because the white version is not visible with the white background.
The staging and prod hubs are deployed!
prod: https://projectpythia.2i2c.cloud/
staging: https://staging.projectpythia.2i2c.cloud/
But before you try to log in, I will temporarily need admin permission in the GitHub organization to do the last step:
https://infrastructure.2i2c.org/hub-deployment-guide/configure-auth/github-orgs/#granting-access-to-the-oauth-app

Hi @AIDEA775 sounds good ... regarding the admin permission, is this something you need our organization (ProjectPythia) to provide, or are you waiting for someone in your 2i2c org to do this?

@ktyle yes, you'd have to grant that to him!
So close to complete :)

Thank you @ktyle! Everything is ready. Can you log in?

@AIDEA775 nice!! Yes, I can log into both instances! Can any member of the ProjectPythia organization now log into these hubs, or do we need to provide a list of users for you?

Looks like folks can log in so I think we're good! Thanks again!

Thanks @AIDEA775 !!


implement chart.js or vx

workin' on it...

(this is being implement via embedded scripts within html, as it is more convenient/simpler for a single view route)

issue is no longer relevant, as I have moved away from a webapplication model, and to a localhost, jupyter graph


Spellcheck on Flutter Web

Supporting spellcheck for text editing in Flutter Web Engine

PR (as of today) will enable support for all browsers other than Safari Mobile: https://github.com/flutter/engine/pull/12192
I am working on adding a fix for Safari Mobile as well.

Is spellcheck supposed to be working for most browsers? I don't see the squiggly lines in a TextField in Chrome Desktop. Is the plan to add an option to enable spellcheck on a TextField?

@kunit1, the issue is still open. It is a todo on our list. Right now we are prioritizing autofill. I'll update this issue about spell check later. Please feel free to have a look at our project for text editing:
https://github.com/flutter/flutter/projects/57

@nturgut What is the status on this issue?
And (depending on the answer) are there any docs for spell checking on web?

@nturgut What is the status on this issue?
And (depending on the answer) are there any docs for spell checking on web?

With web now announced as stable in Flutter 2 I would expect basic text field functionality like this to get moved up in priority. Is there anything I can do to help get this fixed quickly? I'd love to start contributing as best I can on the web front. Thank you!

Adding another voice to the chorus on this.  Spellcheck is surprisingly important, as people have become dependent on it. Can anyone give us an idea of how deep in the backlog this is?

@CBBill This issue has the P4 label, which means that it is a lower priority than all of the P0, P1, P2, and P3 issues.

I noticed that spell-check works in Firefox for Flutter Web apps.  If you add this snippet as an include on your index.html, you can invoke the method during onChanged or similar in Flutter Web textfields.  It should enable spell-check in Chrome on the active textfield.  It isn't perfect, but it might serve as a good placeholder.
function enableSpellCheck() {           document.activeElement.setAttribute('spellcheck','true');       }

I noticed that spell-check works in Firefox for Flutter Web apps. If you add this snippet as an include on your index.html, you can invoke the method during onChanged or similar in Flutter Web textfields. It should enable spell-check in Chrome on the active textfield. It isn't perfect, but it might serve as a good placeholder.
function enableSpellCheck() { document.activeElement.setAttribute('spellcheck','true'); }

Thanks,
but is there any way to enable spellcheck to unfocused element also?

I noticed that spell-check works in Firefox for Flutter Web apps. If you add this snippet as an include on your index.html, you can invoke the method during onChanged or similar in Flutter Web textfields. It should enable spell-check in Chrome on the active textfield. It isn't perfect, but it might serve as a good placeholder.
function enableSpellCheck() { document.activeElement.setAttribute('spellcheck','true'); }

Thanks. Where to put this code and how to call from Flutter web Dart code please?

It would be possible to use the JS querySelector() or querySelectorAll() to find all text elements & call setAttribute(), but I don't think it would be reliable.
To include the JS code:

Add the code in a separate .js file in the web folder of your project directory.  Then modify index.html to reference/include it.
Alternatively, you can modify the index.html file directly and embed the code between script tags.

It can be invoked through the dart:js library:
import 'dart:js' as js;
js.context.callMethod('enableSpellCheck');
Before you use it in production, ensure that you test it well.  It is possible for the misspelling indicator to show up at an unexpected location with this method.

I agree on this being higher priority than P4 🙏🏼

@marco2704 Seconded. This is important to a wide variety of applications, and a large section of users are completely incapable of spelling without spellcheck. This should be at lease P3, to match the corresponding issue for android/iOS

I am using flutter web, and this issue is my biggest concern right now. Spell check is something very basic!

any update on this?

I've looked into this a bit.
Enabling the browser spellcheck (to show the red squiggly line) is straightforward (here). But it requires a few other things in order to work well:

Flutter's scroll position in the text field needs to be kept in sync with the <input> element (issue).
Keep the <input> element alive and correctly positioned after the text field loses focus (to keep the squiggly lines visible).
Re-verify that all styling information is kept in sync between Fltutter's text field and the <input> element (to make sure that Flutter's text and the <input>'s text are perfectly on top of each other).

This is yet another issue that would become trivial if implement this proposal.

Any update on this issue please?

@nturgut Hello! Is there any progress?

It's quite confusing that new features (for example autofill, 4 years ago) have a higher priority than fixing bugs.

@nturgut Hi!
How can we to elevate the priority level of this issue?
This is important because enable us to use Flutter on all platforms.

It would be possible to use the JS querySelector() or querySelectorAll() to find all text elements & call setAttribute(), but I don't think it would be reliable.
To include the JS code:

Add the code in a separate .js file in the web folder of your project directory.  Then modify index.html to reference/include it.
Alternatively, you can modify the index.html file directly and embed the code between script tags.

It can be invoked through the dart:js library:
import 'dart:js' as js; js.context.callMethod('enableSpellCheck');
Before you use it in production, ensure that you test it well. It is possible for the misspelling indicator to show up at an unexpected location with this method.

if you don't want to call js.context.callMethod('enableSpellCheck'); on OnChange and if you want the spell check on every input you can use this inside index.html
<script>
      window.addEventListener("load", function (e) {
        /// Since [spellCheckConfiguration:const SpellCheckConfiguration()] don't work on flutter web
        /// this is to enable spellcheck for input elements when focused
        document.addEventListener("focusin", function (event) {
          // Check if the focused element is an input element
          if (
            event.target.tagName === "INPUT" ||
            event.target.tagName === "TEXTAREA"
          ) {
            event.target.setAttribute("spellcheck", "true");
          }
        });
      });
   </script>

if you don't want to call js.context.callMethod('enableSpellCheck'); on OnChange and if you want the spell check on every input you can use this inside index.html
<script>
      window.addEventListener("load", function (e) {
        /// Since [spellCheckConfiguration:const SpellCheckConfiguration()] don't work on flutter web
        /// this is to enable spellcheck for input elements when focused
        document.addEventListener("focusin", function (event) {
          // Check if the focused element is an input element
          if (
            event.target.tagName === "INPUT" ||
            event.target.tagName === "TEXTAREA"
          ) {
            event.target.setAttribute("spellcheck", "true");
          }
        });
      });
   </script>

Amazingly this works quite well, except I see that the underline squiggles are way offset from the actual text.  Any ideas why?


Memory leak on byte-range response

Thanks for this nice library, it's very easy to use it!
I'm currently implementing h2 proto handlers in my own server lib and had encountered some memory leaks on sending byte-range response.
IStream is in state Closed - all content bytes are sent with endOfStream=true.
And it's not disposed properly even after Dispose called

It was server-side bug with byte-range headers, I have started to use buffered streams and to read response payload lazily in forward proxy module (before that the full response was in ram, until I tested server on a large media).


docs: Update ProgramCall examples and docs

Resolves #181

Reopened #208 but this branch from this repo rather than my fork.

These docs will be updated within .rst files using sphinx-js


Unregister event and unsubscribe.

I'm trying to unregister event
luckPermsHook.api.getEventBus().subscribe(UserLoadEvent.class, luckPermsHook::onUserLoad).close();
but this method not work. Can you help me?

You need to store the instance returned by the subscribe method, and then call close on it when you are ready to unregister.


feat: Support LEGACY camera devices

What
Cameras that report the "LEGACY" hardware level technically also support up to three use-cases:

So that's "preview", "photo-capture" and "video-capture", even though "video-capture" will be in low-resolution (= "preview" resolution).
This PR adds support for LEGACY camera devices.
Changes

Also return LEGACY devices in getAvailableCameraDevices

Tested on

Related issues
Fixes #127

@dhirajanand014 @kabus202 could you test if the Camera works for you guys with the change proposed in this PR? Then I can merge it.

@mrousavy unfortunately i dont have a device with a legacy camera

@mrousavy I found some "LEGACY" devices, let me know if you still need help testing this and I can have a look at it tomorrow.

@yfunk yes please! Let me know if the change in this PR makes LEGACY devices work for you. 🙏

@mrousavy I'm testing this on two devices, which are both reporting hardware level LEGACY:

Amazon Fire 5th Generation (API 22)
Motorola Moto G4 (API 24)

I used the example app for testing, since I currently don't have this library in any of my projects. For verification purposes I ran the main branch (310ad5f) example first. The app started, but the camera page stayed "idle" ("re-rendering camera page without active camera") and the expected error was logged on the native side:

Logs for Fire 5th Generation (main branch)
05-18 11:16:26.787 11715-11804/com.mrousavy.camera.example I/CameraManagerGlobal: getCameraService: Reconnecting to camera service
05-18 11:16:26.856 11715-11804/com.mrousavy.camera.example D/CameraRepository: Added camera: 0
05-18 11:16:26.860 11715-11804/com.mrousavy.camera.example D/CamcorderProfileResolut: mSupportedResolutions = []
05-18 11:16:26.861 11715-11804/com.mrousavy.camera.example D/CamcorderProfileResolut: mSupportedResolutions = []
05-18 11:16:26.877 11715-11804/com.mrousavy.camera.example I/Camera2CameraInfo: Device Level: INFO_SUPPORTED_HARDWARE_LEVEL_LEGACY
05-18 11:16:26.880 11715-11804/com.mrousavy.camera.example D/CameraRepository: Added camera: 1
05-18 11:16:26.880 11715-11805/com.mrousavy.camera.example D/UseCaseAttachState: Active and attached use case: [] for camera: 0
05-18 11:16:26.881 11715-11804/com.mrousavy.camera.example D/CamcorderProfileResolut: mSupportedResolutions = []
05-18 11:16:26.881 11715-11804/com.mrousavy.camera.example D/CamcorderProfileResolut: mSupportedResolutions = []
05-18 11:16:26.881 11715-11804/com.mrousavy.camera.example I/Camera2CameraInfo: Device Level: INFO_SUPPORTED_HARDWARE_LEVEL_LEGACY
05-18 11:16:26.882 11715-11805/com.mrousavy.camera.example D/UseCaseAttachState: Active and attached use case: [] for camera: 1
05-18 11:16:26.893 11715-11715/com.mrousavy.camera.example I/CameraView: Skipping Camera #0 because it does not meet the minimum requirements for react-native-vision-camera. See the tables at https://developer.android.com/reference/android/hardware/camera2/CameraDevice#regular-capture for more information.
05-18 11:16:26.899 11715-11715/com.mrousavy.camera.example I/CameraView: Skipping Camera #1 because it does not meet the minimum requirements for react-native-vision-camera. See the tables at https://developer.android.com/reference/android/hardware/camera2/CameraDevice#regular-capture for more information.
05-18 11:16:26.899 11715-11715/com.mrousavy.camera.example W/CameraView: CameraViewModule::getAvailableCameraDevices took: 335 ms

Logs for Moto G4 (main branch)
2021-05-18 11:17:45.123 14311-14450/com.mrousavy.camera.example I/CameraManagerGlobal: Connecting to camera service
2021-05-18 11:17:45.174 14311-14450/com.mrousavy.camera.example D/CameraRepository: Added camera: 0
2021-05-18 11:17:45.177 14311-14450/com.mrousavy.camera.example D/CamcorderProfileResolutionQuirk: mSupportedResolutions = [1280x960, 1280x720, 960x720, 960x540, 864x480, 720x480, 768x432, 640x480, 320x240, 176x144]
2021-05-18 11:17:45.178 14311-14450/com.mrousavy.camera.example D/CamcorderProfileResolutionQuirk: mSupportedResolutions = [1280x960, 1280x720, 960x720, 960x540, 864x480, 720x480, 768x432, 640x480, 320x240, 176x144]
2021-05-18 11:17:45.189 14311-14450/com.mrousavy.camera.example I/Camera2CameraInfo: Device Level: INFO_SUPPORTED_HARDWARE_LEVEL_LEGACY
2021-05-18 11:17:45.191 14311-14450/com.mrousavy.camera.example D/CameraRepository: Added camera: 1
2021-05-18 11:17:45.192 14311-14450/com.mrousavy.camera.example D/CamcorderProfileResolutionQuirk: mSupportedResolutions = [1280x960, 1280x720, 960x720, 960x540, 864x480, 720x480, 768x432, 640x480, 320x240, 176x144]
2021-05-18 11:17:45.193 14311-14450/com.mrousavy.camera.example D/CamcorderProfileResolutionQuirk: mSupportedResolutions = [1280x960, 1280x720, 960x720, 960x540, 864x480, 720x480, 768x432, 640x480, 320x240, 176x144]
2021-05-18 11:17:45.194 14311-14450/com.mrousavy.camera.example I/Camera2CameraInfo: Device Level: INFO_SUPPORTED_HARDWARE_LEVEL_LEGACY
2021-05-18 11:17:45.202 14311-14450/com.mrousavy.camera.example D/UseCaseAttachState: Active and attached use case: [] for camera: 1
2021-05-18 11:17:45.204 14311-14451/com.mrousavy.camera.example D/UseCaseAttachState: Active and attached use case: [] for camera: 0
2021-05-18 11:17:45.209 14311-14311/com.mrousavy.camera.example I/CameraView: Skipping Camera #0 because it does not meet the minimum requirements for react-native-vision-camera. See the tables at https://developer.android.com/reference/android/hardware/camera2/CameraDevice#regular-capture for more information.
2021-05-18 11:17:45.218 14311-14311/com.mrousavy.camera.example I/CameraView: Skipping Camera #1 because it does not meet the minimum requirements for react-native-vision-camera. See the tables at https://developer.android.com/reference/android/hardware/camera2/CameraDevice#regular-capture for more information.
2021-05-18 11:17:45.218 14311-14311/com.mrousavy.camera.example W/CameraView: CameraViewModule::getAvailableCameraDevices took: 253 ms

Next I switched to the feat/support-legacy-devices branch (a9e8e40), cleaned everything up and ran the example again. Unfortunately the app did not run as expected on any of the two devices:
Fire 5th Generation
useCameraDevice() returned {"back": undefined, "front": undefined} and the camera stayed "idle".

JS Logs
LOG  Running "Home" with {"initialProps":{"componentId":"Component1"},"rootTag":1}
LOG  Target FPS: 60
LOG  re-rendering camera page without active camera
LOG  Target FPS: 60
LOG  re-rendering camera page without active camera
LOG  Target FPS: 60
LOG  re-rendering camera page without active camera
LOG  Devices:

Native Logs
05-18 12:22:55.961 17942-17985/com.mrousavy.camera.example I/ReactNativeJS: Running "Home" with {"initialProps":{"componentId":"Component1"},"rootTag":1}
05-18 12:22:56.872 17942-17985/com.mrousavy.camera.example I/ReactNativeJS: Target FPS: 60
05-18 12:22:56.909 17942-17985/com.mrousavy.camera.example I/ReactNativeJS: re-rendering camera page without active camera
05-18 12:22:57.573 17942-17942/com.mrousavy.camera.example I/ReactNativeJNI: received didPause for reason: 0 in state: RunningDetached [x 46 times]
05-18 12:22:57.881 17942-17942/com.mrousavy.camera.example I/ReactNative: [GESTURE HANDLER] Initialize gesture handler for root view com.reactnativenavigation.react.ReactView{1f785a18 V.E..... ......ID 0,0-600,976 #1}
05-18 12:22:57.926 17942-17942/com.mrousavy.camera.example I/ReactNativeJNI: received didPause for reason: 0 in state: RunningDetached
05-18 12:22:57.940 17942-17942/com.mrousavy.camera.example I/art: Rejecting re-init on previously-failed class java.lang.Class<androidx.camera.extensions.ExtensionsManager$2>
05-18 12:22:57.940 17942-17942/com.mrousavy.camera.example I/art: Rejecting re-init on previously-failed class java.lang.Class<androidx.camera.extensions.ExtensionsManager$2>
05-18 12:22:57.942 17942-17942/com.mrousavy.camera.example I/art: Rejecting re-init on previously-failed class java.lang.Class<androidx.camera.extensions.ExtensionsManager$1>
05-18 12:22:57.943 17942-17942/com.mrousavy.camera.example I/art: Rejecting re-init on previously-failed class java.lang.Class<androidx.camera.extensions.ExtensionsManager$1>
05-18 12:22:57.947 17942-17942/com.mrousavy.camera.example D/ExtenderVersion: No versioning extender found. Falling back to default.
05-18 12:22:57.969 17942-18039/com.mrousavy.camera.example I/CameraManagerGlobal: getCameraService: Reconnecting to camera service
05-18 12:22:57.971 17942-17985/com.mrousavy.camera.example I/ReactNativeJS: Target FPS: 60
05-18 12:22:57.973 17942-17985/com.mrousavy.camera.example I/ReactNativeJS: re-rendering camera page without active camera
05-18 12:22:58.009 17942-18039/com.mrousavy.camera.example D/CameraRepository: Added camera: 0
05-18 12:22:58.013 17942-18039/com.mrousavy.camera.example D/CamcorderProfileResolut: mSupportedResolutions = []
05-18 12:22:58.014 17942-18039/com.mrousavy.camera.example D/CamcorderProfileResolut: mSupportedResolutions = []
05-18 12:22:58.034 17942-18039/com.mrousavy.camera.example I/Camera2CameraInfo: Device Level: INFO_SUPPORTED_HARDWARE_LEVEL_LEGACY
05-18 12:22:58.037 17942-18039/com.mrousavy.camera.example D/CameraRepository: Added camera: 1
05-18 12:22:58.038 17942-18039/com.mrousavy.camera.example D/CamcorderProfileResolut: mSupportedResolutions = []
05-18 12:22:58.038 17942-18039/com.mrousavy.camera.example D/CamcorderProfileResolut: mSupportedResolutions = []
05-18 12:22:58.038 17942-18039/com.mrousavy.camera.example I/Camera2CameraInfo: Device Level: INFO_SUPPORTED_HARDWARE_LEVEL_LEGACY
05-18 12:22:58.039 17942-18040/com.mrousavy.camera.example D/UseCaseAttachState: Active and attached use case: [] for camera: 0
05-18 12:22:58.041 17942-18040/com.mrousavy.camera.example D/UseCaseAttachState: Active and attached use case: [] for camera: 1
05-18 12:22:58.143 17942-17942/com.mrousavy.camera.example W/CameraView: CameraViewModule::getAvailableCameraDevices took: 424 ms
05-18 12:22:58.186 17942-17985/com.mrousavy.camera.example I/ReactNativeJS: Target FPS: 60
05-18 12:22:58.188 17942-17985/com.mrousavy.camera.example I/ReactNativeJS: re-rendering camera page without active camera
05-18 12:22:58.198 17942-17985/com.mrousavy.camera.example I/ReactNativeJS: Devices:

Moto G4
useCameraDevice() returned an object with details about the front and back camera as expected, but an error about the given camera device not being found for use-case binding was raised and no camera feed was visible.

JS Logs
LOG  Running "Home" with {"initialProps":{"componentId":"Component1"},"rootTag":1}
LOG  Target FPS: 60
LOG  re-rendering camera page without active camera
LOG  Target FPS: 60
LOG  re-rendering camera page without active camera
LOG  Target FPS: 60
LOG  Re-rendering camera page with active camera. Device: "back (0)" (4160x2340 @ 30fps)
LOG  Target FPS: 60
LOG  Re-rendering camera page with active camera. Device: "back (0)" (4160x2340 @ 30fps)
LOG  Devices: back (0), front (1)
ERROR  [device/invalid-device: [device/invalid-device] The given Camera device could not be found for use-case binding!]

Native Logs
2021-05-18 12:39:00.698 32134-32166/com.mrousavy.camera.example I/ReactNativeJS: Running "Home" with {"initialProps":{"componentId":"Component1"},"rootTag":1}
2021-05-18 12:39:01.467 32134-32166/com.mrousavy.camera.example I/ReactNativeJS: Target FPS: 60
2021-05-18 12:39:01.496 32134-32166/com.mrousavy.camera.example I/ReactNativeJS: re-rendering camera page without active camera
2021-05-18 12:39:02.035 32134-32134/com.mrousavy.camera.example I/ReactNativeJNI: received didPause for reason: 0 in state: RunningDetached [x 24 times]
2021-05-18 12:39:02.226 32134-32134/com.mrousavy.camera.example I/ReactNative: [GESTURE HANDLER] Initialize gesture handler for root view com.reactnativenavigation.react.ReactView{f498850 V.E...... ......ID 0,0-1080,1776 #1}
2021-05-18 12:39:02.245 32134-32139/com.mrousavy.camera.example I/art: Do partial code cache collection, code=61KB, data=62KB
2021-05-18 12:39:02.246 32134-32139/com.mrousavy.camera.example I/art: After code cache collection, code=58KB, data=59KB
2021-05-18 12:39:02.246 32134-32139/com.mrousavy.camera.example I/art: Increasing code cache capacity to 256KB
2021-05-18 12:39:02.260 32134-32134/com.mrousavy.camera.example I/ReactNativeJNI: received didPause for reason: 0 in state: RunningDetached
2021-05-18 12:39:02.264 32134-32166/com.mrousavy.camera.example I/ReactNativeJS: Target FPS: 60
2021-05-18 12:39:02.265 32134-32166/com.mrousavy.camera.example I/ReactNativeJS: re-rendering camera page without active camera
2021-05-18 12:39:02.269 32134-32134/com.mrousavy.camera.example I/art: Rejecting re-init on previously-failed class java.lang.Class<androidx.camera.extensions.ExtensionsManager$2>: java.lang.NoClassDefFoundError: Failed resolution of: Landroidx/camera/extensions/impl/InitializerImpl$OnExtensionsDeinitializedCallback;
2021-05-18 12:39:02.269 32134-32134/com.mrousavy.camera.example I/art:     at com.google.common.util.concurrent.ListenableFuture androidx.camera.extensions.ExtensionsManager.init(android.content.Context) (ExtensionsManager.java:120)
2021-05-18 12:39:02.269 32134-32134/com.mrousavy.camera.example I/art:     at java.lang.Object com.mrousavy.camera.CameraViewModule$getAvailableCameraDevices$1.invokeSuspend(java.lang.Object) (CameraViewModule.kt:102)
2021-05-18 12:39:02.269 32134-32134/com.mrousavy.camera.example I/art:     at void kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(java.lang.Object) (ContinuationImpl.kt:33)
2021-05-18 12:39:02.269 32134-32134/com.mrousavy.camera.example I/art:     at void kotlinx.coroutines.DispatchedTask.run() (DispatchedTask.kt:106)
2021-05-18 12:39:02.269 32134-32134/com.mrousavy.camera.example I/art:     at void android.os.Handler.handleCallback(android.os.Message) (Handler.java:751)
2021-05-18 12:39:02.269 32134-32134/com.mrousavy.camera.example I/art:     at void android.os.Handler.dispatchMessage(android.os.Message) (Handler.java:95)
2021-05-18 12:39:02.269 32134-32134/com.mrousavy.camera.example I/art:     at void android.os.Looper.loop() (Looper.java:154)
2021-05-18 12:39:02.269 32134-32134/com.mrousavy.camera.example I/art:     at void android.app.ActivityThread.main(java.lang.String[]) (ActivityThread.java:6123)
2021-05-18 12:39:02.269 32134-32134/com.mrousavy.camera.example I/art:     at java.lang.Object java.lang.reflect.Method.invoke!(java.lang.Object, java.lang.Object[]) (Method.java:-2)
2021-05-18 12:39:02.269 32134-32134/com.mrousavy.camera.example I/art:     at void com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run() (ZygoteInit.java:867)
2021-05-18 12:39:02.269 32134-32134/com.mrousavy.camera.example I/art:     at void com.android.internal.os.ZygoteInit.main(java.lang.String[]) (ZygoteInit.java:757)
2021-05-18 12:39:02.269 32134-32134/com.mrousavy.camera.example I/art: Caused by: java.lang.ClassNotFoundException: Didn't find class "androidx.camera.extensions.impl.InitializerImpl$OnExtensionsDeinitializedCallback" on path: DexPathList[[zip file "/data/app/com.mrousavy.camera.example-2/base.apk"],nativeLibraryDirectories=[/data/app/com.mrousavy.camera.example-2/lib/arm, /data/app/com.mrousavy.camera.example-2/base.apk!/lib/armeabi-v7a, /system/lib, /vendor/lib]]
2021-05-18 12:39:02.269 32134-32134/com.mrousavy.camera.example I/art:     at java.lang.Class dalvik.system.BaseDexClassLoader.findClass(java.lang.String) (BaseDexClassLoader.java:56)
2021-05-18 12:39:02.269 32134-32134/com.mrousavy.camera.example I/art:     at java.lang.Class java.lang.ClassLoader.loadClass(java.lang.String, boolean) (ClassLoader.java:380)
2021-05-18 12:39:02.269 32134-32134/com.mrousavy.camera.example I/art:     at java.lang.Class java.lang.ClassLoader.loadClass(java.lang.String) (ClassLoader.java:312)
2021-05-18 12:39:02.269 32134-32134/com.mrousavy.camera.example I/art:     at com.google.common.util.concurrent.ListenableFuture androidx.camera.extensions.ExtensionsManager.init(android.content.Context) (ExtensionsManager.java:120)
2021-05-18 12:39:02.269 32134-32134/com.mrousavy.camera.example I/art:     at java.lang.Object com.mrousavy.camera.CameraViewModule$getAvailableCameraDevices$1.invokeSuspend(java.lang.Object) (CameraViewModule.kt:102)
2021-05-18 12:39:02.269 32134-32134/com.mrousavy.camera.example I/art:     at void kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(java.lang.Object) (ContinuationImpl.kt:33)
2021-05-18 12:39:02.269 32134-32134/com.mrousavy.camera.example I/art:     at void kotlinx.coroutines.DispatchedTask.run() (DispatchedTask.kt:106)
2021-05-18 12:39:02.269 32134-32134/com.mrousavy.camera.example I/art:     at void android.os.Handler.handleCallback(android.os.Message) (Handler.java:751)
2021-05-18 12:39:02.269 32134-32134/com.mrousavy.camera.example I/art:     at void android.os.Handler.dispatchMessage(android.os.Message) (Handler.java:95)
2021-05-18 12:39:02.269 32134-32134/com.mrousavy.camera.example I/art:     at void android.os.Looper.loop() (Looper.java:154)
2021-05-18 12:39:02.269 32134-32134/com.mrousavy.camera.example I/art:     at void android.app.ActivityThread.main(java.lang.String[]) (ActivityThread.java:6123)
2021-05-18 12:39:02.269 32134-32134/com.mrousavy.camera.example I/art:     at java.lang.Object java.lang.reflect.Method.invoke!(java.lang.Object, java.lang.Object[]) (Method.java:-2)
2021-05-18 12:39:02.269 32134-32134/com.mrousavy.camera.example I/art:     at void com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run() (ZygoteInit.java:867)
2021-05-18 12:39:02.269 32134-32134/com.mrousavy.camera.example I/art:     at void com.android.internal.os.ZygoteInit.main(java.lang.String[]) (ZygoteInit.java:757)
2021-05-18 12:39:02.272 32134-32134/com.mrousavy.camera.example I/art: Rejecting re-init on previously-failed class java.lang.Class<androidx.camera.extensions.ExtensionsManager$1>: java.lang.NoClassDefFoundError: Failed resolution of: Landroidx/camera/extensions/impl/InitializerImpl$OnExtensionsInitializedCallback;
2021-05-18 12:39:02.272 32134-32134/com.mrousavy.camera.example I/art:     at com.google.common.util.concurrent.ListenableFuture androidx.camera.extensions.ExtensionsManager.init(android.content.Context) (ExtensionsManager.java:120)
2021-05-18 12:39:02.272 32134-32134/com.mrousavy.camera.example I/art:     at java.lang.Object com.mrousavy.camera.CameraViewModule$getAvailableCameraDevices$1.invokeSuspend(java.lang.Object) (CameraViewModule.kt:102)
2021-05-18 12:39:02.272 32134-32134/com.mrousavy.camera.example I/art:     at void kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(java.lang.Object) (ContinuationImpl.kt:33)
2021-05-18 12:39:02.272 32134-32134/com.mrousavy.camera.example I/art:     at void kotlinx.coroutines.DispatchedTask.run() (DispatchedTask.kt:106)
2021-05-18 12:39:02.272 32134-32134/com.mrousavy.camera.example I/art:     at void android.os.Handler.handleCallback(android.os.Message) (Handler.java:751)
2021-05-18 12:39:02.272 32134-32134/com.mrousavy.camera.example I/art:     at void android.os.Handler.dispatchMessage(android.os.Message) (Handler.java:95)
2021-05-18 12:39:02.272 32134-32134/com.mrousavy.camera.example I/art:     at void android.os.Looper.loop() (Looper.java:154)
2021-05-18 12:39:02.272 32134-32134/com.mrousavy.camera.example I/art:     at void android.app.ActivityThread.main(java.lang.String[]) (ActivityThread.java:6123)
2021-05-18 12:39:02.272 32134-32134/com.mrousavy.camera.example I/art:     at java.lang.Object java.lang.reflect.Method.invoke!(java.lang.Object, java.lang.Object[]) (Method.java:-2)
2021-05-18 12:39:02.272 32134-32134/com.mrousavy.camera.example I/art:     at void com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run() (ZygoteInit.java:867)
2021-05-18 12:39:02.272 32134-32134/com.mrousavy.camera.example I/art:     at void com.android.internal.os.ZygoteInit.main(java.lang.String[]) (ZygoteInit.java:757)
2021-05-18 12:39:02.272 32134-32134/com.mrousavy.camera.example I/art: Caused by: java.lang.ClassNotFoundException: Didn't find class "androidx.camera.extensions.impl.InitializerImpl$OnExtensionsInitializedCallback" on path: DexPathList[[zip file "/data/app/com.mrousavy.camera.example-2/base.apk"],nativeLibraryDirectories=[/data/app/com.mrousavy.camera.example-2/lib/arm, /data/app/com.mrousavy.camera.example-2/base.apk!/lib/armeabi-v7a, /system/lib, /vendor/lib]]
2021-05-18 12:39:02.272 32134-32134/com.mrousavy.camera.example I/art:     at java.lang.Class dalvik.system.BaseDexClassLoader.findClass(java.lang.String) (BaseDexClassLoader.java:56)
2021-05-18 12:39:02.272 32134-32134/com.mrousavy.camera.example I/art:     at java.lang.Class java.lang.ClassLoader.loadClass(java.lang.String, boolean) (ClassLoader.java:380)
2021-05-18 12:39:02.272 32134-32134/com.mrousavy.camera.example I/art:     at java.lang.Class java.lang.ClassLoader.loadClass(java.lang.String) (ClassLoader.java:312)
2021-05-18 12:39:02.272 32134-32134/com.mrousavy.camera.example I/art:     at com.google.common.util.concurrent.ListenableFuture androidx.camera.extensions.ExtensionsManager.init(android.content.Context) (ExtensionsManager.java:120)
2021-05-18 12:39:02.272 32134-32134/com.mrousavy.camera.example I/art:     at java.lang.Object com.mrousavy.camera.CameraViewModule$getAvailableCameraDevices$1.invokeSuspend(java.lang.Object) (CameraViewModule.kt:102)
2021-05-18 12:39:02.272 32134-32134/com.mrousavy.camera.example I/art:     at void kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(java.lang.Object) (ContinuationImpl.kt:33)
2021-05-18 12:39:02.272 32134-32134/com.mrousavy.camera.example I/art:     at void kotlinx.coroutines.DispatchedTask.run() (DispatchedTask.kt:106)
2021-05-18 12:39:02.272 32134-32134/com.mrousavy.camera.example I/art:     at void android.os.Handler.handleCallback(android.os.Message) (Handler.java:751)
2021-05-18 12:39:02.272 32134-32134/com.mrousavy.camera.example I/art:     at void android.os.Handler.dispatchMessage(android.os.Message) (Handler.java:95)
2021-05-18 12:39:02.272 32134-32134/com.mrousavy.camera.example I/art:     at void android.os.Looper.loop() (Looper.java:154)
2021-05-18 12:39:02.272 32134-32134/com.mrousavy.camera.example I/art:     at void android.app.ActivityThread.main(java.lang.String[]) (ActivityThread.java:6123)
2021-05-18 12:39:02.272 32134-32134/com.mrousavy.camera.example I/art:     at java.lang.Object java.lang.reflect.Method.invoke!(java.lang.Object, java.lang.Object[]) (Method.java:-2)
2021-05-18 12:39:02.272 32134-32134/com.mrousavy.camera.example I/art:     at void com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run() (ZygoteInit.java:867)
2021-05-18 12:39:02.272 32134-32134/com.mrousavy.camera.example I/art:     at void com.android.internal.os.ZygoteInit.main(java.lang.String[]) (ZygoteInit.java:757)
2021-05-18 12:39:02.274 32134-32134/com.mrousavy.camera.example D/ExtenderVersion: No versioning extender found. Falling back to default.
2021-05-18 12:39:02.295 32134-32205/com.mrousavy.camera.example I/CameraManagerGlobal: Connecting to camera service
2021-05-18 12:39:02.334 32134-32205/com.mrousavy.camera.example D/CameraRepository: Added camera: 0
2021-05-18 12:39:02.337 32134-32205/com.mrousavy.camera.example D/CamcorderProfileResolutionQuirk: mSupportedResolutions = [1280x960, 1280x720, 960x720, 960x540, 864x480, 720x480, 768x432, 640x480, 320x240, 176x144]
2021-05-18 12:39:02.338 32134-32205/com.mrousavy.camera.example D/CamcorderProfileResolutionQuirk: mSupportedResolutions = [1280x960, 1280x720, 960x720, 960x540, 864x480, 720x480, 768x432, 640x480, 320x240, 176x144]
2021-05-18 12:39:02.348 32134-32205/com.mrousavy.camera.example I/Camera2CameraInfo: Device Level: INFO_SUPPORTED_HARDWARE_LEVEL_LEGACY
2021-05-18 12:39:02.349 32134-32205/com.mrousavy.camera.example D/CameraRepository: Added camera: 1
2021-05-18 12:39:02.350 32134-32205/com.mrousavy.camera.example D/CamcorderProfileResolutionQuirk: mSupportedResolutions = [1280x960, 1280x720, 960x720, 960x540, 864x480, 720x480, 768x432, 640x480, 320x240, 176x144]
2021-05-18 12:39:02.350 32134-32205/com.mrousavy.camera.example D/CamcorderProfileResolutionQuirk: mSupportedResolutions = [1280x960, 1280x720, 960x720, 960x540, 864x480, 720x480, 768x432, 640x480, 320x240, 176x144]
2021-05-18 12:39:02.352 32134-32205/com.mrousavy.camera.example I/Camera2CameraInfo: Device Level: INFO_SUPPORTED_HARDWARE_LEVEL_LEGACY
2021-05-18 12:39:02.353 32134-32206/com.mrousavy.camera.example D/UseCaseAttachState: Active and attached use case: [] for camera: 0
2021-05-18 12:39:02.357 32134-32206/com.mrousavy.camera.example D/UseCaseAttachState: Active and attached use case: [] for camera: 1
2021-05-18 12:39:02.544 32134-32134/com.mrousavy.camera.example W/CameraView: CameraViewModule::getAvailableCameraDevices took: 408 ms
2021-05-18 12:39:02.652 32134-32166/com.mrousavy.camera.example I/ReactNativeJS: Target FPS: 60
2021-05-18 12:39:02.660 32134-32166/com.mrousavy.camera.example I/ReactNativeJS: Re-rendering camera page with active camera. Device: "back (0)" (4160x2340 @ 30fps)
2021-05-18 12:39:02.709 32134-32134/com.mrousavy.camera.example D/CameraView: Lifecycle went from INITIALIZED -> CREATED (isActive: true | isAttachedToWindow: false)
2021-05-18 12:39:02.734 32134-32134/com.mrousavy.camera.example I/ReactNativeJNI: received didPause for reason: 0 in state: RunningDetached
2021-05-18 12:39:02.736 32134-32166/com.mrousavy.camera.example I/ReactNativeJS: Target FPS: 60
2021-05-18 12:39:02.736 32134-32134/com.mrousavy.camera.example I/ReactNativeJNI: received didPause for reason: 0 in state: RunningDetached
2021-05-18 12:39:02.737 32134-32166/com.mrousavy.camera.example I/ReactNativeJS: Re-rendering camera page with active camera. Device: "back (0)" (4160x2340 @ 30fps)
2021-05-18 12:39:02.780 32134-32166/com.mrousavy.camera.example I/ReactNativeJS: Devices: back (0), front (1)
2021-05-18 12:39:02.800 32134-32134/com.mrousavy.camera.example D/CameraView: Lifecycle went from CREATED -> RESUMED (isActive: true | isAttachedToWindow: true)
2021-05-18 12:39:02.808 32134-32134/com.mrousavy.camera.example I/CameraView: onLayout(true, 0, 0, 1080, 1776) was called! (Width: 1080, Height: 1776)
2021-05-18 12:39:02.822 32134-32134/com.mrousavy.camera.example D/CameraView: Lifecycle went from RESUMED -> RESUMED (isActive: true | isAttachedToWindow: true)
2021-05-18 12:39:02.823 32134-32134/com.mrousavy.camera.example I/CameraView: Configuring session...
2021-05-18 12:39:02.825 32134-32134/com.mrousavy.camera.example I/CameraView: Configuring session with Camera ID 0 and custom format...
2021-05-18 12:39:02.842 32134-32134/com.mrousavy.camera.example I/CameraView: Using custom format - photo: 4160x2340, video: 4160x2340 @ 30 FPS
2021-05-18 12:39:02.842 32134-32134/com.mrousavy.camera.example I/CameraView: Setting AE_TARGET_FPS_RANGE to 30-30, and SENSOR_FRAME_DURATION to 0
2021-05-18 12:39:03.088 32134-32166/com.mrousavy.camera.example E/ReactNativeJS: { [device/invalid-device: [device/invalid-device] The given Camera device could not be found for use-case binding!]
    name: 'device/invalid-device',
    _code: 'device/invalid-device',
    _message: '[device/invalid-device] The given Camera device could not be found for use-case binding!',
    _cause:
     { stacktrace: 'java.lang.IllegalArgumentException: No supported surface combination is found for camera device - Id : 0.  May be attempting to bind too many use cases. Existing surfaces: [] New configs: [androidx.camera.core.impl.VideoCaptureConfig@601ae9c, androidx.camera.core.impl.PreviewConfig@80f676e, androidx.camera.core.impl.ImageCaptureConfig@d26be0f]\n\tat androidx.camera.lifecycle.LifecycleCameraRepository.bindToLifecycleCamera(LifecycleCameraRepository.java:278)\n\tat androidx.camera.lifecycle.ProcessCameraProvider.bindToLifecycle(ProcessCameraProvider.java:429)\n\tat androidx.camera.lifecycle.ProcessCameraProvider.bindToLifecycle(ProcessCameraProvider.java:280)\n\tat com.mrousavy.camera.CameraView.configureSession(CameraView.kt:321)\n\tat com.mrousavy.camera.CameraView$update$1$1.invokeSuspend(CameraView.kt:194)\n\tat kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)\n\tat kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:106)\n\tat android.os.Handler.handleCallback(Handler.java:751)\n\tat android.os.Handler.dispatchMessage(Handler.java:95)\n\tat android.os.Looper.loop(Looper.java:154)\n\tat android.app.ActivityThread.main(ActivityThread.java:6123)\n\tat java.lang.reflect.Method.invoke(Native Method)\n\tat com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867)\n\tat com.android.internal.os.ZygoteInit.main(ZygoteInit.java:757)\n',
       message: 'No supported surface combination is found for camera device - Id : 0.  May be attempting to bind too many use cases. Existing surfaces: [] New configs: [androidx.camera.core.impl.VideoCaptureConfig@601ae9c, androidx.camera.core.impl.PreviewConfig@80f676e, androidx.camera.core.impl.ImageCaptureConfig@d26be0f]' } }

Something weird I noticed (on both devices) is, that I was occasionally getting an error about Metro not being able to resolve index.ts from the main library, which seems weird because it does exist. Not sure if this is hinting to some issue on my side.
transform[stderr]: Could not resolve "C:\Users\[...]\react-native-vision-camera\src\index" in file C:\Users\[...]\react-native-vision-camera\example\src\App.tsx.

I also was getting errors about Reanimated 2.1.0 missing ("Error: Frame Processors are not enabled. Make sure you install react-native-reanimated 2.1.0 or above!"), even though it is installed in the example app, but I guess this is due to frame processors not being implemented on Android yet.
As a sanity check I also ran the PR branch on a Samsung Galaxy M20 (hardware level LIMITED), where all use cases (Preview, Video and Photo) worked as expected.
Let me know if and how I can help to further debug this issue.

@yfunk thanks, that's a huge help! ❤
I'll investigate further and try to find out if I can somehow still add the video capture use-case for LEGACY devices by tricking it into thinking it's a low-res in-app-processing use-case.
Also the error about frame processors being disabled is a bit weird, I'll try to find out where that came from

Implemented with https://github.com/cuvent/react-native-vision-camera/commit/72a1fad78e3a5ecdb120d8c9c9b549ad4423c5a8.


Advice on compiling Go binaries with symbols?

Hey @mstange thanks for the wonderful tool! I use it a lot to profile Rust applications where it works super well.
I'm also interested in profiling Go applications but I've searched and searched and I'm unable to find out how to build a go application with the sufficient flags to expose debug symbols, so that my calltree isn't just mangled names. I know this isn't a Samply issue, but I wondered if you or others had advice on how to compile Go binaries such that they can be properly sampled in Samply?
The command I've tried so far:
go build -gcflags "all=-N -l" -ldflags=-compressdwarf=false -o <bin-name> main.go

The issue was PEBKAC. I was using --save-only and the resulting profile.json doesn't seem to come with symbols, only mangled names. Running without --save-only and clicking through to the profiler results in the full expected output.


MAINT: refactor slsqp to fix issue in callback function

The slsqp call in optimize.slsqp.py on L459 mutates the solution vector x after the call to fun. This means that the printed value of fx (iprint >= 2) would not correspond to fun(x) at that point. This was picked up by doing this calculation in the callback. This PR slightly changes the order in which the objective, constraints, gradients, constraint normals are evaluated.
fx should now correspond to fun(x) when it's printed out.
Closes gh-11484

ping for a review here. Should be fairly easy to check.

@rgommers, it's probably passing at this point. Is someone looking into why the Azure CI is so flaky?

Is someone looking into why the Azure CI is so flaky?

See https://github.com/numpy/numpy/pull/16101, where @mattip has identified the issue and is working on a solution for numpy.  For scipy, I just started hacking in https://github.com/scipy/scipy/pull/11965, but there is a lot of stuff in azure-pipelines.yml that is a mystery to me--I can see what it does, but I don't know why.  So don't count on a quick solution from my experiments.

LGTM and CI passes, so merged. Thanks @andyfaff.
Adding a test seems hard indeed, because the issue was only visible in a print statement. Should be good as is.


azure cli gitbash - Anaconda

This is an autogenerated template. Please review and update as needed.
Describe the bug
Command Name
az cognitiveservices account show
Errors:
:open_mouth:

No module named 'azure.mgmt.cognitiveservices'Traceback (most recent call last):
  File "C:\Users\njeru\AppData\Roaming\Python\Python37\site-packages\knack\cli.py", line 206, in invoke
    cmd_result = self.invocation.execute(args)
  File "c:\users\njeru\appdata\roaming\python\python37\site-packages\azure\cli\core\commands\__init__.py", line 248, in execute
    self.commands_loader.load_arguments(command)
  File "c:\users\njeru\appdata\roaming\python\python37\site-packages\azure\cli\core\__init__.py", line 265, in load_arguments
    self.command_table[command].load_arguments()  # this loads the arguments via reflection
  File "c:\users\njeru\appdata\roaming\python\python37\site-packages\azure\cli\core\commands\__init__.py", line 130, in load_arguments
    super(AzCliCommand, self).load_arguments()
  File "C:\Users\njeru\AppData\Roaming\Python\Python37\site-packages\knack\commands.py", line 89, in load_arguments
    cmd_args = self.arguments_loader()
  File "c:\users\njeru\appdata\roaming\python\python37\site-packages\azure\cli\core\commands\arm.py", line 703, in generic_show_arguments_loader
    cmd_args = get_arguments_loader(context, getter_op, operation_group=kwargs.get('operation_group'))
  File "c:\users\njeru\appdata\roaming\python\python37\site-packages\azure\cli\core\commands\arm.py", line 388, in get_arguments_loader
    getter_args = dict(extract_args_from_signature(context.get_op_handler(getter_op, operation_group=operation_group),
  File "c:\users\njeru\appdata\roaming\python\python37\site-packages\azure\cli\core\__init__.py", line 494, in get_op_handler
    op = import_module(mod_to_import)
  File "C:\Users\njeru\Anaconda3\lib\importlib\__init__.py", line 127, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 1006, in _gcd_import
  File "<frozen importlib._bootstrap>", line 983, in _find_and_load
  File "<frozen importlib._bootstrap>", line 953, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
  File "<frozen importlib._bootstrap>", line 1006, in _gcd_import
  File "<frozen importlib._bootstrap>", line 983, in _find_and_load
  File "<frozen importlib._bootstrap>", line 965, in _find_and_load_unlocked
ModuleNotFoundError: No module named 'azure.mgmt.cognitiveservices'

To Reproduce:
Steps to reproduce the behavior. Note: Command arguments have been redacted.

Fill in additional info here
Run: az cognitiveservices account show --resource-group {} --name {} --query {} --output {}

Expected Behavior
A clear and concise description of what you expected to happen.
Environment Summary
Windows-10-10.0.17763-SP0
Python 3.7.1
Shell: bash.exe

azure-cli                         2.0.62

Extensions:
interactive                        0.4.1

Python location 'C:\Users\njeru\Anaconda3\python.exe'
Extensions directory 'C:\Users\njeru\.azure\cliextensions'

Python (Windows) 3.7.1 (default, Dec 10 2018, 22:54:23) [MSC v.1915 64 bit (AMD64)]

Additional Context
Add any other context about the problem here.

out the issue body locally, run az feedback --verbose

From first glance, this might be a packaging issue @marstr, @tjprescott
It appears that you are using Anaconda @Denisnjeru. (see file path for failed import)
Could you give us more information about your installation environment @Denisnjeru? How did you install the CLI? Are you using conda to manage CLI modules and dependencies?

add to S164.

Close due to inactivity. Please feel free to open it if you still have the same issue with recent versions of azure cli.


type error in get started tutorial

import { ChatOpenAI } from "@langchain/openai";
import { ChatPromptTemplate } from "@langchain/core/prompts";
const chatModel = new ChatOpenAI({
openAIApiKey: "...",
});
const prompt = ChatPromptTemplate.fromMessages([
["system", "You are a world class technical documentation writer."],
["user", "{input}"],
]);
const chain = prompt.pipe(chatModel);
Its demo code from website. encountering type error in const chain = prompt.pipe(chatModel);.
Argument of type 'ChatOpenAI' is not assignable to parameter of type 'RunnableLike<ChatPromptValueInterface, BaseMessageChunk>'.
Type 'ChatOpenAI' is not assignable to type 'RunnableInterface<ChatPromptValueInterface, BaseMessageChunk, RunnableConfig> | RunnableMapLike<ChatPromptValueInterface, BaseMessageChunk>'.
Type 'ChatOpenAI' is missing the following properties from type 'RunnableMapLike<ChatPromptValueInterface, BaseMessageChunk>': concat, text, content, additional_kwargs, and 3 more.ts(2345)
versions:
"dependencies": { "@langchain/openai": "^0.0.10", "langchain": "^0.1.0" },
Is this version issue?

Can you try going to the latest versions?

solved when update to
"dependencies": {
"@langchain/openai": "^0.0.12",
"langchain": "^0.1.3"
}


[Bug]: In certain cases with GIT apps having module instances, the update Package message is getting appended to the Import message and not resetting the previous state.

Is there an existing issue for this?

[X] I have searched the existing issues

Description
In certain cases with GIT apps having module instances, the update Package message is getting appended to the Import message and not reset the previous state.
and as a result , we are getting both update and import package error message for the same module
Steps To Reproduce
https://www.loom.com/share/1777a36f46824dc0935607ae3b4802b1

Public Sample App
No response
Environment
Production
Severity
Medium (Frustrating UX)
Issue video log
No response
Version
Cloud/Release

Steps to reproduce without the app being GIT connected
The app doesn't necessarily need to be GIT connected. Another way of reproducing this issue is to follow these steps:
Workspace 1

Create a package with modules and publish
Create an app and consume these two modules
Export the app
Delete the app
Delete one module from the package
Export the package (the pkg.json contains the definition of one module only)

Workspace 2

Go to a new workspace where the required package doesn't exist
Import the pkg.json and publish
Import the app.json and go to the module instance for which the respective module doesn't exist
Notice that the module instance's invalids array contains two messages: 1. Msg related to missing package (Not expected) 2. Msg related to missing module (Expected)

cc: @kamakshibhat-appsmith

RCA
When exporting an application with broken module instances, we include the invalids array of those module instances in the export. When importing such an app.json file, the invalids array is also deserialized. If the destination workspace triggers a different invalid message from what's in the exported JSON file, it appends the new invalid message. This can lead to unexpected messages related to the suspended state mentioned in this issue.
cc: @kamakshibhat-appsmith

Noted and can replicate as well with the other scenario without GIT @subrata71

@subrata71 @kamakshibhat-appsmith the clean up we're doing is only going to affect git persisted files at this stage. Please do consider going ahead with the field specific clean up in case this is high priority.


Intended behaviour on nested input filters and empty POST data?

I have the following classes defined

fieldset with some regular inputs and a collection element
input filter for it that has a collection input filter for the collection element

Let's call them:
fieldset = project
collection = disciplines
Then a form having the fieldset set as the base fieldset, a csrf, submit etc. and the input filter associated
And a validation group that has only the fieldset=>collection pair, something like
setValidationGroup([project => [
disciplines => [
id, name
]
]]);
if I submit the form with some elements in the collection
form->bind(object)
data = get POST
form->setData(data)
form->isValid()
are working as expected
when I submit the form with 0 elements in the collection, the POST is missing the project=>discipline array structure, it has only the form input(csrf and so on...)
if i feed this into the form, the validation fails, but not as I expect(by the way, the collection input filter has the is required flag set to true)
The returned error messages are for the entire fieldset inputs, like it does no take the validation group into account and the collection's isRequired flag.
The shortest workaround for me was to normalize the POST data and make sure that even if empty, the POST is following the correct array structure(like project=>[disciplines=>[//empty array...], csrf, submit], but it looks hackish.
This might be related to other issues that I found related to emptying the collection, but not sure if it was fixed, or this is the intended behavior...
Also can't follow the code completely, not sure if this is input filter related or form/fieldset related

@n3vrax
Please provide a simple and working code example, which illustrates your problem. Thanks!

Closing due inactivity. Please feel free to open a new issue with a full example.