Feedback for QnA Maker Best Practices and General Questions Regarding Knowledgebase Utterance Generation

The documentation I'm currently following: https://docs.microsoft.com/en-us/azure/cognitive-services/qnamaker/concepts/best-practices?tabs=v1
I've been working with Microsoft products and Azure services throughout the year and was considering using QnA maker for a company's online FAQ (the FAQ currently stands at hundreds of questions, but I'm trying a sample of 25 to see how it behaves). I've been following along with the documentation for QnA maker, and after trying to make a basic knowledge base of my own, some concerns came up and some general questions I wanted to ask here..
After having some unsuccessful answers to my own test queries from the knowledge base I created, I decided to simply take one of the built-in chit chat knowledge bases Microsoft already has and run some tests of my own to better understand how the product works. Unfortunately, this led to even more questions, and I'll share my results here.
In the following image, you'll see I ask the bot three nearly identical questions but receive entirely different results. While I understand that the chit chat knowledge base probably isn't robust enough, it does highlight some concerns with how utterances should be created in the knowledge base (specifically when it comes to overlapping terminology, the number of utterances for each QnA pair, etc).

The following three images further highlight the concerns outlined above, since adding essentially nonsense words to the query ('hey' and 'bot') lower the confidence score significantly. It should be pointed out that "who am I talking to?" is a phrase that exists in the knowledgebase while the other two are not.

I decided to use another product I'm familiar with (Luis) and created a simple bot using the Bot Framework Composer with the exact same utterances in the QnA knowledge base discussed above.

You'll notice these results are much more consistent and what I'd expect to see given how similar the utterances are.
Could you please help me better understand my findings and help answer some general best practice questions when it comes to QnA maker? Should I be avoiding QnA pairs with overlapping terminology? Should I be using Luis instead of QnA maker? Why am I seeing the confidence score lower so significantly when I'm adding such an inconsequential word as 'hey' to my utterance? How many utterances should I expect to create for each QnA pair to have consistent results from user queries? Could you tell me how the prediction differs between QnA maker and Luis so that I may better understand how to correct my knowledge base when I see test results like this?

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

ID: 3835d273-a77d-1dbc-193f-9cf929317a78
Version Independent ID: 306cd5e8-7bfb-b7d3-eb14-6dcb9e47979c
Content: Best practices - QnA Maker - Azure Cognitive Services
Content Source: articles/cognitive-services/QnAMaker/Concepts/best-practices.md
Service: cognitive-services
Sub-service: qna-maker
GitHub Login: @nerajput1607
Microsoft Alias: nerajput

@Trubzzz we'll review your feedback and get back to you shortly. Thanks.

@Trubzzz LUIS and QnA Maker solve difference problems. LUIS determines the intent of a user's text (utterance) while QnA Maker determines the answer to a user's text (query). Please review this detailed document to understand when to use either/both services. Hope this helps.

I understand this and have read the documentation, but this really doesn't address the concerns I illustrated here. I realize the chit chat knowledge base of yours that I used to highlight my points may not be robust enough for an actual implementation, but the examples and screenshots I've provided highlight some pretty big inaccuracies in how QnA Maker responds.
"Who am I talking to?" is a verbatim example utterance, and simple additions such as 'hey' and 'bot' have thrown the confidence score off by more than 60 points. Right now, in my current test implementation, I'm working with 25 FAQs pairs, but this number could easily hit 150-200. The reason I brought up Luis is I'm wondering if the NLP capabilities here would be more reliable for 200+ FAQs than QnA Maker.
Taking Luis aside for a minute, the root of my question comes from best practices when working with QnA Maker. The original screenshots I've provided are taken from testing an example chit-chat knowledge base provided by Microsoft that I was looking at to base best practices when creating my own QnA pairs. Can you address some of the inaccuracies I've listed here or address some more specific questions:

Why does adding "hey" to a phrase returns a different response from the bot when the root utterance "Who am I talking to?" exists in the KB already, and why is this confidence score lowered to 35?
How many utterances should I expect to create for each QnA pair to have consistent results from user queries?
Are there techniques (manipulating confidence score thresholds in Visual Studio code) or tools you recommend using (I've already looked into Active Learning, but this doesn't help with initial utterance creation in the KB until the userbase is able to get a hold of the FAQ and test themselves and we can approve their utterances).

@Trubzzz with QnA maker, you need to add as many alternate questions necessary to return the best answer. If you aren't sure of relevant questions or keywords, use Application Insights data to analyze queries so that you can enhance your knowledge base accordingly.
@nerajput1607 do you have anything else to add?


Share button for certificates

this is done. we just need to add the actual links and verbiage to them. the look good now.


Workshop about pull-from-upstream

As a follow-up of #1869 it would be great if we could have a workshop or even more workshops on how to set up and use pull-from-upstream.
Let's start with core-services team. And maybe record it and share the recording publicly. Or create a demo recording based on the workshop.

The offline workshop happened today in the Brno office and was quite successful :rocket:
We still plan to do a new round online and in public, but let's mark this as done and create a separate card for the next one.


Install prometheus/grafana for otel monitoring

Installed but needs to be configured.
Use the configuration from the Otel project. Please look in the config folder: https://github.com/opiproject/otel

@bhoutrosjh i completed this, can be done


Remove unneeded "./" prefix affecting error messages

I noticed this in the error in the commit message of https://github.com/rust-analyzer/rust-analyzer/pull/4739.
Before:
error[E0599]: no method named `initialize_finish` found for struct `lsp_server::Connection` in the current scope
  --> crates/rust-analyzer/./src/bin/main.rs:99:16
   |
99 |     connection.initialize_finish(initialize_id, initialize_result)?;
   |                ^^^^^^^^^^^^^^^^^ method not found in `lsp_server::Connection`

After:
error[E0599]: no method named `initialize_finish` found for struct `lsp_server::Connection` in the current scope
  --> crates/rust-analyzer/src/bin/main.rs:99:16
   |
99 |     connection.initialize_finish(initialize_id, initialize_result)?;
   |                ^^^^^^^^^^^^^^^^^ method not found in `lsp_server::Connection`

-   --> crates/rust-analyzer/./src/bin/main.rs:99:16
+   --> crates/rust-analyzer/src/bin/main.rs:99:16

bors r+


Unable to download plugins through gauge - wget or browser works fine

I suspect this has something to do with the networking configuration where I work, however when I run
$ gauge install java
I get error output like this:

2015/08/19 15:24:14 Downloading using wget => [wget --no-check-certificate http://raw.github.com/getgauge/gauge-repository/master/java-install.json -O /tmp/gauge_temp/java-install.json]
--2015-08-19 15:24:14--  http://raw.github.com/getgauge/gauge-repository/master/java-install.json
Resolving raw.github.com (raw.github.com)... <IP_ADDRESS>
Connecting to raw.github.com (raw.github.com)|<IP_ADDRESS>|:80... connected.
HTTP request sent, awaiting response... 301 Moved Permanently
Location: https://raw.github.com/getgauge/gauge-repository/master/java-install.json [following]
--2015-08-19 15:24:14--  https://raw.github.com/getgauge/gauge-repository/master/java-install.json
Connecting to raw.github.com (raw.github.com)|<IP_ADDRESS>|:443... connected.
HTTP request sent, awaiting response... 301 Moved Permanently
Location: https://raw.githubusercontent.com/getgauge/gauge-repository/master/java-install.json [following]
--2015-08-19 15:24:15--  https://raw.githubusercontent.com/getgauge/gauge-repository/master/java-install.json
Resolving raw.githubusercontent.com (raw.githubusercontent.com)... <IP_ADDRESS>
Connecting to raw.githubusercontent.com (raw.githubusercontent.com)|<IP_ADDRESS>|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 13399 (13K) [text/plain]
Saving to: ‘/tmp/gauge_temp/java-install.json’
...
2015-08-19 15:24:15 (331 MB/s) - ‘/tmp/gauge_temp/java-install.json’ saved [13399/13399]
15:24:15.108 [INFO] Installing Plugin => java 0.2.2
15:24:15.108 [INFO] Downloading Plugin... => https://github.com/getgauge/gauge-java/releases/download/v0.2.2/gauge-java-0.2.2-linux.x86_64.zip
15:24:25.713 [ERRO] java : Could not download plugin zip: Could not download File https://github.com/getgauge/gauge-java/releases/download/v0.2.2/gauge-java-0.2.2-linux.x86_64.zip: >Failed to resolve host..

If I then manually run wget :
$ wget https://github.com/getgauge/gauge-java/releases/download/v0.2.2/gauge-java-0.2.2-linux.x86_64.zip
The file downloads fine and I can install it manually with
$ gauge --install java -f=gauge-java-0.2.2-linux.x86_64.zip
I've tried this on Linux and I'm able to manually download the gauge-java zip file through Chrome too.
I'm not blocked, but it does appear that there's something different about the way gauge downloads the plugins (wget?).
This might be related to #110.

If wget command is available, Gauge simply does
wget --no-check-certificate <url> -O <targetFile>

From the logs, it is clear wget was not able to resolve host. Could you please confirm that there were no network issues on your side?

Thanks for the info. I tried wget --no-check-certificate ... -O somefile and that works for me from the command line.
Regarding network issues, I thought the same thing. But for me it fails 100% of the time through gauge and succeeds 100% of the time with wget on the command line, or a web browser.
Is there anything else different about how gauge kicks off wget?

There is nothing different. Gauge simply uses golang's exec.Cmd to invoke wget. It's the same as invoking the command via command line.

Our network guys say the same thing about the network config. It's a very odd side effect. In the mean time we're using wget. Thanks for your help!

In case this is still persisting, could you check your firewall settings? To see if gauge is allowed to access the network?

Our network admins tell me there are no such firewall settings and I'm not running a software firewall. There is something odd here, I'll reopen the issue if I have more info, but I can't really point you at anything right now.


Multi-line arrow-function expression body should not add line break after arrow in certain circumstances

Describe the bug
dprint-plugin-typescript version: 0.40.1
Input Code
colors.map(color => darken({
    color,
    opacity: 1
}));

Expected Output
colors.map(color => darken({
    color,
    opacity: 1
}));

Actual Output
colors.map(color =>
  darken({
    color,
    opacity: 1,
  })
);

Playground link
Adding a line break before the arrow makes a lot of code unnecessarily verbose with small expressions.
Thank you!

Another similar example from @declanvong:
https://dprint.dev/playground/#code/GYexAoDsFMHcAIDyAjAVuA3gKHr+BDALnlBABoc9ljl8AnCgXwEpmBuIA/language/typescript
foo(new Obj({
    a: foo,
    b: bar,
}));

Outputs:
foo(
    new Obj({
        a: foo,
        b: bar,
    }),
);

I agree with @WearyMonkey, arrow functions that return single expression should be able to be compacted as much as they can, the current behavior discourages the usage of higher order functions in cases like currying etc.:
const add = x => y => {
  return x + y
}

becomes:
const add = x =>
    y => {
        return x + y;
    }

which is less readable as the "y" is now in a different line than the "x" so harder to reason about.

my example:
const render = () => html`
    <div b="1 rd-4 gray-300">
        <button m-4 p-2 rd onclick="${addKid}">+</button>
    </div>
`

(html shouldn't go on next line)
Did not find any config to change this behaviour


Docs: migration to new error handling

When attempting to reproduce another issue, I brought one of my sample projects up to the latest version of Rusoto and the error handling needed to be changed.
The migration should be documented both in release notes in this repo and over at https://github.com/rusoto/rusoto.github.io for https://rusoto.org . 👍

Any documentation available on the new error handling for 0.38.0?

Nothing yet, no. 😿

This was done in https://github.com/rusoto/rusoto.github.io/pull/114 and is available on https://rusoto.org. 🎉


PHOENIX-6080: Add a check to Index Rebuild jobs to check region closi…

…ng before every inner batch

@kadirozde @swaroopak - see the reference counting mechanism in UngroupedAggregateRegionObserver.waitForScansToFinish, which is called by preClose and preSplit. (Also note that it takes a lock and holds it while waiting for scans to finish, and that the isRegionClosingOrSplitting flag is always accessed using that lock, so the calls to UARO.checkForRegionClosing() might be waiting on it.)
In the current PR, the split / close logic is divided between UARO and the IndexRebuild scanner, and the latter ideally shouldn't have to worry about that.
Wouldn't it be cleaner if, rather than passing the UARO to the IndexRebuild scanner, the UARO instead kept a reference to the rebuild scanner and sent it a kill signal in waitForScansToFinish()? Then all the places in this PR that are calling UARO.checkForRegionClosing() could just instead check if their kill flag was flipped, and shut down / send an exception as needed. We already have a reference counting mechanism, why not use it?

@gjacoby126, I am not sure if your suggestion improves something. Why should not IndexRebuidRegionScanner  be concerned or know about that a data table is splitting or closing? It directly works on regions, it knows region boundaries, it knows that it is running within a coproc, etc. Actually this bug is introduced because we removed the references to UARO from the IndexRebuidRegionScanner and ignored region split or close operations.

@kadirozde - Single Responsibility Principle. With this PR, the responsibility for handling closes and splits is spread between both UARO and the rebuild scanner. If someday we refactor UARO so that upsert selects and batch deletes have their own classes (which we really ought to do eventually), then we'd have to have special logic for splits / closes in 4 places.
In general, this class design of having both UARO having a pointer to the scanner and the scanner having a pointer to UARO is a code smell; it indicates the classes are too tightly coupled. It's better if the scanner doesn't know about UARO, or splits or other region operations, but just has a notion that it might be canceled by an external process. This puts the UARO in the position of a task manager, and the scanner as a task worker, with a clean separation between them.

The current design here also means that when reasoning about deadlocks and concurrency, you have to look at code in multiple classes, because the IndexRebuildRegionScanner has to grab a lock in UARO.

I do not see any relation between Single Responsibility Principle and what we are talking about. What we are talking about how IndexRebuildRegionScanner can use the functionality provided by UARO. There is no responsibility sharing in terms of detecting region closing and splits and actions to be taken after. In this PR, IndexRebuildRegionScanner scanner knows about UARO and uses the functionality UARO implements. You suggest that IndexRebuildRegionScanner should not know about UARO,  should not know about region close and splits, and should be instructed to stop its operation. However, it should somehow know magically what to do when it stops its operation. Sorry, that does not make sense to me. Making this implicit for the sake of decoupling and abstracting does not work in this case and there is no problem with the current client  /user (IndexRebuildRegionScanner) and server/provider (UARO) model used here as far as I see.

IndexRebuildRegionScanner doesn't need to know that it's in a bad state because the region is splitting or closing. It just needs to know that it's in a bad state, and to throw an exception. It's a scanner -- at a high level, it should understand open, close, and next(). Scanners and iterators don't usually close themselves, some external class does.
SRP says that each class should have one reason for existing, and one reason to change. Say HBase 3 adds a new event we'd want to stop the scanner for that's not covered by UARO.checkForRegionClosingOrSplitting().  On the other hand, if sending a close or kill signal to the scanner is UARO's responsibility, then adding a new region event just changes UARO, and the scanner doesn't change.
It's a cleaner separation of concerns. (And also makes this easier to unit test)

@gjacoby126, Now you are asking to complicate the current implementation for the sake of simplifying some minor testing. I still see that it will make things implicit and make the code harder to read. If you really want to still push this, then work with @swaroopak to implement it. I will review the change after that.

Simplifying the testing is a bonus, not the reason. Code classes should be highly cohesive and loosely coupled. Standard OO principles. :-) This change makes the rebuild scanner less cohesive and more tightly coupled to UARO.
I'm not really sure why (isClosed()) { throw new IOException("Some informative message") }, where isClosed() checks some AtomicBoolean local to the scanner, would be harder to read than a call to UARO.checkRegionClosingOrSplitting. It does add some bookkeeping to UARO, but it already has a spot for that in the waitForScanners method.
That said, I will not veto this patch as it is if you approve it, @kadirozde .


Plugin request for Buf Schema Registry - elixir-grpc

https://github.com/elixir-grpc/grpc

+1

I'm working on it as a custom plugin, will update if it gets available.

Please note that custom plugins are scoped to an organization (private only), which means only members of the organization can use the plugin.
If there's enough demand, we'll add this as a public Remote Plugin on https://buf.build/plugins for the community.

Yeah, I understand. But is this repo open for contributions, i.e. if we create a PR with the plugin would you accept it?

Also, on the same page, I'm struggling to make the docker image work, who or where can I ask for some help?

But is this repo open for contributions, i.e. if we create a PR with the plugin would you accept it?

Yes, we welcome contributions from the community. We provide feedback and ensure that the plugin can be integrated into our existing pipeline. You can find more information in the contribution guide.
However, please note that we do not accept all plugin requests as there is a maintenance cost for us.
Currently, we have not evaluated whether to add elixir-grpc/grpc or not. Although it has been mentioned a few times in the past, the number of requests for this plugin is significantly lower compared to the ones we have already published.

Ok, makes sense. We'll be implementing it in our org for now as a custom plugin, and potentially contribute and it's up to you then to decide to accept or not.
Thanks for the links.

We've dockerized quite a few plugins, so if it'd help I can put up a PR (within the next few days) for demonstration purposes to save you a bit of time.
If you're a paying customer, we'd be happy to help you out, and there's a contact page as well.

It would be great to see this plugin publicly available. Elixir might not be a mainstream language yet but it is gaining terrain quickly because it is a great language in a robust system (the BEAM). I'm not the only one saying that

This year’s results are now public! See them at Stack Overflow Developer Survey 2023
Some highlights:
Elixir moved up 2 spots in overall popularity, and Erlang moved up 1 spot
Elixir is the 2nd most admired [1] language right after Rust
Phoenix is the most admired web framework
Erlang is the 2nd most well paid technology, and Elixir is on the shared 5th place


Add Polytone

#1094

hoping to have this updated w/ gocodegen

Development is paused as @kakucodes is working on other projects. Returning to backlog.


Throw on incorrect property matchers usage

🚀 Feature Proposal
I'd like to propose a new behavior to recently introduced "snapshot property matchers" – throwing when the object values are not asymmetric matchers.
We should also link to the guide from expect.toMatchSnapshot docs to avoid confusion (regardless this request is accepted or not).
Motivation
I've seen this code in the wild:
expect(user).toMatchSnapshot({
  createdAt: 'mocked-date',
  id: 'gen-id',
});

Which doesn't make much sense (maybe it is sometimes, but not really), because the snapshot file is going to have this very information anyway, resulting in duplicating code and reviewing effort. Such code can easily be replaced with toMatchObject or toMatchSnapshot without property matcher.
Example
We could throw something like:

Snapshot property matchers are intended to use with asymmetric matchers.
For details on how to use it properly, see: https://jestjs.io/docs/en/snapshot-testing#property-matchers

Pitch
It's an update to core matcher.
cc @rickhanlonii

FWIW the current behavior was what was proposed but I agree that it makes sense to only allow asymmetric matchers now that it's better understood 👌

I like the current behaviour, if you have a big response from an api that you want to snapshot and the only thing that changes is a date, then you only need to specify the only field that changes.

@ellipticaldoor we would keep that but would add the requirement that you specify a matcher
const user = {
  name: 'Pete Davidson',
  createdAt: Date.now(),
  id: uuid(),
};

// BAD, properties must be a matcher
expect(user).toMatchSnapshot({
  createdAt: 'mocked-date',
  id: 'gen-id',
});

// GOOD
expect(user).toMatchSnapshot({
  createdAt: expect.any(Date),
  id: expect.any(String),
});


No schema files #159

Signed-off-by: Paul Bastide<EMAIL_ADDRESS>

do we really want to commit to keeping the DDL up-to-date in our docs?

do we really want to commit to keeping the DDL up-to-date in our docs?

Perfectly valid question... maybe teach questions/decision?

got it


Respect cache mode when loading external dependencies.

This line is part of #86960, but this seems to have quite a way ahead of it and I need it to fix the CI for #86973.
Also this might fix
https://github.com/godotengine/godot/issues/82830

This should also be done in the binary format if done here, the same code is used there with the reuse mode

Done

I think this change makes sense. I'd like more people looking into it, though.
One thing I'd like to point out is that, maybe, the editor is relying on the current behavior not to have to reload external resources when loading a scene:
https://github.com/godotengine/godot/blob/fb10e67fefb85af3b8f5abd30db561588d8456c6/editor/editor_node.cpp#L3857
If that were the case, we may need to add a mode, such as CACHE_MODE_REPLACE_ROOT_REUSE_OTHERS, but with a more compact name.

One thing I'd like to point out is that, maybe, the editor is relying on the current behavior not to have to reload external resources when loading a scene:
https://github.com/godotengine/godot/blob/fb10e67fefb85af3b8f5abd30db561588d8456c6/editor/editor_node.cpp#L3857
If that were the case, we may need to add a mode, such as CACHE_MODE_REPLACE_ROOT_REUSE_OTHERS, but with a more compact name.

On an n-th thought, if replace is meant to change the way subresources are loaded, I does make sense that the mode is jsut propagated.

The change seems to be far more critical than I thought it would be. Closing in favor of #88664.


use a one time downloaded gpg key

Better security: Installing or reinstalling apt gpg keys from URLs everytime
seems unsecure for me.

Merged.  Thanks!


Create subdirectory for serde_with

Move all the serde_with related files to the new serde_with directory.
This unifies the repository structure and should make it easier to add
new crates to this repo.

bors merge

bors r+


Update MoM-EE image to v1.5.1_1.10.0 in SI tests

Summary:

Update MoM-EE image to v1.5.1_1.10.0 in SI tests. Replaced max_tasks_per_offer parameter with max_instances_per_offer for 1.5 MoM-EE definitions

I tested it manually on a strict cluster and it works.


null vs NULL

'null' won't work in cpp/winrt, am I right? Seems NULL is required.

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

ID: 8ae1c7ac-0a5f-2801-7360-134e21ac4b91
Version Independent ID: db699579-ba8f-7d89-a1c7-cfa05e7743d3
Content: PointerRoutedEventArgs.GetCurrentPoint(UIElement) Method (Windows.UI.Xaml.Input) - Windows UWP applications
Content Source: https://cpubwin.visualstudio.com/DefaultCollection/windows-uwp/_git/winrt-api-build?path=%2fwinrt-api-build%2fwindows.ui.xaml.input.pointerroutedeventargs.yml&version=GBlive&_a=contents
Product: uwp
Technology: winrt-reference
Git Login: Karl-Bridge-Microsoft
Microsoft Alias: kbridge

Thanks @jevansAN. Unfortunately, the language selector only affects the syntax block and code snippets on a page. At this time, text content of the docs cannot be updated per the language selector and must be generic.


[vcpkg_configure_cmake] Pass CMAKE_DISABLE_SOURCE_CHANGES to all ports by default

This PR passes CMAKE_DISABLE_SOURCE_CHANGES by default to all vcpkg_configure_cmake() calls, which prevents any race conditions around parallel configure steps. It is disabled when passing DISABLE_PARALLEL_CONFIGURE, since this also removes the race condition.
Duplicate of #10999

/azp run


RegexCommandHandler does not handle multiline messages

Describe the bug
RegexCommandHandler does not handle multiline messages
To Reproduce

Create a simple handler like this:

@RegexCommandHandler("/test ?.*")
suspend fun addtopic(user: User, bot: TelegramBot, update: MessageUpdate) {
  println("test successful")
}

Send message

/test a

b
c

Observe that the message is not processed and there is no "test successful" in the log.
Expected behavior
The message is processed in this handler, and we can observe the message "test successful" in the log

Added options parameter for @RegexCommandHandler that helps to pass regex parameters to solve  similar cases


CAMEL-20888 - Remove Kotlin DSL

Release Note
NONE

@apupier I'd suggest that, before this change we introduce a deprecation notice as we are used to to with any feature we're willing to drop. Later we can remove the code.

the deprecation was announced with Camel 4.7 https://camel.apache.org/manual/camel-4x-upgrade-guide-4_7.html#_camel_kotlin_deprecation

@apupier I'd suggest that, before this change we introduce a deprecation notice as we are used to to with any feature we're willing to drop. Later we can remove the code.

the deprecation was announced with Camel 4.7 https://camel.apache.org/manual/camel-4x-upgrade-guide-4_7.html#_camel_kotlin_deprecation

Camel K is default to 4.4. Although the core deprecated this language some time ago, there was no Camel K. user that could have seen this. Next core default version will be likely 4.8. I suggest to add a deprecation notice in the upcoming version (2.5) and remove the feature from the next versions (>= 2.6) onward.

@apupier we typically takes care of deprecation aspects directly setting the Integration condition. I think in this case you can do that in the Quarkus trait, reporting another condition as done for other fields: https://github.com/apache/camel-k/blob/fefa0e74a8a768901cd5a4d7378c1168e7981433/pkg/trait/quarkus.go#L143

raised https://github.com/apache/camel-k/issues/5837 as i do not have an environment ready for go development


How to create a background task in gRPC service

As FastAPI docs metioned, backgroud task could been added using background_tasks.add_task:
https://fastapi.tiangolo.com/tutorial/background-tasks/.
@app.post("/send-notification/{email}")
async def send_notification(email: str, background_tasks: BackgroundTasks):
    background_tasks.add_task(write_notification, email, message="some notification")
    return {"message": "Notification sent in the background"}

But how to create a background task in gRPC service's RPC?

I think asyncio can do this directly, just like tornado

But we can design a better api to help others use it easier

Thanks @Ed-XCF 's PR #72 implemented periodically tasks.
For generic background task or delayed task, we can using the asyncio ability like asyncio.create_task.


Fix pagesConfig not using lowercase as index

This PR aims to fix the issue of having capitalized letters as pagesConfig keys.

That's great contrib. Thanks, I will add this in the next version 1.1.4


[Publication]: Published Playback chat with plotly fails with error on forward/back arrows click

EPAM AI DIAL chat version
0.12.0
How to reproduce
Preconditions:
user has chat with plotly
Steps:

user create Playback for chat with plotly
user create publication request for chat with plotly
admin approves request
user find published Playback chat in Organization
user click forward arrow in Playback published chat
user click back arrow in Playback published chat

Actual result
Error message displayed " An error occurred while saving the conversation. Please refresh the page."
Console: Failed to load resource: the server responded with a status of 403 ()
Network: https://dev-dial-chat.staging.deltixhub.io/api/conversations/public/playback__[Playback] Insurance Claims Analytics DEMO
{id: "conversations/public/playback__[Playback] Insurance Claims Analytics DEMO",…} assistantModelId :  "gpt-4" folderId :  "conversations/public" id :  "conversations/public/playback__[Playback] Insurance Claims Analytics DEMO" isNameChanged :  true lastActivityDate :<PHONE_NUMBER>843 messages :  [{role: "user", content: "Hi, how can you help?", model: {id: "research-assistant"},…}, {,…},…] model :  {id: "research-assistant"} name :  "[Playback] Insurance Claims Analytics DEMO" playback :  {,…} activePlaybackIndex :  16 isPlayback :  true messagesStack :  [{role: "user", content: "Hi, how can you help?", model: {id: "research-assistant"},…}, {,…},…] prompt :  "" selectedAddons :  [] temperature :  1
NOTE: also reproducible for chat with echo with attachments
Expected result
User should be able to navigate through published Playback chat
Confidential information

[X] I confirm that do not share any confidential information

Note: probably related to https://github.com/epam/ai-dial-chat/issues/1556

verified on stg with version 0.14.0 issue is fixed


Update aws-java-sdk-secretsmanager to 1.12.708

About this PR
📦 Updates com.amazonaws:aws-java-sdk-secretsmanager from 1.12.705 to 1.12.708
Usage
✅ Please merge!
I'll automatically update this PR to resolve conflicts as long as you don't change it yourself.
If you'd like to skip this version, you can just close this PR. If you have any feedback, just mention me in the comments below.
Configure Scala Steward for your repository with a .scala-steward.conf file.
Have a fantastic day writing Scala!

⚙ Adjust future updates
Add this to your .scala-steward.conf file to ignore future updates of this dependency:
updates.ignore = [ { groupId = "com.amazonaws", artifactId = "aws-java-sdk-secretsmanager" } ]

Or, add this to slow down future updates of this dependency:
dependencyOverrides = [{
  pullRequests = { frequency = "30 days" },
  dependency = { groupId = "com.amazonaws", artifactId = "aws-java-sdk-secretsmanager" }
}]

labels: library-update, early-semver-patch, semver-spec-patch, commit-count:1

Superseded by #60.


numbered blocks

Continuing a conversation at end of #35.
@thoughtstream said:

Additionally, I'd like to keep count of paragraphs in a block scope so that I could easily implement a numPara block
(I'm planning on numFormula and numTable as additional custom blocks to match up with
numhead, numitem, numdefn, which are specified).

Hmmmmm. Do we need to open a separate issue about this?
Looking at the available standard block types, it seems that
they fall into two categories: those that produce a visible renderings
and those that are effectively invisible in the rendered output:

Visibly Rendered
Invisibly Rendered

=code
=comment

=input
=nested

=output
=rakudoc

=head
=section

=defn
=pod

=item
=data

=para

=table

=cell

=formula

It seems reasonable that every block that produces a visible rendering
should have a corresponding num... version.
On the other hand, I don't think that we can specify that absolutely any block
(visible or not) can be given a num... prefix. If I squint, I can see that
=numsection or =numrakudoc (and even maybe =numnested)
might make some kind of sense...but =numcomment is just silly,
and =numdata positively misleading`.

@thoughtstream I had decided to put numXXX as extra custom blocks so as not to change the spec document again. But the idea of other blocks is mentioned.
I agree with the idea of visible and invisible blocks, and that 'num' versions of visible blocks should exist.
I think however that 'cell' should be considered 'invisible' because it is illegal outside of a table, and within a table, if anything it should be rows or columns that are numbered.
Another complexity I was worried about with regard to table/formula is whether or how numbering should be independent or in the same sequence as head.

I had to break off before finishing.
First about existing num behavour, as I have interpreted it.

numhead is numerated from the top of the document, and the numeration is calculated when the ToC is rendered, which happens even if it is not used in the output.
numitem and numdefn are both independently numbered, and the numbering is blocked scoped.

This has an undocumented behaviour that a sequence,

=numitem a,
=begin section,
=numitem y,
=numitem z
=end section
=numitem b

if b has :continue then it will follow from a, and not from z. There is nothing in spec to prevent this, but it works out more easily to have the numeration function block scoped.
Continuing about other numXXX blocks
We could consider that eg Formula & Table are considered by default to be the same as =head1 for the purposes of ToC. But that would mean the numbering would be the same as head, eg
=numhead header # would be 1. header
=numhead2 minor # would be 1.1. minor
=numformula fff # would be 2. fff
=numhead next # would be 3. next

I think most authors would however prefer numformula and numtable to be independently numbered, eg
1. formula
4. formula
1. table
5. formula

For =numpara, I was thinking that the numbering should be like =numhead and to be calculated only after rendering. (This is not now a problem because I can insert PCells at any point in a rendering to hold data that is calculated after the rendering).
So my thought is that all block-types, except =item and =defn, have orthogonal numerations, implicitly starting at 1. at the start of the document.
However, to provide for some authorial control, it does seem to me that we should have some more metadata options that affect numbering, in addition to :continue, such as :start(3), which would start a new numbering for that block type. Perhaps even ':resetwhich would be the same asstart(0)`.
I have separated out the Numeration class, so that it the Str routine can be sub-classed to provide different numeration strategies other than the default one in the specification.

@thoughtstream Further on division of blocks: in addition to visible/invisible, there is a :toc/:!toc by default division.

Blocks included in ToC
Blocks not included in ToC

head / headN
para

table
code

formula
input

custom block
output

semantic
item

~
defn

~
TITLE

~
SUBTITLE

The last two semantic block are special-cased because that is the way Raku documentation is treated, and it does make some sense to treat them specially. But it is not documented in the spec.
I am also not sure about how to classify nested, because it does have a visual effect, and typically starts a block scope

Just a note that, although I definitely consider this issue important,
I won't be able to discuss or address it until at least Tuesday 11 June
as Linda and I are celebrating our 34th wedding anniversary over the
next few days of the King's Birthday long weekend. I hope that letting
it percolate in a background mental process over that break will mean
I can come up with a more useful contribution once I'm back on air. :-)

@thoughtstream congratulations. Corinne and I will be celebrating on July 1.

[Thank-you both for your congratulations. We had a very pleasant anniversary.]

I think however that 'cell' should be considered 'invisible'
because it is illegal outside of a table, and within a table,
if anything it should be rows or columns that are numbered.

So maybe we don’t specify any in-table numbering for the moment.
If there is a later need/request for it, we (or our successors)
can revisit =numcell, =numrow, and =numcolumn for RakuDoc v.3

Another complexity I was worried about with regard to table/formula is whether or how
numbering should be independent or in the same sequence as head.

Tables and formulae should definitely each have their own sequences, independent of headings.
In fact, every separate block type that can be numbered should have its own independent sequence.

First about existing num behavour, as I have interpreted it.

I agree with your interpretation, including the block-scoping of numbered items.

We could consider that eg Formula & Table are considered by default to be the same as
=head1 for the purposes of ToC. But that would mean the numbering would be the same
as head
...
I think most authors would however prefer numformula and numtable to be independently numbered

Agreed. I think that would be what most authors expect...and what they’d want.

For =numpara, I was thinking that the numbering should be like =numhead and to be
calculated only after rendering.

Agreed. Starting from 1 at the beginning of the document. And not block-scoped.

So my thought is that all block-types, except =item and =defn, have orthogonal
numerations, implicitly starting at 1. at the start of the document.

Agreed.
In summary: every =num... block type has an independent numbering.
=numitem and =numdefn are block-scoped and cluster-scoped,
with numbers restarting at 1 at the start of each section,
or after any block of a different type.
All other =num... blocks are globally scoped,
with numbers starting from 1 at the start of the file.

However, to provide for some authorial control, it does seem to me that we should have some
more metadata options that affect numbering, in addition to :continue, such as :start(3),
which would start a new numbering for that block type. Perhaps even ':resetwhich would be the same asstart(0)`.

I think we only need one metaoption, which would set the numbering of the block type to which it
is applied to a specified number (from which subsequent numbered blocks of the same type would then continue).
Maybe: :number, which might be used as follows:
There are two possibilities:
=for numitem :number(0)
You don’t understand binary
=numitem You do understand binary

If you understand binary, there are two further possibilities:
=for numitem :number(10)
You write numbers in base-2
=for numitem :number(3)
You write numbers in base-10

...which would render to:
There are two possibilities:
  0. You don’t understand binary
  1. You do understand binary
If you understand binary, there are two further possibilities:
  10. You write numbers in base-2
   3. You write numbers in base-10

Further on division of blocks: in addition to visible/invisible,
there is a :toc/:!toc by default division.

Agreed, but I’m not sure how this relates to numbered blocks?

I am also not sure about how to classify nested, because it does have a visual
effect, and typically starts a block scope

I don’t have a problem with allowing =numnested.
I can imagine someone using nested blocks to differentiate
examples, and therefore wanting to number just the nested blocks,
in order to refer to those specific examples.
However, this does bring up another issue. If people do want to refer to
numbered blocks within their text, they’ll want to be able to include the
actual number. For example, if they specify a couple of numbered elements such as:
=for numformula
\sum \frac{1}{n^{2}} = \frac{\pi^{2}}{6}

=begin numtable
    =row
        =cell Closed-form rearrangment of terms
    =row
        =cell Taylor's series approximation
    =row
        =cell Newton's method
=end numtable

...then later they’re going to want to be able to say:
“Table X summarizes the most common solutions to Equation Y.”
...but with the correct numbers automatically inserted.
It seems to me that the obvious way to achieve this is to provide
a metadata option that creates an alias to the automatically assigned number
of any numbered block. Perhaps :numalias, which could then be used like so:
=for numformula :numalias<SumInvSqEqnNum>
\sum \frac{1}{n^{2}} = \frac{\pi^{2}}{6}

=begin numtable :numalias<solutions-table-number>
    =row
        =cell Closed-form rearrangment of terms
    =row
        =cell Taylor's series approximation
    =row
        =cell Newton's method
=end numtable

Table A<solutions-table-number> summarizes the most common solutions to Equation A<SumInvSqEqnNum>.

@thoughtstream pandoras box!
I do like these extensions. But for the time being, I would prefer to keep them out of the specification. I'm battling to get my tests to pass for the new renderer, and I want to get a working compliant renderer.

@thoughtstream pandoras box!

 ;-)
It’s no problem to suspend this discussion for now. We can leave the issue open,
and revisit it whenever suits you.


TintinCDK: separate out UVC code

Let's use a separate class for the UVC version of the TintinCDK camera. This will hopefully help keep the separation clean.

Fixed using https://github.com/3dtof/voxelsdk/commit/de107ff43f9fb7005f4c547a0da2bbbc7e69f916


write info and error to stdout/stderr in download json file

@constanzauanini the parallel downloads are failing in github action (i think this needs to be serialized for github action alone). For now just cleaning up errors/info so I can debug further.

@constanzauanini the parallel downloads are failing in github action (i think this needs to be serialized for github action alone). For now just cleaning up errors/info so I can debug further.

Do you wanna try the node -parallel again?

@constanzauanini the parallel downloads are failing in github action (i think this needs to be serialized for github action alone). For now just cleaning up errors/info so I can debug further.

Do you wanna try the node -parallel again?

Oh good idea, the curl --parallel? I can try that.. wondering if that might fail too since i think it is too many downloads happening too soon. Will try that to confirm.

@constanzauanini the parallel downloads are failing in github action (i think this needs to be serialized for github action alone). For now just cleaning up errors/info so I can debug further.

Do you wanna try the node -parallel again?

Oh good idea, the curl --parallel? I can try that.. wondering if that might fail too since i think it is too many downloads happening too soon. Will try that to confirm.

Yes, sorry, the curl --parallel. But as you say, maybe it also fails


login error "NoneType"

D:\>python pyinstastories.py -u id -p pw -d nasa
----------------------------------------------------------------------
[I] PYINSTASTORIES (SCRIPT V2.6 - PYTHON V3.5.4) - 05:37:51 PM
----------------------------------------------------------------------
[W] Unable to find auth cookie file: credentials.json (creating a new one...)
[I] New auth cookie file was made: credentials.json
Traceback (most recent call last):
  File "pyinstastories.py", line 487, in <module>
    start()
  File "pyinstastories.py", line 415, in start
    ig_client = login(args.username, args.password)
  File "pyinstastories.py", line 121, in login
    print('[I] Login to "' + api.authenticated_user_name + '" OK!')


[BUG]: local variable 'platform' referenced before assignment

Describe the bug
When running the following command in a tenant:
IntuneCD-startbackup -m 1 -o yaml -p ./prod-backup -a ./auth.json

This output is shown:
aaron@einstein pansw % IntuneCD-startbackup -m 1 -o yaml -p ./prod-backup -a ./auth.json
Backing up App Configuration: PDF Expert XML
Backing up App Configuration: PA Endpoint Defender IOS
Backing up App Protection: OneDrive mobile policy
Traceback (most recent call last):
  File "/opt/homebrew/bin/IntuneCD-startbackup", line 8, in <module>
    sys.exit(start())
  File "/opt/homebrew/lib/python3.9/site-packages/IntuneCD/run_backup.py", line 127, in start
    run_backup(opts.path,opts.output,token)
  File "/opt/homebrew/lib/python3.9/site-packages/IntuneCD/run_backup.py", line 66, in run_backup
    savebackup(path,output,token)
  File "/opt/homebrew/lib/python3.9/site-packages/IntuneCD/backup_AppProtection.py", line 59, in savebackup
    if platform == "mdmWindowsInformationProtectionPolicies":
UnboundLocalError: local variable 'platform' referenced before assignment

To Reproduce
There are no WIP policies in the target tenant, so the mdmWindowsInformationProtectionPolicies line may not be applicable. No App Protection policies are actually exported to disk. MAM policies in the tenant are:

Expected behavior
Backup should complete successfully

Hi,
I was not able to replicate this in version 1.0.8, can you verify you are running the latest version?
On another note, I have added a new Beta version that aims to fix the issue with backing up when there are no Management Intents configured. This Beta version also includes a parameter to skip assignments when backing up, requested in #29.
Please test this version by installing it with pip install -i https://test.pypi.org/simple/ IntuneCD-beta and running a backup with IntuneCDBeta-startbackup, to exlude assignments, all you have to do is add -e assignments.
Once I know all is looking good I will merge the changes to production.

Using 1.0.8. I think the issue is something unique to this customer tenant - the Global listed under Deployed for the policy OneDrive mobile policy looks strange to me, so I'm thinking it could be the culprit. I will try replicate in my own tenant.
I'll test the beta version and see how it goes.

IntuneCDBeta was able to perform a backup.

Good to hear, then I will merge the changes tonight together with the ability to exclude assignments from backup. Thank you for reporting and testing!


Update/cmake-build-refactoring

Pull request recommendations:

[x] Name your pull request your-development-type/short-description. Ex: feature/read-tiff-files
[x] Link to any relevant issue in the PR description. Ex: Resolves [gh-##], adds tiff file format support
[x] Provide description and context of changes.
[ ] Provide relevant tests for your feature or bug fix.
[ ] Provide or update documentation for any feature added by your pull request.

Thanks for contributing!
This PR:

Updates the aws-cpp-sdk
Reorganizes the build config so that fewer of the compilation targets interfere with each other

Resolves:
https://github.com/allen-cell-animated/simularium-engine/issues/15
https://github.com/allen-cell-animated/simularium-engine/issues/16
More details:
GCC 11 added warning for several common memory/compile errors. The way the simularium-engine build was setup, warnings are treated as errors. More generally, the compilation environment reflected the strictest settings from any dependency.
To address this, the compilation environment for the dependencies (simulation engines) and the server have been separated further. There is still overlap, but it is a step in the right direction. Further, the aws-sdk-cpp was updated to receive changes that allowed us more control over the compilation environment  for the sdk.
Autorun tests, in the sdk, were disabled, since there are known issues with some of the newer tests in untested environments (e.g. Docker images)
https://github.com/aws/aws-sdk-cpp/issues/1601

Looks good, looks like it is moving in the right direction. One question: is the aws sdk being staticly linked or dynamically linked?

The aws sdk is dynamically linked. Why?

Looks good, looks like it is moving in the right direction. One question: is the aws sdk being staticly linked or dynamically linked?

The aws sdk is dynamically linked. Why?

Looser coupling if it's dynamically linked.  The build doesn't necessarily need to be as entangled with the other components and could be practically independent (depending on allocation patterns and data passing across the interface, but the chances are good).


Rewrite of middleware sorting returns duplicates

Laravel Version: 5.3.19
PHP Version: PHP 5.6.25 (cli) (built: Aug 18 2016 11:40:20)
Database Driver & Version: Server version: 10.1.9-MariaDB-log mariadb.org binary distribution

Description:
framework/src/Illuminate/Routing/Router.php - function sortMiddleware returns an array with duplicates
Steps To Reproduce:
Debug or log output of function
Laravel Version: 5.3.18
sortMiddleware {"sorted":[
"Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse",
"Illuminate\Session\Middleware\StartSession",
"Illuminate\View\Middleware\ShareErrorsFromSession",
"App\Http\Middleware\VerifyCsrfToken",
"App\Http\Middleware\FilterIfPjax",
"App\Http\Middleware\ForceHttps",
"App\Http\Middleware\JSONRequest"]}
Laravel Version: 5.3.19
[2016-10-20 20:17:48] local.INFO: sortMiddleware {"wtf":[
"Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse",
"Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse",
"Illuminate\Session\Middleware\StartSession",
"Illuminate\Session\Middleware\StartSession",
"Illuminate\View\Middleware\ShareErrorsFromSession",
"App\Http\Middleware\VerifyCsrfToken",
"App\Http\Middleware\FilterIfPjax",
"App\Http\Middleware\ForceHttps",
"App\Http\Middleware\JSONRequest",
"Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse",
"Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse",
"Illuminate\View\Middleware\ShareErrorsFromSession",
"App\Http\Middleware\VerifyCsrfToken",
"App\Http\Middleware\FilterIfPjax",
"App\Http\Middleware\ForceHttps",
"App\Http\Middleware\JSONRequest",
"App\Http\Middleware\SentinelCheck",
"App\Http\Middleware\SentinelHasAccess",
"App\Http\Middleware\SessionExpired",
"App\Http\Middleware\UserActivity",
"App\Http\Middleware\JSONRequest"]}

Update: The issue seems to be that the array returned from the sortMiddleware function has duplicates. array_unique seems to sort it out.

Fix: return array_unique((new SortedMiddleware($this->middlewarePriority, $middlewares))->all());

Fixed in the PR linked with the issue.


Organizating content to support content for tags and other things

At the moment the project is set up so that you can write information about fonts, but based on your 26 Days of Type posts like "G is for Geometric", I assume you'd like to be able to write about tags as well?
While we're at it, there may be other categories of content you'd want to support from the start.
So the general question is: what organization would make sense to you for the content you'll be writing?
Right now, the src folder has a fontBook subfolder with articles for fonts. I'm thinking it makes sense to move that subfolder to the top level of the project — it feels conceptually different to mean than "source code" — but ultimately the project should reflect an organization that makes sense to you.
Example: hypothetically speaking, let's say the project has a top-level folder called, say, "content". That folder could contain subfolders for different types of content, as well as pages like the home page.
content/
  fonts/
    Aboreto.md
    … more fonts …
  tags/
    Geometric.md
    … more tags …
  index.md
src/
  (source files go here)
package.json
… etc.

Let me know what makes sense to you. One idea would be for you to try out an organization for content in the actual project to get something that feels reasonable to you, then I'd update the site.ori file to match that new organization. Or you could just outline something here.

The structure you outlined makes sense. I think I would want content/fonts and content/tags for sure. I was thinking of content/lists as a third possible content type, but 'fonts' and 'tags' are priority.

I've created a pull request that implements the structure above. Once you've merged that, you can close this issue.
For now I think you can probably use tags to implement lists. If at some point you want to make lists a distinct concept, it shouldn't be hard to add that.


Allow for metadata updates

It is possible the same sequence gets multiple metadata entries (e.g. for clinical outcome). So we need to be able to add metadata several times. Furthermore it is important to be able to update existing metadata - I think simply by adding versions.

I'd like to have a gist like approach. When you submit the data and metadata for the first time, you'll get the accession id. And then, when you want to submit the revised/fixed version of data or metadata, you need to submit them with the given accession id. The data will be stored as the version 2, which automatically assigned by the system. I don't think it'd be a good idea to let submitters manage the versions of their records.

This should be pretty easy, I think we want to do something like:

Enable Arvados collection versioning on the cluster
On the initial upload, print the Arvados UUID of the newly created collection
To do an update, upload a new collection with the new metadata and a collection property for_update: X which has the Arvados UUID returned earlier.
The orchestration script notices the for_update property and re-validates the sequence and metadata
If it passes validation, copy the contents over to the collection to be updated (the old version will be automatically preserved) and re-run pipelines

Perfect! Arvados++

When we fix #103 it should be easy because every collection gets its own permanent identifier.


Implement StorageNMap

Fixes #8291.
Things left to be done:

[ ] Support StorageNMap in #[pallet::storage] and decl_storage! macros
[ ] Make use of it in pallets that wanted a StorageTripleMap
[ ] (Optional, needs discussion) Deprecate StorageMap and StorageDoubleMap and make them use StorageNMap underneath

@KiChjang I see this is a draft. If there are outstanding things that need to be done, make a checklist of those things?

@shawntabrizi There are some really tough problems with regards to supporting iteration of prefixes in the StorageNMap. Specifically, I'm really not sure how to tell Rust to return the suffix key types, so I think I'd probably not support the iter_prefix and the drain_prefix methods.
Other than that, what's mostly left to do is trying to get it to actually work in pallets, so that people can start using it.

It feels to me without the ability to do iteration and the lingering (), this is probably no the correct approach.
@bkchr is there better ways to approach this?

@shawntabrizi Just to clarify, iteration itself is supported, the only problem is supporting the iteration of prefixes.

If you use tuples as keys, you should be able to remove this extra ().
What is the exact problem with prefix iteration? That it is hard to declare a prefix of v for a key (v, x)?

@bkchr With the current design, this is how a iter_prefix method declaration can be written as follows:
fn iter_prefix<KG, KArg>(key: (KArg, KG::NextKey)) -> ??? // what should even go in here?

The problem I see here is two-fold:

How do I make sure that the KG parameter is a proper prefix of K in the StorageNMap?
How do I write the rest of the key suffixes out as the return type?

for prefix iterator maybe we can create a new trait which enforce the correctness of the prefix. an example can be:
trait KeyPrefix<T>: KeyGenerator {}

// To be implemented with macro
impl<A: KeyGenerator, B: KeyGenerator, C: KeyGenerator> KeyPrefix<(A, B, C)> for (A, B) {}
impl<A: KeyGenerator, B: KeyGenerator, C: KeyGenerator, D: KeyGenerator> KeyPrefix<(A, B, C, D)> for (A, B) {}
impl<A: KeyGenerator, B: KeyGenerator, C: KeyGenerator, D: KeyGenerator, E: KeyGenerator> KeyPrefix<(A, B, C, D, E)> for (A, B) {}

impl<A: KeyGenerator, B: KeyGenerator, C: KeyGenerator, D: KeyGenerator> KeyPrefix<(A, B, C, D)> for (A, B, C) {}
impl<A: KeyGenerator, B: KeyGenerator, C: KeyGenerator, D: KeyGenerator, E: KeyGenerator> KeyPrefix<(A, B, C, D, E)> for (A, B, C) {}

I tried an implementation using tuples, the difficulty as you mentionned is to be able to use EncodeLike.
If we

migeate_keys can be more manual.
Meaning you take the old hashers as tuple as you take them for the struct itself. The user would need to make sure that they pass the same number of arguments of hashers as the struct itself.

migeate_keys can be more manual.
Meaning you take the old hashers as tuple as you take them for the struct itself. The user would need to make sure that they pass the same number of arguments of hashers as the struct itself.

I thought about this before, but StorageHasher functions are defined as "class functions" on the hasher structs, so I can't just hasher.hash() something, I need to have its type and do Hasher::hash().
I of course could add a hash(&self, x: &[u8]) method for these structs, inside of which would just have Self::hash(x), but I'm not sure if that's a good idea.

If migrate keys is a problem, you could obmit it for now and make the rest working for now.

Okay, the only missing functionality right now is migrate_keys, the rest of this PR can be reviewed.

@KiChjang need to fix the warnings/errors for CI

@KiChjang in general, please avoid force-push. As a reviewer, I may have reviewed up to a certain point, and then i would only want to review the new changes, not have to review everything again.

Sorry, force of habit. I tend to amend failing commits so that each of them
compiles successfully and has no mistakes.
On Sat, Apr 24, 2021, 10:31 AM Shawn Tabrizi @.***>
wrote:

@KiChjang https://github.com/KiChjang in general, please avoid
force-push. As a reviewer, I may have reviewed up to a certain point, and
then i would only want to review the new changes, not have to review
everything again.
—
You are receiving this because you were mentioned.
Reply to this email directly, view it on GitHub
https://github.com/paritytech/substrate/pull/8635#issuecomment-826126398,
or unsubscribe
https://github.com/notifications/unsubscribe-auth/AAYZDS7KKHRD7XSFVRYBCJ3TKL573ANCNFSM43DAZBEQ
.

(Optional, needs discussion) Deprecate StorageMap and StorageDoubleMap and make them use StorageNMap underneath

I think we can do that in a follow-up PR

For me the 2 remaining issue are:

https://github.com/paritytech/substrate/pull/8635#discussion_r620159563
https://github.com/paritytech/substrate/pull/8635#discussion_r620215141

apart form those, there is the version of metadata to bump and some other small stuff but nothing difficult. And then implementation is good to me.

This is looking pretty good, what is left?
I did a review, and didn't see any problems that would stop this from being merged.

@shawntabrizi There is this comment left by Gui, and I'm figuring out where to put the macro. Do you think it's necessary? We could indeed merge it as is without creating a proc macro just for the purpose for implementing the HasKeyPrefix traits.

I agree, sounds like something we can do as follow up.
Can you get the CI checks green?

I might have just spotted a bug; don't merge this yet.

Nevermind, false alarm, this is ready to merge.

Might be a breaking change to some of the paths in Sidecar and tx construction in txwrapper-core. Deferring to @TarikGul if those will need a major version change.
Will this or #8615 change transaction encoding? Then we would need to bump the version.

Will this or #8615 change transaction encoding? Then we would need to bump the version.

Will not affect tx-version.

it seems follow up pieces are:

As sanity, I'd be interested in seeing a a test that demonstrates a double map and an NMap(2) which same key types and hashers, generate exactly identical keys, and are thus exactly identical.

have a procedural macro for impl_key_prefix_for!((A, B, C), (A, B), C); ....

update generate_storage_alias to support nmpa as well

maybe making StorageMap and StorageDoubleMap using StorageNMap under the hood.

maybe consider using storage n map everywhere instead of storage map and storage double map. or the other way around: https://github.com/paritytech/substrate/pull/8635#pullrequestreview-650056706

bot merge


Subtract Templates for MOSS

Since MOSS doesn't seem to be handling our templates well - we should try removing templates manually.

I'm assuming you've tested it already, so besides a few style nits I think it's good to go


PERF, TODO: Ensure 128-bit alignment all rows/columns for SIMD friendliness

Split off from #3114 ...
It doesn't seem (from my testing) that numpy guarantees 128-bit alignment the start of an array (which is odd, since malloc usually does that no matter what, from my testing), and it certainly doesn't 128-bit align each row/column since they're always contiguous.
Apparently it can be done manually via a method like described below:
http://mail.scipy.org/pipermail/scipy-user/2009-March/020283.html
(This just aligns the start of the array, but if you overallocate more and play with strides you can do the same thing to every c-contig row or f-contig column)
The downside is that this has to be done everywhere where allocation currently happens...even with a helper function to do it it's going to be somewhat messy.
Also, to avoid too much overhead, I think this should only be done when each row/column is at least 256 bits (32 bytes) naturally, so the absolute worst case space penalty is 33% + 96 bits constant (on a 32-bit machine) or 20% + 64 bits constant (on a 64-bit machine)...
We can bump that up a bit higher to 512 bits if that still seems like too much, but it means that DataFrames with 5-7 float64/int64 columns could be pathologically misaligned. (So basically, this won't help at all until at least 9 columns are present...)

I'm sorry that @stephenwlin is no longer with us. I have created #33 to ensure we do aligned / padded allocations in pandas 2.0 where we are allocating our own memory.


Upgrade/Migration automation.

Tackle will need to support complex upgrade with needs to include:

Data migration (in combination with GORM schema migration).
RBAC updates.

The design for this should be a chained, incremental migration.  That is, each release will have a migration.  So when 2.0 is installed, the existing seeding with be a migration. 0 => 2.0.  The 2.0 migration will be executed.  Migration from 2.0.0 => 2.1.0 will execute the 2.1.0 migration.  For upgrade from 2.0 => 2.1.3 will execute migrations:

2.1.0
2.1.1
2.2.2
2.1.3

Done in 2.1.0


Persistent mapping should be an implementation detail

Instead of providing functions like new_persistent, glium should automatically setup persistent mapping when creating a dynamic buffer.
write and read would read/write from the mapping instead of calling OpenGL functions.

Done in #771


add all exports from a direct child

In GEOSldas, the exports in Catchment or CatchmentCN need to be bubbled up to Land grid comp and to GEOSens grid comp for average. It is inconvenient to add and repeat all exports.
Description

Related Issue

Motivation and Context

How Has This Been Tested?

Types of changes

[ ] Bug fix (non-breaking change which fixes an issue)
[x] New feature (non-breaking change which adds functionality)
[ ] Breaking change (fix or feature that would cause existing functionality to change)
[x] Trivial change (affects only documentation or cleanup)

Checklist:

[ ] I have tested this change with a run of GEOSgcm (if non-trivial)
[x] I have added one of the required labels (0 diff, 0 diff trivial, 0 diff structural, non 0-diff)
[x] I have updated the CHANGELOG.md accordingly following the style of Keep a Changelog

I tested this (along with #1655) with the GCM and it seems zero-diff and good to go.


make the starting positions of the mouse paw customizable

also added missing config options to config

Made the starting positions of the mouse paw
customizable by adding new config options.
This applies to the osu and custom mode.
Comparison of the default coordinates
with some arbitrary coordinates:

hey @peeteer1245, your work looks awesome here. Would you be so kind as to compile a build for me that includes your work on both on #98 and #88? Thank you!

Sure thing @erichyang.
Regarding #88 I published a release on my fork here.
With #98 there really was nothing I did except for cross-compiling since the participants did not have a up to date build.

Nice. Can you add a PR to the wiki as well or only I have the access to the wiki?

Since the Wiki is a separate repo without PR functionality I cannot create a PR.
But you can use the information in this gist to merge my changes.
My Wiki FREPO is https://github.com/peeteer1245/bongocat-osu.wiki.git.

@peeteer1245 so sorry to bother u, but ive been having a hard time finding out what are the coordinates i need for my image, may i know how to do so?

I'm not sure if the config file included in the download is up to date.
If it is the there should be a couple of coordinates the far bottom of it. You will have to play with them to get it just right.
If it is not you will have to add some lines to the bottom of your config file. Here are the default configurations. The specific point I linked has the info for the mouse-paw-coordinates.
If you have problems modifying your config file you can attach it in a comment and I can help you with it.


pcp-prom implant: fix filesystem permissions

The prometheus receiving agent needs write permissions into the
container filesystem for some transient data storage.

Can one of the admins verify this patch?

Can one of the admins verify this patch?

[test]

[test]


Azure module

What does this PR change?
I have added the azure module so we can use sumaform to also provision an environment on azure.
I have built this with general public in mind as opposed to internal use.
TODO: add snapshot support for mirror image
TODO: Add README and advanced config info

corrected main.tf in network module

Thanks for your contribution @japelbaum
One missing piece.
Base and host network should have a symbolic link for variables file (variables.tf) pointing to the variables file in the null backend_module.
This file is used as a kind of interface to insure compatibility between all backends.
I'm planning to submit a full review during the current week

Can you please rebase again from master. We have merged a PR that should correct the errors on the github actions.

@rjmateus to be honest i am using a trial account, which gives you 200$ of credit to try azure with for 30 days.
With regards to the symbolic links, Github doesnt allow me to commit symbolic links, not sure if there is a workaround?

@japelbaum regarding the symbolic links, I just run the following command ln -sf ../../null/host/variables.tf variables.tf``inside the directory I want to place the symbolic link, in this case backend_modules/azure/host. Then running git status` on the console show me the file to be added. If you have any problem I can help

@japelbaum I have tested the deployment of uyuni and that went really good :)
As Soon as the last comments are addressed I think we are good to go.
Thanks for the great work

@japelbaum I have tested the deployment of uyuni and that went really good :)
As Soon as the last comments are addressed I think we are good to go.
Thanks for the great work

That is awesome news :) Happy to hear. Is there value in writing an integration for gcp?


Why types does not have the listener prop?

There is a listener prop available, however there is no ts type related, why?
Same thing for responsive-options, can't find any type.
(https://github.com/fraserxu/react-chartist/blob/master/index.d.ts)

Same here, I can't set listener prop on ChartistGraph ts is complaining that it has no property.


Gather methods option should only be taken into account on class generation

When gathermethods option is set to start then the Service class is named after the operation name Search whereas when we set the option to none the Service class is named with the default ServiceType class name which is Service.
This is wrong as the parsed data should be an image of what is provided by the WSDL. The options should only be used when generating the classes.

fixed in 2.8.0


Create pull_request_template.md file

Project repo now has a Pull Request Template so that team members have a template to go to when creating a new PR

Great you have everything that we agreed upon.

Sweet! As we start to do our pull requests if there's anything else that we notice we can jot those points down then add them to thise template!


VS reports Invaliud tag helper property even though now supported

I have created a TagHelper that has a property of type IDictionary<string, ModelExpression>
According to this GH Issue, it was originally not supported, but now it should be: https://github.com/aspnet/Mvc/issues/5310
And my TagHelper is working as expected.
But if I build my project when a view file (*.cshtml) that uses this tag helper is open in VS. I get the following output in VS Error List: Error Invalid tag helper property 'SomeNamespace.SomeTagHelper.some-prefix'. Dictionary values must not be of type 'Microsoft.AspNetCore.Mvc.ViewFeatures.ModelExpression'.
Could it be that the support for properties of type IDictionary<string, ModelExpression> in TagHelpers also requires some update to VS 2017 in order to not get this error message? Currently It's a bit confusing, especially for fellow developers that might not have insight into this.

This issue is also posted here:
https://developercommunity.visualstudio.com/content/problem/66937/vs-reports-invaliud-tag-helper-property-even-thoug.html

@ajaybhargavb could you investigate this guy?

@deap82, I tried to reproduce your issue but couldn't. Which version of Razor/Mvc are you using? If possible, could you share a sample repro app?

@ajaybhargavb I'm on an asp.net core mvc app, not sure what kind of version definition (number) you are asking for. Could you perhaps start with sharing your repro app and I can quickly see if I get the error in my environment?

I meant the versions you are referencing in your csproj. (If you right-click your project -> Edit MyProject.csproj)

Version 1.1.1 for Microsoft.AspNetCore.Mvc.Core, Microsoft.AspNetCore.Mvc and Microsoft.AspNetCore.Mvc.Razor.

@deap82, I tried reproducing with a 1.1 app but still couldn't. Here is the app that I used https://github.com/ajaybhargavb/TestApp/tree/master/WebApplication1. The VS version I used was 15.2 (26430.14) Release. I am closing this issue for now but feel free to re-open the issue if you are still seeing the issue even after updating Visual Studio.


Fix indentation and api version for k8s deployment

Need to check if other files need to be updated.

@qiwzhang should I update all docs with the indentation and apiService in this PR?


Which license?

The license file at the root of the repo is for the MIT license, as is the readme, and bower.json - but Javascript files contain a title block with the Apache 2.0 license.
I suggest one is chosen and applied across the repo.

Hi.
Of course, i change the correct license to MIT.
Regards.

Hi @cocowalla.
This feature is available in:
.

Fix navigation to invalid pages.
Filling search/hidden inputs.
Search and filter case insensitive.
Support for Bootstrap 3.3.7.
Update license to MIT.

Regards.


Implement blocking operations for moka

We need blocking operations in kv adapter.

Fixed in https://github.com/datafuselabs/opendal/pull/970


Update to .Net 7

As .Net 7 is just around the corner it would be great to look into what is needed to add explicit support to the new version.

Unless we are going to make the effort to migrate to new APIs, IMO it doesn't make much sense to add a new target. In fact, we are evaluating whether to drop one of the targets (either net462 or netstandard2.0), since these have significant overlap and netstandard2.1 pretty much covers all other platforms except .NET Framework and .NET 6+.
However, adding .NET 7 tests to Azure DevOps is a must. Adding .NET 7 tests to GitHub Actions should only be done if we remove the tests for .NET 6, since we only need one set of tests to validate the net6.0 target and we want the PR tests to run as fast as possible.
Adding a target for net6.0 made sense because:

J2N uses hardware intrinsics for some of the low level bit operations and net6.0 supports both Windows and Linux
Normal dictionaries support deleting while iterating forward, so we don't have to use ConcurrentDictionary<TKey, TValue>

Being that we only have a couple of months left of netcoreapp3.1 support, we should drop those tests but keep the net5.0 tests for testing the netstandard2.1 target. net5.0 makes more sense to use because it supports detecting fatal crashes, where netcoreapp3.1 does not. It would be best to first do a PR for dropping netcoreapp3.1 tests, then a PR for adding the net7.0 tests.
Azure DevOps / build.bat
x64 + x86 on Windows only

net7.0 -> tests net6.0 tfm
net6.0 -> tests net6.0 tfm
net5.0 -> tests netstandard2.1 tfm
net48 -> tests net462 tfm
net461 -> tests netstandard2.0 tfm (will probably drop both of these)

GitHub Actions
x64 only on all targets

net7.0 -> tests net6.0 tfm
net5.0 -> tests netstandard2.1 tfm
net48 -> tests net462 tfm
net461 -> tests netstandard2.0 tfm (will probably drop both of these)

FYI - I upgraded the Git Tools plugin that I use to review working changes so it is compatible with VS2022. So, that clears the path for adding .NET 7 tests since I am finally able to move beyond VS2019, which has been out of support since April, 2022.
The plugin saves so much time during reviews that it simply wasn't worth it to upgrade Visual Studio without it.
We will have to phase out support for VS2019 (and update the build instructions accordingly) in order to add support for .NET 7.


CSV for users and students

Make it possible to retrieve a CSV from the backend with data about users and students.

I think that the best way for this would be to make a request to /student with Content-Type text/csv.


Authorize salesforce modal is not showing anything

When you create a new frigg application, Salesforce is configured by default.
Steps to reproduce

Create a frigg app
Follow the docs for first time use
Navigate to the integrations page
Enable salesforce
See modal spinner
Click Connect
Nothing happens and you are not redirected to salesforce to log in

Expected:

I should be prompted for a login modal to salesforce at some point in this flow

I believe the frontend needs to be rewired to use the backend "GET /authorize" endpoint?
⚙⚙⚙⚙⚙⚙⚙⚙⚙⚙
Sean Matthews
Co-Founder & Frigg Lead Developer
LeftHook.com & FriggFramework.org
&
--- original message ---
On January 9, 2023 at 9:57 AM EST @.*** wrote:
When you create a new frigg application, Salesforce is configured by default.
Steps to reproduce
Create a frigg app
Follow the docs for first time use
Navigate to the integrations page
Enable salesforce
See modal spinner
Click Connect
Nothing happens and you are not redirected to salesforce to log in
Expected:
I should be prompted for a login modal to salesforce at some point in this flow
—
Reply to this email directly, view it on GitHub, or unsubscribe.
You are receiving this because you are subscribed to this thread.Message ID: @.***>
--- end of original message ---

@seanspeaks @joncodo
This one is most likely because salesforce is using basic or apikey auth but no json schema is being sent to the frontend to collect that data (api key etc).
Or if it's supposed to be OAuth then the getAuthorizationRequirements function is returning undefined for type

If neither of those solutions work, it might be the redux issue, from the other issue. The AuthorizationRequirements isn’t getting mapped to the redux state

So @seanspeaks can you give a spec for what is supposed to happen when you enable salesforce in a new create-frigg-app?

@seanspeaks im a bit blocked on this task right now. Here is what I propose should happen:

Create a frigg app
connect to db
run app
login to UI
Enable salesforce

If no config is set, the UI lets you set your config in the UI and saves it locally to disk as the .env file
Once config is set properly for salesforce, when you click the enable button in the UI, you are redirected to a salesforce login page.
Once you log in, you are redirected to the application and it shows that you have connected salesforce and which user you have authorized in the UI.
This tells the user that it is working.
Then I think we have a list of all routes that we support with a live coding tool to make requests like postman right from the frontend of the UI.
I think these are good ideas but I need them approved by @seanspeaks


Tabbed view with examples in landing page

This PR addresses #129.

Add a tabbed view for examples in the landing page
Example for Compute/App Engine is kept as is, while I added an example for using the library outside of Compute/App Engine
Add highlight.js to handle code formatting

Notes: the example uses AuthCredentials.createForJson so we should not update previous versions sites. If I am not mistaken Travis will use the new files from this PR for the next release.
You can have a look at the page here, comments are more than welcome.

Hmm - looks like we lost some of the syntax highlighting in that demo?

@jgeewax You are right I forgot to add custom highlighting for constants. Could you double-check now?

As much as I hate how long we need our snippet to be (!) -- this LGTM :)

Nice.
In AE and CE one also does not have to supply projectid. see here.
As of now, snapshot releases are only pushed maven (snapshot repository) and non snapshot releases are pushed to maven as well as creating and updating the site. So, I don't think this will be pushed by Travis as is.

@aozarov Yes, I meant that Travis detects when a release is pushed through $SITE_VERSION and only in that case builds (and publishes) the site for the new release. It this right? Merging this PR does not trigger any site build so older versions sites remain unchanged.

@mziccard Right, however if we want it sooner than later we could push it manually (in a separate PR).
Do you still want to keep the explicit projectid for CE and AE? I think omitting it is nicer and consistent with not  supplying the auth (that is tied for that project)....

@aozarov I've just removed it:)

Great, thanks. Why the empty line between options assignment and datastore?

It's just there to separate the "environment" dependent part from the more functional one. Basically after the line the code is the same in all environments (and in the 2 tabs). But I am not particularly attached to it, so I can drop it if you prefer.

+1 to remove that empty line.

Thanks! another nit. Do you mind to change the CE/AE version to have only one line separator between imports and the code (similar to the other one).

I'm +1 to keeping a line separating env setup from Datastore specific
stuff......

I am -1 for that. The setup is actually service specific (each service has its own options, though they share a common code for setting common stuff).
DatastoreOptions options = DatastoreOptions.builder().build();

Datastore datastore = DatastoreFactory.instance().get(options);
KeyFactory keyFactory = datastore.newKeyFactory().kind(KIND);
...

That empty line between DatastoreOptions construction and Datastore construction seems wrong to me (and normally will not appear in user code). Instead, if we must, I would have a comment.

The way you have it written I'd far more readable to me....
It's already super long... I think a giant blob of text like that needs a
little spacing... Like separate paragraphs in GH.
Do we have a style guide reference saying they should be all one
"paragraph"?

The way I mentioned above is less readable to me (though I would not go as much as saying far) :)
We don't use spacing in this particular case in our code (test or samples).
This is what the Java style guide has to say about empty lines: vertical-whitespace.
You may argue that "Within method bodies, as needed to create logical groupings of statements." falls in this category but I think that is a weak argument. I would say that a space between constructing a service and using it would make more sense to me.

I think that's exactly the argument... Logical grouping of statements....

Ok, than you have my answer/opinion.

So what do we do then?:) Maybe @ajkannan can give us a third opinion.

You can wait to get more opinions like @ajkannan or just decide yourself.
I think, this is a minor issue and can always be changed later (so the decision should
not block this PR).
Just to make my opinion clear is that I think current state should be change to:

Only 1 empty line between import and code, but more importantly be consistent in both examples.
No need for an empty line after DatastoreOptions creation (my top preference) or have another empty line after Datastore creation or have an empty line only after DatastoreOptions and Datastore creation.

I have a slight preference towards one line to separate the imports from code (and no other empty lines), but either way wouldn't be abhorrent in my book :)

I updated last commit to remove the additional unnecessary line. You can see the updated version here.
There are 2 empty lines at the end of the CE/AE code to match the length of the "elsewhere" example. Otherwise the code box size changes everytime tab is changed, which is quite ugly:)


[RayService] Submit requests to the Dashboard after the head Pod is running and ready

Why are these changes needed?
In #1065, the RayCluster initialization resulted in 47 status updates due to the controller sending HTTP requests to the Dashboard to create Serve Deployments before it was ready to handle requests. See this gist for more details.

updateState	{"error": ...: connect: connection refused"} => Send requests to the Dashboard before it was ready to handle requests.
r.Status().Update() isHealthy && !isReady => The Serve Deployments are created but not ready.

In this PR, the RayService controller will submit the HTTP request to the Dashboard after the head Pod is running and ready. Note that the Dashboard and GCS may take a few seconds to start up after the head pod is running and ready. Hence, some requests to the Dashboard (e.g. UpdateDeployments) may fail. This is not a big issue since UpdateDeployments is an idempotent operation.
Compare with RayJob
Unlike RayJob, RayJob will submit a job to the RayCluster when the cluster is ready (by definition, "ready" means that all Pods are running, but the implementation may be a bit different.).
https://github.com/ray-project/kuberay/blob/795db0dc9e09702caf23b936a86f77b0a3c5215b/ray-operator/controllers/ray/rayjob_controller.go#L173-L174
The reasons are:

Typically, RayService should be available 24/7. In addition, Ray Serve deployments may scale up/down based on the QPS, and cause the RayCluster up/down with Ray Autoscaler. Only updating Ray Serve deployments when all Pods are ready and running may cause big overhead.
In addition, there may be some edge cases that cause some Pods to crash unexpectedly.

Hence, if RayService only updates Ray Serve Deployments when all Pods are running and ready, it may be risky.
Why do I update rayservice_controller_test.go?
Prior to this PR, the controller would submit an HTTP request to the Dashboard regardless of the status of the head Pod. As a result, the fake Dashboard client would create Ray Serve deployments with a HEALTHY status. However, in a real Kubernetes cluster, it is impossible for Ray Serve Deployments to be HEALTHY before the Dashboard is ready.

r.getAndCheckServeStatus -> r.updateRayClusterInfo -> Turn PendingRayCluster into ActiveRayCluster.

https://github.com/ray-project/kuberay/blob/795db0dc9e09702caf23b936a86f77b0a3c5215b/ray-operator/controllers/ray/rayservice_controller_test.go#L553-L559
With this PR, the function r.getAndCheckServeStatus will not be executed if the head Pod is not running and ready. However, envtest doesn't create a full K8s cluster. It only has the control plane. There's no container runtime or any other Kubernetes controllers. Pod's status will not be updated by Kubernetes built-in Pod controller, and thus the status will always be "pending". Hence, we need to manually update the status from "pending" to "running". The function r.getAndCheckServeStatus will be executed after the head Pod becomes running and ready, and then turn PendingRayCluster into ActiveRayCluster. See https://book.kubebuilder.io/reference/envtest.html for more details.
Other updates

Typo: CheckAllPodsRunnning -> CheckAllPodsRunning

rayservice_controller_test.go => rayiov1alpha1 -> v1alpha1

Related issue number
#1061
#1062
#1065
#983
Checks

[ ] I've made sure the tests are passing.
Testing Strategy

[x] Unit tests
[x] Manual tests
[ ] This PR is not tested :(

I performed an experiment similar to #1062.

status updates in the RayCluster initialization. => 47 -> 13

2023-05-10T06:44:04.862Z	INFO	controllers.RayService	r.Status().Update() Update RayService Status since reconcileRayCluster may mark RayCluster restart.
2023-05-10T06:44:06.908Z	INFO	controllers.RayService	r.Status().Update() updateState	{"error": "Service \"rayservice-sample-raycluster-c6d8t-dashboard-svc\" not found"}
2023-05-10T06:44:07.046Z	INFO	controllers.RayService	r.Status().Update() updateState	{"error": "Service \"rayservice-sample-raycluster-c6d8t-dashboard-svc\" not found"}
2023-05-10T06:45:27.955Z	INFO	controllers.RayService	r.Status().Update() updateState	{"error": "Put \"http://rayservice-sample-raycluster-c6d8t-dashboard-svc.default.svc.cluster.local:52365/api/serve/deployments/\": dial tcp <IP_ADDRESS>:52365: connect: connection refused"}
2023-05-10T06:45:28.978Z	INFO	controllers.RayService	r.Status().Update() updateState	{"error": "Put \"http://rayservice-sample-raycluster-c6d8t-dashboard-svc.default.svc.cluster.local:52365/api/serve/deployments/\": dial tcp <IP_ADDRESS>:52365: connect: connection refused"}
2023-05-10T06:45:31.002Z	INFO	controllers.RayService	r.Status().Update() updateState	{"error": "Put \"http://rayservice-sample-raycluster-c6d8t-dashboard-svc.default.svc.cluster.local:52365/api/serve/deployments/\": dial tcp <IP_ADDRESS>:52365: connect: connection refused"}
2023-05-10T06:45:33.060Z	INFO	controllers.RayService	r.Status().Update() updateState	{"error": "Put \"http://rayservice-sample-raycluster-c6d8t-dashboard-svc.default.svc.cluster.local:52365/api/serve/deployments/\": dial tcp <IP_ADDRESS>:52365: connect: connection refused"}
2023-05-10T06:45:42.919Z	INFO	controllers.RayService	r.Status().Update() isHealthy && !isReady
2023-05-10T06:45:42.963Z	INFO	controllers.RayService	r.Status().Update() isHealthy && !isReady
2023-05-10T06:45:44.958Z	INFO	controllers.RayService	r.Status().Update() isHealthy && !isReady
2023-05-10T06:45:46.995Z	INFO	controllers.RayService	r.Status().Update() isHealthy && !isReady
2023-05-10T06:45:49.060Z	INFO	controllers.RayService	r.Status().Update() isHealthy && !isReady
2023-05-10T06:45:51.102Z	INFO	controllers.RayService	r.Status().Update() isHealthy && !isReady
2023-05-10T06:45:53.261Z	INFO	controllers.RayService	r.Status().Update() Final status update for any CR modification.

cc @msumitjain would you mind giving some feedbacks? Thanks!

cc @msumitjain would you mind giving some feedbacks? Thanks!

Thanks @kevin85421 for picking this up. I will test them tomorrow and let you know.

rayiov1alpha1 -> v1alpha1 what's the reason for this out of curiosity?

rayiov1alpha1 -> v1alpha1 what's the reason for this out of curiosity?

There are rayiov1alpha1, rayv1alpha1, and v1alpha1 in the codebase, and I would like to ensure consistency across them. This can be a good first issue for new contributors.


Add Votekick functionality

About the PR

This PR adds the ability for trusted users to initiate a votekick against problematic players, for which other users that meet a total playtime threshold can participate and vote on. If a votekick is successful the target player will be temporarily banned for a short duration.
This functionality is only available when no admins are online, and is meant to supplement admin enforcement by temporarily remove a problem player until an admin can review and process appropriate actions.
The Votekick option is found under the Call Vote option in the player menu. The following requirements must be met to be able to initiate a votekick:

The user must be whitelisted (this requirement will likely be replaced by a separate player list in the future)
The user must be a ghost/observer
The user must have been a ghost/observer for at least 5 minutes
There must be at least 10 eligible players online that can vote.

To be eligible to vote on a votekick, the criteria below must have been met. If you are not eligible, the vote does not show up for your client. Votekicks do not show the vote count for the available options (unless you are an admin), and there is a button to teleport to the user being targetted for the votekick.

The user must have over 10 hours total playtime.
The user must be a ghost/observer
The user must have been a ghost/observer for at least 5 minutes

When initiating a votekick, you are given a list of all players currently in the round. You also have the option to follow the selected player to ensure you are votekicking the correct player and not someone just impersonating someone else. You must then provide one of three reasons for the votekick:

Raiding
Cheating
Spamming

Abuse of the votekicking system is a heavily punishable offense.
Why / Balance
While the ideal scenario for SS14 would be to have 24/7 coverage of admins on all servers, in reality this is very resource-intensive to achieve. This votekick system is meant to give players an option to deal with highly problematic players when admins are not online - essentially provide a stopgap until an admin can log on and resolve the issue.
For a votekick to pass, there must be 60% Yes votes (Abstain votes are not counted). If a votekick passes, the player is banned for 3 hours.
The votekick feature is meant to only deal with players who are blatantly breaking core rules of the game. This is why only the options Raiding, Cheating and Spamming are available, as grayzone issues like "powergaming", "self-antagging" and "metagaming" are more subjective and often less malicious. To prevent real antags who are a bit too murderbone-happy from being kicked for "raiding", any antag with 10+ hours of playtime is immune from the Raiding votetype.

Players eligible for antag protection still show up in the votekick player list and the vote still goes active, but nothing happens when the vote completes.
Admins do not show up in the votekick player list and are of course immune to votekicks.
Deadmins do show up in the votekick player list, but are immune to votekicks (nothing happens when the vote completes).
If an admin is online, the vote still goes active, but nothing happens when the vote completes.

Please keep in mind that the values listed are cvars and can be edited by admins. Please do not let the discussion get bogged down in whether 60% or 80% is the correct threshold for a votekick to pass. That is up to the admins to decide.
Technical details

Hoo boy where to start.
The votekick system is relying on the existing createvote system to create default votes. When the menu is first opened the server is queried whether the player is allowed to make a votekick, and if they are the UI presents the options to the player once they select the votekick option. There's a bunch of querying different systems to check eligibility and get names.
VoterEligibility is a new struct that can be used to set whether a vote should only show to a certain subset of players. Currently only All, Ghost and GhostMinimumPlaytime exists.
IVoteHandle on the server also keeps track of the cast votes, to include the player votes in the admin log. This functionality could also be used for a separate system to track and display vote results.
The way entity systems are being checked in VoteManager.DefaultVotes is probably scuffed.
The UI is functional but not the best, but since I am completely unfamiliar with RT's UI conventions I am opening up the floor to having the UI improved in a subsequent PR.
Media

Create vote menu when eligible to initiate a vote:

Create vote menu when not eligible to initiate a vote:

How the vote looks like (admin view! Normal users do not see the vote count):

Admin client left, alive player client right (alive player client does not get the vote):

Messages from votes:

Cvars:

Admin logger:

Requirements

[x] I have read and am following the Pull Request and Changelog Guidelines.
[x] I have added media to this PR or it does not require an ingame showcase.

Breaking changes

Changelog

🆑

add: Trusted players can now initiate votekicks for serious rulebreaks, when admins are unavailable.

CHANGELOG FAIL

CHANGELOG FAIL

it feels kinda odd that you should be a ghost, because you can spot a raider while being a passenger or secoff and you just have to rely on ghosts

I think the vote kick menu info text should tell the voters about the fact that antags cannot be vote kicked:

Players might be unsure if someone should be vote kicked because they don't know if they are a self-antag or not. This would allow them to vote, even when in doubt.
Players might think the vote kick system is broken due to lack of feedback.

Ghost requirement should probably be a cvar

a text field so they can write more info about what the person is being votekicked for?

A cvar to hide the vote counts to prevent dogpiling might be nice. I believe there's a PR open right now that adds the option to hide vote counts.
Another suggestion: maybe allow whitelisted players over a certain amount of hours to vote, even if they're in the round. Most whitelisted players in wizden can separate IC/OOC enough to vote on a person to be booted. This would curb the 10 ghosts problem a little bit.

A cvar to hide the vote counts to prevent dogpiling might be nice. I believe there's a PR open right now that adds the option to hide vote counts.

The vote counts already show up only to admins.

How the vote looks like (admin view! Normal users do not see the vote count):

(You know, maybe I should actually read the PR a little bit more instead of speeding through it, lmao)

should defo allow people actively playing to report, but maybe make it a verb menu action you get when rightclicking them

this will 100% will not be abused in any way whatsoever :trollface:
million traitors must be votekicked

Antags can't be vote kicked
And shrimply ban the people that abuse it

would like to see increases across the board for timers, we can relax them further down the line once it's been rolled out to a theoretically smaller group since whitelist is currently just "has this player been a pain in the ass from an administrative standpoint within the last month weeks and how old is their account" (there is a bit more to it but i'm summarizing).

increase time requirement from 10 hours to 20 (in theory this would at least cast a more direct net on players more likely to have some sort of command role experience through sheer playtime and have a sharper expectation of what is and isn't permissible)
ghost only makes sense due to information the player is provided or has access to within the menus proposed
total online player count seems reasonable
relax ghost duration from 5 minutes to 3 minutes

so basicaly cs 1.6

Ghost requirement should probably be a cvar

Implemented. I am not implementing a verb menu to start a vote or anything since that is a lot of extra work for something that is not going to be used upstream, so as-is this system would allow non-ghosts to see all active players from the vote menu if votekick.initiator_ghost_requirement is false.
votekick.voter_ghost_requirement is a separate Cvar and can be used in conjunction with the playtime and whitelist requirements to let trusted non-ghosts vote.
To summarize, nothing has changed with the ghost requirements, but now they have cvars.

increase time requirement from 10 hours to 20
relax ghost duration from 5 minutes to 3 minutes

Done.

imo only ghosts should be calling votes since they know who the shitter really is, but anyone should be able to vote. if you see the raider you have to let him kill you to vote him out which is silly, it should just let any trusted player vote regardless of alive/dead, let them trust the vote caller is using their ghost information for good and not lying about who the raider is

let them trust the vote caller is using their ghost information for good and not lying about who the raider is

I want to avoid players voting blindly and just assuming the person initiating the vote is right.  I don't like it much, and it feels like a compromise. But on the other hand if you are alive you can kill the bastard. ;)

if the votekick fails the user that called the votekick should be banned instead :trollface:

Cvar for votekick eligibility is raised to 100 based on admin discussion.

This went through maintainer review, but the label was not given.
The code looks good on my side.