CSV

Can the output be set to include CSVC rather than just text - as exporting to text looses the column details
otherwise a great tool

Not sure what column details it's losing.

Hi Leslie,
The program is brilliant, but it’s the output… It doesn’t loose data – its my bad explanation….
For example,
[Graphical user interface  Description automatically generated with medium confidence]
Everything is shown and ordered very clearly, but then I export the data – its only available to export as a txt file.
I was just hoping there could be an option to export to a CSV, to allow for extra data manipulation post export.
Thanks Russ
Russell Collis | Professional Services Engineer
T: 07971 366 299 | E: @.*** | W: www.Jigsaw24.com
L:
linkedin.com/Jigsaw24 |
F:
facebook.com/JigsawSystems
|
T:
twitter.com/WeAreJigsaw24

Please consider the environment - do you really need to print this email?

This email may contain confidential information, personal data and/or copyright material and is intended for the use of the addressee only. If you are not the addressee any unauthorised use may be unlawful. If you receive this email by mistake, please advise the sender immediately by using the reply facility in your email software. Any views or opinions presented are those of the sender and do not necessarily represent Jigsaw Systems Limited (trading as Jigsaw24). Jigsaw Systems Limited (2682904) is registered in England and Wales and is regulated as an appointed representative under the Financial Conduct Authority (firm reference number 848084). For further information on our privacy policy please refer to our website www.Jigsaw24.com/privacy-notice. Jigsaw24 have taken steps to ensure that this email message and any attachments have been scanned for the presence of viruses, we advise that in keeping with good computing practice the recipient should carry out checks to ensure that they are free of viruses.
From: Leslie Helou @.>
Date: Tuesday, 8 March 2022 at 23:01
To: BIG-RAT/Object-Info @.>
Cc: Russell Collis @.>, Author @.>
Subject: Re: [BIG-RAT/Object-Info] CSV (Issue #10)
Not sure what column details it's losing.
—
Reply to this email directly, view it on GitHubhttps://eur01.safelinks.protection.outlook.com/?url=https%3A%2F%2Fgithub.com%2FBIG-RAT%2FObject-Info%2Fissues%2F10%23issuecomment-1062329187&data=04|01|russell.collis%40jigsaw24.com|8b1a87f0817c40c649a008da01579fa5|49e3f29f4e094195bb50a840e760c89a|1|1|637823773104980273|Unknown|TWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D|3000&sdata=IeNqdIR1gdo7LTYzboQ3%2BNEKFtkftRRhhSlhAv9HDJ4%3D&reserved=0, or unsubscribehttps://eur01.safelinks.protection.outlook.com/?url=https%3A%2F%2Fgithub.com%2Fnotifications%2Funsubscribe-auth%2FANPDS3HFMZNELAKGEVWHOITU67L5VANCNFSM5ORHBLQA&data=04|01|russell.collis%40jigsaw24.com|8b1a87f0817c40c649a008da01579fa5|49e3f29f4e094195bb50a840e760c89a|1|1|637823773104980273|Unknown|TWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D|3000&sdata=ethXYIqv6In3TW2e8sFVYtCgk25W2%2Fh81Et9DW%2BgCz8%3D&reserved=0.
Triage notifications on the go with GitHub Mobile for iOShttps://eur01.safelinks.protection.outlook.com/?url=https%3A%2F%2Fapps.apple.com%2Fapp%2Fapple-store%2Fid1477376905%3Fct%3Dnotification-email%26mt%3D8%26pt%3D524675&data=04|01|russell.collis%40jigsaw24.com|8b1a87f0817c40c649a008da01579fa5|49e3f29f4e094195bb50a840e760c89a|1|1|637823773104980273|Unknown|TWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D|3000&sdata=d6lgFNoiTERk2TKSC43Y0NxqTCEmUh1Z6UeaBo2XkZo%3D&reserved=0 or Androidhttps://eur01.safelinks.protection.outlook.com/?url=https%3A%2F%2Fplay.google.com%2Fstore%2Fapps%2Fdetails%3Fid%3Dcom.github.android%26referrer%3Dutm_campaign%253Dnotification-email%2526utm_medium%253Demail%2526utm_source%253Dgithub&data=04|01|russell.collis%40jigsaw24.com|8b1a87f0817c40c649a008da01579fa5|49e3f29f4e094195bb50a840e760c89a|1|1|637823773104980273|Unknown|TWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D|3000&sdata=ljTrzABTIsm94BR40Gl0uGCflST2tdTakMrgGawtF3w%3D&reserved=0.
You are receiving this because you authored the thread.Message ID: @.***>

Got it.  Output is tab delimited so opening in a spreadsheet will retain the columns of information.  Perhaps changing the default extension to csv from txt makes sense.

I did try that and it lost its format – must have been something I did 😊
Thanks for the reply
Russell Collis | Professional Services Engineer
T: 07971 366 299 | E: @.*** | W: www.Jigsaw24.com
L:
linkedin.com/Jigsaw24 |
F:
facebook.com/JigsawSystems
|
T:
twitter.com/WeAreJigsaw24

Please consider the environment - do you really need to print this email?

This email may contain confidential information, personal data and/or copyright material and is intended for the use of the addressee only. If you are not the addressee any unauthorised use may be unlawful. If you receive this email by mistake, please advise the sender immediately by using the reply facility in your email software. Any views or opinions presented are those of the sender and do not necessarily represent Jigsaw Systems Limited (trading as Jigsaw24). Jigsaw Systems Limited (2682904) is registered in England and Wales and is regulated as an appointed representative under the Financial Conduct Authority (firm reference number 848084). For further information on our privacy policy please refer to our website www.Jigsaw24.com/privacy-notice. Jigsaw24 have taken steps to ensure that this email message and any attachments have been scanned for the presence of viruses, we advise that in keeping with good computing practice the recipient should carry out checks to ensure that they are free of viruses.
From: Leslie Helou @.>
Date: Wednesday, 9 March 2022 at 14:22
To: BIG-RAT/Object-Info @.>
Cc: Russell Collis @.>, Author @.>
Subject: Re: [BIG-RAT/Object-Info] CSV (Issue #10)
Got it. Output is tab delimited so opening in a spreadsheet will retain the columns of information. Perhaps changing the default extension to csv from txt makes sense.
—
Reply to this email directly, view it on GitHubhttps://eur01.safelinks.protection.outlook.com/?url=https%3A%2F%2Fgithub.com%2FBIG-RAT%2FObject-Info%2Fissues%2F10%23issuecomment-1062971261&data=04|01|russell.collis%40jigsaw24.com|215eebcab60544c3713408da01d83f6e|49e3f29f4e094195bb50a840e760c89a|1|0|637824325554949770|Unknown|TWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D|3000&sdata=Vl6IdUFem9PcfeO86U%2FLlYZHRHmZn%2FRoAkZb93b%2BJJA%3D&reserved=0, or unsubscribehttps://eur01.safelinks.protection.outlook.com/?url=https%3A%2F%2Fgithub.com%2Fnotifications%2Funsubscribe-auth%2FANPDS3HBGROYNTXUCXHFE23U7CX2NANCNFSM5ORHBLQA&data=04|01|russell.collis%40jigsaw24.com|215eebcab60544c3713408da01d83f6e|49e3f29f4e094195bb50a840e760c89a|1|0|637824325554949770|Unknown|TWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D|3000&sdata=Xx3YeQz6SQRmBKxCwp6%2B9mPZR%2Bk8ovePCGcUTAp1qPc%3D&reserved=0.
Triage notifications on the go with GitHub Mobile for iOShttps://eur01.safelinks.protection.outlook.com/?url=https%3A%2F%2Fapps.apple.com%2Fapp%2Fapple-store%2Fid1477376905%3Fct%3Dnotification-email%26mt%3D8%26pt%3D524675&data=04|01|russell.collis%40jigsaw24.com|215eebcab60544c3713408da01d83f6e|49e3f29f4e094195bb50a840e760c89a|1|0|637824325554949770|Unknown|TWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D|3000&sdata=koyjmzrQvSwnt2g7CL3Q7f%2BdBqEOP2bxrUnqOD%2FX5c0%3D&reserved=0 or Androidhttps://eur01.safelinks.protection.outlook.com/?url=https%3A%2F%2Fplay.google.com%2Fstore%2Fapps%2Fdetails%3Fid%3Dcom.github.android%26referrer%3Dutm_campaign%253Dnotification-email%2526utm_medium%253Demail%2526utm_source%253Dgithub&data=04|01|russell.collis%40jigsaw24.com|215eebcab60544c3713408da01d83f6e|49e3f29f4e094195bb50a840e760c89a|1|0|637824325554949770|Unknown|TWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D|3000&sdata=Bl1q1HAMjVF2dmHzdx3ZjR%2FtbcWMSJv4jqkBisbPLBg%3D&reserved=0.
You are receiving this because you authored the thread.Message ID: @.***>

Yep – I was using , as the delimiter
Thanks again 😊
Russell Collis | Professional Services Engineer
T: 07971 366 299 | E: @.*** | W: www.Jigsaw24.com
L:
linkedin.com/Jigsaw24 |
F:
facebook.com/JigsawSystems
|
T:
twitter.com/WeAreJigsaw24

Please consider the environment - do you really need to print this email?

This email may contain confidential information, personal data and/or copyright material and is intended for the use of the addressee only. If you are not the addressee any unauthorised use may be unlawful. If you receive this email by mistake, please advise the sender immediately by using the reply facility in your email software. Any views or opinions presented are those of the sender and do not necessarily represent Jigsaw Systems Limited (trading as Jigsaw24). Jigsaw Systems Limited (2682904) is registered in England and Wales and is regulated as an appointed representative under the Financial Conduct Authority (firm reference number 848084). For further information on our privacy policy please refer to our website www.Jigsaw24.com/privacy-notice. Jigsaw24 have taken steps to ensure that this email message and any attachments have been scanned for the presence of viruses, we advise that in keeping with good computing practice the recipient should carry out checks to ensure that they are free of viruses.
From: Leslie Helou @.>
Date: Wednesday, 9 March 2022 at 14:22
To: BIG-RAT/Object-Info @.>
Cc: Russell Collis @.>, Author @.>
Subject: Re: [BIG-RAT/Object-Info] CSV (Issue #10)
Got it. Output is tab delimited so opening in a spreadsheet will retain the columns of information. Perhaps changing the default extension to csv from txt makes sense.
—
Reply to this email directly, view it on GitHubhttps://eur01.safelinks.protection.outlook.com/?url=https%3A%2F%2Fgithub.com%2FBIG-RAT%2FObject-Info%2Fissues%2F10%23issuecomment-1062971261&data=04|01|russell.collis%40jigsaw24.com|215eebcab60544c3713408da01d83f6e|49e3f29f4e094195bb50a840e760c89a|1|0|637824325554949770|Unknown|TWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D|3000&sdata=Vl6IdUFem9PcfeO86U%2FLlYZHRHmZn%2FRoAkZb93b%2BJJA%3D&reserved=0, or unsubscribehttps://eur01.safelinks.protection.outlook.com/?url=https%3A%2F%2Fgithub.com%2Fnotifications%2Funsubscribe-auth%2FANPDS3HBGROYNTXUCXHFE23U7CX2NANCNFSM5ORHBLQA&data=04|01|russell.collis%40jigsaw24.com|215eebcab60544c3713408da01d83f6e|49e3f29f4e094195bb50a840e760c89a|1|0|637824325554949770|Unknown|TWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D|3000&sdata=Xx3YeQz6SQRmBKxCwp6%2B9mPZR%2Bk8ovePCGcUTAp1qPc%3D&reserved=0.
Triage notifications on the go with GitHub Mobile for iOShttps://eur01.safelinks.protection.outlook.com/?url=https%3A%2F%2Fapps.apple.com%2Fapp%2Fapple-store%2Fid1477376905%3Fct%3Dnotification-email%26mt%3D8%26pt%3D524675&data=04|01|russell.collis%40jigsaw24.com|215eebcab60544c3713408da01d83f6e|49e3f29f4e094195bb50a840e760c89a|1|0|637824325554949770|Unknown|TWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D|3000&sdata=koyjmzrQvSwnt2g7CL3Q7f%2BdBqEOP2bxrUnqOD%2FX5c0%3D&reserved=0 or Androidhttps://eur01.safelinks.protection.outlook.com/?url=https%3A%2F%2Fplay.google.com%2Fstore%2Fapps%2Fdetails%3Fid%3Dcom.github.android%26referrer%3Dutm_campaign%253Dnotification-email%2526utm_medium%253Demail%2526utm_source%253Dgithub&data=04|01|russell.collis%40jigsaw24.com|215eebcab60544c3713408da01d83f6e|49e3f29f4e094195bb50a840e760c89a|1|0|637824325554949770|Unknown|TWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D|3000&sdata=Bl1q1HAMjVF2dmHzdx3ZjR%2FtbcWMSJv4jqkBisbPLBg%3D&reserved=0.
You are receiving this because you authored the thread.Message ID: @.***>

Good to hear.  Too bad tsv (tab separated values) isn't a recognized extension.


build: bump sinon to a version that supports esm

Attempted at fixing AB#7319 and related.
Fixes:
Writing test results relative to package to nyc/junit-report.xml and nyc/junit-report.json

file:///workspaces/f1/packages/common/core-utils/lib/test/promiseCache.spec.js:6
import { useFakeTimers } from "sinon";
         ^^^^^^^^^^^^^
SyntaxError: Named export 'useFakeTimers' not found. The requested module 'sinon' is a CommonJS module, which may not support all module.exports as named exports.
CommonJS modules can always be imported via the default export, for example using:

import pkg from 'sinon';
const { useFakeTimers } = pkg;

This bump does not fix the below error. ESM modules cannot be stubbed.
import { stub } from "sinon";
         ^^^^
SyntaxError: Named export 'stub' not found. The requested module 'sinon' is a CommonJS module, which may not support all module.exports as named exports.

Pushed a minor workaround to resolve the error. Feel free to revert the commit if needed :)

  '@fluidframework/core-interfaces': 2.0.0-internal.8.0.6

Should we roll back these patch bumps?

Refers to: pnpm-lock.yaml:15565 in 8194acb. [](commit_id = 8194acb3c7acecf7a76abac8ff62e7c420d3f769, deletion_comment = False)


fix(cli_mode): don't prompt for db url if in cli_mode

fixes issue causing some CI checks to pass in, for example, #369

TODO: refactor that function to handle all the "cli_mode" stuff separately rather than checking and settings things individually, should reduce the maintenance burden

Thanks for looking out for this :raised_hands:


Add a workload that measures scan-after-write consistency

Many NoSQL DBs has an eventual consistency mode for scan-after-writes, some support strong consistency for this scenario and some even support both. Consistency model clearly has an impact on performance as well.
The goal of this workload is to measure how consistent a NoSQL DB is when doing scan-after-write, expressed in terms of percentage of scans that are able to see all records that were just written.
Key application scenarios are Big Data processing scenario where producer nodes uploads a large amount of objects representing intermediate results and consumer nodes use scan to discover these objects before retrieving them. Another important scenario is log file aggregation and distribution - similar to big data scenario where consumers of these log files typically does a scan to find out new files to be collected.
@cmccoy - FYI. I'd be happy to implement this if the proposal looks good to you.
@voellm - fyi.

What did you have in mind for coordinating the shared knowledge between writers and readers?

If the writers and readers are running on the same host (process), then they can simply share knowledge via memory.
If the writers and readers are running on different hosts -
Each writer can generate a manifest file of names of objects that have been successfully written to the NoSQL Store, the manifest file itself is to be named deterministically with a predefined prefix followed by the writer's ID (0 - N), and then the writers can either:

save the manifest file to the NoSQL store, or
save it locally.

Then the reader who tests scan consistency can read those manifest files first to construct the truth. Since the names of the manifest files are deterministically defined, all the reader needs to know to construct the names of the manifest file is the prefix + the number of writers. These  can be passed-in to the reader as command line parameters. Then the reader can read the manifest objects from NoSQL Store or read it locally.

@cmccoy and me had a couple of discussions about this and we are in-sync with the proposed workload idea here.
We also discussed some implementation details, e.g., a potential way to simplify reader-writer communication by always having the scanner running on the same node as the writer (so they can communicate via shared memory). The drawback of this simplification is the scanner can only validate the objects written by one particular writer which is quite a bit of deviation from realistic data processing workflow where the scanner node would typically need to list objects written by all writers and then fans out the object names to the next stage of processing.
Our current thought is such simplification would only be necessary if the manifest file based idea turns out to be too complex, but we are not seeing that at the moment.
Anyway, these are just implementation details.
@busbey - do you have any further input on the design and the proposed workload idea here? I'd like to make sure we converge on the design review first before starting the implementation. Thanks!

A few things:

Could you specify how users will interact with this workload?
Do you need to track the entire key set written by each node, or would a range suffice?
I wonder if this will be difficult to implement in YCSB - you're simulating a Map/Reduce scenario - maybe just run Hadoop or Spark?

A typical way is: Users will specify number of writers, keys of each writer, and the launch the workload. The writers will write the keys to the DB in parallel and then a scanner will scan and validate all the required keys.

I will track the names of keys that are successfully written (so failures are not included in expectation).

I'd like to make this a generic workload to test list-after-write consistency, I don't see any reason to limit this specifically to just Hadoop or Spark, or to run those applications to test list consistency of a NoSQL DB - that (benchmarking noSQL DB) is what this tool is designed for.

Many thanks to the great inputs and suggestions from @cmccoy -
It turns out that the writers can generate key names deterministically using existing YCSB mechanism, therefore the scanner is capable of generating the expected set of key names deterministically using the same logic as the writers, however the scanner still needs to know the set of failed writes which can be communicated using manifest files as mentioned above.
In the next update, I'm going to post a verbose write-up of the design. Folks, please feel free to voice your comments here! Thanks!

Workflow: We will use the existing YCSB workflow template: Load + Run.

The load step will launch the writers and write keys to the DB concurrently, and the scan step will do the validation that keys from all successful writes during the load step are present in the scan results.
We expect the user to control the wait time (if any) between the scan step and the load step based on their expectation of the consistency level of the underlying DB. We will provide an example to show how to wrap these two steps in a simple bash script.

Keys and communication between writers and the scanner.

a) At the load step, each writer writes their keys simply following existing mechanism in YCSB:

Each writer has its own range of keys.
The keys will be deterministically hashed so they appear random to the DB under test.
There will be an overall prefix for a given test run, all keys will be written under this prefix.
(currently YCSB used a hard-coded prefix for all test runs, it's "user", we can improve this behavior by allowing the user to pass a per-run prefix via a command line parameter)

This has one key advantage: Each key is generated deterministically so the scanner can use the same logic to deduce the set of keys it needs to expect for each writer - modulo any failed writes, which we will handle via a "negative manifest" as described below.
b) When a writer finishes its writes:

It records those failed writes to a manifest file (there is no need to do tenacious retry of the writes for this workload here) and writes the file to the NoSQL DB under test.
The information recorded to the file can simply be those failed keys.
This is called "negative manifest file".
The manifest files are deterministically named by the prefix of the test run + the ID of the writer, so the scanner does NOT need to rely on scan to uncover these manifest files.

c) At the run step, the user passes the number of writers, prefix of the test run, and number of keys written to the scanner, which then:

Generate the expected set of keys by running the same code writers used to generate those keys.
Read the negative manifest files from the NoSQL DB which contains list of failed keys (if any)
Remove any failed keys from the expected set of keys generated in the first step, this forms the final expectation.
Performs scan to the NoSQL DB asking for all keys under the prefix of this test run.
Compare the results of the scan and the final expectation.

This is pretty much it. It's actually a quite simple test process, but I wrote it verbosely here so we have the necessary details documented. ;)

Any update here?

It's still on my plate. I plan to work on this in March.
Sorry for the lack of update here, and thanks for the ping!
On Sunday, January 31, 2016, Sean Busbey<EMAIL_ADDRESS>wrote:

Any update here?
—
Reply to this email directly or view it on GitHub
https://github.com/brianfrankcooper/YCSB/issues/416#issuecomment-177706275
.


Ubuntu Bionic/Focal: Add GCC 11

Add GCC 11 to the Ubuntu 18.04 Bionic and 20.04 Focal toolsets.
Closes #3280.
Please run /azp run ubuntu1804, ubuntu2004 to test the images.
We probably should also start talking about a date to make GCC 11 the default.

Check list

[x] Related issue / work item is attached
[x] Tests are written: By CI
[x] Documentation is updated: By CI
[x] Changes are tested and related VM images are successfully generated

/azp run ubuntu1804, ubuntu2004

Done, added GFortran 11 to the toolsets.

/azp run ubuntu1804, ubuntu2004

@EwoutH, please pull the latest main, it contains fix for Ruby gem installation for Ubuntu 20.04 (that is why it is failing)

Done!

/azp run ubuntu1804, ubuntu2004


Color picker not working on IE11

When running the plunker demo example you will already see that some tabs (second and third tab) are not rendered well in IE 11.
Seems some styling/css issues?

Can you try the latest release v0.2.1

Sliders were fixed, but the palettes broke


Application get open when notification received while the app is not in the background

My problem is the application get open when notification received while the app is not in the background, if the application already running but in the background, it will stay in the background which is expected.
when the app not running, it shouldn't get open after receive notification, only should open when click on notification.
What version of RN and react-native-fcm are you running? ^7.5.1
What device are you using? (e.g iOS9 emulator, Android 6 device)? emulator 7.1.1
Is your app running in foreground, background or not running? foreground
Advanced:
Have you tried adding break point in native handlers to see if message gets delivered?
can share a project with issue?

+1 The app just opened when received notification

can you reproduce with the example app?

I got this issue on my rn 0.46 project which is using react native navigation.  And my rn-fcm version is 10+.

I resolved this issue, I am using wix/react-native-navigation.
Please refer to this, if you are also using wix/react-native-navigation.
https://wix.github.io/react-native-navigation/#/android-specific-use-cases?id=compatibility-with-headlessjs

@horacehylee Thanks so much. You've saved my days.

Yes, that method Navigation.isAppLaunched still works in React 0.53. I have switched back from react-native-firebase after finding this solution.


[full-ci] chore: bump web to v7.1.0-rc.2

The following issues have been fixed since the last RC:

fix: add missing translations: owncloud/web#9443
fix: access token renewal during cloud imports: owncloud/web#9460
fix: broken cloud import dashboard when upload failed before: owncloud/web#9471
fix: prevent uploads when a cloud import is running: owncloud/web#9470
fix: concurrent uploads: owncloud/web#9463
fix: generate unique request ids for tus upload requests: owncloud/web#9418
fix: merging folders: owncloud/web#9477
fix: various search location filter issues: owncloud/web#9432
fix: location filter seach with shares: owncloud/web#9456

be listed https://github.com/owncloud/web/pull/9443 https://github.com/owncloud/web/pull/9460 in the ChangeLog?

should be listed owncloud/web#9443 owncloud/web#9460 in the ChangeLog?

We didn't create separate changelog items for those fixes because they were follow-ups for features that already have a changelog item (e.g. "Cloud import" is one big changelog item).


Collect Metrics on the Number of Installs of Z Open Editor

I would like to know how to capture the number of installs metrics via an API to update and create reports for the number of installs/downloads of IBM Z Open Editor
This is currently displayed on maketplace here
https://marketplace.visualstudio.com/items?itemName=IBM.zopeneditor&ssr=false#qna
IBM Z Open Editor
IBM
|
14,732 installs
| (11) | Free
Description of the enhancement requested
I would like to know how to capture the number of installs metrics via an API to update and create reports for the number of installs/downloads of IBM Z Open Editor

@mpanch59 can you provide more details for this request, i.e. why you need to access this number?
IBM does not control the VS Code Marketplace. It is a Microsoft product. Perhaps they have documentation or take enhancement request?


💡 [FEATURE] - Resources for the Backend development

Idea Contribution

[X] I have read all the feature request issues.

Explain feature request
The web development is always divided into 2 categories , frontend and backend, i have saw in the issues sections that someone is working on the resources for the frontend development but no one is working on the resources for the backend development,
i would like to work on the resources for the backend development.
Explain your solution
i would link all the authentic and helpful links on backend development
Any alternative approaches/features
No response
Additional Context
No response

Would you assign me this task under GSSOC'24 ?


chef-server-ctl org-create is broken in v12

No matter what you put in the command:
In example:
chef-server-ctl org-create Test "Test123"
you always get:
ERROR: The data in your request was invalid
Response: Field 'name' invalid

Version is 12.4.0.rc.2

Thanks for taking the time to file this ticket.  I believe the problem is your capitalized name.  It appears that only lowercase names are allowed:
https://github.com/chef/chef-server/blob/master/src/oc_erchef/apps/oc_chef_authz/src/oc_chef_organization.erl#L192

I had the same issue, dropping case resolved it.


Comment

[Enter feedback here]
SDK-Setup does not work - see: https://github.com/microsoft/service-fabric/issues/1462

Document Details
⚠ Do not edit this section. It is required for learn.microsoft.com ➟ GitHub issue linking.

ID: 23e79576-36ff-8e39-9d21-adc897608b73
Version Independent ID: bb904115-2166-6871-6347-0941dbb32d2a
Content: Set up a Windows development environment - Azure Service Fabric
Content Source: articles/service-fabric/service-fabric-get-started.md
Service: service-fabric
GitHub Login: @tomvcassidy
Microsoft Alias: tomcassidy

@strabu
Thanks for your feedback! We will investigate and update as appropriate.

@strabu
I'm going to assign this to the document author so they can take a look at it accordingly

I believe this is updated as per that bug's resolution and the download links being updated in the doc in question. If that's not the case, please let me know with anothe comment here. Until then, thanks for bringing this up and #please-close


Add the CG in the GitHub awesome BI tools list

[ ] https://github.com/thenaturalist/awesome-business-intelligence

Done by @pshrimal21 - https://github.com/thenaturalist/awesome-business-intelligence/pull/49


Custom responses not available in middleware functions

Sails version: 1.0.0-36
Node version: 8.2.1
NPM version: 5.3.0
Operating system: Debian 9.0

When using a middleware function, I can't call any custom response (like res.notFound) because it's undefined, maybe because it's injected after ? If the "router" middleware handle this, it's problematic because I need to do some tests and sometime end the request before reaching the router.
module.exports.http = {

  middleware: {

    test(req, res, next) {
      // some useful epic code
      // ...
      res.notFound(); // not defined
    },

    order: [
      'test',
      'router',
      'www'
    ]
  }
};

Hi @magiksd, your intuition is correct -- the custom response functionality isn't added to the req object until it hits the Sails router.  You could work around this in your middleware by calling the response directly, albeit with a bit of apply gymnastics:
req._sails = sails;
sails.hooks.responses.middleware.notFound.apply({req: req, res: res});

But, in almost every case you would be better served by just transforming your middleware into a hook instead:
// api/hooks/myEpicHook/index.js
module.exports = function(sails) {

  return {

    routes: {

      // Define routes to be matched _before_ explicit routes
      // from config/routes.js and blueprints.
      before: {

        // Define a route handler to match everything.
        '/*': {
          target: function(req, res, next) {
            // some useful epic code
            // ...
            res.notFound(); // works like a charm...
          },
          // Since this route matches everything, you _probably_ want it to skip
          // things like js/main.js.  If you don't, you can collapse this route config
          // into the shorthand of `'/*': function(req, res, next) {...}`
          skipAssets: true
        }

      }
    }

  };

};


Update for parsing changes on julia 0.5

Ref https://github.com/JuliaOpt/JuMP.jl/pull/711
One-sided comparisons parse as :call expressions in Julia 0.5. JuMP follows the new syntax on 0.5 for expressions returned through the MPB interface.
Before:
julia> dump(:(x <= 1))
Expr
  head: Symbol comparison
  args: Array(Any,(3,))
    1: Symbol x
    2: Symbol <=
    3: Int64 1
  typ: Any

After:
julia> dump(:(x <= 1))
Expr
  head: Symbol call
  args: Array(Any,(3,))
    1: Symbol <=
    2: Symbol x
    3: Int64 1
  typ: Any

I'm running into an error on the ifelse test in JuMP. Here's a reduced case:
using JuMP, MathProgBase
m = Model()
@variable(m, x, start = 2)
@NLobjective(m, Min, ifelse( x <= 1, x^2, x) )
buildInternalModel(m)
MathProgBase.initialize(m.nlpdata.evaluator, [:ExprGraph])
dump(MathProgBase.obj_expr(m.nlpdata.evaluator))

gives
Expr
  head: Symbol call
  args: Array(Any,(4,))
    1: Symbol ifelse
    2: Expr
      head: Symbol comparison
      args: Array(Any,(3,))
        1: Expr
          head: Symbol ref
          args: Array(Any,(2,))
            1: Symbol x
            2: Int64 1
          typ: Any
        2: Symbol <=
        3: Float64 1.0
      typ: Any
    3: Expr
      head: Symbol call
      args: Array(Any,(3,))
        1: Symbol ^
        2: Expr
          head: Symbol ref
          args: Array(Any,(2,))
            1: Symbol x
            2: Int64 1
          typ: Any
        3: Float64 2.0
      typ: Any
    4: Expr
      head: Symbol ref
      args: Array(Any,(2,))
        1: Symbol x
        2: Int64 1
      typ: Any
  typ: Any

But shouldn't the comparison simply be a call now?
julia> dump(:(ifelse( x <= 1, x^2, x)))
Expr
  head: Symbol call
  args: Array(Any,(4,))
    1: Symbol ifelse
    2: Expr
      head: Symbol call
      args: Array(Any,(3,))
        1: Symbol <=
        2: Symbol x
        3: Int64 1
      typ: Any
    3: Expr
      head: Symbol call
      args: Array(Any,(3,))
        1: Symbol ^
        2: Symbol x
        3: Int64 2
      typ: Any
    4: Symbol x
  typ: Any

Everything should be up to date on my end, does something need to be updated in ReverseDiffSparse perhaps?
julia> Pkg.status()
6 required packages:
 - AmplNLWriter                  0.2.1+             master (dirty)
 - Cbc                           0.2.1
 - CoinOptServices               0.1.0              f7bc9186 (dirty)
 - FactCheck                     0.4.2
 - Ipopt                         0.2.2
 - JuMP                          0.13.1+            master
16 additional packages:
 - BinDeps                       0.3.21
 - Calculus                      0.1.14
 - Clp                           0.2.1
 - Compat                        0.7.18
 - DataStructures                0.4.4
 - ForwardDiff                   0.1.8
 - Homebrew                      0.2.0
 - JSON                          0.5.0
 - Lazy                          0.10.1
 - LightXML                      0.2.1
 - MacroTools                    0.3.0
 - MathProgBase                  0.5.0+             master
 - NaNMath                       0.2.1
 - ReverseDiffSparse             0.5.5
 - SHA                           0.1.2
 - URIParser                     0.1.3

That does look like a bug, will take a look.

Whoops, misclick sorry for the noise


Application gets stuck after canceling dialog

Lib don't handle cancel button. So a Image picker activity remains active. It should be close on below all cases:

When user tap on "Cancel" OR "Ok"
When User denied permission in that event, Activity must be closed.

These two cases handled.
-> Space added between "to" & "LIST_OF_PERMISSION" in confirmation alert dialogue

Fix #88


feat(test-cli): add integer and boolean sets to wordpress example/test bundle

Adding a couple non-string set values to our test bundle (installed via make test-cli) to ensure porter-helm mixin support.
Will fail until https://github.com/deislabs/porter-helm/pull/30 is merged/released.

A tag has been cut with the changes needed by this PR, as verified by CI on this latest commit.  Merging.


Upgrade to Ruby 2.6.5

Trello card: https://trello.com/c/aB7CT1X2/2737-all-upgrade-to-most-recent-version-of-ruby-265

👍


Incomplete display of dataset descriptions

Hi Carlos,
for some reason, the definitions of these two datasets are not displayed correctly, and the text shown on the page is only a part of the full text included in the definition box:

https://landportal.org/book/dataset/fao-glpsr
https://landportal.org/book/dataset/sedac-abw

I tried myself to see if there was some break or other problem, but I don’t see the difference with — for instance — the  NRGI - Resource Governance Index, where the full text of the dataset definition appears on the page.
Can you make sure the full definition appears in all dataset pages?
In case this isn’t something you can address, would you mind contacting Adam?
Thanks in advance.
Best,
Marcello

Hi Marcello,
I was digging into this isse and it looks like there is an issue in Drupal with the language of the description. For these datasets, there are 2 descriptions. One in English (en) and other in "undeterminated" (und) language.
If the dataset taxonomy term is edited using the drupal website, it looks like the changes are applied to a description with an "undeterminated" (und) language. But the description shown in the website is the one marked as "English".
I was able to fix it manually changing the values directly in the database (that it is not sustainable for the future, but fast & clean in this concrete case).
Maybe this could be an issue to be tackled in the next Drupal release.
Best,
Carlos


Cloudmapper fails to install on macos

Hello, whatever the solution I came up with to setup cloudmapper, it fails at the pyjq install...
pip3 install --user pipenv
cd cloudmapper/; pipenv install --skip-lock

is it related to the below issue ?
https://github.com/doloopwhile/pyjq/issues/54
https://bugs.python.org/issue42504
Please find hereunder my logs:

Installing dependencies from Pipfile...
An error occurred while installing pyjq==2.3.1! Will try again.
An error occurred while installing seaborn==0.10.1! Will try again.
🐍   ▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉ 37/37 — 00:00:44
Installing initially failed dependencies...
[InstallError]:   File "/usr/local/Cellar/pipenv/2020.11.15/libexec/lib/python3.9/site-packages/pipenv/cli/command.py", line 233, in install
[InstallError]:       retcode = do_install(
[InstallError]:   File "/usr/local/Cellar/pipenv/2020.11.15/libexec/lib/python3.9/site-packages/pipenv/core.py", line 2052, in do_install
[InstallError]:       do_init(
[InstallError]:   File "/usr/local/Cellar/pipenv/2020.11.15/libexec/lib/python3.9/site-packages/pipenv/core.py", line 1304, in do_init
[InstallError]:       do_install_dependencies(
[InstallError]:   File "/usr/local/Cellar/pipenv/2020.11.15/libexec/lib/python3.9/site-packages/pipenv/core.py", line 899, in do_install_dependencies
[InstallError]:       batch_install(
[InstallError]:   File "/usr/local/Cellar/pipenv/2020.11.15/libexec/lib/python3.9/site-packages/pipenv/core.py", line 796, in batch_install
[InstallError]:       _cleanup_procs(procs, failed_deps_queue, retry=retry)
[InstallError]:   File "/usr/local/Cellar/pipenv/2020.11.15/libexec/lib/python3.9/site-packages/pipenv/core.py", line 703, in _cleanup_procs
[InstallError]:       raise exceptions.InstallError(c.dep.name, extra=err_lines)
[pipenv.exceptions.InstallError]: Collecting pyjq==2.3.1
[pipenv.exceptions.InstallError]:   Using cached pyjq-2.3.1.tar.gz (2.1 MB)
[pipenv.exceptions.InstallError]: Requirement already satisfied: six in /Users/hiyaa/.local/share/virtualenvs/cloudmapper-WzNltrOW/lib/python3.8/site-packages (from pyjq==2.3.1->-r /var/folders/26/pmmcdlhx727ffbxy2ld7m86h0000gn/T/pipenv-8bez_ooa-requirements/pipenv-r8czubvu-requirement.txt (line 1)) (1.14.0)
[pipenv.exceptions.InstallError]: Building wheels for collected packages: pyjq
[pipenv.exceptions.InstallError]:   Building wheel for pyjq (setup.py): started
[pipenv.exceptions.InstallError]:   Building wheel for pyjq (setup.py): finished with status 'error'
[pipenv.exceptions.InstallError]:   ERROR: Command errored out with exit status 1:
[pipenv.exceptions.InstallError]:    command: /Users/hiyaa/.local/share/virtualenvs/cloudmapper-WzNltrOW/bin/python -u -c 'import sys, setuptools, tokenize; sys.argv[0] = '"'"'/private/var/folders/26/pmmcdlhx727ffbxy2ld7m86h0000gn/T/pip-install-7m4e96ks/pyjq_abce72f03b2c422d9a98ef71102e0034/setup.py'"'"'; file='"'"'/private/var/folders/26/pmmcdlhx727ffbxy2ld7m86h0000gn/T/pip-install-7m4e96ks/pyjq_abce72f03b2c422d9a98ef71102e0034/setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(file);code=f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, file, '"'"'exec'"'"'))' bdist_wheel -d /private/var/folders/26/pmmcdlhx727ffbxy2ld7m86h0000gn/T/pip-wheel-dbvkaevy
[pipenv.exceptions.InstallError]:        cwd: /private/var/folders/26/pmmcdlhx727ffbxy2ld7m86h0000gn/T/pip-install-7m4e96ks/pyjq_abce72f03b2c422d9a98ef71102e0034/
[pipenv.exceptions.InstallError]:   Complete output (44 lines):
[pipenv.exceptions.InstallError]:   running bdist_wheel
[pipenv.exceptions.InstallError]:   running build
[pipenv.exceptions.InstallError]:   running build_py
[pipenv.exceptions.InstallError]:   creating build
[pipenv.exceptions.InstallError]:   creating build/lib.macosx-11-x86_64-3.8
[pipenv.exceptions.InstallError]:   copying pyjq.py -> build/lib.macosx-11-x86_64-3.8
[pipenv.exceptions.InstallError]:   warning: build_py: byte-compiling is disabled, skipping.
[pipenv.exceptions.InstallError]:
[pipenv.exceptions.InstallError]:   running build_ext
[pipenv.exceptions.InstallError]:   Traceback (most recent call last):
[pipenv.exceptions.InstallError]:     File "", line 1, in
[pipenv.exceptions.InstallError]:     File "/private/var/folders/26/pmmcdlhx727ffbxy2ld7m86h0000gn/T/pip-install-7m4e96ks/pyjq_abce72f03b2c422d9a98ef71102e0034/setup.py", line 93, in
[pipenv.exceptions.InstallError]:       setup(
[pipenv.exceptions.InstallError]:     File "/Users/hiyaa/.local/share/virtualenvs/cloudmapper-WzNltrOW/lib/python3.8/site-packages/setuptools/init.py", line 153, in setup
[pipenv.exceptions.InstallError]:       return distutils.core.setup(**attrs)
[pipenv.exceptions.InstallError]:     File<EMAIL_ADDRESS>line 148, in setup
[pipenv.exceptions.InstallError]:       dist.run_commands()
[pipenv.exceptions.InstallError]:     File<EMAIL_ADDRESS>line 966, in run_commands
[pipenv.exceptions.InstallError]:       self.run_command(cmd)
[pipenv.exceptions.InstallError]:     File<EMAIL_ADDRESS>line 985, in run_command
[pipenv.exceptions.InstallError]:       cmd_obj.run()
[pipenv.exceptions.InstallError]:     File "/Users/hiyaa/.local/share/virtualenvs/cloudmapper-WzNltrOW/lib/python3.8/site-packages/wheel/bdist_wheel.py", line 299, in run
[pipenv.exceptions.InstallError]:       self.run_command('build')
[pipenv.exceptions.InstallError]:     File<EMAIL_ADDRESS>line 313, in run_command
[pipenv.exceptions.InstallError]:       self.distribution.run_command(command)
[pipenv.exceptions.InstallError]:     File<EMAIL_ADDRESS>line 985, in run_command
[pipenv.exceptions.InstallError]:       cmd_obj.run()
[pipenv.exceptions.InstallError]:     File<EMAIL_ADDRESS>line 135, in run
[pipenv.exceptions.InstallError]:       self.run_command(cmd_name)
[pipenv.exceptions.InstallError]:     File<EMAIL_ADDRESS>line 313, in run_command
[pipenv.exceptions.InstallError]:       self.distribution.run_command(command)
[pipenv.exceptions.InstallError]:     File<EMAIL_ADDRESS>line 985, in run_command
[pipenv.exceptions.InstallError]:       cmd_obj.run()
[pipenv.exceptions.InstallError]:     File "/private/var/folders/26/pmmcdlhx727ffbxy2ld7m86h0000gn/T/pip-install-7m4e96ks/pyjq_abce72f03b2c422d9a98ef71102e0034/setup.py", line 30, in run
[pipenv.exceptions.InstallError]:       self._build_oniguruma()
[pipenv.exceptions.InstallError]:     File "/private/var/folders/26/pmmcdlhx727ffbxy2ld7m86h0000gn/T/pip-install-7m4e96ks/pyjq_abce72f03b2c422d9a98ef71102e0034/setup.py", line 39, in _build_oniguruma
[pipenv.exceptions.InstallError]:       self._build_lib(
[pipenv.exceptions.InstallError]:     File "/private/var/folders/26/pmmcdlhx727ffbxy2ld7m86h0000gn/T/pip-install-7m4e96ks/pyjq_abce72f03b2c422d9a98ef71102e0034/setup.py", line 67, in _build_lib
[pipenv.exceptions.InstallError]:       os.environ['MACOSX_DEPLOYMENT_TARGET'] = macosx_deployment_target
[pipenv.exceptions.InstallError]:     File<EMAIL_ADDRESS>line 680, in setitem
[pipenv.exceptions.InstallError]:       value = self.encodevalue(value)
[pipenv.exceptions.InstallError]:     File<EMAIL_ADDRESS>line 750, in encode
[pipenv.exceptions.InstallError]:       raise TypeError("str expected, not %s" % type(value).name)
[pipenv.exceptions.InstallError]:   TypeError: str expected, not int
[pipenv.exceptions.InstallError]:   ----------------------------------------
[pipenv.exceptions.InstallError]:   ERROR: Failed building wheel for pyjq
[pipenv.exceptions.InstallError]:   Running setup.py clean for pyjq
[pipenv.exceptions.InstallError]: Failed to build pyjq
[pipenv.exceptions.InstallError]: Installing collected packages: pyjq
[pipenv.exceptions.InstallError]:     Running setup.py install for pyjq: started
[pipenv.exceptions.InstallError]:     Running setup.py install for pyjq: finished with status 'error'
[pipenv.exceptions.InstallError]:     ERROR: Command errored out with exit status 1:
[pipenv.exceptions.InstallError]:      command: /Users/hiyaa/.local/share/virtualenvs/cloudmapper-WzNltrOW/bin/python -u -c 'import sys, setuptools, tokenize; sys.argv[0] = '"'"'/private/var/folders/26/pmmcdlhx727ffbxy2ld7m86h0000gn/T/pip-install-7m4e96ks/pyjq_abce72f03b2c422d9a98ef71102e0034/setup.py'"'"'; file='"'"'/private/var/folders/26/pmmcdlhx727ffbxy2ld7m86h0000gn/T/pip-install-7m4e96ks/pyjq_abce72f03b2c422d9a98ef71102e0034/setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(file);code=f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, file, '"'"'exec'"'"'))' install --record /private/var/folders/26/pmmcdlhx727ffbxy2ld7m86h0000gn/T/pip-record-1eezjp50/install-record.txt --single-version-externally-managed --compile --install-headers /Users/hiyaa/.local/share/virtualenvs/cloudmapper-WzNltrOW/include/site/python3.8/pyjq
[pipenv.exceptions.InstallError]:          cwd: /private/var/folders/26/pmmcdlhx727ffbxy2ld7m86h0000gn/T/pip-install-7m4e96ks/pyjq_abce72f03b2c422d9a98ef71102e0034/
[pipenv.exceptions.InstallError]:     Complete output (46 lines):
[pipenv.exceptions.InstallError]:     running install
[pipenv.exceptions.InstallError]:     running build
[pipenv.exceptions.InstallError]:     running build_py
[pipenv.exceptions.InstallError]:     creating build
[pipenv.exceptions.InstallError]:     creating build/lib.macosx-11-x86_64-3.8
[pipenv.exceptions.InstallError]:     copying pyjq.py -> build/lib.macosx-11-x86_64-3.8
[pipenv.exceptions.InstallError]:     warning: build_py: byte-compiling is disabled, skipping.
[pipenv.exceptions.InstallError]:
[pipenv.exceptions.InstallError]:     running build_ext
[pipenv.exceptions.InstallError]:     Traceback (most recent call last):
[pipenv.exceptions.InstallError]:       File "", line 1, in
[pipenv.exceptions.InstallError]:       File "/private/var/folders/26/pmmcdlhx727ffbxy2ld7m86h0000gn/T/pip-install-7m4e96ks/pyjq_abce72f03b2c422d9a98ef71102e0034/setup.py", line 93, in
[pipenv.exceptions.InstallError]:         setup(
[pipenv.exceptions.InstallError]:       File "/Users/hiyaa/.local/share/virtualenvs/cloudmapper-WzNltrOW/lib/python3.8/site-packages/setuptools/init.py", line 153, in setup
[pipenv.exceptions.InstallError]:         return distutils.core.setup(**attrs)
[pipenv.exceptions.InstallError]:       File<EMAIL_ADDRESS>line 148, in setup
[pipenv.exceptions.InstallError]:         dist.run_commands()
[pipenv.exceptions.InstallError]:       File<EMAIL_ADDRESS>line 966, in run_commands
[pipenv.exceptions.InstallError]:         self.run_command(cmd)
[pipenv.exceptions.InstallError]:       File<EMAIL_ADDRESS>line 985, in run_command
[pipenv.exceptions.InstallError]:         cmd_obj.run()
[pipenv.exceptions.InstallError]:       File "/Users/hiyaa/.local/share/virtualenvs/cloudmapper-WzNltrOW/lib/python3.8/site-packages/setuptools/command/install.py", line 61, in run
[pipenv.exceptions.InstallError]:         return orig.install.run(self)
[pipenv.exceptions.InstallError]:       File<EMAIL_ADDRESS>line 545, in run
[pipenv.exceptions.InstallError]:         self.run_command('build')
[pipenv.exceptions.InstallError]:       File<EMAIL_ADDRESS>line 313, in run_command
[pipenv.exceptions.InstallError]:         self.distribution.run_command(command)
[pipenv.exceptions.InstallError]:       File<EMAIL_ADDRESS>line 985, in run_command
[pipenv.exceptions.InstallError]:         cmd_obj.run()
[pipenv.exceptions.InstallError]:       File<EMAIL_ADDRESS>line 135, in run
[pipenv.exceptions.InstallError]:         self.run_command(cmd_name)
[pipenv.exceptions.InstallError]:       File<EMAIL_ADDRESS>line 313, in run_command
[pipenv.exceptions.InstallError]:         self.distribution.run_command(command)
[pipenv.exceptions.InstallError]:       File<EMAIL_ADDRESS>line 985, in run_command
[pipenv.exceptions.InstallError]:         cmd_obj.run()
[pipenv.exceptions.InstallError]:       File "/private/var/folders/26/pmmcdlhx727ffbxy2ld7m86h0000gn/T/pip-install-7m4e96ks/pyjq_abce72f03b2c422d9a98ef71102e0034/setup.py", line 30, in run
[pipenv.exceptions.InstallError]:         self._build_oniguruma()
[pipenv.exceptions.InstallError]:       File "/private/var/folders/26/pmmcdlhx727ffbxy2ld7m86h0000gn/T/pip-install-7m4e96ks/pyjq_abce72f03b2c422d9a98ef71102e0034/setup.py", line 39, in _build_oniguruma
[pipenv.exceptions.InstallError]:         self._build_lib(
[pipenv.exceptions.InstallError]:       File "/private/var/folders/26/pmmcdlhx727ffbxy2ld7m86h0000gn/T/pip-install-7m4e96ks/pyjq_abce72f03b2c422d9a98ef71102e0034/setup.py", line 67, in _build_lib
[pipenv.exceptions.InstallError]:         os.environ['MACOSX_DEPLOYMENT_TARGET'] = macosx_deployment_target
[pipenv.exceptions.InstallError]:       File<EMAIL_ADDRESS>line 680, in setitem
[pipenv.exceptions.InstallError]:         value = self.encodevalue(value)
[pipenv.exceptions.InstallError]:       File<EMAIL_ADDRESS>line 750, in encode
[pipenv.exceptions.InstallError]:         raise TypeError("str expected, not %s" % type(value).name)
[pipenv.exceptions.InstallError]:     TypeError: str expected, not int
[pipenv.exceptions.InstallError]:     ----------------------------------------
[pipenv.exceptions.InstallError]: ERROR: Command errored out with exit status 1: /Users/hiyaa/.local/share/virtualenvs/cloudmapper-WzNltrOW/bin/python -u -c 'import sys, setuptools, tokenize; sys.argv[0] = '"'"'/private/var/folders/26/pmmcdlhx727ffbxy2ld7m86h0000gn/T/pip-install-7m4e96ks/pyjq_abce72f03b2c422d9a98ef71102e0034/setup.py'"'"'; file='"'"'/private/var/folders/26/pmmcdlhx727ffbxy2ld7m86h0000gn/T/pip-install-7m4e96ks/pyjq_abce72f03b2c422d9a98ef71102e0034/setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(file);code=f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, file, '"'"'exec'"'"'))' install --record /private/var/folders/26/pmmcdlhx727ffbxy2ld7m86h0000gn/T/pip-record-1eezjp50/install-record.txt --single-version-externally-managed --compile --install-headers /Users/hiyaa/.local/share/virtualenvs/cloudmapper-WzNltrOW/include/site/python3.8/pyjq Check the logs for full command output.
ERROR: Couldn't install package: pyjq
Package installation failed...
☤  ▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉ 1/2 —

Many thanks !

It happened the same to me (same error), I tried to install the requirements using:
pip install -r requirements.txt
and with:
pip3 install -r requirements.txt
And it fails with the very same error.
Could it be due to higher versions of Python than 3.7 ? I was using 3.9 and @serialp here was using 3.8.

Is this on macOS Big Sur? Could be this Python issue: https://bugs.python.org/issue42504
I installed CloudMapper without issues on an Ubuntu system last week.

Is this on macOS Big Sur? Could be this Python issue: https://bugs.python.org/issue42504
I installed CloudMapper without issues on an Ubuntu system last week.

Yes, in my case it is. macOS Big Sur 11.1
I'll wait for that to get fixed! Thanks @0xdabbad00 ! Good catch!

@w0rmr1d3r I used the same install method as you then switch to pipenv I also tried with each version of python util 3.9.
That's why I have mentioned this issue to @0xdabbad00 and yes Scott I am using MacOs big sur 11.2.2 which is why I mentioned the related issue if it can help.
So will you able to deliver a fix on your side or pyjq will handle it ?
Thanks again for your feedback !

@w0rmr1d3r I used the same install method as you then switch to pipenv I also tried with each version of python util 3.9.
That's why I have mentioned this issue to @0xdabbad00 and yes Scott I am using MacOs big sur 11.2.2 which is why I mentioned the related issue if it can help.
For linux have you tried on Ubuntu 20.04 LTS ?
So will you able to deliver a fix on your side or pyjq will handle it ?
Thanks again for your feedback !

Sorry @serialp , I went too fast on your logs and didn't see the links to the very same issue @0xdabbad00 said.
I belive that, regarding to Python issues, we might need to wait for pyjq to handle it.

I had the same issue on mac os, removing the version numbers from the file fixed it for me, pip sorted out everything.

@cvdv87 which file? The requirements.txt file?

@w0rmr1d3r correct, my file looks like this:
astroid autoflake autopep8 boto3 botocore certifi chardet coverage docutils idna isort Jinja2 jmespath lazy-object-proxy MarkupSafe matplotlib mccabe mock netaddr nose pandas parliament policyuniverse pycodestyle pyflakes pyjq pylint python-dateutil PyYAML requests s3transfer seaborn six toml typed-ast urllib3 wrapt
I have to say, I had another dependency issue, different packages, but perhaps this works for you too.

There are a lot of issues in this repo regarding versions and some incompatibilities (and some PRs opened as well).
We should take a look at those too!
Question:
If we delete fixed versions, are we installing latest versions for all of those dependencies? Does Cloudmapper work as usual?
Which dependency issue you say you were having?

So here is my approach, keep in mind I use a newer python version as advised in the installation page:
Python version 3.8
1)- Clone repo, install pre-reqs, start venv
2)- Update pip: pip install --upgrade pip
3)- pip install -r requirements.txt
Error:
ERROR: Cannot install -r requirements.txt (line 5) and urllib3==1.26.5 because these package versions have conflicting dependencies.
The conflict is caused by:
The user requested urllib3==1.26.5
botocore 1.17.6 depends on urllib3<1.26 and >=1.20; python_version != "3.4"
Solution provided by pip:
To fix this you could try to:

loosen the range of package versions you've specified
remove package versions to allow pip attempt to solve the dependency conflict

Solution 2 is what I've tested and afaik everything seems to be working fine for me.

That happens to you the same way it happened to other people, because urllib3 got updated and it conflicted with botocore versions and other dependencies.
Exists this PR which fixes the issue that you have encountered -> https://github.com/duo-labs/cloudmapper/pull/876
Which, at the same time, it fixes this issue -> https://github.com/duo-labs/cloudmapper/issues/875
That's why I was saying that there are issues and PRs opened regarding dependencies and problems installing them.

Sounds similar to #301 (I've just opened #881, based on Debian)

I can see in https://github.com/duo-labs/cloudmapper/issues/881 that you installed dependencies without a fixed version, which is similar to other PRs that basically upgrade dependencies, am I wrong?
Thanks @Sean12697 !

You're not wrong @w0rmr1d3r, I did manually implement #876 (which I see you reviewed a couple of weeks before I opened my issue), although it was running sudo apt install autoconf libtool from doloopwhile/pyjq#50 which finally fixed the issue for me.
Ideally I would reset my environment to test how much of an impact manually implementing #876 has before installed the additional apt packages.

@w0rmr1d3r correct, my file looks like this: astroid autoflake autopep8 boto3 botocore certifi chardet coverage docutils idna isort Jinja2 jmespath lazy-object-proxy MarkupSafe matplotlib mccabe mock netaddr nose pandas parliament policyuniverse pycodestyle pyflakes pyjq pylint python-dateutil PyYAML requests s3transfer seaborn six toml typed-ast urllib3 wrapt
I have to say, I had another dependency issue, different packages, but perhaps this works for you too.

This is what fixed my issue, removing the verision numbers

issues fixed by updating typed-ast==1.5.5 and pyjq==2.6.0


Cubic splines

Adds cubic spline interpolation method to scipy.ndimage.map_coordinates with natural boundary conditions based on this paper https://doi.org/10.1007/s10614-007-9092-4.
The results given by this interpolation differ at the edges because scipy doesn't use natural boundary conditions, but does match at the inner regions.
Similarly I have raised a NotImplementedError for the 'reflect' mode because it gives incorrect answers based on the coordinates output from the _INDEX_FIXERS with 'reflect'. I believe this could be fixed by implementing a different function to generate the output coordinates.
I also have not implemented unit tests or tests comparing to scipy (due to the boundary conditions).
I am hoping to have some help getting this PR through soon since I need to integrate this into the software I am developing, all help is greatly appreciated!
This should also close #3928 !

Hi - sorry we missed this! Can you please add some tests for the new functionality? Existing tests for this function can be found here: https://github.com/google/jax/blob/b4ec72deaefa1094891829cd0b78efb5cc19c28b/tests/scipy_ndimage_test.py#L79

Hey Jake thanks for picking this up!
So I've locally updated the tests to cover the third order interpolation however I've implemented a version with a different boundary condition, scipy uses the 'not-a-knot' condition as far as I can tell (they are not explicit about the particular algorithm they use) whereas I've implemented 'natural' boundary conditions. This gives machine precision matching results at the inner parts of the array, but differing results at the boundaries (shown below).

The existing tests use arrays of shapes (5,), (3, 4), (3, 4, 5) meaning that the tests comparing to scipy fail and can't just compare the central portion as the arrays are too small. I'm wondering what the way forward is here. I haven't been able to solve this problem for the 'not-a-knot' boundary conditions, which may not even be the correct one and I think will require an entirely different implementation 😬. I'm thinking as a solution the tests for third order could use larger arrays and only compare the inner regions (which isn't exactly ideal, but works) and specifying in the docs about using different boundary conditions to scipy.
Let me know your thoughts!

Did you see the discussion in https://github.com/google/jax/issues/5687?
The existing linear interpolation scheme is somewhat inconsistent with scipy but we would like to fix this. In particular see the proposed solution in https://github.com/google/jax/issues/5687#issuecomment-776866617
Is your PR consistent with one of SciPy (new) supported boundary modes?
https://docs.scipy.org/doc/scipy/tutorial/ndimage.html#interpolation-boundary-handling

Yes I'm aware of the current issues with the boundary mode and have been following these, my PR does not address anything to do with this. The issue you linked is to do with the boundary mode, how the output coordinates are mapped outside of the range of the input coordinates, which is different to the boundary conditions I'm referring to in my above comments.
The boundary conditions are a set of extra conditions at the boundary of the arrays that are needed to solve for the spline coefficients, of which there are a few although scipy doesn't provide options for this. The plot in the above comment is defined entirely within the input coordinates so there are no effects from the boundary mode.
There should be no issues with any future changes made to the boundary modes since this just changes how the output coordinates are mapped, which are then subsequently fed into the interpolation algorithm.

I just wanted to mention that it would be great to have this merged, even if it does not match the scipy boundary conditions. Figuring out what those boundary conditions even are and then implementing them would be challenging. And having some form of cubic interpolation for map_ccordinates is better than having none :)
I am happy to help out with making this happen if you need it. Let me know what needs to be done!

@JamesAllingham If you need something now you can build my jax fork from source until we get this though https://github.com/LouisDesdoigts/jax. Also feel free to send me your email and I can add you to a thread I have trying to sort this out! Any help is greatly appreciated!

Just checking on this - this is a dependency for some science we are currently doing.

I really appreciate you putting this together, but I don't think it's a good idea for JAX's cubic spline code to diverge further from SciPy. The JAX team does not have the expertise on the numerics of splines to get this code right.
I would suggest either:

Work on getting these features into SciPy. Once they have been merged over there, we would be happy to consider your PR to mirror the features in JAX.
Release a separate library with JAX splines. We would be happy to include a link in the relevant section of the JAX docs.

Thanks for this – I think given the discussion in https://github.com/google/jax/pull/18137, this functionality is probably out-of-scope for jax core. Sorry we weren't able to accept your contribution here!


Equivalent of Blender "auto depth"

This would require the use of ray casting. But allow much more instinctive navigation in the scene.
The idea is to cast a ray into the scene from the camera position into the direction of the mouse pointer. If there is a hit, use the location of the hit:

As the rotation center while rotating
As the "target" while zooming or panning (affecting the radius)

With this enabled, the geometry under the cursor is always the same after the zoom/rotation/pan as it was before.

Hi, thanks for the suggestion, it's a good idea.

As the "target" while zooming or panning (affecting the radius)

The zoom part of this would be "zoom to mouse cursor" in Blender, and you've already created https://github.com/Plonq/bevy_panorbit_camera/issues/63 for that. I'll keep these separate like Blender does.

Thanks,
I think, in Blender, the "auto depth" option affects the zoom also. But differently than the "zoom to mouse cursor".
The "zoom to mouse cursor" affects only the direction in which the zoom is done. While the "auto depth" option affect the radius/target depth/sensitivity. But the last one is a bit difficult to tell given that in Blender you can zoom "past" the target once you get too close to it.

I think I know what you mean - when panning, the pivot point is where you clicked, thus changing the distance between the pivot and the camera. That is different from the 'focus' though, because zooming always zooms in and out from the focus, and the focus stays consistently in the middle of the screen.

To be honest, I'm having a lot of trouble implementing this. The main problem I'm having is that I can't just rotate around the raycast hit location, I need to translate that movement back into alpha, beta, and focus. In other words, what is the change in focus, alpha, and beta that would result in the movement of rotating around a different point in space.
As opposed to if the only state was the camera's current transform and the focus, then all movement would simply be a modification of that transform and it would be relatively easy (but cause other problems).
Any help would be appreciated!

I am available to help. However I am new to both rust (coming from C++) and bevy and I tried to study the code of this add-on and still could not understand how it works yet. So this will probably take some time. I am still working on that, but in the meantime, feel free to indicate me on how I can help.

Well the part I'm stuck on has nothing to do with rust, the plugin, or bevy haha.
The overview of how it works is this. There are 4 values that are used to determine the transform of the camera each frame: alpha (angle around global y axis), beta (angle around local x axis), focal point (vec3) and radius (distance from focal point).
On every tick an entirely new transform is created from these values and applied to the camera. Imagine it like this: first it's rotated around global y axis based on alpha (yaw). Then it's rotated around its local x axis (tilt). Then it's moved/translated to the focal point, and finally it's moved backwards (local Z) the radius amount.
This makes it orbit around the focal point, which is always exactly where the camera is looking at. This is the 'turn table' style orbiting, where 'up' never changes.
Now the hard part comes in two parts:

Creating the same turn table orbit movement temporarily around a different focal point
Translating that movement back into those 4 values - alpha, beta, focus

Radius should actually stay the same, which helps, because once step 1 is done, you can use 'forward * radius' in order to calculate the new focus.
However I'm actually stuck on step 1 right now. The alpha/yaw movement is easy, but getting the beta/tilt working around an offset pivot point is proving difficult.
Hopefully that helps you or maybe someone else reading this. Good luck, no pressure, I'll keep trying myself.

I am still reading the code, but at utils.rs line 35 in the multiplication, both quaternions are after the original quaternion. However in linear algebra, multiplication is not commutative so both transformations are in the local space. I don't think it is related to this issue or even a bug, but it is contradictory to the code in the cheat book and to the description in the previous comment.

So I did experiment messing with the code and for me rotate_around does work. I did not did the ray cast to detect the pivot_point but hard coded it to be a corner of the cube in the basic example. I changed the file util.rs line 35 to multiple lines:
// new_transform.rotation *= Quat::from_rotation_y(alpha) * Quat::from_rotation_x(-beta);
let rotation = Quat::from_rotation_y(alpha) * Quat::from_rotation_x(-beta);
let pivot_point = Vec3::new(0.5, 1.0, 0.5);
new_transform.rotate_around(pivot_point, rotation);

And it works, the corner of the cube in question stays at the same position in the viewport.

Edit: Sorry about that. Given that new_transform is IDENTITY, there is no difference. The * in the *= can also be removed I suppose.

Edit: Sorry about that. Given that new_transform is IDENTITY, there is no difference. The * in the *= can also be removed I suppose.

Yes you're right the *= is unnecessary. Also note that an euler rotation XYZ also works the same:
new_transform.rotation = Quat::from_euler(EulerRot::YXZ, alpha, -beta, 0.0);

So I did experiment messing with the code and for me rotate_around does work. I did not do the ray cast to detect the pivot_point but hard coded it to be a corner of the cube in the basic example. I changed the file util.rs line 35 to multiple lines:
// new_transform.rotation *= Quat::from_rotation_y(alpha) * Quat::from_rotation_x(-beta);
let rotation = Quat::from_rotation_y(alpha) * Quat::from_rotation_x(-beta);
let pivot_point = Vec3::new(0.5, 1.0, 0.5);
new_transform.rotate_around(pivot_point, rotation);

And it works, the corner of the cube in question stays at the same position in the viewport.

Thanks! That helps, but it's not the whole solution. When the pivot changes, the camera jumps. You can see that the pivot is always in the vertical center of the screen. This is unlike Blender where the pivot stays in the position on the screen that you clicked.
https://github.com/Plonq/bevy_panorbit_camera/assets/7709415/4a46c769-7819-4c06-a03c-8e0921a573a1
You can find the code used for the above video on this branch: https://github.com/Plonq/bevy_panorbit_camera/tree/64-auto-depth. I'm using the basic example for testing, with smoothing disabled for simplicity. The orange-red gizmo is the pivot and the aquamarine gizmo is the focus.
Also note I made one small change:
new_transform.rotate_around(pivot - focus, rotation);

Subtracting focus here means it still works when the focus has changed (panned the camera).

Thanks! That helps, but it's not the whole solution. When the pivot changes, the camera jumps. You can see that the pivot is always in the vertical center of the screen. This is unlike Blender where the pivot stays in the position on the screen that you clicked.

Yes. I figured that since, in utils.rs update_orbit_transform, the alpha and beta parameters represent the whole rotation since the start of the app, using the pivot point there is making the assumption that all the rotations ever were made around the same pivot point. So I started trying as you recommended yesterday and making a "temporary movement" (in lib.rs) to translate into the other properties, however I had no success doing that.
Also, if doing things there: the limits might cause issues. But given that there is not limit for the pan operation, this should be OK.
In my opinion this is probably the best option. And not only radius stays unchanged but alpha and beta also stay unchanged the "only" thing to calculate is a translation that compensate for the rotation around the pivot point.

new_transform.rotate_around(pivot - focus, rotation);

Yes I figured that also. However, without this the rotation start to behave weirdly after a pan operation, but with this the pan operation behave weirdly after a rotate operation.

In my opinion this is probably the best option. And not only radius stays unchanged but alpha and beta also stay unchanged

I'm not so sure. alpha stays the same but beta changes. At least, the beta relative to the pivot point is different to the beta relative to the focus (where the camera is looking). Hopefully this illustration explains:

the "only" thing to calculate is a translation that compensate for the rotation around the pivot point.

Yeah I haven't been successful at this.

Actually, I maybe be wrong with that illustration. If beta is always consistent with the focus and the pivot point rotation is only temporary, then you're right I think beta does stay the same - it's the focus that will move. This hurts my brain 😆

Yes, I am pretty sure beta/pitch stays the same.
I am making progress, but my linear algebra courses are a long way back. Basically I need to transform a local quaternion into a global one, in order to be able to commute them. I have:
q1 * q2 = q3

where I have q1 and q2 and can calculate q3, but I need to calculate q4 so that:
q4 * q1 = q3

Maybe asking help by someone with a more mathematical mind/expertise for this would be better.
Also the limits causes issues, but it can be worked around.

Ok, so I managed to get something working. I:

used your branch and reverted the changes made to utils.rs update_orbit_transform
commented the apply constrains part in lib.rs pan_orbit_camera
In lib.rs pan_orbit_camera I added:

                let mut transform_temp = transform.clone();
                let yaw = Quat::from_rotation_y(-delta_x);
                let pitch = Quat::from_rotation_x(-delta_y);
                let pivot = *pivot_point;
                transform_temp.rotate_around(pivot, yaw);
                let pitch_global = transform_temp.rotation * pitch * transform_temp.rotation.inverse();
                transform_temp.rotate_around(pivot, pitch_global);
                pan_orbit.target_focus = transform_temp.translation
                    + (transform_temp.forward() * pan_orbit.target_radius);

between
                pan_orbit.target_alpha -= delta_x;
                pan_orbit.target_beta += delta_y;

and
                has_moved = true;

diff

So after a bit of cleanup, this works also and is a bit quicker:
                let mut transform_temp = transform.clone();
                let yaw = Quat::from_rotation_y(-delta_x);
                let pitch = Quat::from_rotation_x(-delta_y);
                let pitch_global =
                    transform_temp.rotation * pitch * transform_temp.rotation.inverse();
                transform_temp.rotate_around(*pivot_point, yaw * pitch_global);
                pan_orbit.target_focus = transform_temp.translation
                    + (transform_temp.forward() * pan_orbit.target_radius);

Still todo:

If no hit on the raycast, chose a pivot point on the plane perpendicular the the camera forward direction, passing by the focus point and under the cursor
Get the target_alpha/beta before applying delta_x/y, apply delta_x/y, apply the constrains directly after that and recalculate a delta_x/y based on the values of target_alpha/beta before incrementing them and after applying the constrains.
Auto depth for pan
Auto depth for zoom

Also in the todo list possibly:

Change the radius so that the focus is in the same plane (perpendicular to the camera forward direction) as the pivot

Nice work! I implemented the limit fix you mention and that works (no longer pans/slides when you hit the limit).
Unfortunately, there are problems with smoothing. Your solution as-is doesn't work at all with smoothing. Here's what it looks like with default smoothing:
https://github.com/Plonq/bevy_panorbit_camera/assets/7709415/75d507a0-e9c0-4631-bceb-639387fc78f5
However, if transform_temp is a representation of the target values, like so:
let mut transform_temp = Transform::IDENTITY;
transform_temp.rotation = Quat::from_rotation_y(pan_orbit.target_alpha)
    * Quat::from_rotation_x(-pan_orbit.target_beta);
transform_temp.translation +=
    pan_orbit.target_focus + transform_temp.back() * pan_orbit.target_radius;
let yaw = Quat::from_rotation_y(-delta_x);
let pitch = Quat::from_rotation_x(-delta_y);
let pitch_global = transform_temp.rotation * pitch * transform_temp.rotation.inverse();
transform_temp.rotate_around(*pivot_point, yaw * pitch_global);
pan_orbit.target_focus =
    transform_temp.translation + (transform_temp.forward() * pan_orbit.target_radius);

Then it sort of works:
https://github.com/Plonq/bevy_panorbit_camera/assets/7709415/8be44776-43d1-4364-8bc9-8bc556dca340
You can see that it's wobbly. If we change the smoothing values to exaggerate the effect, you can see it very obviously.
Here's with orbit smoothing at 0.5 and pan smoothing disabled.
https://github.com/Plonq/bevy_panorbit_camera/assets/7709415/4b886962-8b7f-4ede-9aa4-ae506425f174
Here's with orbit smoothing disabled and pan smoothing at 0.5.
https://github.com/Plonq/bevy_panorbit_camera/assets/7709415/e418d32d-a0c9-4c39-8115-127f1810b733
And this made me think maybe if both pan and orbit smoothing are at the same value, then it would 'even out' and be fine, but unfortunately no. It's still off:
https://github.com/Plonq/bevy_panorbit_camera/assets/7709415/38fbc164-f561-42c2-8299-67649c87d925
I believe the problem is that the pan (focus) movement is linear (straight line from old focus to new focus), however the orbit movement is circular, and because the two are combined, then they don't line up and it result in the wobbliness. So if we can make the focus/pan smoothing to follow the same circular movement as the orbit, then they would line up and everything would work. But I have no idea how to go about that.
I had a go at doing this, and the closest I came was to apply the same solution to the actual focus (not the target focus), after interpolating. This code comes after new_focus is declared.
let mut transform_temp = Transform::IDENTITY;
transform_temp.rotation =
    Quat::from_rotation_y(alpha) * Quat::from_rotation_x(-beta);
transform_temp.translation += pan_orbit.focus + transform_temp.back() * radius;
let delta_alpha = new_alpha - alpha;
let delta_beta = new_beta - beta;
let yaw = Quat::from_rotation_y(delta_alpha);
let pitch = Quat::from_rotation_x(-delta_beta);
let pitch_global =
    transform_temp.rotation * pitch * transform_temp.rotation.inverse();
transform_temp.rotate_around(*pivot_point, yaw * pitch_global);
new_focus = transform_temp.translation + (transform_temp.forward() * radius);

This results almost perfect smooth movement, however as you can see in this video, focus ends up drifting away from the target_focus (floating point errors?).
https://github.com/Plonq/bevy_panorbit_camera/assets/7709415/c546f042-ab5e-499d-a3e0-99a814a58caa
I've updated my branch with this attempt, along with two commented-out failed attempts at different solutions.
Oh I also implemented the limit fix you described, which works well.

Nice work and progress. Thanks for the feedback, it helps a lot.
It does look like a accumulation error of numerical precision indeed. Hopefully we can fix that by normalizing some (all) the quaternions somewhere (everywhere). I will try to experiment with this and come with a solution but, even though it would hurt to come so close without success, I cannot promise anything. :(
Anyway, by this point we did all the hard work. I put the culpability of this on the smoothing.

Not a numerical precision accumulation error. However I manged to fix the "drift" by switching some values form target_focus/radius to just focus/radius
diff --git a/src/lib.rs b/src/lib.rs
index 1d5dfd0..4364058 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -630,16 +630,20 @@ fn pan_orbit_camera(
             let mut transform_temp = Transform::IDENTITY;
             transform_temp.rotation = Quat::from_rotation_y(pan_orbit.target_alpha)
                 * Quat::from_rotation_x(-pan_orbit.target_beta);
+            // transform_temp.translation +=
+            //     pan_orbit.target_focus + transform_temp.back() * pan_orbit.target_radius;
             transform_temp.translation +=
-                pan_orbit.target_focus + transform_temp.back() * pan_orbit.target_radius;
+                pan_orbit.focus + transform_temp.back() * radius;
             let delta_alpha = pan_orbit.target_alpha - pre_target_alpha;
             let delta_beta = pan_orbit.target_beta - pre_target_beta;
             let yaw = Quat::from_rotation_y(delta_alpha);
             let pitch = Quat::from_rotation_x(-delta_beta);
             let pitch_global = transform_temp.rotation * pitch * transform_temp.rotation.inverse();
             transform_temp.rotate_around(*pivot_point, yaw * pitch_global);
+            // pan_orbit.target_focus =
+            //     transform_temp.translation + (transform_temp.forward() * pan_orbit.target_radius);
             pan_orbit.target_focus =
-                transform_temp.translation + (transform_temp.forward() * pan_orbit.target_radius);
+                transform_temp.translation + (transform_temp.forward() * radius);

             gizmos.sphere(
                 pan_orbit.target_focus,

However the new version of you code breaks the panning, and I did not managed to restore it in a way that works.
Also doing twice the calculation to rotate around a point is not really optimal and duplicate some code (some of which is also duplicated in util.rs) but the code duplication can be cleaned up when we manage to get something that works.

Making progress! If we can't solve this in a way that work well though then that's okay.
FYI only changing target_focus to focus is necessary from your diff.
So one workaround for the issue of panning breaking, is that we make panning and orbiting mutually exclusive. If panning you can't orbit and if orbiting you can't pan, and doing either interrupts the other. It's not a perfect solution, but it is pretty good. Here's a demo:
https://github.com/Plonq/bevy_panorbit_camera/assets/7709415/81aa2627-6f59-4a24-b6f7-686b5952902c

Anyway, by this point we did all the hard work. I put the culpability of this on the smoothing.

You're right about this. Blender has no smoothing! It definitely complicates everything. If we can't get it working well with smoothing, we could just avoid the problem entirely and say that if this option is enabled, it also disables all smoothing. That would at least be better than nothing for the people that want this feature.
As usual, I've updated the branch with a POC of the above.

Also doing twice the calculation to rotate around a point is not really optimal and duplicate some code (some of which is also duplicated in util.rs) but the code duplication can be cleaned up when we manage to get something that works.

This will be an optional feature, so I'm not fussed about the extra calculation (doubt it's significant), and yeah the code can be cleaned up and better structured if we find a solution

Anyway, by this point we did all the hard work. I put the culpability of this on the smoothing.

You're right about this. Blender has no smoothing! It definitely complicates everything. If we can't get it working well with smoothing, we could just avoid the problem entirely and say that if this option is enabled, it also disables all smoothing. That would at least be better than nothing for the people that want this feature.

I think it will be possible, thanks for your cooperation on this. I would definitely not have managed to do that alone.
I modified the code to have a pivot point under the mouse even when there is no hit during the ray cast:
diff --git a/src/lib.rs b/src/lib.rs
index 4185b3c..e5119e0 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -419,7 +419,10 @@ fn pan_orbit_camera(
                 let hits1 = raycast.cast_ray(cursor_ray, &default());
                 if let Some(hit) = hits1.first().map(|(_, hit)| hit) {
                     *pivot_point = hit.position();
-                    *pivot_radius = pivot_point.distance(pan_orbit.target_focus);
+                    // *pivot_radius = pivot_point.distance(pan_orbit.target_focus);
+                } else {
+                    *pivot_point =
+                        cursor_ray.origin + cursor_ray.direction * pan_orbit.radius.unwrap();
                 }
             }
         }

That one was easy.
I suppose now I will focus on the pan and zoom. Or maybe to move the focus to be in the same plane as the pivot point during orbit. If I understood well the attempts in you code this is something needed also?

So I decided to concentrate on moving the focus to be on the same plane (perpendicular to the camera forward direction) as the pivot point. After all this is pretty much the only things this "auto depth" option have in common between orbit pan and zoom (even when "zoom to mouse position" is not set) in Blender.
Doing the math/geometry was easy but doing the code so that the smoothing was still working and there was no jumping at the beginning or end of the orbit operation was a real pain. Here is a video of the feature working:
Screencast from 2024-03-13 17-29-46.webm
Here a diff file with the changes for this, the previous pivot_point calculation when no hit by the raycast and some basic changes: Like do not use the same value for pan/orbit smoothing anymore and set the pan smooth value to something non zero in the demo.

So I just taught of this, but my last changes can break the radius limit. Also the whole things since the start is probably not working with orthographic cameras. :(

I think it will be possible, thanks for your cooperation on this. I would definitely not have managed to do that alone.

I like the optimism! I don't think I would have figured out the math myself (or given up first), so we're a good team!

So I just taught of this, but my last changes can break the radius limit. Also the whole things since the start is probably not working with orthographic cameras. :(

Yeah there is no obvious solution here. We have two choices:

Prevent the focus (and pivot point?) moving further away from the camera than the max radius limit; or
Snap that camera to the max radius if a pivot point is chosen farther away

I couldn't even get option 1 working, but here's option 2. Not very nice.
https://github.com/Plonq/bevy_panorbit_camera/assets/7709415/7da50bcb-5173-47a8-a523-be0fb87fa349
Side note: I moved the bottom if is_orbiting block after util::update_orbit_transform so that zooming still works while orbiting.

I figured out option 1. It's much better than option 2. Awkward, but acceptable outcome if you choose to add zoom limit.
https://github.com/Plonq/bevy_panorbit_camera/assets/7709415/bd9ef0f0-260a-4f1b-8632-3c578f3f8d89
As usual branch updated.

Nice,
On my side I fixed some trivial stuff:

Fixed the calculation of the pivot point when there is no ray cast hit. It turns out that cursor_ray.origin is not the same as the camera position which introduced a small error (not noticeable visually)

I did some small cleanups:

Removed useless comment regarding the pan_smoothness begin the same as the orbit_smoothness which is not true and the code is not there anymore
Removed a useless + from a +=

I "think" I also fixed the orthographic projection related stuff:

For this I switched to the orthographic example but I modified the near and far parameters. Otherwise the near is by default set to 0.0 and this makes sometimes some bad math appear correct
I calculated the pivot point when using an orthographic projection for the camera an there is no hit by the ray cast
When modifying the radius to move the focus point on the same plane as the pivot. We do not want this change in radius to affect the projection scale. I did not found a way to do that cleanly, so I did an ugly hack for this but it "works" and is fairly simple/understandable.

Here is a diff of all my changes related to the above points.

Good work on the orthographic, though I don't particularly like the hack. I used to have a separate scale field on PanOrbitCamera which was used for orthographic projection, but this was recently removed in https://github.com/Plonq/bevy_panorbit_camera/pull/58. Your hack seems to be essentially the same thing - separating out ortho scale from radius - just as a factor rather than entirely separate. So I wonder whether it would be better to revert that PR? What do you think?

Another thing - I get stutter/jitter in ortho. This is due to the 1-frame delay due to changing values after update_orbit_transform has already run (meaning those changes only get applied the next frame). A hacky/naive/brute force solution is to run update_orbit_transform twice - before and after the if is_orbiting block. Really not a fan of that though, and I'm sure there's a way to avoid that by incorporating zoom into the is_orbiting block instead, then only calling update_orbit_transform afterwards.
I'll look into this when I can.
Demo of stutter:
https://github.com/Plonq/bevy_panorbit_camera/assets/7709415/d21531aa-ed6a-4865-90a7-ac89a6e377d4

Good work on the orthographic, though I don't particularly like the hack. I used to have a separate scale field on PanOrbitCamera which was used for orthographic projection, but this was recently removed in https://github.com/Plonq/bevy_panorbit_camera/pull/58. Your hack seems to be essentially the same thing - separating out ortho scale from radius - just as a factor rather than entirely separate. So I wonder whether it would be better to revert that PR? What do you think?

I do not like the hack neither. In some ways the scale field, has before, was better but in other ways it makes it more difficult to switch from perspective to orthographic projections and have a relatively identical field of view. I do not really have a strong opinion on that one. None of the "solutions" are really clean. I suppose my hack of having a scale factor defaulted to one and not needing any work from the user to calculate a correct value to set the scale is easier.

Another thing - I get stutter/jitter in ortho. This is due to the 1-frame delay due to changing values after update_orbit_transform has already run (meaning those changes only get applied the next frame). A hacky/naive/brute force solution is to run update_orbit_transform twice - before and after the if is_orbiting block. Really not a fan of that though, and I'm sure there's a way to avoid that by incorporating zoom into the is_orbiting block instead, then only calling update_orbit_transform afterwards.

I cannot reproduce the pivot point jitter here. But yes: The is_orbiting block that changes the focus point to be at the same depth as the pivot can be moved before applying the values with update_orbit_transform the only things different it does is allowing zooming while keeping the orbit mouse button pressed, but not while while actually orbiting (moving the mouse in addition to pressing the orbit button).
In addition in the future (when also supporting auto_depth for panning and zooming) this code will need to be always called (when auto_depth is set to true at least).
I am currently working on this and managed to get the focus point relocated correctly by:

Changing the condition to calculate pivot_point from

if input::orbit_just_pressed(&pan_orbit, &mouse_input, &key_input)
{
    ...

to
if input::orbit_just_pressed(&pan_orbit, &mouse_input, &key_input)
    || input::pan_just_pressed(&pan_orbit, &mouse_input, &key_input)
    || mouse_key_tracker.scroll_line != 0.0
{
    ...

Removing this if is_orbiting condition and always execute the code to move the focus point at the end (the one talked about a bit higher in my message)

However, this moves the focus point to the correct position but breaks the zooming and panning which does not work anymore and I do not manage to fix this :(

Regarding the hack. There might be a way to avoid it just by setting the radius to a different value.
I managed to avoid it by replacing the line:
                    pan_orbit.ortho_scale_factor *= pan_orbit.radius.unwrap() / new_radius;

by
                    if let Projection::Orthographic(_) = *projection {
                        new_radius = pan_orbit.radius.unwrap();
                    }

And thus not using the hack and allowing to remove the ortho_scale_factor from everywhere.

I like the avoidance of the hack, but it does break zoom while orbiting because it's using radius which is the old value not the new value. Unfortunately, using the new value (before modifications) results the same camera jump when the pivot changes :(

Look, if I'm honest, I'm starting to feel this is getting to be too complicated. Even if we solve the issues, it's still a whole lot of complexity stemming from making it work with smoothing, which makes bugs more likely, and also makes it harder to understand and harder to add other features as well.
I think it would probably be better to create a separate plugin that doesn't have smoothing, and implement this there. Or implement smoothing in a different way.
I'm still open to implementing this, but it just seems there are a lot of hacks and special cases and I am not a fan.

I understand your thinking. I understand the geometry and linear algebra of it but I have difficulties to understand some things related to the smoothing too. Like why the new focus is moved at the end of the code when it should probably moved at the start, and why some calculation need to be done twice for the smoothing interpolation to be working. Sorry to have wasted your time so much and thank you a lot for the help.

You haven't wasted my time! I'm glad we explored this, and thank you for the help. I think it's just not going to fit well with the architecture of this plugin. Particularly the fact the plugin uses absolute positioning and smoothes by tracking two separate values. A camera controller that uses relative positions and velocity+acceleration for smoothing I think would be much more suitable. In fact, bevy_editor_cam might be that plugin as it does use relative positioning. Perhaps you could request the feature there? (Based on the docs, I even think it already does panning based on raycast hit location which is part of the auto-depth feature).


docs: add recommended rules to the docs

Summary
This PR adds:

a paragraph in the /linter page, that lists the recommended rules;
a new aside on the page of the nursery rules, to warn users that those rules belong to such group

Test Plan
Tested locally that links work, correctly rendered and auto generated.

At some point we should switch to a table-based layout for rules. Similar to what typescript eslint do.

At some point we should switch to a table-based layout for rules. Similar to what typescript eslint do.

Checkout clippy and ruff too:

https://docs.astral.sh/ruff/rules/
https://rust-lang.github.io/rust-clippy/master/index.html