Task 15

Concatenate the name from the excel and writing full name

SourceCode/2023/Oct2023/Basics/Khantil Desai/Task 15/project.json
Your code completion score is 2 out of 2: Good work completing your code and offering a fully-functional solution.
Your execution score is 1.5 out of 2: Your code seems to work effectively for its purpose, but there are issues related to unused dependencies, which could impact execution time and overall performance.
Your annotations and comments score is 0.5 out of 1: There seems to be a lack of logging activity in your workflow, which would help understand the flow path for future maintenance or in event errors occur. Moreover, WriteLine activity used should ideally be replaced by tracepoints during debug.
Suggested improvements based on file review:
NoFile:

Please define an Automation Hub URL in your 'Project Settings'. This is required by your organisation.
Try to remove unused packages like UiPath.Mail.Activities, UiPath.MicrosoftOffice365.Activities, UiPath.Testing.Activities, UiPath.UIAutomation.Activities. Eliminating these will improve your process execution time.

Main.xaml:

Incorporate 'Log Message' activities in your workflow, particularly in 'Main'. It will aid in maintenance and will help identify errors, if they happen.
'WriteLine' activity at 'Full name

SourceCode/2023/Oct2023/Basics/Khantil Desai/Task 15/project.json
NoFile

Your project lacks an Automation Hub URL, as required by your organisation. Add this missing information via 'Project Settings'.
Several dependency packages (UiPath.Mail.Activities, UiPath.MicrosoftOffice365.Activities, UiPath.Testing.Activities, UiPath.UIAutomation.Activities) aren't being used in your code. Get rid of these to boost your process execution time.

Main.xaml

In your Main workflow, you haven't used the Log Message. Log Message activities are crucial – they make understanding the flow path easier during both the development stage and after the project has been launched. This also assists in quickly pinpointing any errors.
WriteLine activity has been noted at Full name output. If you're debugging, consider replacing these with tracepoints. If WriteLine is essential for debugging, you may want to swap it to Log Message. Remember to remove WriteLines before publishing.
Your variable 'Output1' doesn't have the DataTable prefix. Adding a dt_ prefix could be useful.

Score

Code Completion: 1.5/2
Execution: 1.5/2
Annotations and comments: 0.5/1

SourceCode/2023/Oct2023/Basics/Khantil Desai/Task 16/project.json
Github PR Comments:
POST to: <GithubPR>/path_to_pr_1
Comment:
"Relative to NoFile:
Firstly, add an Automation Hub URL for your project via 'Project Settings'.
Also, I noticed you have a few dependency packages (UiPath.Mail.Activities, UiPath.Testing.Activities, UiPath.UIAutomation.Activities) that don't seem to be utilized. Get rid of these to speed up processing.
Scores: Completion - 1.5, Execution - 2, Annotation - 0.5"
POST to: <GithubPR>/path_to_pr_1
Comment:
"Relative to Main.xaml:
Enhance your workflow by employing Log Message activities. These assist in unraveling the flow path, a handy tool for troubleshooting.
Remember also: DataTable Variables ought to start with 'dt_'.
Revise your variables to follow the preset naming pattern ^(dt_)?([A-Z]|[a-z])+([0-9])*$.
Lastly, updating your 'Output Data Table' activity title might make its purpose clearer.
Scores: Completion - 1.5, Execution - 1.5, Annotation - 0.5"

SourceCode/2023/Oct2023/Basics/Khantil Desai/Task 16/project.json
Scores:
Code Completion: 2
Execution: 1.5
Annotations and Comments: 1
Comments:
NoFile:

You need to add your Automation Hub URL in the "Project Settings". Your organization requires it for their info record.
You have some packages like UiPath.Mail.Activities, UiPath.Testing.Activities, and UiPath.UIAutomation.Activities which are not being used. By getting rid of them, the execution time will get better.

Main.xaml:

There's a lack of usage of 'Log Message' activities in your Main workflow. These are helpful in understanding the project flow during both development and after release.
Variable naming is off. Variables like 'Output' that hold DataTable should start with 'dt_' as prefix.
Another variable 'Output_1' does not match the desired pattern "^(dt_)?([A-Z]|[a-z])+([0-9])*$". Please review your variable naming practices to ensure they are consistent and follow the proper pattern.
Just noticed an activity 'Output Data Table' that has a default name. It always helps if you replace the default name with something more descriptive.

Review these points and act accordingly to improve your code quality and execution time.

@Khantil12
Task-12
Task not available in this pr. check it
Task-14
Task not available in this pr. check it
Task -15
Code verified.
Task -16
Code verified.
Task -17
Code verified.


Synchronous issuer plugin design

Recently we had an issue where NGINX timed out a request as it was taking longer than x seconds. When this happened, it created the certificate in Digicert but we lost the private key. In generally this is not ideal as you really want to store the private key as soon as you possibly can.
I have a proposal for an idea and I want to see what your thoughts are as to whether this is something you'd accept as a PR.
Current workflow:
CSR is created with Private Key -> Request made via IssuerPlugin to create/accept/retrieve certificate -> Store Certificate with Private key
Proposed workflow
CSR is created with Private Key -> Store Certificate in database with private key and no certificate
Sync cron runs -> Updates certificate
Pros:

Asynchronous workflow
You can't lose the private key
You can now use approval workflows with your CA

Cons:

If your request to the CA fails you have a certificate with only a private key in Lemur

I wouldn't have any problems merging something like this in as I think it is a very common workflow for low volume certificates, but it will take quite a bit of work.
For historical context, most of our downstream clients and customers expect a response immediately such that they don't have to build in retry/fetching logic. We get around the asynchronous workflow by explicitly using APIs from CAs that are also synchronous (e.g. Digicert CIS). I don't know if that is an available to all customers.
I see two ways of adding this functionality:
Workflow Option 1
CSR is created with Private Key -> Request made via AsyncIssuerPlugin to create create/accept/retrieve certificate -> Task Status/Id is returned to caller -> Caller periodically checks for status.
Components:

Create a new plugin type that would be AsyncIssuer. All plugins of this type would use celery/rq to run a background process to request a certificate and then wait for it to be issued.
Create a new table to keep track of the certificate's private key and the current status of its issuance task.
Modify certificate creation flow control, perhaps returning an empty certificate dictionary and task ID

Workflow Option 2
Create request -> Async? (Yes/No) -> Create background task -> return task id
Components:

Make an explicit call to new endpoint create/async re-use existing plugins
Wrap the create function call in celery/rq background task.

I'm not in love with either option, but I am currently leaning on Option 1.

Another intermediate Option we were considering was going from a single Certificate commit to a 2 stage commit.

The initial Certificate commit would contain the private key and any other data not derived from the cert_body & cert_chain.
Following a successful request for creating a certificate, we would then update the Certificate with the returned cert body and chain.
In the event of the request failing due to timeout, we won't have lost the private key and we'll have the ability to manually fix the entry without a certificate.

Currently if it fails we have to revoke the certificate and start again as we don't have the private key where as this approach gives us the ability to manually fix the certificate by fetching the details from the CA.
This may mean we'll need to change database constraints so I was wanting to check whether or not you thought this was a reasonable step in the right direction. I believe this will further enable us to move towards an async approach as well.

The two-stage approach could also work, but you might run into issues where the state of the certificate isn't clear. You have a private key, but the certificate failed for some reason. Do you retry within your plugin? Do you raise an error to have the user take an action? Either way, you have a nebulous private key without any associated metadata (CSR, domains, validity, etc.,).
My preference would be an async implementation where the status of the task (issuance, destination, etc,.) is very clear and can be presented to the user is a straight forward way. This most likely means that the two-stage commit would indeed exist, but is tied to some other db table (tasks) and not to the certificate table itself.

I also had this issue, and spent a little bit of time getting it mostly done (PR probably coming in the next few days, depending).  I'd like to have someone check and see if it makes sense once I do put it up.
Essentially:

Create cert as normal, if you get the response immediately, then you continue as normal
If you don't get a certificate from the issuing plugin, then you return empty cert body, chain and external_id.
Then a PendingCertificate is created (PendingCertificate pretty much a subset of Certificate, with a couple extra fields such as renaming [certs are named based on certificate, which doesn't exist for Pending Certificate, so a dummy name needs to be generated in the meanwhile).
Then I use Sources sync to get the new certificates.  This has to be a Source because upon step 1, you have already ordered a certificate, trying to order again will result in a second certificate.  So you need to sync from sources.  Then for each certificate from source, I check for existing cert as before and update.  If the certificate doesn't exist, then check PendingCertificates for the order_id/external_id (this may depend of source), and create a certificate with PendingCertificate's fields.
Then delete the used PendingCertificate.  Update the count of syncs for every certificate (perhaps fail and notify if a PendingCert has sat around for too long).

This approach means you need a Source (will start pulling all existing certs from your CA, unless we want to filter by passing external_ids from Pending Certificates table to filter only Pending).  This also changes the relations quite a bit, as now you have pending certificates with the same relations as certificates, so that it can remap them once actually fulfilled.
Other considerations / to do on my side:
[] UI to view pending certificates
[] Checking roles / authorization to view, modify pending certs
[] Ability to cancel an order - pending cert can be cancelled on the CA, before it gets issued.  Need to update base plugins, and what happens if you cancel an order that was actually fulfilled but not yet synced.

How often do you plan to run the source plugins? We typically run them once per hour. I am also a little concerned with the Source plugin route. We have some issuers that have tens of thousands of certificates syncing them has become quite a problem, so much so that we've generally abandoned continuous syncing.

Create cert as normal, if you get the response immediately, then you continue as normal

Does this mean that support for pending certificate will be based on the plugin? Which issuer plugins are you focusing on? Are you planning async based issuer plugins.

I plan on once an hour or less.  I haven't tried with a large source sync yet so I can't comment on the speed here.  We can definitely reverse the source sync to go through every pending certificate (which should be very few certificates), and try to see if the source has it or not.  This way, we just need another sync command (source pending-sync -s ).

Does this mean that support for pending certificate will be based on the plugin? Which issuer plugins are you focusing on? Are you planning async based issuer plugins.

It shouldn't be based on any plugin, as long as they return empty certificate body in case of failure.  I am focusing on Digicert plugin.  In my case, most of the time certificates will be issued pretty much immediately, and I skip over the pending certificate route.  I'm not planning async based plugins because I don't want to change the expected flow / setup of current Lemur.  There's no way to know if one issuer will need async support or not.


Massachusetts - UP Migration - Validate Test Data

User Story:
As a developer, I want the [STLT] to validate test messages in staging, so that they can receive data in the format they expect.
Description/Use Case
[STLT] is already receiving data from the covid pipeline they will be onboarded to the UP where they will be receiving data from SimpleReport including Covid, Flu and RSV. We need to make sure the message we generate from the UP passes the STLTs validation. We can use SimpleReport to submit test messages to the STLT.
Risks/Impacts/Considerations
Notes doc and requirements
https://cdc.sharepoint.com/:w:/r/teams/ReportStream/Shared Documents/Engagement/Onboarding/Massachussetts Onboarding Running Notes.docx?d=wea4dac3fe3dc46c7bd4e06980d138089&csf=1&web=1&e=KzcUAW
Dev Notes:

[ ] Upload the newly created receiver settings to Staging
[ ] Copy the receiver's secret key with the new receiver name in Azure's staging environment
[ ] Verify we can connect to the newly created receiver
[ ] Send a test message through Simple Report and make sure it gets routed to the STLT
[ ] Send test messages according to the STLT needs

Acceptance Criteria

[ ] Created and sent data using Simple Report
[ ] Confirmed with STLT that data passes validation

Massachusettes requested change to test messages as described below:
"
Hi James,
MDPH would like to receive the identified AOE questions via ReportStream’s ELR feed.
Currently, our ELR Portal/Surveillance System (MAVEN) cannot consume the following AOE questions:
76691-5 - Gender identity
SR0001-What is the gender of their sexual partners
A MAVEN software release is required for their integration into a question package.
We are in the requirements gathering phase for an upcoming release, but there is no projected go live date as yet.
Thus, we are requesting that 76691-5 and SR0001 be temporarily filtered out from our ELR feed, until we can successfully accept these AOE questions.
Do send me any questions or concerns.
Best regards,
Samorga"

initial feedback received. Mass asked to move forward with testing plan

Mass approved us to move forward with testing production data


feat(frontend/settings): add customisable hotkeys

Subject
Adds customisable hotkeys
Changes
I found the thread below hard to work against, so I've consolidated it here:

[x] Prevent unusable hotkeys from being assigned
[x] Reserve "highly safe" hotkeys
[x] Inform user of invalid recorded hotkey
[x] Investigate hotkeys when info modal is open
[x] Fix being able to assign reserved hotkeys
[x] Disable shift-f or even any shift-solo keys
[ ] Zoom in and Zoom out
[x] Fullscreen controller toggle does not check whether toggle controller is toggled
[ ] Reserve Navigator hotkeys
[ ] Prevent reuse of subsequences from beginning

Linked issues
Closes #176, Closes #426
Before
N/A
After

Tests

Shift + any key as a modifier => deliberately ignores
Modifiers only => deliberately ignores
Maps to cmd on Mac
Required hotkeys are not removable or corrupted

TTR
Probably closer to 13 hours, but did not track properly.
Reviewers
@bhajneet

I cannot use the following hotkey combos:

ctrl w (closes window)
ctrl r (refreshes window)
ctrl m (minimizes window)

The following can be used but are already hotkeys:

ctrl a (selects all text)
ctrl - (minus text size)
ctrl shift = (plus text size)
ctrl 0 (resets zoom)

The following are reserved/taken, but don't work as intended perhaps:

ctrl q (does not quit app in settings window, does work in other windows -- btw this is a bit too easy to hit, no? perhaps it should be ctrl shift q)
ctrl g (goes to search when there is no history/navigator available, instead it should do nothing, reproduce by going to bookmarks and typing ctrl g on fresh open of shabad os)
ctrl , and ctrl p open new settings windows. I'm not sure there is a use case for multiple settings windows as there is for multiple controllers

The following are hotkeys I don't think need to be set:

ctrl shift x (duplicate of ctrl x)
ctrl shift h (duplicate of ctrl h)

I'm guessing some of these are because of dev. In the off chance they are not: Reserve all the hotkeys in first two lists and don't allow deletion of them or for them to be assigned elsewhere.
I cannot test mac, but I'm curious how some of these work with their hotkeys. I think cmd h is used to hide windows, what do we do to hide the controller vs hide the app on macOS?

Hotkey recording broken after shift+f (no actual hotkey after that is recorded). Better would be to tell the user yes, you typed shift+f but we don't allow that. ("Taken by reserved hotkeys list" or something).

Lol:

This sequence actually worked, however it also triggered all the "jump to" hotkeys in the navigator for longer shabads...
Perhaps all sequences should require safe modifiers? Ctrl+C Ctrl+D Ctrl+K etc. Note this sequence also takes me to history and copies it from there:

Reserve highly considered "safe" hotkeys like up and down arrow keys, space for autoselect, enter / return to select line. These are very critical to reserve. I would argue reserving b, page up, page down, esc, ctrl+shift+b are also key for using presenter/projector remotes.
Though I'm impressed this didn't break search much:

Ctrl+X, Ctrl+H shows blank screen even if line is activated. Clicking on blank area will advance line. I think there might be an out-of-scope issue open for this. Need to check before creating an issue out of this comment.

Side note, I cannot copy with the pop over, but the hotkey works for all lines haha:

The second one will not work after the first one:

Ctrl Shift A is broken. Until I unfocus and refocus entire electron window. Happens with other Ctrl Shift  hotkeys as well.
This doesn't happen with ctrl+shift+b for esc (reserved)

I shouldn't be allowed to re-use a reserved hotkey... Wonder what will happen!

(It just escapes the screen, it doesn't quit the app haha)

Side note, I cannot copy with the pop over, but the hotkey works for all lines haha:

That is because it is a Bani and #500 will make it happen

btw @Harjot1Singh react-hotkeys has problems with hotkeys that being with alt

I cannot use the following hotkey combos:

ctrl w (closes window)
ctrl r (refreshes window)
ctrl m (minimizes window)

The following can be used but are already hotkeys:

ctrl a (selects all text)
ctrl - (minus text size)
ctrl shift = (plus text size)
ctrl 0 (resets zoom)

These all are dev-only, except ctrl-a. Would you like to disable these anyway, since they apply in the browser?

Ctrl+X, Ctrl+H shows blank screen even if line is activated. Clicking on blank area will advance line. I think there might be an out-of-scope issue open for this. Need to check before creating an issue out of this comment.

Not sure I can see what's going on here, appears to work for me.

...
These all are dev-only, except ctrl-a. Would you like to disable these anyway, since they apply in the browser?

I think it would be nice to use zoom in and out in prod as well, have had a couple people ask about changing font sizes for navigator

ctrl shift h (duplicate of ctrl h)

This exists purely because in-browser, ctrl-h => history.

Okay, no worries on this

Ctrl+X, Ctrl+H shows blank screen even if line is activated. Clicking on blank area will advance line. I think there might be an out-of-scope issue open for this. Need to check before creating an issue out of this comment.

Not sure I can see what's going on here, appears to work for me.

See here for example (notice the background)

Side note, I cannot copy with the pop over, but the hotkey works for all lines haha:

Seems to work for me btw, unless I misunderstood how to reproduce.

Seems to work for me btw, unless I misunderstood how to reproduce.

I think he meant that you can copy with hotkeys but you cannot press the copy button in popover. Don’t worry about this (we have separate issue in tracker)

Prevent unusable hotkeys from being assigned
This is still incorrect. Go to the "open a new controller" hotkey, and assign a new one as Ctrl+F and it will say this is already assigned. However, because you can combo hotkeys, I can then do Ctrl+C (total hotkey chord becomes Ctrl+F, Ctrl+C) and this is allowed. Now in usage, if I do Ctrl+F it will fullscreen the window and then if I do Ctrl+C afterwards it opens a new controller.
This also causes lots of issues:

If a hotkey is being used as part of a chord, it must be used only as part of a chord. If a hotkey is used at the end of a chord or as a singular hotkey command, it cannot be used as part of a chord
Reserve "highly safe" hotkeys
Enter and Return are highly safe hotkeys, lol
Disable shift-f or even any shift-solo keys
What about this? I removed the hotkey and now I cannot re-assign it.

Also being able to assign these hotkeys on their own will mess with navigator (I assume)

Sequenced hotkeys appear to muck up shorter sequences: https://github.com/greena13/react-hotkeys/issues/219 and https://github.com/greena13/react-hotkeys/issues/255.
Resolving.

https://github.com/tntmarket/roam-toolkit/pull/2 is a great reference to resolve many of the issues we are also having

1 semi-serious limitation/bug remaining - if you carry on holding a modifier key after a hotkey has completed, it will not work again unless you focus away and back. Will try to resolve.

For notification purposes, I've removed myself from review until you're finished with the remaining fixes

@bhajneet

Prevent unusable hotkeys from being assigned
This is still incorrect. Go to the "open a new controller" hotkey, and assign a new one as Ctrl+F and it will say this is already assigned. However, because you can combo hotkeys, I can then do Ctrl+C (total hotkey chord becomes Ctrl+F, Ctrl+C) and this is allowed. Now in usage, if I do Ctrl+F it will fullscreen the window and then if I do Ctrl+C afterwards it opens a new controller.
This also causes lots of issues:

If a hotkey is being used as part of a chord, it must be used only as part of a chord. If a hotkey is used at the end of a chord or as a singular hotkey command, it cannot be used as part of a chord
Put another way:

Chord hotkeys cannot be hotkeys in and of themselves, they can only be used as part of a trigger / sequence to an end hotkey combo
The last key combo in a sequence or a single combo used as a hotkey cannot be used anywhere else, and definitely not as part of a sequence/chord.

Why not just prevent starting sequences being reused?
Case 1:
Action 1: ctrl+c g
Adding Action 2: ctrl+c <= Unassignable, since ctrl+c matches action 1 already
Case 2:
Action 1: ctrl+c g
Adding Action 2: g <= Ok, since does not match any sequence from the beginning. Keys also will not conflict, since if ctrl+c has been pressed, will wait for g or any other key and not trigger action 2.
Case 3:
Action 1: ctrl+a ctrl+c
Adding Action 2: ctrl+a ctrl+c d e f g <= fails, since we have a matching starting sequeunce
Adding Action 3: ctrl+c ctrl+a ctrl+c <= ok, since action 3 is not a subsequence from the beginning of any previous hotkeys
Adding Action 4: ctrl+a <= fails, since a subsequence of action 1
This way, no conflicts could ever happen, and it's logical/intuitive. What do you think?

Disable shift-f or even any shift-solo keys
What about this? I removed the hotkey and now I cannot re-assign it.

Did you want to reassign these mappings?

Why not just prevent starting sequences being reused?

The logic is sound, go for it

Did you want to reassign these mappings?

I want them to be locked/permanent (non-removable), so then a user will not be in a situation where they are unable to "fix" them since shift keys are not allowed (afaicr)

@bhajneet

Did you want to reassign these mappings?

I want them to be locked/permanent (non-removable), so then a user will not be in a situation where they are unable to "fix" them since shift keys are not allowed (afaicr)

So we are still having shift+ hotkeys, but users cannot assign any. FYI, the shift+ hotkeys do not work when in search, which I believe is why we disabled them in the first instance.

Please test @bhajneet @saihaj


RROR: Could not build wheels for ed25519-blake2b, which is required to install pyproject.toml-based projects

Hi mate.
Thq for your projectbut i need your help.
Looking many topics and forums in google but nothing help me.
Now i must ask you.
install gcc
install sqlcipher
upgrade setuptools
upgrade wheel
upgrade pip
cloning repo
when installing requiremets have that issue:
Building wheels for collected packages: ed25519-blake2b
Building wheel for ed25519-blake2b (setup.py) ... error
error: subprocess-exited-with-error
× python setup.py bdist_wheel did not run successfully.
│ exit code: 1
╰─> [7 lines of output]
UPDATING build/lib.linux-x86_64-cpython-39/ed25519_blake2b/_version.py
set build/lib.linux-x86_64-cpython-39/ed25519_blake2b/_version.py to '1.4'
src/ed25519-glue/ed25519module.c:17:10: fatal error: Python.h: No such file or directory
17 | #include "Python.h"
|          ^~~~~~~~~~
compilation terminated.
error: command '/usr/bin/x86_64-linux-gnu-gcc' failed with exit code 1
[end of output]
note: This error originates from a subprocess, and is likely not a problem with pip.
ERROR: Failed building wheel for ed25519-blake2b
Running setup.py clean for ed25519-blake2b
Failed to build ed25519-blake2b
ERROR: Could not build wheels for ed25519-blake2b, which is required to install pyproject.toml-based projects

Hi, what linux distribution are you using? Do you have a C++ compiler like gcc installed?
https://stackoverflow.com/questions/21530577/fatal-error-python-h-no-such-file-or-directory

Im using tails and yes gcc installed

Have you tried this command?
sudo apt-get install python-dev

Yes this command help me :)
Bro how can i contact you, i have business offer or add me https://t.me/didluh

@donpon34343, I sent you a text message on Telegram


feat: support multiple environment caching

See https://github.com/Flagsmith/flagsmith-js-client/pull/246

@oluizcarvalho This is published under<EMAIL_ADDRESS>

@oluizcarvalho This is published under<EMAIL_ADDRESS>
Excellent, I'm going to test it in my projects.

@oluizcarvalho This is published under<EMAIL_ADDRESS>
Excellent, I'm going to test it in my projects.

@oluizcarvalho Could I confirm everything's going well with this ? I'd like to publish a release with this soon 🚀

@oluizcarvalho This is published under<EMAIL_ADDRESS>
Excellent, I'm going to test it in my projects.

@oluizcarvalho Could I confirm everything's going well with this ? I'd like to publish a release with this soon 🚀

Yes, I finished the tests.
I noticed that in this documentation we mention the old key that will be replaced.
All tests were successful with two different keys being used in the same browser.
I haven't tested the scenario of having two identical keys with different instances in the same browser, but I don't think it would be a problem either.

@oluizcarvalho This is published under<EMAIL_ADDRESS>
Excellent, I'm going to test it in my projects.

@oluizcarvalho Could I confirm everything's going well with this ? I'd like to publish a release with this soon 🚀

Yes, I finished the tests.
I noticed that in this documentation we mention the old key that will be replaced, it would be interesting to change.

Yep we can do that our end!

All tests were successful with two different keys being used in the same browser.

Amazing work!

I haven't tested the scenario of having two identical keys with different instances in the same browser, but I don't think it would be a problem either.

Actually I can maybe think of 1 case, if one instance was identifying and the other wasn't, the api responses would combat cache.

I've been thinking about this more and I think the cache key should have the identity name in it, it makes sense we do this as part of the same release

I've been thinking about this more and I think the cache key should have the identity in it, it makes sense we do this as part of the same release

Since it is a major version, I think it makes sense to include this other solution together. I still can't understand how it would work, but I imagine that you wanted to make the cache key as
prefix_default + envId + userId(optional)
I believe that it wouldn't be that complex to adapt, but if a lot of restructuring is needed, you could separate it into a new issue, since today customizing the cache key seems to be a way to solve the scenario

Hey @oluizcarvalho I'll take a look at how difficult this would be today, though I agree RE the custom key. The aim will be to do a release today 👍

Considering this more, I think we should keep behaviour as it is for now since it could be desirable to retrieve identity cache when an identity isn't provided.


Control of RTCPeerConnection

The user application alone has the full control over the RTCPeerConnection instance. It is probably necessary to use the RTCPeerConnection instance shortly during hanover.
@dbrgn Can you review and check if I missed a section?

Looks good to me.
See https://github.com/saltyrtc/saltyrtc-task-webrtc-java#usage for current API.


False warning that Vessel section was left blank

The mandatory data has been filled in and so this shouldn't raise a warning when submitting

Not reproducible


LocalEvaluation + Puma with Worker Processes Requires Reconnect

I set up AmplitudeExperiment with LocalEvaluation in a Puma environment, calling #start on the client during Rails initialization.
Expected Behavior
Each worker process is able to see updates to flag configuration or error is logged alerting you to dead polling thread and potentially stale results.
Current Behavior
No errors are raised, but the flag configurations are not updated after processes fork and so the flag configurations become stale even though logs show polling behavior happening.
It appears to be that the polling thread is dead when logging from the worker, but the thread is still active in the main process and logging updates (with the logger fix from #38) , which is misleading.
Captured below - we see a fetch of flagVersion 17 but then a few seconds later when inspecting the experiment client we see it is stuck at 16 and poller_thread shows status of dead in the inspect:

08:26:11 web.1    |
08:26:29 web.1    | [Experiment] Fetch flag configs: [....,"flagKey":"initial_test","flagVersion":17,......]
08:26:33 web.1    | Started GET "/health" for ::1 at 2023-05-22 08:26:33 -0700
08:26:33 web.1    | Processing by HealthController#index as HTML
08:26:33 web.1    |   ↳ app/controllers/health_controller.rb:5:in `index'
08:26:34 web.1    | #<AmplitudeExperiment::LocalEvaluationClient:0x000000010fc25ed8 @api_key="server-,...", @config=#<AmplitudeExperiment::LocalEvaluationConfig:0x000000010fc26018 @debug=true, @server_url="https://api.lab.amplitude.com", @bootstrap={}, @flag_config_polling_interval_millis=30000>,
@flags="[{.... \"flagKey\":\"initial_test\",\"flagVersion\":16,...",
@flags_mutex=#<Thread::Mutex:0x000000010fc0cac8>,
@logger=#<Logger:0x000000010fc0ca50 @level=0, @progname=nil, @default_formatter=#<Logger::Formatter:0x000000010fc0c988 @datetime_format=nil>, @formatter=nil, @logdev=#<Logger::LogDevice:0x000000010fc0c898 @shift_period_suffix=nil, @shift_size=nil, @shift_age=nil, @filename=nil, @dev=#<IO:<STDOUT>>, @binmode=false, @mon_data=#<Monitor:0x000000010fc0c820>, @mon_data_owner_object_id=64200>>, @fetcher=#<AmplitudeExperiment::LocalEvaluationFetcher:0x000000010fc0c640 @api_key="server-Xz4ocdyihcxoSRvSeaJZiwdQEBWdUFri", @uri="https://api.lab.amplitude.com/sdk/rules?eval_mode=local", @debug=true, @http=#<Net::HTTP api.lab.amplitude.com:443 open=true>, @logger=#<ActiveSupport::Logger:0x000000010f3d8c80 @level=0, @progname=nil, @default_formatter=#<Logger::Formatter:0x000000010f3e17e0 @datetime_format=nil>, @formatter=#<ActiveSupport::Logger::SimpleFormatter:0x000000010f3d8ac8 @datetime_format=nil, @thread_key="activesupport_tagged_logging_tags:64240">, @logdev=#<Logger::LogDevice:0x000000010f3e16a0 @shift_period_suffix="%Y%m%d", @shift_size=1048576, @shift_age=0, @filename="/Users/david/pathstream/intake/log/development.log", @dev=#<File:/Users/david/pathstream/intake/log/development.log>, @binmode=false, @mon_data=#<Monitor:0x000000010f3e1628>, @mon_data_owner_object_id=59680>>>,
@is_running=true,
@poller_thread=#<Thread:0x000000010fc64de0 /Users/david/.rvm/gems/ruby-3.1.3/gems/amplitude-experiment-1.1.0/lib/experiment/local/client.rb:83 dead>>

Possible Solution
Either documentation to describe how to achieve expected behavior (you must call #start after process fork), or better handling of this case to automatically achieve desired behavior (example from Redis client watches a cached @pid variable to detect a fork: https://github.com/redis-rb/redis-client/commit/bec4931c952b6196c76977356238dbaf4f2e1293 )
Environment

SDK Version: 1.1.0
Language Version: 3.1.3

Hi @therabidbanana sorry for missing this issue.
Could you validate that my warning in PR #42 is accurate?

That sounds right - added a comment with a bit more detail.

Thanks! I'll keep this issue open to track that this still needs to be updated.


Initial support for intergroup variable references

This PR adds the following:

a new struct defining a "variable reference" to deployment variables or to the output values of other modules
unit tests for a function introduced in #828

The unit test increases coverage by 0.1% and serves to enforce the syntax of variable references.
This PR anticipates future work adding functionality to expandSimpleVariable which will allow it to properly resolve intergroup references. Current feature branch (link may not live forever).

[X] Is unit test coverage still above 80%?
[X] Have you updated all applicable documentation?
[X] Have you followed the guidelines in our Contributing document?

If you agree with my comments then make tasks and resolve and merge. If you disagree then maybe more discussion.


Flutter support

🤔 Expected Behavior

😯 Current Behavior

💁 Possible Solution

🔦 Context

https://crates.io/crates/flutter_rust_bridge

💻 Examples

One of the many downsides of 3rd party map rendering frameworks is the ability to include platform views into the map.
Let's say we are running on iOS then it would be nice to have a custom marker that is backed by a UIView.
Same goes for Flutter. Something that was frequently requested in the google maps flutter sdk was the ability to create flutter widgets as markers.
If we add support for adding native views as map elements, then we might be able to support flutter widgets as well because we should be able to render specific widgets into an android surface or texture view.
I would love to get your feedback and thoughts on this @maxammann

yes, absolutely. The differenciation between, SDK views (UIView, DOM element) is a tough topic.
You definitely want to use SDK views where ever possible actually. But that comes with a high development cost, because you then need to develop the feature X times (web, android, iOS, desktop).
But like you said: If we support flutter, then we might be able to render close-to-native views on top of the map easily.
That being said, a downside is that flutter might become a dependency. If that is the case, then large corporations like Meta might have issues integrating maplibre-rs due to a large (in size and count) dependency tree.

Shouldn't it be "easy" to avoid the dependency to flutter (or any other framework) in maplibre-rs?
Let's say someone wants to use maplibre-rs for flutter, then we would provide a dart package that has (ffi?) bindings for maplibre-rs and it also takes care of giving us a simple widget that we can use.
Same goes for an android lib that provides a kotlin interface and a android.View.
Afaik maplibre-rs needs a surface to paint to and this will be provided by the platform view in all cases, right? For a marker we can do the same thing. Give maplibre-rs a surface for a marker and additionally render the platform view in the marker surface as well?
Correct me if I am wrong, I am pretty new to this topic but I would love to learn more about it and contribute to the maplibre-rs flutter sdk once its possible.

I think we need to concertize what we want to achieve. I'm a little bit lost on what we want to achieve.
The maplibre could already provide callbacks which then trigger e.g. the movement of a native android.Button.


Fix deletion of aliases that use WITH

The view type for the WITH was getting added to the schema but not
deleted. Avoid adding it.
Fixes https://github.com/edgedb/edgedb/issues/5987.

Bizarre, the tool picked up the wrong commit message for the description!

Bizarre, the tool picked up the wrong commit message for the description!

It was happening to me with hub a bunch, gh seems to not do this.


Add "destructors" for CanvasElements and improve event handler

Currently the event manager (rkviewer.canvas.events) has no garbage collector, meaning bound handlers could not be removed from the list of handlers once added. This is restrictive, since the programmer would not be able to bind handlers inside CanvasElements, which are transient (deleted every controller update).
To achieve this, need to refactor bind_handler() to accept an additional target parameter of type CanvasElement. Supposedly this is the "target" of the event, and the handler should be valid only as long as target lives.
Now Python does not have destructor methods, and the closest thing one has is the context manager. So the solution is to add a close method (or equivalent) to the CanvasElement base class and call that manually in Canvas. The close method should be manually patched by the event manager to trigger the handler to be deleted, when it is called.

Done.


[3.0] org.apache.dubbo.* add serialization whitelist

What is the purpose of the change
fix #8422
Brief changelog
Verifying this change

Checklist

[x] Make sure there is a GitHub_issue field for the change (usually before you start working on it). Trivial changes like typos do not require a GitHub issue. Your pull request should address just this issue, without pulling in other changes - one PR resolves one issue.
[ ] Each commit in the pull request should have a meaningful subject line and body.
[ ] Write a pull request description that is detailed enough to understand what the pull request does, how, and why.
[ ] Check if is necessary to patch to Dubbo 3 if you are work on Dubbo 2.7
[ ] Write necessary unit-test to verify your logic correction, more mock a little better when cross module dependency exist. If the new feature or significant change is committed, please remember to add sample in dubbo samples project.
[ ] Add some description to dubbo-website project if you are requesting to add a feature.
[ ] GitHub Actions works fine on your own branch.
[ ] If this contribution is large, please follow the Software Donation Guide.

Codecov Report

Merging #8423 (e1858be) into 3.0 (78d9012) will decrease coverage by 0.13%.
The diff coverage is 50.00%.

@@             Coverage Diff              @@
##                3.0    #8423      +/-   ##
============================================
- Coverage     63.17%   63.04%   -0.14%
+ Complexity      312      310       -2
============================================
  Files          1102     1102
  Lines         46242    46198      -44
  Branches       6980     6947      -33
============================================
- Hits          29214    29126      -88
- Misses        13766    13784      +18
- Partials       3262     3288      +26

Impacted Files
Coverage Δ

...an2/dubbo/WhitelistHessian2FactoryInitializer.java
0.00% <0.00%> (ø)

...sian2/dubbo/DefaultHessian2FactoryInitializer.java
100.00% <100.00%> (ø)

.../remoting/transport/netty4/NettyServerHandler.java
56.81% <0.00%> (-13.64%)
:arrow_down:

...in/java/org/apache/dubbo/common/utils/JVMUtil.java
81.13% <0.00%> (-11.33%)
:arrow_down:

...e/dubbo/remoting/transport/netty4/NettyClient.java
62.31% <0.00%> (-8.70%)
:arrow_down:

...e/dubbo/remoting/transport/netty/NettyChannel.java
52.27% <0.00%> (-7.96%)
:arrow_down:

...mmon/threadpool/support/fixed/FixedThreadPool.java
80.00% <0.00%> (-7.50%)
:arrow_down:

...moting/transport/netty4/NettyEventLoopFactory.java
30.00% <0.00%> (-6.37%)
:arrow_down:

.../dubbo/remoting/transport/netty4/NettyChannel.java
60.39% <0.00%> (-5.95%)
:arrow_down:

...va/org/apache/dubbo/registry/RegistryNotifier.java
80.00% <0.00%> (-5.72%)
:arrow_down:

... and 40 more

Continue to review full report at Codecov.

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


Update eks version

Update the EKS version to 0.14.2 and all templates to release 28 templates from the manifest.
Start simplifying and tweaking the cloud init to fail less often.
My commit below says it installs k8s 1.25 by default now, but that isn't working. I think I should make that a separate PR now. This one will install 1.23.6.

We missed a few spots in the manual guide:
https://github.com/equinix-labs/terraform-equinix-metal-eks-anywhere#steps-to-run-on-eksa-admin
export EKSA_RELEASE="0.11.3" OS="$(uname -s | tr A-Z a-z)" RELEASE_NUMBER=20


Resting heart rate incorrect

The resting heart rate displayed in the clock face is not the one in the phone app.

Another attempt to fix in 0.4.0


Unexpected error in ordmapproperties.fst: Type name not found: total_order

../bin/fstar.exe ordmapproperties.fst

Unexpected error; please file a bug report, ideally with a minimized version of the source program that triggered the error.
Failure("Type name not found: total_order")

Same error in util.fst:
fstar.exe util.fst

Unexpected error; please file a bug report, ideally with a minimized version of the source program that triggered the error.
Failure("Type name not found: t")

Those errors do not exist anymore.
Closing.

A similar error in ulib/FStar.OrdMapProps.fst is still there.
I'm going to push a fix for this in a few minutes.


Use ResponsiveButtons API in lists audit

WHAT
Fix bugs in the screenshots for lists, and add a section padding before buttons.
WHY
Match the testcases.
HOW
Checklist :clipboard:

[ ] Add explicit visibility modifier and explicit return types for public declarations
[ ] Run spotless check
[ ] Run tests
[ ] Update metalava's signature text files

@luizgrp can you take a look again, seems this should be available outside dialogs.


Add 199 Binary Tree Right Side View

@sasa150  @FreeTymeKiyan  @JoannaCode  @xliu45  @hustldw @forest5013

Please do NOT merge every time, that makes the commit history very ugly.
You should create a new branch for a new problem. Old branches will be deleted.

ok, starting from next one .

Looks good

good

LGTM


前端报错

./src/styles/index.scss (./node_modules/_css-loader@1.0.1@css-loader??ref--8-oneOf-3-1!./node_modules/_postcss-loader@3.0.0@postcss-loader/src??ref--8-oneOf-3-2!./node_modules/_sass-loader@7.3.1@sass-loader/dist/cjs.js??ref--8-oneOf-3-3!./src/styles/index.scss)
Module build failed (from ./node_modules/_sass-loader@7.3.1@sass-loader/dist/cjs.js):
Error: Node Sass does not yet support your current environment: OS X 64-bit with Unsupported runtime (93)
For more information on which environments are supported please see:
https://github.com/sass/node-sass/releases/tag/v4.14.1

试试node14


Control modes

This PR adds aliases for actuator types of DART which we call control modes. @jbmouret I was thinking which control modes to provide to the user and I ended up with the conclusion that we should not provide any position control (either kinematic or dynamics with torques) as this would interfere with the control API. The user can use the step by step API to make a PID controller (they need to add one line of code!) and with the new functions they can change the control modes per dof/joint in a DART-free way (only by strings).

Couldn't the position control "mode" be a controller that we add? I do not think this is "one line" to have a PID controller for each joint of the Talos (including that we would have different PID values for different joints).
Also, this mode could be in the Talos class.
My general point of view is that simple things should be straighforward: moving a robot in position control should be the most straightforward thing to do.

Couldn't the position control "mode" be a controller that we add?

If you add a controller, then you can no longer use the set_commands; it gets overriden.

My general point of view is that simple things should be straighforward: moving a robot in position control should be the most straightforward thing to do.

If you put your robot in servo or velocity mode, then you only need a P value and no real tuning (especially for velocity the same small P value works for almost any robot -- of course with velocity, you have infinite torque; servos are similar and I never had issue with tuning them, using a single value for almost all robots).
So basically we can create an example with position control, explaining all the steps: (1) set robot in servo or velocity mode, (2) add the PDControl, (3) use only P values, etc... What do you think?

What I meant was that if I instantiate a controller:
Controller full_pid_controller;
robot.add_controller(&full_pid_controller);
and do my commands: full_pid_controller.set_position()...
Basically, this would be a predefined low-level controller that I can use for higher-level control.
About Velocity: I thought people (you? Pierre?) told me that Talos was not working in velocity mode and that we had to define our PD+ controllers?

What I meant was that if I instantiate a controller:
Controller full_pid_controller;
robot.add_controller(&full_pid_controller);
and do my commands: full_pid_controller.set_position()...
Basically, this would be a predefined low-level controller that I can use for higher-level control.

Yes.. This is how the control API works. OK. We should make an issue to create this example.

About Velocity: I thought people (you? Pierre?) told me that Talos was not working in velocity mode and that we had to define our PD+ controllers?

I never said this. The options are the following:

Velocity actuators means that no physical constraint is respected (no joint limits, no torque limits, no velocity limits), and the desired velocity is followed always (thus assuming infinite torque available to the motors)
Servo actuators are the same as velocity actuators but respecting all the physical constraints of the robot. The downside is that each servo is an additional constraint in the optimization loop of DART and thus making thing slower (if you do not have a very powerful machine).
Torque actuators are the most realistic ones as they are just simulating the forces in joint space. They are also the fastest ones since no additional computation is needed by DART; just forward dynamics (which is already computed). Of course one needs to properly tune the PID values of the low-level controller.

One of our goals is to provide a good simulators for our robots (Talos and others) that works 'out of the box': we do not want each user to fine-tune his/her talos simulation. We want a Talos/Franka/etc simulator. Like, I want to simulate the Talos but I do not want to think about force vs velocity vs servo. I just want 'something good and validated by the community'.
Then we can provide different options in the Talos/Franka/etc. class ("modes") but we should make it easy...

By the way, this is one reason to not like this control API ;)
To continue the conversation, I do not think our goal is to provide a library of examples.  20 lines examples are not simple: people (students, engineers, etc.) end up copy-pasting code that they don't understand "just because it was there". Ultimately, people code like it's magic, because they do not have time (and this is alright) to understand all the internal details of a library.
So... if I understand well, if I want to have the different position control modes in the Talos class, then the Talos class cannot use the control API (but this control API would be used internally to do the PIDs). This is fine with me, but this will prevent you from using this class since you like this control API (for reasons that I might understand one day...).
Any solution? I do not think examples for simple position-control is the way to go.

Question: what is
 // First 6-DOFs should always be FORCE if robot is floating base
    for (size_t i = 0; i < 6; i++)
        global_robot->set_actuator_type(i, dart::dynamics::Joint::FORCE);

(in the examples)

One of our goals is to provide a good simulators for our robots (Talos and others) that works 'out of the box': we do not want each user to fine-tune his/her talos simulation. We want a Talos/Franka/etc simulator. Like, I want to simulate the Talos but I do not want to think about force vs velocity vs servo. I just want 'something good and validated by the community'.

There is absolutely no way to get realistic physically-based and accurate simulation without having to tune something. The question is who to tune the simulation. In my mind, I let the user to tune it to their cases. In your mind, you want the community to tune it and provide it. I would not disagree with this option, but you need the community to tune the parameters. I suggest to use torque actuation then, and use the community to tune the PID values. If we have the tuned PID values, then the question is how to provide the tuned parameters and this is easy to do. We can also go with servo actuators as default where it is super simple to have stable P-values (we can then provide them in many different ways).

people (students, engineers, etc.) end up copy-pasting code that they don't understand "just because it was there". Ultimately, people code like it's magic, because they do not have time (and this is alright) to understand all the internal details of a library.

I tend to agree and disagree at the same time. I know that most of the students code like it's magic, but I do not agree that you need to understand all of the details of a library to not code like it's magic.
In the specific example, they will not even need to know the internal details of the library. Just how to code a PID.

if I want to have the different position control modes in the Talos class, then the Talos class cannot use the control API (but this control API would be used internally to do the PIDs).

No. You can still use the control API (it depends on the exact implementation). It's the other way around. If you use the control API, then it is not possible to use directly set_commands(). Because if you want high-level commands, the robot is not accepting this type of commands. You can of course do: controller->set_commands() or controller->set_parameters() (as it is now in the naming conventions).

This is fine with me, but this will prevent you from using this class since you like this control API (for reasons that I might understand one day...).

As I explained above, this is not the case. Also, I am getting a bit mixed signals from your side. From one point of view you do not want automated control API and you want to have set_commands(). On the other hand, you want to have a class Talos that works out-of-the-box with any control mode. If you go for the second option, then set_commands() is useless (and I am not talking about the specific implementation but generically since you would like to use the high-level control commands).

Any solution? I do not think examples for simple position-control is the way to go.

What I was saying is (maybe I did not phrase it correctly):

For someone that wants position control, the already implemented PDControl (for those that want to use the control API) or a simple macro/function that computes a P-controller is sufficient when using the servo actuators and set_commands(). We can make this crystal clear in the documentation and I said it'd be nice to have a example also. The tuning of this P-value is trivial and we can provide nice default values per robot that we support. Here's what it would look like (for the control API, the set_commands() version would be almost identical):

talos->set_control_mode("servo");
controller = PDControl(talos->get_servo_p_values());
talos->add_controller(controller);

while(true) {
    controller->set_commands(my_position_commands);
    simu.step_once();
}

If we really create separate classes for each robot that we support, then it could even be something like this:
talos->set_control_mode("position");

while(true) {
    talos->set_position_commands(my_positions_commands);
    simu.step_once();
}

(Similar codes can be shown for the rest)

For someone that wants to use pure torque control, they can use SimpleControl (control API) or just set_commands() with torque actuators. They can use any high-level controller (e.g., whole body inverse dynamics) in either case.
For someone that wants position control without the computational overhead of servo actuators, we need to provide tuned PD values and then they can use the PDControl (control API) or again a macro/function that computes a PD-controller and set_commands(). If you have someone to tune the PID values, we can provide nice values for each robot that we support again.
There is a fourth option to use velocity actuators and P-controllers, but this is identical to the servo-position control and will provide less realistic simulations. Could be good for someone doing only animation as it is much faster than using servo actuators.

To be honest, I am not sure how much easier we can make it than this. I do not know if this is what you had in mind, but this is what I meant.

Question: what is
 // First 6-DOFs should always be FORCE if robot is floating base
    for (size_t i = 0; i < 6; i++)
        global_robot->set_actuator_type(i, dart::dynamics::Joint::FORCE);

(in the examples)

This is left-overs from old code. I am literally writing right now a new branch for cleaning up those. But for the record, when you have a floating-base robot if you say that all degrees of freedom (including the base) have servo or velocity actuator type, then the robot stops being floating-base in the sense that you can directly set the velocity of the root joint (first 6 DoFs). In the previous version of robot_dart, when someone was doing robot->set_actuator_types(type), all dofs were overwritten. In the current version by default we do not overwrite mimic joints and the first 6 DoFs if the robot is floating-base (the user has to specify that he wants to overwrite those). But even this should be avoided with what I did in this PR. The user should now do: robot->set_control_mode("servo");.

There is absolutely no way to get realistic physically-based and accurate simulation without having to tune something. The question is who to tune the simulation. In my mind, I let the user to tune it to their cases.
In your mind, you want the community to tune it and provide it. I would not disagree with this option, but you need the community to tune the parameters.

I think the added value of something like robot_dart is in having simulations that are already well tuned so that we do not have to reinvent the simulator for each new project. The fully-flexible version is what Dart does: you can do whatever you want but you have to tune/choose many things.

I suggest to use torque actuation then, and use the community to tune the PID values. If we have the tuned PID values, then the question is how to provide the tuned parameters and this is easy to do. We can also go with servo actuators as default where it is super simple to have stable P-values (we can then provide them in many different ways).

I am open to all the options for 'realistic'/stable/fast position control...

people (students, engineers, etc.) end up copy-pasting code that they don't understand "just because it was there". Ultimately, people code like it's magic, because they do not have time (and this is alright) to understand all the internal details of a library.

I tend to agree and disagree at the same time. I know that most of the students code like it's magic, but I do not agree that you need to understand all of the details of a library to not code like it's magic.

What I mean is when the example is 20 lines long to do something simple, you simply copy-paste the example and you have no idea what each line does.

As I explained above, this is not the case. Also, I am getting a bit mixed signals from your side. From one point of view you do not want automated control API and you want to have set_commands(). On the other hand, you want to have a class Talos that works out-of-the-box with any control mode. If you go for the second option, then set_commands() is useless (and I am not talking about the specific implementation but generically since you would like to use the high-level control commands).

I am not sure to understand what you mean. We would like to be able to do:
Talos talos("torque");
//loop
talos.set_commands(...); //torque commands

Talos talos2("position");
//loop
talos2.set_commands(...); // positions

> * For someone that wants position control, the already implemented `PDControl` (for those that want to use the control API) or a simple macro/function that computes a P-controller is sufficient when using the `servo` actuators and `set_commands()`. We can make this crystal clear in the documentation and I said it'd be nice to have a example also. The tuning of this P-value is trivial and we can provide nice default values per robot that we support. Here's what it would look like (for the control API, the `set_commands()` version would be almost identical):
>
> ```c++
> talos->set_control_mode("servo");
> controller = PDControl(talos->get_servo_p_values());
> talos->add_controller(controller);
>
> while(true) {
>     controller->set_commands(my_position_commands);
>     simu.step_once();
> }
> ```

This is not bad, but I would like to hid the PDController.

> If we really create separate classes for each robot that we support, then it could even be something like this:
>
> ```c++
> talos->set_control_mode("position");
>
> while(true) {
>     talos->set_position_commands(my_positions_commands);
>     simu.step_once();
> }
> ```

Yes, this is what I mean. But that means having "set_position_commands" and "set_commands". Which is not very elegant... Or we do not use 'modes' and use set_torque_command, set_velocity_command, etc.

> * For someone that wants position control without the computational overhead of `servo` actuators, we need to provide tuned PD values and then they can use the `PDControl` (control API) or again a macro/function that computes a PD-controller and `set_commands()`. If you have someone to tune the PID values, we can provide nice values for each robot that we support again.

How big is this overhead? I have nothing against using proper servos if this is not unstable and not too slow... I was simply suggesting these PD controllers because this is what is currently used iCub & Talos. This is not necessarily the right approach (I did not do this...).

Yes, this is what I mean. But that means having "set_position_commands" and "set_commands". Which is not very elegant...

If we have a separate class for each robot that we support, it is possible to just do set_commands and not set_position_commands. Although to be honest I like when control commands are explicit, otherwise people tend to forget what values they send.

Or we do not use 'modes' and use set_torque_command, set_velocity_command, etc.

This is going to be complicated to actually implement. Because it would mean that you can change the control mode of each dof on the fly. I am not sure if we really want that.

How big is this overhead?

Loosely speaking, the running time of their solver is O(n^3) where n is the number of constraints (contacts, servo, joint limits, etc.). The more constraints you have, the more time it takes. Gladly, servo constraints are not as costly as contact constraints since they are easily satisfied, but still they do make the solver slower. I haven't really timed it, but we can.
DART also supports iterative solvers (that should be faster), but last time that I used them they were not working very well. It's been a long time though.
In any case, this PR is just creating an alias for set_actuator_type as to be DART-free. We should move the discussion on whether we should create separate classes for each robot that we support or not (if we do not have separate classes per robot, then the current state to my opinion is the easiest option without losing generality) to another issue.

So... what do we do? I think we do not have a clear consensus here.

either we do not set PD+force control as "a control mode" (which is OK if this is something we use very rarely and not the "default" way to control a robot in position) --- in that case we instantiate a special controller and do our stuffs
or we have an additional mode in some robot classes (e.g. Talos) that instantiate the PD/force with the right parameters, which is called using set_position_commands or something like this, but why not having this in Robot.cpp in that case.

I guess the true question is wether it is actually better to use the servo actuation for our robots (given that we want to have fast simulations). It is good that the servo joints do not have parameters to tune, of course.

I tried a small "benchmark":

Talos
2 joints are controlled (at 100Hz)
1000Hz for Dart
10 seconds simulation
collision: FCL

robot->set_control_mode("velocity");

=> 9.5 seconds (without a PID, but this should not change anything on the running time)
robot->set_control_mode("servo");

=> 20 seconds
Conclusion:

velocity mode = real-time
servo mode = 2 times slower than real-time!

So, yes, there is a large overhead.

So... what do we do?

I thought about it a bit and here are my thoughts:

"Control_modes" is not the best choice of words for what I am doing in this PR. I will change this PR to have better names.
I do not believe that providing a control_mode to the generic robot is easy to do. This is because we need to be generic (Robot is a very generic class) and it'll be difficult to catch all cases.
We can provide classes for specific robots and there we can have some kind of control modes. Because they will depend on the specific robots: e.g. a walking controller for a hexapod.

collision: FCL

I would avoid FCL. Go either for Bullet (they have a small memory leak, but maybe they fixed it) or if you have simple shapes, use DART's simple collision detector (I always convert everything to simple shapes for collision and use this one as it is the most deterministic one and the fastest one). FCL is super slow as it generates 5-6 contacts per pair of objects (sometimes even more!!!) and this makes it even slower for the simulation.

velocity mode = real-time

Velocity mode is ignoring all the physical limits. They are basically only kinematic joints: no joint limits, no torque limits, no other constraints. If you want to simulate realistic robotic setups, you should avoid velocity joints. They are intended for animation or simple verifications.

servo mode = 2 times slower than real-time!

This is normal for big robots like Talos; imagine that each servo motor is imposing 6-8 constraints to the solver. We can also trying to switch to an iterative solver, that is supposed to be faster, instead of the LCP one (that is the default one).

torque mode = 2 times slower than real-time (in that specific case)

This is weird. I guess this comes from the collisions. The speed should be almost the same with velocity actuators. I've benchmarked those quite a few times and they are more or less equivalent. So I guess this is coming from the collisions.

=> for maximum simulation speed, we should use velocity mode (which would be like a soft constraint in Dart). I need to test more for the torque mode, but it does not seem obviously faster.

As I said, velocity actuators are only for simple verification or kinematic animations. They are not intended for accurate physics simulation. Also torque-mode should be as fast as velocity actuators; try with a PID and you should be getting very similar run-times.
So overall my conclusion is that we should have torque mode with well-tuned PID controllers, and velocity mode for simple things and verification. In velocity mode it is also impossible to do inverse dynamics control (except if you convert the computed torque to positions or velocities, which is not that good to do), whereas in torque-mode you give this possibility.

I am fine to put this in robot-specific classes. However, don't we need similar things everywhere (besides de parameters)?

However, don't we need similar things everywhere (besides de parameters)?

Maybe. Let's try to see what exactly we need and how it needs to be implemented. If it can be generic, I am fine with putting it inside the Robot class. Although as a principle I would like to keep separated the control part from the robot part, but I can "put some water in my wine" if this can be very generic and it'll help people using the library.

With the Bullet collision this is much much slower once the robot hits the ground (like, it did not finish after 1 minute...).

However, don't we need similar things everywhere (besides de parameters)?

Maybe. Let's try to see what exactly we need and how it needs to be implemented. If it can be generic, I am fine with putting it inside the Robot class. Although as a principle I would like to keep separated the control part from the robot part, but I can "put some water in my wine" if this can be very generic and it'll help people using the library.

Do torque joints comply with joint limits/velocities/etc. ? If not, we need to add this in addition to the PD / SPD part.

Do torque joints comply with joint limits/velocities/etc. ?

Yes they do. This is the default and most realistic way of simulating robots in DART.

With the Bullet collision this is much much slower once the robot hits the ground (like, it did not finish after 1 minute...).

Good to know that they did not fix it yet.

@jbmouret I think this is ready to be merged.. Let me know if you have any issue/comment (we should handle the robot-specific control modes, etc. in a different PR).

Good for me!

@dalinel @PedroDesRobots Can you give me the iCub urdf/meshes that we use with Dart?

@jbmouret you can find here :
icub_description package : https://gitlab.inria.fr/larsen-robots/icub_description
urdf : https://gitlab.inria.fr/larsen-robots/icub_description/-/blob/master/urdf/icub.urdf

@PedroDesRobots and the xacro that corresponds to it? what do we need to take?

(btw. sorry, I thought this was the other pull request)


XNAT fails to upload output files from FastSurfer analysis

The FastSurfer analysis runs successfully now but there is still an issue with the output files. For some reason, XNAT fails to upload them (see screenshot), though they are present in the correct path (manually confirmed by sshing into the EC2 instance).

@davecash75, just continuing our conversation here to keep track.
Would you be able to deploy the xnat-aws infrastructure yourself and run the FastSurfer analysis to reproduce the error?
Steps needed:

Generate credentials

cd credentials
terraform init
terraform apply

Deploy infrastructure

cd ../provision
terraform init
terraform apply

Instal XNAT

cd ../configure
./install_xnat.sh

Set up example project
This can take quite some time to upload all data, but I would suggest just killing the script after the first dataset has uploaded

# still from configure/
./setup_xnat_project.sh

Run FastSurfer analysis

Run dcm2niix command on a T1 scan
Run Converts NIFTI to 256 conformed MGZ file
Run Run FastSurfer pipeline on a conformed T1 MGZ - CPU
Note that the FastSurfer pipeline can take about 2 hours

alternatively @davecash75 , do you have the Dockerfile (or image) that was used in the workshop last year? The only FastSurger image on the Health Biosciences Ideas docker hub had the incorrect tag (gpu rather than gpu-xnat) and was actually running pydeface rather than FastSurfer. So @milanmlft built a new image based on the latest fastsurfer image but now we're having the issue that the output fails to upload after the analysis is finished

Apologies - I can't find it on my laptop. @HChughtai  - might this image/container still be on the machine we ran it on last year if it hasn't been rebuilt?
I'll keep digging to see if I can find anything. It might be on an old laptop.

Afraid not - that machine has been rebuilt since. It looks like the container is running and the expected outputs produced, so I doubt it's the image itself. More likely the command wrapper, file permissions somewhere or a timeout somewhere

Seems it was a memory issue after all... I used a larger EC2 instance with more RAM and configured tomcat and the Docker image to have higher max. memory settings, and now it works!

Feel free to try it out! I think this particular issue is solved now, so no need to dig further into it. But in any case it would be good to get some feedback on our setup in general. No rush though! 🙂


Fit Test: New RSP-500 PSU tray

This version is modified to make room for M4 socket head cap screws.
Files are in the unstable branch.

I don't have M4 socket caps to test with right now (they are coming), but the tray works fine. The only issue I had was that with fans(4010) mounted in the PSU tray area, the psu does not fit as it is longer than the LRS-350. It does fit fine with no fans mounted and probably doesn't need them as the rsp-500 has a fan built in it that moves a decent amount of air.

Thanks for checking! I'm going to hold this open until I can verify the socket head screws fit, just to be sure.
Re: the tray fit
The RSP-500 pretty much maxes out the space below. Since the fan up front blows out, I moved it forward to let the existing fan try and do the work (and try and leave more room at the back).
There's a work in progress to center the PSU fan exhaust on the fan holes, but that's still in planning.

I'm going to close this for now. CAD shows there's plenty of room for socket head screws and cereal's already made sure it fits.


Fix node versión not supported #124

Upgrade node version to v20 (It will be LST from 24 October)
Fix #124

I already made a fix

Upgrade node version to v20 (It will be LST from 24 October)

I made a mistake in previous pr as I don't know action don't support node18 and Anand merge it but I fix it use node16 on action and fix the build issue

Thanks @soker90  and @Zaid-maker!

This should be fixed in 70fca5e. Thanks for your contribution!


Removed "allow access"

Within the User risk policy blade, allow access on its own is not an option. Unticking "require password reset" automatically changes the policy to block. 'Allow access' on its own is not an available option to administrators.

@buzzyc : Thanks for your contribution! The author(s) have been notified to review your proposed change.

@buzzyc If you didn't select a risk (like low) in your policy, you would be allowing those with some level of risk to have access to resources.

#please-close


Binja crash - seg fault after toggling between two bndb tabs

Binary Ninja Version: 2.2.2549-dev, 920769a4
Platform: Ubuntu 20.04.1 LTS
Binja randomly crashes when the user (or plugin) moves focus between two (or more) tabs.
Steps to reproduce:

Open at least 2 bndb tabs in binja
Launch the attached sample_plugin
Observe the crash after a count of ~40.

If you are having trouble reproducing the crash, toggle to a new window (e.g. a web browser and then back to binja).

Note: I run binja while logging to a file. The log file does not have any information about the crash. The console that I launch binja from reports a
sample_plugin.zip
Segmentation fault.

Can you show the results of the stack at the moment of the crash? We have symbols we can sync it to.

Thanks for the excellent repro plugin! I was able to repro after 352 cycles.

Unfortunately, this looks like a QT bug and we're currently blocking on being able to upgrade due to some Visual Studio incompatibilities. In the meantime, if you really want to work-around this if we can identify which change in QT caused it you could back-port the patch and replace the version of QT we ship with as described at: https://docs.binary.ninja/about/open-source.html#building-qt
That said, our current plan is to wait for a version of QT that resolves both this issue and the VS incompatibilities.

Ouch: Waiting for QT to release a patch could be an indeterminate delay.
I have witnessed the bug with only a few tabs (<5) and a few toggles (<5).  I used in infinite loop in the sample plugin to make sure you could reproduce the issue.
If you will identify a version of pyside2 that does not have the issue I will be glad to try it, hopefully an older version still implements the UI that our plugin(s) code is built on.

This may be a long shot, but you might want to check your QT code for thread issues.  I recently fixed a bug in my plugin code where I was using a progress bar that crashed after a number of updates.  The fix was that I had to switch to using Signals and Slots instead of callbacks.

@bpotchik @psifertex   Has there been any change on this bug?  Is there a chance for a work around?

Looking at your script, it looks like you need to make sure that any actions you invoke through the action system need to run on the main thread. Update the line of your script which calls trigger_action to the following, and I believe your crash should go away.
execute_on_main_thread_and_wait(lambda : trigger_action("Next Tab"))

@bpotchik Your suggestion to modify the crash script does mask the issue.
However, the sample_plugin scrip (using trigger_action) is just to illustrate the issue.  My users are reporting this crash from human interactions (i.e. a human RE has multiple tabs open in binja, after manually toggling between a few tabs then binja crashes).  Their interactions are basic functions in binja.

If you have a plugin active that is invoking any actions through the action system that run as a result of switching tabs, that can potentially crash as well if not run on the main thread. I imagine this crash only happens with some plugin active?

Yes, we started seeing the crashes after using a feature of one of our plugins.  The plugin has a table of bndbs that when the user double clicks one of them then the plugin loads that bndb into binja and navigates to the desired address with:
`    def open_bndb_in_new_tab(self, file_path: str, fid: str, address: int):
try:
mainthread.execute_on_main_thread_and_wait(
lambda: UIContext.allContexts()[0].openFilename(file_path)
)
        # navigate to the target function.  Use a new thread so that we can wait on analysis to complete without hanging the gui
        self.navigate_to_address_thread = threading.Thread(
            target=self._navigate_to_target_address_thread,
            args=(fid, address,),
        )
        self.navigate_to_address_thread.start()

    except:
        print("Something went wrong when we tried to open the bndb in a new tab")

def _navigate_to_target_address_thread(self, fid: str, address: int):

    try:
        bv = self.get_current_bv()# note: race-condition: the current bv may not be the one we are aiming for...Very likely though as the open_bndb_in_new_tab thread just completed...

        cur_fid = getFileId.get_file_id_from_bv_original_filename(bv)

        if cur_fid != fid:
            print(f"The current fid '{cur_fid}' != target fid: '{fid}' so we can't navigate to address: {address}")
        else:
            # wait until the analysis is complete
            while bv.analysis_info.state != AnalysisState.IdleState:
                print("waiting for analysis to complete -> then navigate to address")
                time.sleep(0.5)

            print(f"navigate to address: {address} fid: '{fid}'")
            mainthread.execute_on_main_thread(
                lambda: bv.navigate(bv.file.view, int(address, base=16))
            )
    except:
        print(
            "Something went wrong when we tried to navigate to the target address"
        )

def get_current_bv(self) -> BinaryView:
    dock = DockHandler.getActiveDockHandler()
    if not dock:
        print(
            f"Could not get DockHandler.  Vector 35 Snippets plugin says this should not happen."
        )
        return None, None, None
    else:

        view_frame = dock.getViewFrame()
        if not view_frame:
            # no open views
            return None, None, None
        else:
            view_interface = view_frame.getCurrentViewInterface()
            bv = view_interface.getData()

            return bv

`
Now the user has 2 or more bndbs open in binja.  The bug usually occurs minutes later as the user manually switches between open bndb tabs.

Yes I see. The navigation action needs to occur on the main thread. That code is creating a new thread.

I create a new thread so that I can wait in case there is any analysis (e.g. from a new version of binja) but then I do the bv.navigate action inside a execute_on_main_thread() block.

Oh I see that now. The formatting was a little strange on first glance. What happens if you change the execute_on_main_thread call to a execute_on_main_thread_and_wait?

I changed my code to use execute_on_main_thread_and_wait for the bv.navigate step.  I don't see any change in behavior but the bug is difficult to reproduce.
The crashes do not appear to be related to the open/navigate steps as they usually happen minutes later when the user is manually switching between tabs or closing a tab.
How would the execute_on_main_thread_and_wait version of the navigate step relate to the crash?

I can confirm that the bug persists after changing to the execute_on_main_thread_and_wait block for the bv.navigate step.  I have reproduced the bug several times in the last hour.

It's been a while since the original post which was 2.2.2549-dev. Does this still occur on the latest dev (2.2.2576?)
Is there a chance this crash is being produced by a specific binary which is able to trigger this edge case? And if so can you share the binary? (Can also DM to me on slack)

I tested the stable and dev branch.  Crash persists on both.
I don't think the crash is related to any specific binary.  I will try to put together a binary set that I can share.

Also if you have a different plugin to try and repro that could help. The sample_plugin.zip provided above does not crash for me anymore after updating with the 'and_wait' version of the API.

I believe this may have been fixed in 2.2.2644-dev. I am unable to repro this issue anymore. If you are able to repro on the latest dev please reopen this issue.


finer-grained dependencies on futures crates

This lets users avoid building the unused futures-executor and futures-sink crates.

Interesting! Also, a note for tracking: ready! is being stabilised in the stdlib soon, so futures_util can be dropped at the cost of raising the minimum rustc dependency.

I need this. Can we merge this PR and publish a new version?


Additional Metrics

Is this a BUG REPORT, PERFORMANCE REPORT or FEATURE REQUEST?:
Feature Request
Need additional metrics exposed via discoverer:

upstream-services{cluster, tenant/namespace} -- (Number of upstream services, labeled by cluster and tenant/namespace)
replicated-services{cluster, tenant/namespace} -- (Number of services replicated to gimbal cluster labeled by cluster and tenant/namespace)
invalid-services{cluster, tenant/namespace} -- (Number of services unable to be replicated labeled by cluster and tenant/namespace)
upstream-endpoints{cluster, tenant/namespace,service} -- (Number of endpoints - meaning IP:Port - in the upstream labeled by cluster, namespace, and service name)
replicated-endpoints{cluster, tenant/namespace,service} -- (Number of endpoints - meaning IP:Port replicated to Gimbal cluster labeled by cluster, namespace and service name)
invalid-endpoints{cluster, tenant/namespace,service} -- (Number of endpoints - meaning IP:Port - unable to be replicated to gimbal labeled by namespace and service name)

@stevesloka is this something you or @alexbrand should tackle?
I tried an alternative path to grab these metrics from kube-state-metrics, but the data isn't there (label breakdowns).
I would think this would be helpful data to have for #72.  Assigning to v0.3 milestone, but willing to discuss relative priorities to other in-progress issues.

invalid-endpoints would be any endpoints that are unable to be synced for whatever reason.  The only reason I can think of at this point is if Endpoints must follow the same valid DNS name as Services.
upstream-services is the number of all services (or LBaaS) that exist that could be discovered.
replicated-services are the number of services/LBaaS that have been replicated/synchronized.
invalid-services is the total count of services that are unable to be replicated/synced due to any reason (right now, this is most likely due to invalid name from DNS perspective.)
For any backend that's being discovered:
count(upstream-services) = count(replicated-services) + count(invalid-services)

Thanks for the clarification! This also means these metrics are type gauge rather than counter.

I would think gauge is the appropriate metric type.


Not a problem, just a question.

Hello !
Is it possible to detect that a channel changes position on the Discord and specifically know the person who changed the position of that channel?
Thanks u so much

Copied from @MinnDevelopment: The github issue tracker is reserved for feature requests and bug reports. Your issue is neither and should be sorted out inside of our discord server. Go to JDA's guild to receive the needed help.

@caneleex please refrain from posting that without giving some answer as well...
Alternatively, just let Staff answer and we will post that whenever suitable
@MAKSHOUW detecting a position change is done via event listener. (CategoryChangePositionEvent, XXXChannelChangePositionEvent, XXXChannelUpdateParentEvent)
Finding out who changed it will probably require you to look through audit logs, unless there is a getter on the event (JDA can only provide data in the event that is actually sent from discord)


Create .config/anadi directory via install.sh

The tool expects to have $HOME/.config/anadi/ directory but its creation is user duty.
To help the user this creation should be done in install.sh script.

@Cereal84 hey I got the answer for that...so I added a simple line that creates the dir when running the ./install.sh because it only needs to be run one time


gulp wont run beacuse of gulp.series function is not defined

The boilerplate gives me gulp version 3.9.1, and if I'm correct that doesn't support gulp.series, right?
It complains about that anyway, it's undefined..
Then I installed gulp 4 and tried, in that case it complains again and says "AssertionError: Task function must be specified"
Then had to change
this -> gulp.task('default', ['build', 'watch']);
to that -> gulp.task('default', gulp.series('build', 'watch'));
Correct me if I'm wrong, but isn't the first one the gulp 3 way of doing it, and then gulp.series() is gulp 4 way of doing it?
Which version is this made for?
Am I missing something?

I started initially with gulp 4, but since it's not even out yet I have decided to switch back to gulp 3.9. If there are gulp.series leftover modules, that's a bug and needs to be fixed.

Alright! I Probably have time later to make a pr.
At the moment I had some problem with "ng-annotate" to run. The problem was that the first line in "app.js" had "<%= satellizer %>", I changed it to "sattellizer" and it worked.
Is there a reason it said "<%= satellizer %>" ? I guess that is a variable, if so, there does it come from?
Maybe off topic, but the reason I asking, I saw that you owned that repo as well. 😄
And it could help me make an pr.

@rickbrunstedt That's also a bug, although strangely enough, I haven't encountered it during testing. Basically, it's a string placeholder. If you have selected any Authentication checkboxes, "satellizer" string will be added to app module dependencies, otherwise it should be replaced with an empty string, i.e. "<%= satellizer %>" should go away regardless.
And you are right it's one of the angular modules I built two years ago for easier authentication process in AngularJS apps.


Cannot create new caption-this repository on Mac

When running the ./teach-class script, I get similar error both on Linux and on Mac:
http: warning: HTTP 404 Not Found

http: warning: HTTP 404 Not Found

Updating contents of README.md...
http: warning: HTTP 404 Not Found

jq: parse error: Invalid numeric literal at line 1, column 134
Done.
Updating contents of _config.yml...
http: warning: HTTP 404 Not Found

jq: parse error: Invalid numeric literal at line 1, column 129
Done.
Branch protection rules updated.
Creating issue: Add collaborators to this repo... Done.
Creating project: Caption Contest...
http: warning: HTTP 410 Gone

Done.
Creating project column: To do...
http: warning: HTTP 404 Not Found

Done.
Creating project column: In progress...
http: warning: HTTP 404 Not Found

Done.
Creating project column: Done...
http: warning: HTTP 404 Not Found

Done.
Creating project card: ...
http: warning: HTTP 404 Not Found

However, I don't get
jq: parse error: Invalid numeric literal at line 1, column 129
on Linux and the repo seems to get created without issues (even though I still get the http warnings).
On Mac, I only get an empty repository.
On my Linux system, jq is version 1.6, on Mac 1.7. However, I was unable to downgrade. Not sure if that is the source of the problem. I checked https://github.com/githubtraining/training-manual/tree/main/script#local-configuration and there is no mention of required version.

Trying to create a repository in the organization https://github.com/github-developer-training-school
I already deleted the repo I was trying to create using Mac.


ExtractEdges.py fails if annotations are numeric

Found this out when I accidently created my annData file using cluster index rather than name.

Hi there, we assumed that the input dataset was annotated, clusters with a cluster index is not informative for network analysis.


Add custom background line colour to TextEdit and remove marked lines

Separating this from my WIP branch as part of #31739
Added a way to set/get the background colour of a line, the background colour is now drawn on the minimap. This supersedes marked lines which have been removed.
During the process I cleaned up some duplicated theme loading code between each of the editors.
closes #34165
closes godotengine/godot-proposals/issues/987

Thanks!


Add\update containers

New SSZ containers
validator containers

[ ] BlobsAndCommitments
[ ] PolynomialAndCommitment

p2p containers

[ ] BlobsSidecar
[ ] SignedBeaconBlockAndBlobsSidecar

Updated SSZ containers
beacon containers

[ ] BeaconBlockBody

[ ] BeaconBlockBodyBuilder

[ ] ExecutionPayload
[ ] ExecutionPayloadHeader

Looks like validator containers are no more actual with this pull merged
https://github.com/ethereum/consensus-specs/pull/3038
one of the goals was to close this issue https://github.com/ethereum/consensus-specs/issues/3026

we may need structure for this tuple, but it doesn't have a name at the moment https://github.com/ethereum/consensus-specs/blob/dev/specs/eip4844/validator.md?plain=1#L48

That's implementation specific. I currently think we will pass around the "internal" version of blobsbundlev1 which I don't think it will be an ssz container.

Looks like validator containers ...

yeah, I haven't updated the issue after that pr was merged


Stylecop

added this. where relevant
added missing access modifiers
sorted using statements
fixed line spacing
renamed constants to use pascal casing
use auto-property where possible
remove unnecessary type declaration

@fassadlr oh yes, it's not finished by a long way.
This is just the first shot, more is coming.
I've taken care of these comments and removed all the underscores from fields and parameters, as well as the extra lines you noticed. For some reason, these didn't get picked up because of the ; that was lost in the middle of the file.

And the stylecop file has moved to the solution level.


Add missing ";" in SendGrid doc

@fashaikh : Thanks for your contribution to the Azure documentation! The author, @thinkingserious, has been notified to review your proposed change.

The change looks good. Thanks @fashaikh!


Unable to install using npm

npm install koa-hbs
Following are the logs that i have received, while running the above command.
540 verbose argv "/usr/local/bin/node" "/usr/local/bin/npm" "install" "koa-hbs"
541 verbose node v8.3.0
542 verbose npm  v5.3.0
543 error path /Users/XAM/liimex/portfolio/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/delegates
544 error code ENOENT
545 error errno -2
546 error syscall rename
547 error enoent ENOENT: no such file or directory, rename '/Users/XAM/liimex/portfolio/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/delegates' -> '/Users/XAM/liimex/portfolio/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/.delegates.DELETE'
548 error enoent This is related to npm not being able to find a file.
549 verbose exit [ -2, true ]

@mabdullah353 this is going to be an issue with either your local npm install or your environment on windows. unfortunately that's not something that's within the scope of this project. confirmed that the install is in fact working on windows 10 and mac os.

@shellscape  You are right it's problem with my local npm install.
I have removed the node_module folder and on reinstall it worked.
Thanks.


Support Topics and Subscriptions

Subscriptions are the bomb
In contrast to queues, in which each message is processed by a single consumer, topics and subscriptions provide a one-to-many form of communication, in a “publish/subscribe” pattern. Useful for scaling to very large numbers of recipients, each published message is made available to each subscription registered with the topic. Messages are sent to a topic and delivered to one or more associated subscriptions, depending on filter rules that can be set on a per-subscription basis. The subscriptions can use additional filters to restrict the messages that they want to receive. Messages are sent to a topic in the same way they are sent to a queue, but messages are not received from the topic directly. Instead, they are received from subscriptions. A topic subscription resembles a virtual queue that receives copies of the messages that are sent to the topic. Messages are received from a subscription identically to the way they are received from a queue.
By way of comparison, the message-sending functionality of a queue maps directly to a topic and its message-receiving functionality maps to a subscription

This doesn't sound like it'll be too much work if the lower-level send/receive mechanisms are the same.

@AndyCross can you have many receivers of a single subscription? so imagine you had ten instances of CloudAgent, would they need to each have a separate subscription to the topic or could they all receive on the same subscription?

They can all receive on the same subscription, the queueing semantics are the same. The magic is in the pubsub which happens behind the scenes before the subscription client tries to pop from the queue.
Addressing the correct subscription is often done algorithmically so you should probably just let consumers of cloud agent supply the subscription to read

From: Isaac<EMAIL_ADDRESS>Sent: ý31/ý01/ý2015 16:00
To<EMAIL_ADDRESS>Cc: Andy<EMAIL_ADDRESS>Subject: Re: [FSharp.CloudAgent] Support Topics and Subscriptions (#6)
@AndyCrosshttps://github.com/AndyCross can you have many receivers of a single subscription? so imagine you had ten instances of CloudAgent, would they need to each have a separate subscription to the topic or could they all receive on the same subscription?
—
Reply to this email directly or view it on GitHubhttps://github.com/isaacabraham/FSharp.CloudAgent/issues/6#issuecomment-72323329.


Indicators for the new 876 field should be spaces instead of zeroes

https://github.com/pulibrary/bibdata/blob/4c2f7b2df482af4ce3e9508683c1e3454601a48c/app/adapters/alma_adapter/alma_item.rb#L72

@christinach is there some place this should be tested?  If not it looks ok to me...

@carolyncole This is a new field we add and it should have spaces ' '  in the indicators. @mzelesky says it is wrong the way it is added with '0' in the indicators. We don't need to test it somewhere.

Currently it's being used in the barcode controller when Recap accessions the items.