SqlClient: Implement optimized version of the new ADO.NET batching API

Edited by @divega on 2/6/2019
We want to add public and provider independent batching APIs to the base classes in ADO.NET. This has been described in detail at https://github.com/dotnet/corefx/issues/35135.
We plan for the batching API to include a "fallback implementation" that should work for most existing providers that simply support the DbCommand functionality. But the fallback implementation will be sub-optimal (it will just concatenate the contents from CommandText into a single string and execute it.
From now on, we are going to use this customer-reported issue to track implementing a SQL Server-optimized version of the batching APIs.
As this issue originally referred to, SqlClient already contain the general functionality necessary in System.Data.SqlClient.SqlCommandSet, but there is no public API to use it directly and the only way to leverage it is through DataSet and SqlDataAdapter.
Original issue contents
--
Command sets are a SQL Server / TDS facility that lets database clients send multiple batches in one round trip. This can be very beneficial for performance. This facility is currently only being used by the SqlDataAdapter infrastructure. This infrastructure is not being used by modern apps anymore and it exposes only a very limited functionality (not arbitrary commands).
Command sets can help with this:

Send multiple batches in one round trip
Receive results independently
Much enhanced performance for executing many small commands
A clean API

SqlCommandSet should be cleaned up and made public. There is great community interest and value in doing this (link to a well known post by Ayende, includes benchmarks, second post, Ayende's hack to pry the class open).

Currently, people often concatenate their SQL commands into one batch. This is problematic:

It can defeat plan caching
It's slower
It's tedious and error prone (especially since you need unique parameter names, and errors non-deterministically stop the batch or they don't, and you can't easily find out which command failed)
It is subject to a total 2100 parameter limit (add by @roji, 2020-06-22)

I believe that command sets have great value. It looks like cleaning them up would not be too hard since they were written in a style that looks like they were meant to be exposed.
I also believe that the .NET community is not sufficiently aware that there is this super fast and clean way of submitting many small statements. Many applications and scenarios could benefit from this. When this is made public there should be a blog post on a Microsoft blog about it. It really is a secret ninja trick at this point. "Do this one special trick and get much better performance... DB consultants hate it."
Entity Framework could send updates likes that. According to the measurements by Ayende (and my own) this would be a very nice performance boost. I believe EF sometimes sends multiple sub-queries for one query in case of includes. This could make use of command sets as well cutting away one round trip for each query.
In the age of cloud network latencies are typically higher. It becomes especially valuable to be able to cut out round-trips.

@roji [from https://github.com/dotnet/corefx/issues/35135#issuecomment-493700728]

It is indeed the client's responsibility to drain and process responses coming from the server. This is similar to the PostgreSQL case: when responses aren't drained quickly enough the TCP buffer gets full and the server simply blocks. However, this doesn't really seem specific to batching in any way (can easily occur with a single command where row processing is very slow) - or am I mistaken?

I believe you are correct--I'm unaware of any way in which this would be batching specific.

Answering @Wraith2's comment in https://github.com/dotnet/corefx/issues/35135#issuecomment-519721600.
Sounds like things are somehow being built not against the newest versions? If you want to point me to a PR/branch I can try to take a look.
In any case, we know that the new batching stuff won't go into .NET Core 3.0 or .NET Standard 2.1. That means it may be OK to just wait for MS.Data.SqlClient to go open-source and work on setting up a benchmarking suite there - I don't think it makes much sense to do this in corefx where System.Data.SqlClient is getting pretty much frozen. It will also probably be easier to work in that repo rather than within corefx, built-wise.

From a clean corefx master. have a corefx command prompt open at the repo root. Create a new branch.
Run build src\System.Data.SqlClient and build src\System.Data.Common they will succeed, if It doesn't there are other problems.
Open System.Data.Common project and add in this code:
    public abstract class DbBatch : IDisposable, IAsyncDisposable
    {
        public void Dispose() { throw null; }
        protected virtual void Dispose(bool disposing) { throw null; }
        public virtual Threading.Tasks.ValueTask DisposeAsync() { throw null; }
    }

Then at the command prompt run build src\System.Data.Common again and it will succeed, you'll get ApiCompat errors but those are just because we didn't add an implementation. The compile has succeeded for everything and they're not the same, all good to continue development at that point.
Open SqlClient project, add this code into the ref assembly:
namespace System.Data.Common
{
    public abstract class DbBatch : IDisposable, IAsyncDisposable
    {
        public void Dispose() { throw null; }
        protected virtual void Dispose(bool disposing) { throw null; }
        public virtual Threading.Tasks.ValueTask DisposeAsync() { throw null; }
    }
}

Then at the command prompt run build rc\System.Data.SqlClient again, and see the following failures:
System.Data.SqlClient.cs(246,50): error CS0246: The type or namespace name 'IAsyncDisposable' could not be found (are you missing a using directive or an assembly reference?) [E:\Programming\csharp7\corefx\src\System.Data.SqlClient\ref\System.Data.SqlClient.csproj]
System.Data.SqlClient.cs(250,40): error CS0234: The type or namespace name 'ValueTask' does not exist in the namespace 'System.Threading.Tasks' (are you missing an assembly reference?) [E:\Programming\csharp7\corefx\src\System.Data.SqlClient\ref\System.Data.SqlClient.csproj]

ValueTask and IAsyncDisposable are both part of core, they're surfaced through System.Runtime type forwards. Both ref projects contain project references to the same project in the src tree for this, and yet one works and the other does not. If you check the .csproj files for both solutions they're almost the same except sqlclient has netfx and netstandard targets, neither of which is the default in the build command (netcoreapp is).
/pokes @ViktorHofer because you usually help me work out how to build things and @jnm2 because we were discussing this in gitter.

@Wraith2, just a shot in the dark, but have you tried to add the DbBatch class in System.Data.SqlClient.NetCoreApp.cs as opposed to System.Data.SqlClient.cs? Looking at ref/System.Data.SqlClient.csproj, I believe that System.Data.SqlClient.cs is probably compiled for all targets and in some of them those types won't exist.

I would try @divega's suggestion and if that doesn't work I will take a closer look.

The prototype I have in corefx requires the RPC changes that had already been merged there. Those changes in this version of the library involved Always Encrypted which means it isn't a simple port and will require some careful review and testing. The changes are made and in PR https://github.com/dotnet/SqlClient/pull/209 . Once those changes are integrated I can bring over the batching api.

The RPC changes I needed for this are in the netcore version of this library now. I still have my old corefx branch with the original version of the feature and I can port it to this library now. There are a couple of questions.

does Always Encrypted need to be fully supported in the batching api? if so does this require new or SqlClient specific surface area?
does the feature need to be added to both netfx and netcore versions? I've got a netcore version but we haven't progressed with the merging of codebases and getting those changes ported to netfx might be tricky.
do you want this for the 2.0 timeframe or is ok for a later version, it introduces new api surface area but doesn't break any previous behaviours so it can be a 2.x or later I think.

@Wraith2 thanks for this update, I'm very happy to hear this is still on your mind. I'm admittedly taken up by other things, but pushing the batching API through is definitely one of my goals this year.
Just to be sure I understand - your RPC changes are what's required under the hood, but the batching surface API (i.e. DbBatch) isn't yet exposed in any way, right? Would you estimate this would be a large effort given that the RPC changes are there?

does Always Encrypted need to be fully supported in the batching api? if so does this require new or SqlClient specific surface area?

I think you're better-placed than I to answer that :) Are you asking because the two features conflict in any way? Why do you think new surface may be required?

does the feature need to be added to both netfx and netcore versions? I've got a netcore version but we haven't progressed with the merging of codebases and getting those changes ported to netfx might be tricky.

That again is more a question for @David-Engel and @cheenamalhotra. From the ADO.NET perspective, the batching API is definitely not going to go into .NET Framework (in general no new BCL APIs will be introduced). It's still possible to introduce the API into the SqlClient netfx version, but I'm not sure it's extremely valuable (unless you see this as an easy and relatively risk-free proposition). Perf-minded people (and adopters of new APIs) in general should definitely be on core, so I'd imagine the value here would be more having general parity between the two versions of SqlClient rather than specific user need for this.

do you want this for the 2.0 timeframe or is ok for a later version, it introduces new api surface area but doesn't break any previous behaviours so it can be a 2.x or later I think.

I think post-2.0 should be fine - especially if you're convinced there's not going to be any breakage. Realistically I'm not going to get around to focusing on this in the next month (possibly two), and the main deadline from my perspective is .NET 5.0.

When I wrote the batching implementation in System.Data.SqlClient it took advantage of some improvements I'd made to the low level RPC mechanism inside the library which made it a lot easier. This repository was forked before my changes were merged so I needed to port over those RPC changes before I could port the batch feature. The netfx version of M.D.SqlClient won't have those changes which would make porting tricky, not impossible but more difficult.
The Always Encrypted feature is implemented largely at RPC level so it adds a layer of complication to my existing code and presents testing and validation problems because I don't have an AE environment setup. I rely on the CI to validate those behaviours and that isn't suitable as a development REPL environment, if AE is needed I'm going to need help from the MS team. It will also introduce some extended properties beyond the shared api because it'll require setting AE keys etc on the batches. I don't see any technical problem with it just resourcing concerns.

your RPC changes are what's required under the hood, but the batching surface API (i.e. DbBatch) isn't yet exposed in any way, right? Would you estimate this would be a large effort given that the RPC changes are there?

Correct. In terms of effort it's a few hours worth of porting from the corefx branch to get the core feature in place. Extra time will be needed on top for AE. My tests are a bit basic so we could expand on those.
We could put the DbBatch and other types into this library and ifdef them depending on the framework target, include out local versions for 3.1 and exclude for 5.0 where they will be in framework System.Data.Common. This would allow us to ship the feature from this repo before 5.0 is ready and allow users to try the api.

Thanks for the explanations @Wraith2, great to have you on this. I don't think it's terrible if SqlClient initially supports batching only without AE, although it would limit some usage possibilities: for example, the EF Core SQL Server provider wouldn't be able to use the batching API, since it wouldn't always work. Regarding the technical/resourcing side of this, I really don't have much to contribute - it's up to you and the SqlClient people.

We could put the DbBatch and other types into this library and ifdef them depending on the framework target, include out local versions for 3.1 and exclude for 5.0 where they will be in framework System.Data.Common. This would allow us to ship the feature from this repo before 5.0 is ready and allow users to try the api.

That's certainly possible - I'm definitely intending to expose DbBatch and friends from Npgsql for users targeting pre-5.0 TFMs as well, SqlClient could very well do the same. One advantage of this is to actually implement the API and run into any problems early, hopefully leaving us enough time to tweak the specs before they get locked down for 5.0. The only thing to be careful with is that if the specs do change, that may be a breaking change for users doing this - but I think it really shouldn't be a huge issue (it could be defined as a preview API, and possibly even exposed only in preview versions; to be seen with @David-Engel and @cheenamalhotra obviously).
One thing that would be great to see, though, is some perf numbers on how the API fares and to what extent it improves SqlClient performance (compared to "semicolon batching" in the same command). @bgrainger has done this work for MySqlConnector as you know (https://github.com/mysql-net/MySqlConnector/issues/650), it would be really great to see those numbers for SqlClient as well. I'm hoping it wouldn't be much work to adapt Bradley's code to SqlClient, I'd obviously be happy to help as well if needed.

The simple read-only DbBatch benchmarking code for MySQL/MariaDB is at https://gist.github.com/bgrainger/0504a52065eeade9e4b30e88b6363f2c.

I've got the code together and tests passing but I'm fighting a losing battle against the build system and as long as I have errors I can't get a nuget package to perf test with. Can I get some help figuring out what's going wrong with it @cheenamalhotra or anyone else? The branch is at https://github.com/Wraith2/SqlClient/tree/api-batching and from the netstandard 2.0 build ( I think) i'm getting stuff like this:
Common\Data\Common\DbBatchCommand.cs(8,27): error CS0260: Missing partial modifier on declaration of type 'DbBatchCommand'; another partial declaration of this type exists [E:\Programming\csharp7\SqlClient\src\Microsoft.Data.SqlClient\netcore\src\Microsoft.Data.SqlClient.csproj]
Common\Data\Common\DbBatch.cs(15,25): error CS0260: Missing partial modifier on declaration of type 'DbBatchCommandList'; another partial declaration of this type exists [E:\Programming\csharp7\SqlClient\src\Microsoft.Data.SqlClient\netcore\src\Microsoft.Data.SqlClient.csproj]
E:\Programming\csharp7\SqlClient\obj\Release.AnyCPU\Microsoft.Data.SqlClient\netcore\netstandard2.0\Microsoft.Data.SqlClient.notsupported.cs(1161,32): error CS0102: The type 'DbBatchCommand' already contains a definition for 'CommandText'
 [E:\Programming\csharp7\SqlClient\src\Microsoft.Data.SqlClient\netcore\src\Microsoft.Data.SqlClient.csproj]

which is saying there are two definitions of DbBatchCommand which there aren't and references a file Microsoft.Data.SqlClient\netcore\netstandard2.0\Microsoft.Data.SqlClient.notsupported.cs which isn't real and I can't see how it's being generated if it is. Compiling in visual studio works fine. and shows no errors for any config. I've got various conditions in the project files to stub in the provider base definitions for <net5.0 because they're needed as base classes.

 For SqlClient prepare isn't implemented (could be but it would only help with homogenous commands) and the it's only comparing 2 commands against a low latency local server. I've removed the prepare tests and upped the number of queries in the batch to 20 so you can see the per differences more clearly.

Method
Mean
Error
StdDev

Command
217.7 us
3.20 us
3.00 us

Commands
1,933.6 us
12.40 us
11.60 us

BatchCommand
227.4 us
2.10 us
1.86 us

BatchCommands
685.9 us
7.79 us
6.08 us

So the important figures are the Commands and BatchCommands which take a list of 20 statements and execute them serially counting the results.. Batching is 3 times faster even at this low repetition count.
These tests don't take into account latency and as I mentioned this is all done against a local instance. With a remote server or even worse an azure server we should see that gulf open even wider.

@Wraith2
Can you paste here SQL Server profiler traces to see how commands are sent to server?

@Wraith2 if I'm reading this correctly, batching using the new API (BatchCommands) is 3 times slower than batching using today's method, i.e. concatenation (Command)? Can you confirm that the two correspond to the techniques described in this article?

To answer your earlier questions, as discussed internally:

does Always Encrypted need to be fully supported in the batching api? if so does this require new or SqlClient specific surface area?

Yes. AE and Enclaves would need to be supported now or later, since it's one of the most important features for stakeholders. I'm not sure I understand surface area? The driver should be able to work with encrypted/non-encrypted columns seamlessly as it does for regular commands. New APIs for only Encrypted columns should be avoided and user experience for encryption enabled columns should be similar to rest of the driver.

does the feature need to be added to both netfx and netcore versions? I've got a netcore version but we haven't progressed with the merging of codebases and getting those changes ported to netfx might be tricky.

Yes. We want to reduce effort later on maintaining and porting over changes to netfx. And our goals are to continue to provide new features/fixes in both NetFx and NetCore as they apply to unify code-bases and to avoid API differences in both drivers as much as possible. However, it can be done after design in netcore is finalized and approved.

For what it's worth I think the SQL Server error model is an atrocity. The fact that SQL Server tends to keep running the batch but aborting the transaction means that following statements will execute outside of any transaction causing random damage. But other things could happen as well because, as stated, sometimes the batch is aborted. Sometimes the transaction stays open, sometimes not. It's very random.
The model is horribly broken in many ways. It seems best to keep command sets as consistent with the single command model as possible. That's the only sanity we can hope to maintain.

Maybe an example would help determine where this is observed. Because working with transactions and exceptions is definitely tricky and is going to be one of the key things when Batching is implemented.

Can you paste here SQL Server profiler traces to see how commands are sent to server?

basic traces show it's standard mode vs exec sp_execute but that's to do with how the existing driver executes batching not any choice of mine. Batching was already present in limited form I just surfaced it using the new public surface and tweaked a few things.
traces.zip
If you want specific trace flags or events just let me know what.
AE support is entirely possible but it comes with performance limitations. AE does a server roundtrip to get the encrypted parameter descriptions for each statement you want to execute. So if you want to execute a batch you'll have to get a description for each statement in it which at best doubles roundtrip time.
If we put in some logic to detect homogenous batch commands e.g. "INSERT INTO table(value) VALUES (@value)" repeated 20 times with different parameters we could do a single describe roundtrip and use the encryption data for all of the batch. That's all SqlClient internal detail though

does the feature need to be added to both netfx and netcore versions?
Yes. We want to reduce effort later on maintaining and porting over changes to netfx

The branch I got these numbers from implemented the SqlClient and System.Data.Common parts that would need to be in the runtime so it works in netcore 2.1 and 3 builds and is just project changes for 5.0 if this api gets in.
The internal changes mostly touch basic RPC which is slightly different in netcore due to perf changes I've made but those changes have been live for quite a while now in corefx and this library so porting them to netfx shouldn't be too difficult.

@Wraith2 if I'm reading this correctly, batching using the new API (BatchCommands) is 3 times slower than batching using today's method, i.e. concatenation (Command)? Can you confirm that the two correspond to the techniques described in this article?

Yup. That's what it looks like.
Concatenation is fine in small cases like this but it's going to seriously screw with your query plan generation and lifetime as well as parameter sniffing and time spent in plan generation in any moderately loaded environment. Concat is fine for small stuff but larger scale is where this feature is useful.

Absolutely agree that query plan pollution is important here, thanks.

If we put in some logic to detect homogenous batch commands e.g. "INSERT INTO table(value) VALUES (@value)" repeated 20 times with different parameters we could do a single describe roundtrip and use the encryption data for all of the batch.

This might not be possible. JDBC driver supports 'ExecuteBatch()' for parameterized queries and it's only possible with 1 query at a time. You can add data to batch, but internally it's still executed for 1 query at a time using sp_executesql. And for AE, metadata differs based on DATA, so if you are passing "32.5" and "12345.123" their metadata is different when encryption is performed.

On the other note, parameter metadata caching is beneficial for some scenarios where re-use of metadata is done when applicable on batched queries, which we also support implicitly in SqlClient.

@Wraith2
I compared your traces to parameterized queries, and that's exactly the same (using sp_executesql).
So I'd like to know how batching will improve above parameterized execution (from SqlClient perspective), coz we cannot concatenate queries, they will always be sequentially executed.
Secondly, since Prepare is not supported, I think that's a major lag. We're totally missing a big block of prepared statement support in the driver. I will investigate more about it, but let me know if you have any details.
IMO It should be supported for improving query execution performance on regular statements as well as parameterized queries. When preparing and executing queries, driver would make RPC calls in below order for n rounds of execution: (1)sp_executesql > (1)sp_prepareexec > (n-2)sp_execute. [sp_execute being the most efficient one, and sp_executesql saving prepare time on server side if query is executed only once]
That's how JDBC works, and it gives a good performance impact.

It can improve performance by sending multiple RPC's at the same time instead waiting on the first roundrip to complete. it helps in large latency situations. I haven't implemented prepare because it's a proof of concept not production ready code. Given that there was no signoff on the feature I wasn't trying to make it complete just see if it was possible, and it is.

It can improve performance by sending multiple RPC's at the same time instead waiting on the first roundrip to complete.

We'd still need to parse the results for each statement, as exceptions also need to be caught and thrown immediately instead of letting driver read all results. It could lead to unnecessary server processing if 1000s of statements are batched and the first one throws error.. we can't wait for server to process all 1000s of queries and then read first error.

On the first exception processed I would assume you send a cancel and then wait for the ok response while discarding contents. I also regard exceptions as something which should be exceptional and don't try to make them fast only correct, if a user screws up it's on them to deal with the outcome of that I only promise I won't make it worse.

Note that @GSPP seems to suggest above there may be an option to make SQL Server abort a batch on the first error (https://github.com/dotnet/SqlClient/issues/19#issuecomment-461451286), though I'm not sure if he meant the concatenated batch or our new proposed RPC batch. FWIW that's exactly the Npgsql/PostgreSQL behavior - the first failed command will automatically cause PG to skip the remaining ones, and only the first exception will be reported.

probably SET XACT_ABORT on or something like that but the driver can't rely on the user doing that or force them to do so because it's a behaviour changing setting. The batch command has been added to the exception as part of the new api surface so users can identify the batch entry that failed. We're not really talking at that level here though @cheenamalhotra was talking about the internal behaviour of the rpc's that are issued to the server and how their results are handled. It sounds like the java driver does something that might be useful here so lets see if it helps.

It may be OK for the driver itself to change a setting like that - as this is a totally new API there's no backwards compat or anything (as long as things are set back properly at the end etc.).

XACT_ABORT has strong semantic consequences. The driver should not change that. For both values of that setting, there's code "in the wild" relying on it. In particular, changing the default just for the new batch API would add to the confusion around the error model by introducing another special case.

Likely, the batch API should just behave as if those commands were executed one after the other. I think this is the naturally occurring behavior and it introduces the least additional confusion.
I do not have test cases for the various error cases (aborting batch or transaction) at hand. This seems to provide some pointers: https://dba.stackexchange.com/questions/126467/list-of-batch-aborting-errors-in-sql-server As described in that link, sometimes a batch keeps limping along and sometimes it is terminated. Reading that list it seems that batches are aborted under fairly unusual circumstances only. But there are exceptions:

As I suspected, there are exceptions, of course, as noted in the comments. Conversion failure is severity 16 but aborts the batch

This means that a SQL command can produce a stream of errors and other info messages interleaved with results. I believe this is currently fully supported through the InfoMessage event. I suspect that SQL Server Management Studio simply uses this API to support that as well.
I find statements on the web that errors do not roll back the transaction but keep executing. I don't trust those statements because I have definitely seen a transaction rolled back but the batch continuing. Needless to say, this had damaged the database by partially applying changes in a fairly random fashion.

Command sets are nice because they preserve the existing semantics while improving performance. Other solutions such as concatenating SQL lack that clean abstraction. For that reason, command sets should behave as closely to normal commands as possible.
This is important for library authors as well. For example, the popular Dapper library might use command sets (somehow) in the future. Dapper has no control over the SQL that is being passed to it.

Sorry for the long text below...

XACT_ABORT has strong semantic consequences. The driver should not change that. For both values of that setting, there's code "in the wild" relying on it. In particular, changing the default just for the new batch API would add to the confusion around the error model by introducing another special case.
[...]
command sets should behave as closely to normal commands as possible.

It does seem valid to me for a (new) batching API to have its own error semantics which differ from normal use. The reason for that, is that when commands are executed in separate roundtrips, the application has a chance to react to errors, e.g. refrain from sending later commands and/or go down a different code path.
There is also a performance aspect here which I think we're overlooking. @Wraith2 wrote:

I also regard exceptions as something which should be exceptional and don't try to make them fast only correct

Database exceptions are sometimes a normal part of program flow. For example, imagine doing optimistic concurrency (some update) as your first command in a batch - do you really want to have to execute and consume the results of all subsequent commands when it fails? Granted, the whole idea of optimistic concurrency is that concurrent updates to the same row are rare, and that it's acceptable to pay a small perf price when they happen (e.g. the extra roundtrips to redo the update) - but the price of executing later batched commands can easily become prohibitive if the batch is big.
However, I'm not sure if setting XACT_ABORT to true helps - it fails the transaction, but doesn't necessarily imply that later commands are evaluated (and their results returned). This would have to be checked.
To conclude, I personally find the SQL Server default behavior (XACT_ABORT=false) quite bad, but that may be my PostgreSQL background. However, @GSPP I do see the point that this is the SQL Server (default) behavior, and that we should be careful when considering changing it (although again, the context of batching may justify it). It seems that more research on exactly how SQL Server behaves would be good here.
PS1 Just for comparison, in PostgreSQL, the moment a command fails, the entire transaction is put into a "failed" state. It's not possible to continue executing commands (they will immediately fail), and the only thing you can do is roll the transaction back. This is completely unrelated to batching.
PS2 At the wire protocol level (e.g. like TDS), once an error occurs, PostgreSQL will skip all subsequent protocol messages until a special Sync message is seen. Npgsql uses this feature and packs batch commands together within a single Sync, so later commands are automatically skipped (not executed, or even parsed). This isn't related to transactionality.

I did a quick test. I change the list of commands so that the 3rd was one which would cause a common error. Specifically I tried to convert a string into an integer that was never going to work. Profile trace is as follows.

So it looks to me as if regardless of whether the following 17 RPC's were sent they weren't executed and I got an sql exception in the calling application. Does that help?
As far as the SQL Server error model being confusing and complicated. I agree but there's absolutely no way it's going to change because of the massive amount of work and errors it would cause to existing users. It's something that has to be lived with and understood for compatibility. It's like VB6, I don't like it but I do have to be aware of it.

@Wraith2 currently SqlCommandSet's behaviour does not send them in single request, so that's a safe implementation. I don't think we have any implementation in driver to send multiple commands at once and read all responses together. The only think that's different from regular SqlCommand is executing queries with RPC call.
This performance can further be improved if we supported Prepare that prepares queries and re executes them using it's prepare handle.
What I meant to say was we aren't going to do anything extra by making this class public than we could if we implement support for Prepare properly. This class would rather be an overhead to maintain once Prepare is supported. We can support same behaviour in SqlCommand in order to execute with RPC (as I mentioned above as done by JDBC) if user can call sqlCmd.Prepare() before executing it.
But "sending all requests together and reading all responses" is not going to work for SQL server.
Also regarding XACT_ABORT discussion, we don't change server side properties implicitly outside the scope of a single statement for specific cases as changing anything on the server without customer requesting it is against integrity of the driver.

currently SqlCommandSet's behaviour does not send them in single request

It doesn't? The code at https://github.com/dotnet/SqlClient/blob/5e943028d702cdc948263f96d60a5677860577f4/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/SqlClient/TdsParser.cs#L8943 loops over the entire rpc batch sending it in multiple packets if required without running the receive loop as far as I can see.

Ok I see that's an RPC batch being sent.
Thanks for sharing, I didn't scan through the code completely, but was comparing traces.
RPC batching is good! Let's also evaluate transaction processing in this flow and if we see any unexpected behaviors.
We would definitely need a lot of testing.

Just as a reminder, the most urgent from my perspective is less to work out all the implementation issues now, and more to confirm that the general ADO.NET batching proposal in #28633 is good.
(As an aside, @Wraith2 I hope you've received my email)

I did and responded, ready to talk it through with you all.

The branch is here. https://github.com/Wraith2/SqlClient/tree/api-batching
The implementation is mostly moving the internal LocalCommand object out to SqlBatchCommand and plumbing exception and sqlbatch through call hierarchies. Work will need to be done to get encrypted scenarios working and additional work could be done for prepared commands if there were time and interest.

Looks like this is going to get into NET6. I've still got my branch with the implementation in so I can rebase to current and get it posted as a draft.
Work that I know needs to be done:

NET6 build target needs to be added
Encryption scenarios need supporting and tests writing
Decisions on backporting to <NET6 versions (possible but is it desired?)

NET6 build target needs to be added

This is an approved change, and we will be adding it soon after .NET 6 release for the new API support from both .NET 5 and 6. Just that we're expecting some heavy changes in the driver code when building with .NET 6, but keeping fingers crossed 🤞
Prep work for .NET 6 building will be done now, but DLLs will be introduced to our NuGet after .NET 6 release.

Decisions on backporting to <NET6 versions (possible but is it desired?)

We'll have to evaluate the impact and accordingly make a decision to this.

We'll have to evaluate the impact and accordingly make a decision to this.

I've got the core working without any net6 so the impact shouldn't be very big. The main decisions is how to provide the local version of the new classes that are added like DbBatchCommand, we can't go without them because we need the base class but if we put it in the main namespace we'll prevent multiple providers being in the same process, I thought putting them in a local Microsoft.Data.Common would work.
We'll have to see what happens with encryption which is going to be need to be done on the MS side.

@DavoudEshtehari @JRahnama This is the issue we discussed last week. The api is in net 6 so what we need is a net6 build target and a policy decision from the MS side on the api will be made available in other builds where the base classes aren't available.
@roji to get this onto the management radar to implement we need to get more upvotes. I don't do twitter etc but is there any chance you or any of the EF team could raise the visibility and as anyone who wants the feature to give us an upvote?

@Wraith2  we start adding net6 for TFWs (sometime before preview1) and after that we are interested to start reviewing this and take it in also before preview 1.

Any news from the progress of this task?
.NET6 has been active LTS for some time already.
We are facing similiar issue as described here: https://github.com/dotnet/efcore/issues/22852

No news.

Initial implementation is up: https://github.com/dotnet/SqlClient/pull/1825
Please review, test your use cases, provide (constructive) feedback. I expect there to be at least some further work required and I feel that we could use some crowd sourced tests to provide better behavioural coverage.

Any more news?

The feature was merged. It'll be available in netcore only in all future builds.

@JRahnama Could this be closed?

Closing as v5.2.0-preview4 is released with this feature included.

@ayende sqlclient batching api is now public

@Wraith2 Just to understand - each SqlBatchCommand supports up to 2098 parameters, is that correct?

As far as i know, yes. Please feel free to try it...


android4.4 camera switch Camera.constants.Type.front,picture was distortion,but when I let phone switch landscape and portrait,it's work well.

help me,please. English is poor./(ㄒoㄒ)/~~


fix the bug that the Feature's tag match is wrong

Take a look at the errors reported by the build action


Open Loop Control for Fetch in Kujiale Scene

Most codes have been tested except configuring WORLD_PATH_NAME and LEVEL_NAME.

I made some minor cosmetic changes to this PR. I also squashed-and-merged it. Usually we don't squash-and-merge each others' PRs, but in this case I wanted to enable Rachith to test some physics changes. Please delete the dev branch when you're ready.


Real-time is not working for tenants other than admin

On the details screen, the graphs are not updated in real time.

tenant teste

simulator publishes data but the map and graphs are not updated

another example

There are some evidences that historical data is also affected by this issue.

Is this still happening?

Test OK.
Tested on Version: 62.2-20190524


write: broken pipe

Hi !
I try to use rtmp client to youtube
And got error "write: broken pipe"
this error I catch on func:
func (self *Conn) WritePacket(pkt av.Packet) -> self.writeAVTag(tag, int32(timestamp));
Could you help me with it ?

Hi,
Can you give my the command line that you are using ? I can try to have a look later. Cheers

May I have your email address ?

I'd rather keep the discussion public; you can just remove the Url and Key from the command line, if that's what bothers you ;)

It's ok. I don't worry about my keys, because I can change the at any time.
So what I try to do:
I trying to catch incoming packets, push them to the queue and after that read from the queue and push to the different rtmp connects.
my example:
package main

import (
	"fmt"
	"github.com/Seize/joy4/av/avutil"
	"github.com/Seize/joy4/av/pubsub"
	"github.com/Seize/joy4/format/rtmp"
	"log"
	"sync"
	"time"
)

const(
	urlYoutube = "rtmp://a.rtmp.youtube.com/live2/{MY_RTMP_KEY}"
	urlMixer = "rtmp://ingest-ams.mixer.com:1935/beam/{MY_RTMP_KEY}"
)

func main()  {

	rtmp.Debug = true

	server := &rtmp.Server{}

	l := &sync.RWMutex{}
	type Channel struct {
		que *pubsub.Queue
	}
	channels := map[string]*Channel{}

	startPublish := func(path string) {

		time.Sleep(time.Second * 2)

		conn, err := rtmp.Dial(urlMixer); if err != nil{
			fmt.Println(err)
			return
		}

		l.RLock()
		ch := channels[path]
		l.RUnlock()

		if ch != nil {
			cursor := ch.que.Latest()

			//demuxer := &pktque.FilterDemuxer{Demuxer: cursor, Filter: &pktque.WaitKeyFrame{}}

			if err := avutil.CopyFile(conn, cursor); err != nil{
				fmt.Println("error on copy to packets to connection: ", err)
				panic("go panic")
			}
		}

	}

	/// publisher
	server.HandlePublish = func(conn *rtmp.Conn) {

		path := conn.URL.Path

		fmt.Println(fmt.Sprintf("Come HandlePublish(%s)", conn.URL.Path))

		streams, _ := conn.Streams()

		l.Lock()
		ch := channels[conn.URL.Path]
		if ch == nil {
			ch = &Channel{}
			ch.que = pubsub.NewQueue()

			if err := ch.que.WriteHeader(streams); err != nil{
				log.Println("err on writing headers to queue: ", err)
				return
			}

			channels[conn.URL.Path] = ch
		} else {
			ch = nil
		}
		l.Unlock()

		if ch == nil {
			return
		}

		go startPublish(path)

		if err := avutil.CopyFile(ch.que, conn); err != nil{
			fmt.Println("error on copy: ", err)
			return
		}

		fmt.Println("Leaving HandlePublish()")

		l.Lock()
		delete(channels, conn.URL.Path)
		l.Unlock()

		ch.que.Close()

	}

	server.ListenAndServe()

}

I'm try stream packets to:

Twitch   (works fine)
Youtube  (error broken pipe)
Mixer    (error broken pipe)

On connection to Mixer platform, got error on command(connect) message.
For fix this I change AMF object on func writeConnect(rtmp.go:596)
FROM:
    flvio.AMFMap{
        "app":           path,
        "flashVer":      "MAC 22,0,0,192",
        "tcUrl":         getTcUrl(self.URL),
        "fpad":          false,
        "capabilities":  15,
        "audioCodecs":   4071,
        "videoCodecs":   252,
        "videoFunction": 1,
    }

TO:
        flvio.AMFMap{
            "app":           path,
            "flashVer":      "FMS.3.1",
            //"type":			 "nonprivate",
            //"flashVer":      "MAC 22,0,0,192",
            "tcUrl":         getTcUrl(self.URL),
            //"fpad":          false,
            //"capabilities":  15,
            //"audioCodecs":   4071,
            //"videoCodecs":   252,
            //"videoFunction": 1,
        },

After that message connect goes fine.
But after command messages on AV packet got error: broken pipe.
Also I try to debug rtmp server.
You can get dump HERE
my system configuration:
System Software Overview:

      System Version: macOS 10.14.3 (18D42)
      Kernel Version: Darwin 18.2.0
      Boot Volume: Без названия
      Boot Mode: Normal
      Computer Name: Mac mini
      User Name: moneyzmey
      Secure Virtual Memory: Enabled
      System Integrity Protection: Enabled
      Time since boot: 25 days 17:26

my go version:
go version go1.11.5 darwin/amd64

For streaming to rtmp server i use OBS (version: OBS 22.0.3 (mac))
My encoder setting you can get from obs log
OBS LOG:
09:33:58.967: ---------------------------------
09:33:58.967: [x264 encoder: 'streaming_h264'] preset: medium
09:33:58.967: [x264 encoder: 'streaming_h264'] profile: main
09:33:58.967: [x264 encoder: 'streaming_h264'] settings:
09:33:58.967: 	rate_control: CBR
09:33:58.967: 	bitrate:      4500
09:33:58.967: 	buffer size:  4500
09:33:58.967: 	crf:          0
09:33:58.967: 	fps_num:      30
09:33:58.967: 	fps_den:      1
09:33:58.967: 	width:        1920
09:33:58.967: 	height:       1080
09:33:58.967: 	keyint:       60
09:33:58.967:
09:33:58.978: [CoreAudio AAC: 'Track1']: settings:
09:33:58.978: 	mode:          AAC
09:33:58.978: 	bitrate:       160
09:33:58.978: 	sample rate:   44100
09:33:58.978: 	cbr:           on
09:33:58.978: 	output buffer: 1536
09:33:58.978: [rtmp stream: 'adv_stream'] Connecting to RTMP URL rtmp://<IP_ADDRESS>/live...
09:33:58.980: HandShake: client signature does not match!
09:33:58.982: [rtmp stream: 'adv_stream'] Connection to rtmp://<IP_ADDRESS>/live successful
09:33:59.003: ==== Streaming Start ===============================================
09:34:33.090: [rtmp stream: 'adv_stream'] User stopped the stream
09:34:33.090: Output 'adv_stream': stopping
09:34:33.090: Output 'adv_stream': Total frames output: 968
09:34:33.090: Output 'adv_stream': Total drawn frames: 1024
09:34:33.093: ==== Streaming Stop ================================================

Do you have any idea ?

Hi !
I haven't had time to look into this. I just tried to reproduce the problem with Youtube, and I also get the "write: broken pipe" when I stream with Obs.
I don't know yet what causes the problem, but when I tried streaming with ffmpeg (ffmpeg -stream_loop -1 -re <MY_FILE> -c copy -f flv rtmp://<IP_ADDRESS>:1935) it worked correctly. I'll have to keep looking.
Cheers

I've experienced the broken pipe issue as well for youtube. It seems higher bitrates are what cause it. For me, anything over 1000 causes the connection to fail. I hope that helps narrow it down

The main problem that bitrate 1000 is too low for live videos. Also youtube have table with bitrate and resolution: https://support.google.com/youtube/answer/2853702?hl=en you can check it here

I know it’s too low. If I try to do higher the pipe gets disconnected
On Mon, Jun 24, 2019 at 10:09 AM moneyzmey<EMAIL_ADDRESS>wrote:

The main problem that bitrate 1000 is too low for live videos. Also
youtube have table with bitrate and resolution:
https://support.google.com/youtube/answer/2853702?hl=en you can check it
here
—
You are receiving this because you are subscribed to this thread.
Reply to this email directly, view it on GitHub
https://github.com/Seize/joy4/issues/18?email_source=notifications&email_token=AACJ5LCTZQMLVSWQ5F47CBDP4DIQXA5CNFSM4G237XDKYY3PNVWWK3TUL52HS4DFVREXG43VMVBW63LNMVXHJKTDN5WW2ZLOORPWSZGODYNBQIQ#issuecomment-505026594,
or mute the thread
https://github.com/notifications/unsubscribe-auth/AACJ5LAMYYGS7LMUVRJ4FU3P4DIQXANCNFSM4G237XDA
.

I try to investigate this issue when have time. I'll let you know if problem will be solved


Indicate no limit on encryption_passphrase

Prompted by a user question, we discovered that this question is not answered by the docs.
No "practical" limit, because there are limitations on max size of SQL options, but that limit is multiple megabytes, and unlikely to apply to a key.

This change is

Online preview: http://cockroach-docs-review.s3-website-us-east-1.amazonaws.com/cdb3f64c508cabe3c6abef1a966f1474438df951/
Edited pages:

v20.2/take-and-restore-encrypted-backups.md

Online preview: http://cockroach-docs-review.s3-website-us-east-1.amazonaws.com/8c50e7857f63da318cf8c35ca05466ccd24aa3f3/
Edited pages:

v20.1/backup-and-restore-advanced-options.md
v20.1/backup.md
v20.2/show-backup.md
v20.2/take-and-restore-encrypted-backups.md

@lnhsingh Good catch, added.


feat(PL-2419): add support for alternate names for catalog/joy.yaml

I have renamed the file to joy.yaml as discussed in https://github.com/nestoca/joy/pull/88
I also have tested using a symlink and it was handled gracefully
by joy as-is.
So we can just do: https://github.com/nestoca/catalog/pull/597
And delete the symlink in a few months or so.

@silphid GH won't let me re-request a review from you, but can you have another look?


Gem require is too slow

First of all, thank you so much for making dry-validation. At @Shopify, we are looking forward to try it on our scale.
This is not particularly dry-validation issue, but for some reason the gem require time is quite slow:
require 'bundler/setup'
require 'benchmark'

puts Benchmark.measure {
  require 'dry-validation'
}

$ ruby bench.rb
0.240000   0.150000   0.390000 (  0.401198)

That's  400ms or almost half a second just to require the gem.
All credits to @casperisfine for discovering this problem.
@solnic @timriley

Here is the output of the dependencies profile:
TOP: 6.4258 MiB
  dry-validation: 6.3789 MiB
    dry/validation: 6.375 MiB
      dry-configurable: 4.8516 MiB (Also required by: dry/container)
        dry/configurable: 4.8438 MiB
          concurrent: 4.8086 MiB (Also required by: dry/container, dry/types)
            concurrent/configuration: 1.8945 MiB (Also required by: concurrent/scheduled_task, concurrent/options, and 2 others)
              concurrent/delay: 1.4492 MiB (Also required by: concurrent/utility/processor_counter, concurrent)
                concurrent/concern/obligation: 0.8594 MiB (Also required by: concurrent/ivar)
                  concurrent/atomic/event: 0.6992 MiB (Also required by: concurrent/executor/immediate_executor, concurrent/atomics, and 3 others)
                    concurrent/synchronization: 0.625 MiB (Also required by: concurrent/executor/abstract_executor_service, concurrent/utility/at_exit, and 29 others)
                concurrent/executor/immediate_executor: 0.5234 MiB (Also required by: concurrent/configuration, concurrent/executors)
                  concurrent/executor/abstract_executor_service: 0.4609 MiB (Also required by: concurrent/executors, concurrent/executor/ruby_executor_service)
            concurrent/executors: 1.3594 MiB
            concurrent/atomics: 1.0313 MiB (Also required by: concurrent/executor/simple_executor_service)
              concurrent/atomic/reentrant_read_write_lock: 0.3477 MiB
      dry/validation/schema: 1.3047 MiB (Also required by: dry/validation/schema/form, dry/validation/schema/json)
        dry/validation/input_processor_compiler: 0.418 MiB
          dry/types: 0.3516 MiB
        dry/validation/messages: 0.3867 MiB
          dry/validation/messages/yaml: 0.3672 MiB
            yaml: 0.3281 MiB
              psych: 0.3281 MiB

My two cents after looking a bit into dependencies:

dry-validation doesn't need an extensive config management. Maybe we could avoid loading concurrent-ruby just for a few accessors?
Maybe we could delay loading validation messages and I18n until they're required for compiling error messages? dry/validation/messages takes around 0.4 MiB

This is pretty crazy :/ Could you tell me which ruby version do you use? Is it in a rails app?
We used dry-v in a non-rails app and we had cases where ie loading a single spec which requires dry-v + a bunch of other things + running a spec would take less than 400ms.

dry-validation doesn't need an extensive config management. Maybe we could avoid loading concurrent-ruby just for a few accessors?

We use concurrent-ruby for thread-safe caches too, but maybe we could improve that dep start-up time somehow too.

Maybe we could delay loading validation messages and I18n until they're required for compiling error messages? dry/validation/messages takes around 0.4 MiB

Yep, that's definitely a good idea. In fact originally we didn't even require i18n support by default, but since that's so slow I'll change that.
I'm on short holidays right now, going back home on Monday, so I'll look into this further later next week. Thanks for reporting this and trying out dry-v btw, we're wrapping up a major release this month, lots of improvements, polishing and bug fixes :)

Could you tell me which ruby version do you use? Is it in a rails app?

My results are from MRI 2.3.0.
Yes, we use dry-v in a Rails app but all my benchmarks are taken outside of Rails app with a separate Gemfile.
Here is an update: I could isolate the problem and turns out the massive slowdown is coming not from require, but from the schema definition.
require 'benchmark'
puts Benchmark.measure { require 'dry-validation' }
puts Benchmark.measure {
    require_relative './order_schema_definition'
}

cold start:
require: 0.460174s
schema: 4.934889s

hot start:
require: 0.115078s
schema: 4.936531s

(require is still slow, but it's fast when compared to schema definition timing)
It takes 5 seconds to define the schema and build the AST.
Here is an example of our huge schema (I had to strip the field names): https://gist.github.com/kirs/f12ce793376d8f454c2f1a4ce997481b

Here is a stackprof profile from the schema defition:
     TOTAL    (pct)     SAMPLES    (pct)     FRAME
     10598 (214.8%)        2802  (56.8%)     Dry::Validation::InputProcessorCompiler#visit_and
      4826  (97.8%)         345   (7.0%)     Dry::Types::Compiler#merge_with
     21150 (428.7%)         309   (6.3%)     Dry::Validation::InputProcessorCompiler#visit
      3845  (77.9%)         192   (3.9%)     Dry::Types::Compiler#visit_type
      6670 (135.2%)         159   (3.2%)     Dry::Types::Compiler#visit
       152   (3.1%)         113   (2.3%)     Dry::Validation::InputProcessorCompiler#visit_predicate
        59   (1.2%)          59   (1.2%)     Concurrent::Collection::NonConcurrentMapBackend#get_or_default
        48   (1.0%)          48   (1.0%)     Dry::Types::Options#initialize
       113   (2.3%)          44   (0.9%)     Dry::Types::Builder#|
        39   (0.8%)          39   (0.8%)     Dry::Validation::InputProcessorCompiler#type
      2180  (44.2%)          38   (0.8%)     Dry::Types::Compiler#visit_key

@kirs thank you for the reproduction steps. Maybe it is better to change the issue description and title since what is slow is not the gem require but the schema definition.
@solnic here is the issue that I told you in Gitter.

Thanks Rafael, I renamed it.
One more thing I just discovered: all slowdowns apply only to Dry::Validation.Form. Dry::Validation.Schema works quite fast.

Thanks for the detailed info, I'll make it much faster in 0.8.0. Stay tuned.

Thanks! I'll be looking forward to try it from master.

I compared this with a plain schema w/o coercions and it's pretty clear that the bottleneck is coercion-inference. It takes ~0.05 second to define your huge schema w/o coercions, I'm pretty sure we can make it almost as fast with coercions too.
We are in the process of discussing a new explicit API for defining types inside a schema, which will remove the need to have this crazy input-processor compilers. For more info see #181

There we go:
Schema defined in 0.075425
Form defined in 5.43349
Form (with type specs) defined in 0.077061
------------------------------------------------------------------------------
Warming up --------------------------------------
              Schema     1.000  i/100ms
                Form     1.000  i/100ms
Form with type specs     1.000  i/100ms
Calculating -------------------------------------
              Schema     15.248  (±13.1%) i/s -     75.000  in   5.045985s
                Form      0.174  (± 0.0%) i/s -      1.000  in   5.749034s
Form with type specs     14.810  (±20.3%) i/s -     71.000  in   5.000067s

Comparison:
              Schema:       15.2 i/s
Form with type specs:       14.8 i/s - same-ish: difference falls within error
                Form:        0.2 i/s - 87.66x slower

This means there will be no practical difference between schema with or without coercions (via type specs) :) This is in a branch, I gotta clean some things up and merge it to master. I'll close this issue once  that's done.

Thank you so much!
Looking forward to try the new version.

Folks, I'm gonna close this one as with dry-v 0.8.0 you'll be able to use explicit type-specs which will be used to configure coercion separately from the rules. Good news is, as mentioned already, it's gazillion times faster, bad news is that it's gonna be more verbose syntax-wise, ie:
required(:age, [:nil, :int]).maybe(:int?)

There are various ways how this can be improved, but there are lots of considerations here so I decided to postpone this for another release; in the meantime people can experiment with their own methods to remove some duplication and we can see what comes out of that. I just added a public API for extending the DSL with custom methods, ie:
dsl_ext = Module.new do
  def maybe_int(name, *predicates, &block)
    required(name, [:nil, :int]).maybe(:int?, *predicates, &block)
  end
end

Dry::Validation::Schema.configure do |config|
  config.dsl_extensions = dsl_ext
end

schema = Dry::Validation.Schema do
  maybe_int(:age)
end

I'll release new versions of dry-validation/types/logic today so please check it out and lemme know if things work for you.

Thank you for the new release!
I've checked it with our huge schema and results are pretty good. It takes around 7ms for the schema definition 🚀 🚀 🚀

@kirs thanks for testing it out :)


Game Jolt API

Name
Game Jolt API
Description
This version is beta, so there may be errors in the requests.
There are functions for Scores, Data Store, Time, Session, Users, Friends and Trophies and others tools.
game-jolt-api.zip

Nice :)
A few feedbacks based on what I've seen:

You're loading a library from "https://maurydev.github.io/game-jolt-api-gdevelop/lib/versions/1.0.1/index.min.js", can you describe what is it?
Remember that if you're using fat arrow functions ((name) => ...) instead of function, you're breaking compatibility with Android 4.4. (I've added a card on the roadmap to automate the detection of this: https://trello.com/c/DRaJS0hY/385-add-warning-when-adding-extension-or-when-the-game-is-exported-about-android-4-compatibility and warn the users)
You're using eval, why doing so? It's dangerous as it can let arbitrary code being executed. Can you explain why you're using it or remove it? In 99.9% of the case, there is a better way to do it using safer JavaScript functions.

1- I didn't want to write so much code in the project, so I made an external file.
I made the code smaller and more unreadable to read.
2- I did not know that some platforms did not support () =>
3- I will correct the eval, I also found it.
My repository: https://github.com/MauryDev/game-jolt-api-gdevelop

My repository: https://github.com/MauryDev/game-jolt-api-gdevelop

That's good work! :)
Right now GDevelop miss the ability to embed an external library like the one you did.
Nevertheless, it could be interesting to bundle the content of the index.min.js into the extension itself (as a JavaScript event that is called when you initialise the extension maybe?). So that players don't have to download another file from github when running the game (it's more robust and secure) :)

Update :v
game-jolt-api.zip

Cool! :)
Thanks for including the whole library in the extension 👍 You can still include a comment with a link to your Git repository if you wish?
No eval seems better :) I'll take a more in depth look tomorrow.
Thanks for working on this! Will be very useful 👍

Git repository: https://github.com/MauryDev/game-jolt-api-gdevelop.git
Any mistake or good thing I mentioned.

Thanks this looks very complete :)
I've started to go through descriptions of actions and make some fixes.
For example, sentences of actions like "Response Trophies. Message ID: _PARAM1_,Variable Data: _PARAM2_" should instead be full sentences, like Save all trophies from Message ID _PARAM1_ into scene variable _PARAM2_
Other things to fix:

You mention global variables while it's scene variables.
Can you explain what Message ID is?

I'll go through everything and try to fix the mistakes/improve the sentences :) Thanks for this very complete implementation so far.

Message ID: Name of the variable that receives the api response that is different from the scene variable, global variable, and object variable.
I don't speak much English. I am taking a free online course.
And the global variable I did wrong.

I don't speak much English. I am taking a free online course.

That's a great job you've done considering this :)
I'll go and fix the extension in the next days and will publish it.

I've seen that some parameters have a long description. I'll be making changes to GDevelop so that we can put long descriptions below the fields in the interface, so that it's not taking too much space on the field itself. See this: https://trello.com/c/ZzQI6giY/389-add-support-for-long-descriptions-for-action-conditions-parameters-shown-as-helper-text-below-the-parameter-field

Would be great. I wish I could add icon for extension.

If you have an icon post it here and I'll see if I can add it later when extension support icons

about messege id how do u use it

about messege id how do u use it

quit

What is the change required in GDevelop here, icons or javascript based extensions? If it is the former the process can be resumed. If not, for the record, I had made an extension around the same time as MauryDev for game jolt that didn't load any external script.
Here is the file, though I do not remember at all how I did it and haven't taken a new look at it so the code quality may be very bad and it may be incomplete.

If there are no updates in the next 10 days, I will consider this abandoned and close the issue.

the change i dont know what needs to be changed mabie the message id or something else altho arthuro555 did make a gamejolt api extention for gdevelop and should be intergraited into gdevlop itself. another thing that needs to be changed is the way extentions get their icons as for some resean it considered malware or virus

My version of the extension is old and incomplete. I would rather redo it with GDevelop events rather than JavaScript. I also am not sure what the needed changes are hence why I don't do them myself but ask the original author to tell if they plan to do it or if we should just make a new one.

Trying to use this Softlocks my game.

This extension is sadly abandoned and should probably not be used. If someone needs the GameJolt API, a brand new extension should be started from scratch.

I'll close this and add it in extensions ideas on Trello then.

huh


Defer collection of device ID until necessary (presumably for rewards)

The app asks for my device ID (and thus, ability to make calls) on startup. This is offputting to some users.
It would be preferable if this wasn't requested until necessary as part of opting in to rewards.

como obter recompesa nesse aplicativo porque estou perdido

Olá, recompensas para Android estarão disponíveis em uma futura versão beta.


Improve the OCL parser

Is your feature request related to a problem? Please describe.
The current parser requires adding "::" and ":" for allInstances() and class properties, respectively. This is not "compliant" with the OCL specification.
Describe the solution you'd like
Re-implement the parser, in a light-weight manner
Describe alternatives you've considered
I have talked with Ed Willink, who is the guy responsible of Eclipse OCL and the
"guru" in terms of OCL implementations. Attached is our email exchange.
I believe we need to go for a "light" solution, independent from Eclipse. That's the reason
I propose to re-implement the parser, in a light-weight manner.
Hi Manuel
I cannot comment on how re-useable the USE parser is, but I expect it's useable but obviously not that accurate and without any of my OCL spec fixes.
Both Classic and Pivot Eclipse OCL can be used standalone, although even for standalone usage it's convenient to invoke from a plugin so that the MANIFEST generates the classpath automatically.
The corresponding "Parsing OCL Documents" in the OCL documentation explains simple usage.
If you only want occasional usage, just open your *.ocl file in the Complete OCL editor and then use the context menu to save as Abstract Syntax.
The PIvot OCL is certainly not as light as possible since it uses Xtext, but it generates a credible Abstract Syntax model, which is probably just what you want. Probably 10-15 plugins from the 50 plugin OCL distribution.
The Classic OCL  uses LPG2 so you might get away with 5 plugins. But the AS is proprietary and slightly tricky to extract. Correction: https://ci.eclipse.org/ocl/job/ocl-ecore-standalone/76/console tells me that the classpath is:
ClassPath:
/home/hudson/genie.ocl/.jenkins/jobs/ocl-ecore-standalone/workspace/tests/org.eclipse.ocl.standalone.ecore.tests/target/classes
/home/hudson/genie.ocl/.jenkins/jobs/ocl-ecore-standalone/workspace/tests/org.eclipse.ocl.standalone.ecore.tests/target/classes
/opt/public/hipp/homes/genie.ocl/.m2/repository/.cache/tycho/org.junit-4.12.0.v201504281640.jar/junit.jar
lpg.runtime.java/2.0.17.v201004271640/lpg.runtime.java-2.0.17.v201004271640.jar
org.eclipse.emf.common/2.16.0.v20190528-0845/org.eclipse.emf.common-2.16.0.v20190528-0845.jar
org.eclipse.emf.ecore.xmi/2.16.0.v20190528-0725/org.eclipse.emf.ecore.xmi-2.16.0.v20190528-0725.jar
org.eclipse.emf.ecore/2.18.0.v20190528-0845/org.eclipse.emf.ecore-2.18.0.v20190528-0845.jar
org.eclipse.ocl.common/1.8.400.v20190915-0640/org.eclipse.ocl.common-1.8.400.v20190915-0640.jar
org.eclipse.ocl.ecore.tests/3.10.400.v20190915-0640/org.eclipse.ocl.ecore.tests-3.10.400.v20190915-0640.jar
org.eclipse.ocl.ecore/3.14.0.v20190915-0640/org.eclipse.ocl.ecore-3.14.0.v20190915-0640.jar
org.eclipse.ocl.tests/3.10.400.v20190915-0640/org.eclipse.ocl.tests-3.10.400.v20190915-0640.jar
org.eclipse.ocl/3.10.400.v20190915-0640/org.eclipse.ocl-3.10.400.v20190915-0640.jar
org.hamcrest.core/1.3.0.v20180420-1519/org.hamcrest.core-1.3.0.v20180420-1519.jar
Regards

    Ed

On 17/09/2019 10:39, MANUEL CLAVEL wrote:

Hi Ed,
This is Manuel Clavel.
First of all, thank you for your keynote, talk, and discussions/questions at the OCL Workshop.
Very enlightening, indeed :-)
Now, a quick question:
As I mentioned to you yesterday,  for the Java library we are building for mapping
OCL into SQL we need a "decent" OCL parser (right now we are using a very "basic" one).
Which one will you recommend us? Obviously, it should be as "light" as possible, open-source,
and easy to "plug-in" in our library (which does not assume/depend on ECLIPSE in any way).
Thanks!
--Manuel

Additional context

 Improve the OCL parser #7

Hi @manuelclavel ,
After received this ticket, we spent some time looking into the work Ed with the hope of reusing his Eclipse OCL parser. After a while, we could not follow the implementation due to its complexity.
Eventually, we decided to implement the lightweight parser on our own using regular expression.
This approach, on the one hand gives us full-control of what is going on during the parsing but on the other hand forces us to write/adjust regular expression manually (because it is incomplete) whenever a new operation or syntax is required.
For the time being, all the definitions in the published papers are implemented in an OCL-compliant way. We had checked one-by-one with the old parser to make sure that no monkey business is happening.
As a result, we pushed the second version of OCL2PSQL to default branch. You can checkout it using command
git checkout OCL2PSQL-v2.
By the way, we removed the old implementation in the new version. For your reference, you can use the old one in the old version
git checkout OCL2PSQL-fdse19-v1.
Cheers,
H.


Invalid name

I get the following error in the homebridge log after configuring the plugin:
[12/12/2022, 20:32:29] [UPS] <IP_ADDRESS>: error: RangeError: : invalid name
at UpsAccessory.set name [as name] (/var/lib/homebridge/node_modules/homebridge-ups/node_modules/homebridge-lib/lib/Delegate.js:108:13)
at new Delegate (/var/lib/homebridge/node_modules/homebridge-ups/node_modules/homebridge-lib/lib/Delegate.js:38:15)
at new AccessoryDelegate (/var/lib/homebridge/node_modules/homebridge-ups/node_modules/homebridge-lib/lib/AccessoryDelegate.js:42:5)
at new UpsAccessory (/var/lib/homebridge/node_modules/homebridge-ups/lib/UpsAccessory.js:68:5)
at UpsHost.init (/var/lib/homebridge/node_modules/homebridge-ups/lib/UpsHost.js:67:37)
at processTicksAndRejections (node:internal/process/task_queues:96:5)
at UpsPlatform.init (/var/lib/homebridge/node_modules/homebridge-ups/lib/UpsPlatform.js:104:7)
Using the ups -H command in the terminal connects and displays info of my UPS fine. I have a CyberPower CP900EPFCLCD UPS connected to a TrueNAS system.

What's your config.json?


Figma Design.

Design the UX and UI of The Crowd by creating a mobile-first Figma design.

Pages

Login

email input
password input
submit button
link to sign up page
front end validation
Link to info page

Sign Up

name input
email input
password input
birthday input
location input
link to log in page
front end validation
Link to info page

Info page

General info about the app

Profile

name
link to accounts page
pledge count
list of currently active pledge (links to those pledges)
option to remove active pledges
logout

accounts page

ability to delete the account
change password

old password input
new password input x2
save button

change email

shows current email
new email input
save button

dashboard / nav

Six categories of life areas that affect climate change (Transport, Shopping, Nature, Waste, Energy, Food)

6 Action pages

Action page is dedicated to each category
Stores 3 pledges
Each pledge shows how many others have also made that pledge
Each pledge is given with some pros/cons of making that pledge
User can 'select' a pledge that will then be stored on their profile
User can deselect pledge if they no longer want to make that pledge

The Figma prototype https://www.figma.com/file/hFtTGaPfdTBUBr2ibqU7Pd/The-Crowd?node-id=0%3A1

The Figma prototype


Add is_non_clock_global attribute to model ports in the XML schema

is_non_clock_global is a newly added attribute of model ports which didn't make it to the schema or docs yet, but it exists in the parser code.

I think this was added as part of @mustafabbas 's work? There might be more clues at https://github.com/verilog-to-routing/vtr-verilog-to-routing/commits?author=mustafabbas and https://github.com/verilog-to-routing/vtr-verilog-to-routing/issues?utf8=✓&q=is%3Aissue+mustafabbas

Fixed in #872.


Greenwich.RELEASE   --     Turn the plus sign“+” into space

After upgrade Greenwich.RELEASE  ，feignclient  Turns the plus sign“+” into space

Can you provide a complete, minimal, verifiable sample that reproduces the problem? It should be available as a GitHub (or similar) project or attached to this issue as a zip file.

In my case it look like
Send via feign client  Preprocess phone=[+123]
Get on recipient Cannot find by phone=[ 123]

@mdavydau  https://github.com/spring-cloud/spring-cloud-openfeign/issues/137#issuecomment-467507591

In my case it look like
Send via feign client Preprocess phone=[+123]
Get on recipient Cannot find by phone=[ 123]

Yes

Feign  Client Send
@RequestMapping(value = "/api/user/user/getUserByUsernamePwd", method = RequestMethod.GET)
public UserDTO getUserByUsernamePwd(
@RequestParam("username")String username,
@RequestParam("password")String password);
username ="aa"
password = “a+123456” [a+123456]
Feign Server  Receive
username ="aa"
password = “a 123456”      [a 123456]

@ryanjbaxter
I made fork from https://github.com/spring-cloud-samples/feign-eureka and add example with "+".
Commit with current test: https://github.com/mdavydau/feign-eureka/commit/e64c8010ee781a0b45d39839b00724a9679093db
Code example: feign-eureka.zip
Please send on your local env
http://localhost:7211/phone
and check response from server with whitespace
Hello World: 123 | HelloServer:<IP_ADDRESS>:7111

@mdavydau @Supermagic5 I've tested this (using the sample @mdavydau has provided) against Spring Cloud Greenwich.RELEASE + Boot 2.1.3.RELEASE and it worked fine for me. If you want us to work on this,
please provide a minimal, complete, verifiable example that reproduces the issue.

If you would like us to look at this issue, please provide the requested information. If the information is not provided within the next 7 days this issue will be closed.

Closing due to lack of requested feedback. If you would like us to look at this issue, please provide the requested information and we will re-open the issue.

There was a bug found in openfeign for this exact issue back in January, multiple actually.
https://github.com/OpenFeign/feign/issues/881
https://github.com/OpenFeign/feign/issues/879

And the fix was https://github.com/OpenFeign/feign/pull/882

Which, after doing some research, is available in 2.1.2-RELEASE of this library since feign was updated to 10.3.0 and the fix was present for 10.2.0. For spring cloud versions that would mean Greenwich.SR2


thanos: 0.27.0 -> 0.28.0

Automatic update generated by nixpkgs-update tools. This update was made based on information from https://github.com/thanos-io/thanos/releases.
meta.description for thanos is: "Highly available Prometheus setup with long term storage capabilities"
meta.homepage for thanos is: "https://github.com/thanos-io/thanos"
meta.changelog for thanos is: ""
Updates performed

Golang update

To inspect upstream changes

Release on GitHub

Compare changes on GitHub

Impact

Checks done (click to expand)

built on NixOS
The tests defined in passthru.tests, if any, passed
found 0.28.0 with grep in /nix/store/hfwxfxll8irl84c6vrg8gsm1bn9bhpqn-thanos-0.28.0
found 0.28.0 in filename of file in /nix/store/hfwxfxll8irl84c6vrg8gsm1bn9bhpqn-thanos-0.28.0

Rebuild report (if merged into master) (click to expand)

1 total rebuild path(s)

1 package rebuild(s)

First fifty rebuilds by attrpath
thanos

Instructions to test this update (click to expand)

Either download from Cachix:
nix-store -r /nix/store/hfwxfxll8irl84c6vrg8gsm1bn9bhpqn-thanos-0.28.0 \
  --option binary-caches 'https://cache.nixos.org/ https://nix-community.cachix.org/' \
  --option trusted-public-keys '
  nix-community.cachix.org-1:mB9FSh9qf2dCimDSUo8Zy7bkq5CX+/rkCWyvRCYg3Fs=
  cache.nixos.org-1:6NCHdD59X431o0gWypbMrAURkbJ16ZPMQFGspcDShjY=
  '

(The Cachix cache is only trusted for this store-path realization.)
For the Cachix download to work, your user must be in the trusted-users list or you can use sudo since root is effectively trusted.
Or, build yourself:
nix-build -A thanos https://github.com/r-ryantm/nixpkgs/archive/2203cc848241849393509cf80ee9d379c6cb7e41.tar.gz

After you've downloaded or built it, look at the files and if there are any, run the binaries:
ls -la /nix/store/hfwxfxll8irl84c6vrg8gsm1bn9bhpqn-thanos-0.28.0
ls -la /nix/store/hfwxfxll8irl84c6vrg8gsm1bn9bhpqn-thanos-0.28.0/bin

Pre-merge build results
We have automatically built all packages that will get rebuilt due to
this change.
This gives evidence on whether the upgrade will break dependent packages.
Note sometimes packages show up as failed to build independent of the
change, simply because they are already broken on the target branch.
Result of nixpkgs-review run on x86_64-linux 1

1 package built:

thanos

Maintainer pings
cc @basvandijk for testing.

Result of nixpkgs-review pr 188749 run on x86_64-linux 1

1 package built:

thanos


Add python decoding + Add YAML/JSON support

~Based on refactoring in #45~ (merged)
Based on refactoring in #46

Merging this. Additional ARCHITECTURE.md comments can go in #47


Fixed: Builder does not work on Safari on IOS

While the regular expression might fix IOS issues, it will not match the emoji name.


[PE-D][Tester E] Lack of visuals and explanations for list commands

When entered into the command box, the "listSuppliers", "listTasks", "listInventory" commands do not seem to perform any function as the UI remains unchanged after performing the commands. There are also a lack of visuals provided in the UG to illustrate what these commands actually do, which makes it confusing for the user to understand the actual function of these commands.

Labels: type.DocumentationBug severity.High
original: rycs2812/ped#4

Not sure why is it a severity high but I guess we can explain that it is to list all items etc in the UG.


footer overlap - content-wrapper wrong min-height

Hey there!
I have some problems with the min-height of the content-wrapper. I'm using a tablist as you can see down below (content is on german, sorry^^):
http://i.share.pho.to/e579f31c_o.png
As you can see, everything is fine. But when i switch the tab, the content overlaps the footer.
http://i.share.pho.to/38a4fa7a_o.png
I sniffed the code and I found the problem:
When I click on the tab, the content-wrapper min-height didn't get an update - how can I handle this?
/cheers and thanks for your work!

How about try using the Tabs provided by the Theme and see if the error still occurs when navigating between Tabs. If not, maybe it is with your HTML tab elements.
Do share your HTML so we can give it a try and help if you'd like.
Hope this helps,

Ah, shame on me. Haven't seen that there are themed tabs. Gonna take a look later, when I've arrived at home. Thanks :)

Yeah - it was my fault. Thanks for your help, ramadan. Everything works fine, now :)

I am Having same problem. But I am not using tabs or anything. I am using features provided by Adminlte...have a look at the problem

I had the same. I realized I forgot to add a row to the boxes. So add this before your first box:
and add this at the end before the footer

@jvieitez Thank you so much for responding. I really appreciate that. But I really don't understand what do you mean by adding a row to boxes. Can you give me a simple example?

Try adding
 then your content and close the row

If that doesn't work, add

 to the end of the document, right before the footer.

It solved the problem. Thank you @almasaeed2010

@almasaeed2010 you saved my day.

Try adding
 then your content and close the row

If that doesn't work, add

 to the end of the document, right before the footer.

Solved my problem! Tyvm


Prefer const over let

In order to comply with this new standard rule ☺
https://github.com/standard/eslint-config-standard/pull/133

Coverage remained the same at 99.436% when pulling 34e169431f50cca3b46281c692066533f38ace42 on LinusU:prefer-const into f7254985c1919fb0dc4d284811bfe06340efb32c on z0mt3c:master.

ping @z0mt3c ☺

ping @z0mt3c ☺

ping @z0mt3c ☺


Bug:  XDM requires many ID's under experience event schema to be length > 20 | E.g. productViews.id, cartAbandons.id, ...

What are the schemas that are affected by the issue
_xdm.context.experienceevent
What are examples of products that are impacted by the issue
The constraint on the product ID's seems like a bug. We need to remove this.
Here is the full list of ID's that have constraint of 20 length:
https://wiki.corp.adobe.com/display/DMSArchitecture/XDM+Field+Constraints
Background: I have a ACME Retail Application where user views and purchase products. Application integrates with Platform and sends all experience event as well as Profile update using Streaming via  DCCS.
Here is JSON message for Product View:
[{"header":{"imsOrgId":"340B40865B7BAD1F0A49403C@AdobeOrg","msgType":"xdmEntityCreate","datasetId":"5b7c58814fabe601e1680d17 ","createdAt":1536896306783,"xdmSchema":{"name":"_xdm.context.experienceevent","version":"<IP_ADDRESS>","namespace":""},"source":{"name":"Acme Retail","description":null}},"body": { "xdmMeta": {"xdmSchema":{"name":"_xdm.context.experienceevent","version":"<IP_ADDRESS>","namespace":""}} , "xdmEntity":{"web":{"webPageDetails":{"siteSection":"Computers & Tablets,Computer Accessories & Peripherals,Laptop Accessories,Laptop Chargers & Adapters,Computers,Electronics,Computer Accessories","name":"Lenovo - AC Adapter for Select Lenovo Yoga Laptops - Black"}},"endUserIDs":{"_experience":{"acid":{"namespace":{"code":"AcmeID"},"id":"4162807","primary":true}}},"_id":"1536896287398","commerce":{"productViews":{"id":"1008","value":36.74}},"timestamp":"2018-09-13T20:38:07-07:00"}
Now validation for this message is failing because XDM requires that productViews.id length should be > 20 . Is there any reason why this id should be greater than 20 character length? In my case, I am sending the productId  stored in database which is 4 characters long.
           "productViews": {
                "description": "View(s) of a product have occurred.",
                "meta:xdmField": "xdm:productViews",
                "type": "object",
                "properties": {
                    "_type": {
                        "type": "string",
                        "format": "uri",
                        "description": "Links to the `Metric` that this measure refers to. The `@type` can be omitted in contexts where it is obvious what metric is being referred to, for instance in the `Metrics` object that is keyed with `Metric` URIs.",
                        "meta:xdmType": "string",
                        "meta:xdmField": "@type"
                    },
                    "id": {
                        "title": "Unique Identifier",
                        "type": "string",
                        "minLength": 20,
                        "description": "Unique identifier of the measure. In cases of data collection using lossy communication channels, such as mobile apps or websites with offline functionality, where transmission of measures cannot be ensured, this property contains a client-generated, unique ID of the measure taken. It is best practice to make this sufficiently long to ensure enough entropy. Additionally, if information such as time stamp, device ID, IP or MAC address, or other potentially user-identifying values are incorporated in the generation of the xdm:id, the result should be hashed, so that no PII is encoded in the value, as the goal is not to identify user or device, but the specific measure in time.",
                        "meta:xdmType": "string",
                        "meta:xdmField": "xdm:id"
                    },

Wondering how customers are suppose to handle this type of weird requirements?  Looking for a guidance..

It appears that all "measure" values have this minLength restriction.  I'm not sure why it was required.  It looks like it was introduced by @jwen-adobe on 02/26/2018.  Joe, can you or @cmathis comment on this?  Can we just remove the constraint?

@kstreeter @cmathis The measure schema is not created by us and it was merged in our xdm schemas during the merging process. It was from public repo at the first place maybe for a reason? I am fine with removing it though.


unsafe_merge crashes with nested structured config and union type

Describe the bug
unsafe_merge crashes with nested structured config and union type.
To Reproduce
from dataclasses import dataclass

from omegaconf import OmegaConf

@dataclass
class A:
    x: int | str

@dataclass
class B:
    a: A

def main():
    x = OmegaConf.unsafe_merge(OmegaConf.structured(B), {'a': {'x': 1}})
    print(x)

if __name__ == '__main__':
    main()

Expected behavior
{'a': {'x': 1}} will be printed, just like OmegaConf.merge.
Actual result
Traceback (most recent call last):
  File "./test.py", line 18, in <module>
    main()
  File "./test.py", line 14, in main
    x = OmegaConf.unsafe_merge(OmegaConf.structured(B), {'a': {'x': 1}})
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File ".../omegaconf/omegaconf.py", line 308, in unsafe_merge
    target.merge_with(*configs[1:])
  File ".../omegaconf/basecontainer.py", line 492, in merge_with
    self._format_and_raise(key=None, value=None, cause=e)
  File ".../omegaconf/base.py", line 231, in _format_and_raise
    format_and_raise(
  File ".../omegaconf/basecontainer.py", line 490, in merge_with
    self._merge_with(*others)
  File ".../omegaconf/basecontainer.py", line 514, in _merge_with
    BaseContainer._map_merge(self, other)
  File ".../omegaconf/basecontainer.py", line 399, in _map_merge
    dest_node._merge_with(src_node)
  File ".../omegaconf/basecontainer.py", line 514, in _merge_with
    BaseContainer._map_merge(self, other)
  File ".../omegaconf/basecontainer.py", line 358, in _map_merge
    expand(dest)
  File ".../omegaconf/basecontainer.py", line 342, in expand
    node._set_value(val)
  File ".../omegaconf/dictconfig.py", line 647, in _set_value
    raise e
  File ".../omegaconf/dictconfig.py", line 644, in _set_value
    self._set_value_impl(value, flags)
  File ".../omegaconf/dictconfig.py", line 677, in _set_value_impl
    self.__setitem__(k, v)
  File ".../omegaconf/dictconfig.py", line 314, in __setitem__
    self._format_and_raise(key=key, value=value, cause=e)
  File ".../omegaconf/base.py", line 231, in _format_and_raise
    format_and_raise(
  File ".../omegaconf/dictconfig.py", line 308, in __setitem__
    self.__set_impl(key=key, value=value)
  File ".../omegaconf/dictconfig.py", line 318, in __set_impl
    self._set_item_impl(key, value)
  File ".../omegaconf/basecontainer.py", line 535, in _set_item_impl
    if self._get_root() is value._get_root():
                           ^^^^^^^^^^^^^^^^^
  File ".../omegaconf/base.py", line 289, in _get_root
    assert isinstance(self, Container)
AssertionError

Additional context

[x] OmegaConf version: 2.3.0
[x] Python version: 3.11.4
[x] Operating system: Ubuntu 22.04

Thanks, @function2-llx. I can reproduce the error.


Add automatic color conversion for SimulatorDisplay

Hi! Thank you for helping out with Embedded Graphics development! Please:

[x] Add a CHANGELOG.md entry in the Unreleased section under the appropriate heading (Added, Fixed, etc) and appropriate crate (embedded-graphics, simulator, tinytga, tinybmp) if your changes affect the public API
[x] Run rustfmt on the project
[x] Run ./build.sh (Linux/macOS only) and make sure it passes. If you use Windows, check that CI passes once you've opened the PR.

PR description
The simulator used to implement DrawTarget for all Cs that can be converted Into the color type used to build the SimulatorDisplay. This feature was somehow lost during the refactoring of the simulator some time ago. This PR reimplements that feature.
After this changes an explicit type annotation on the SimulatorDisplay variables is required. But IMO that's beneficial because this way the type of the framebuffer data is always unambiguously defined.

Ah, some missed doc examples broke the build - lib.rs and check_readme.rs

Ah, some missed doc examples broke the build - lib.rs and check_readme.rs

Oops, I forgot to run the tests again, I should really start reading the checklist before adding the checkmarks :wink:. But the tests and other nits should now be fixed.


#match with a regexp doesn't seem to work

I'm loading TSV data and when I attempt to use match from Handlebar-Helpers I get errors.  What I'm trying to do is process a field into an array using a regexp then process the element of the array into a list using #each.  I get nothing but errors when I try to use the following code:
Stellar:
{{#each (match (Stars) (toRegex "[OBAFGKM]\d\s\w+|D|BD|BH|NS|PSR")) ~}}
- {{this}}
{{/each ~}}

The field Stars contains data like:
G0 V D
F1 V D
M3 V
K6 II M2 V

The regex is to unstring the multiple stars in the data field and put them on separate lines.

I'm not at my computer right now, but why do you have a tilde before the closing brackets "~}}" ? Regards,MartinOn 2 Jul 2022 05:25, ckennedy666 @.***> wrote:
I'm loading TSV data and when I attempt to use match from Handlebar-Helpers I get errors.  What I'm trying to do is process a field into an array using a regexp then process the element of the array into a list using #each.  I get nothing but errors when I try to use the following code:
Stellar:
{{#each (match (Stars) (toRegex "[OBAFGKM]\d\s\w+|D|BD|BH|NS|PSR")) ~}}

{{this}}
{{/each ~}}

The field Stars contains data like:
G0 V D
F1 V D
M3 V
K6 II M2 V
The regex is to unstring the multiple stars in the data field and put them on separate lines.
—Reply to this email directly, view it on GitHub, or unsubscribe.You are receiving this because you are subscribed to this thread.Message ID: @.***>

I'm not at my computer right now, but why do you have a tilde before the closing brackets "~}}" ?

To suppress white space generation at those points.

In a quick test, you should not have the parentheses around the "Stars" name immediately after match

The match function is better handled by a syntax like:
Stellar:
{{#each (match (Stars) "[OBAFGKM]\d\s\w+|D|BD|BH|NS|PSR" "regex: true") ~}}
- {{this}}
{{/each ~}}

Having looked at the match function, I don't think it does what we thought it does.
It will look for matches in the array of strings passed as the first parameter for any entries which match the second parameter.
What we need is a function that will break a string based on a regex.

I've just created 0.18.0 which adds a new function 'strsplit' which splits a single string into multiple parts.
The following seems to work with the new helper function:
Stellar: {{#each (strsplit Stars (toRegex "([OBAFGKM]\d)")) ~}}
{{#ifOdd @index }}

- {{/ifOdd}}{{this}}{{/each}}

(The separator is put into the output array as a separate element, and the first element is a blank string, thus the use of #ifOdd to put the dash on a newline before the star's main classification.

Hmm...  Tried to update to the latest, even using BRAT, and I'm not getting the strsplit helper included.  Also the version still identifies as 0.17 instead of 0.18.

Ah, I forgot to update several files with the new version number. I'll fix it

0.19.0 should be marked properly, and should have the strsplit helper available.

I'll test tonight. Thanks for all the work.

Working perfectly (once I adjusted my regex).  Thanks so much!


Update OneVsOneCommand.php

Add leave command stuff, just need a public function. How do you code it so if you join an arena and type /1vs1 leave it makes you leave? EDIT: I used the disconnectPlayer function I found lol I think it works

There isn't function OneVsOne->disconnectPlayer(Player);

But you defined it in https://github.com/GamakCZ/1vs1/blob/master/1vs1/src/vixikhd/onevsone/arena/Arena.php


'src' of undefined

I am using this method
    unzip: {
      'location/to/extract/files/': 'file/to/extract.zip'
    }

defined in your readme.md but i am getting this error
'src' of undefined
then I found this after googling and it works
renameZipToDocx: {
    src: '@@All Siri Guru Granth Sahib in Gurmukhi, without Index.zip',
    dest: '@@All Siri Guru Granth Sahib in Gurmukhi, without Index.docx'
}

please check this issue....

It sounds like a path is wrong, can you try running grunt unzip --verbose? Alternative src/dest formats can be found in the README:
https://github.com/twolfson/grunt-zip#unzip-1


I'd like to join this project's community

Your public repo
https://github.com/taipeicityeth/gov4git-identity-public.git
Your public branch
main

Approved

 Follow up
On Monday, 22-Jan-24 21:38:22 UTC by Gov4Git dev
@taipeicityeth was added to the community.


Add stacker tool and associated AxisOverlay helper

Relates to #11
As above. Add helper to WhatIsThat.
Try to make the tool Inspector panel scrollable and not squish when you've got too much in it.

A bit more to do before merging, but could do with an assist on:

Getting the menu to be scrollable
Why on earth does rotation offsets not work? Stacker.cs:200

You were incredibly close! angle.RotateAroundAxis() returns a new modified angle, see c042e25.
I also rebased your branch off the latest main to add compatibility with the new toolpanel, which seems to handle different sized menus fine enough now.


Modifying sidecar ID in cyral_repository_binding does not result in repo binding being removed from the old sidecar

We started with the following pseudo-config where repo_2 was accidentally bound to sidecar_2
resource "cyral_sidecar" "sidecar_1" {
  name              = "sidecar-1"
  deployment_method = "helm3"
}

resource "cyral_sidecar" "sidecar_2" {
  name              = "sidecar-2"
  deployment_method = "helm3"
}

resource "cyral_repository" "repo_1" {
  name = "repo_1"
  host = var.database.address
  port = var.database.port
  type = "mysql"
}

resource "cyral_repository_binding" "repo_1" {
  repository_id = cyral_repository.repo_1.id
  listener_host = 3307
  listener_port = var.listener_port
  sidecar_id    = var.sidecar_1_id
}

resource "cyral_repository" "repo_2" {
  name = "repo_2"
  host = var.database.address
  port = var.database.port
  type = "mysql"
}

resource "cyral_repository_binding" "repo_2" {
  repository_id = cyral_repository.repo_2.id
  listener_host = 3307
  listener_port = var.listener_port
  sidecar_id    = var.sidecar_1_id
}

I then corrected this:
resource "cyral_repository_binding" "repo_2" {
  repository_id = cyral_repository.repo_2.id
  listener_host = 3307
  listener_port = var.listener_port
  sidecar_id    = var.sidecar_2_id
}

The plan succeeded and said that it was going to change the binding.  Once run, the binding was correctly added to sidecar_2 but it was not removed from sidecar_1

Fixed by #159.


drivers: serial: gecko: fix impmlicit declaration of IRQ_CONNECT

Previously, the build was failing due to implicit declaration of IRQ_CONNECT. Simply include <zephyr/irq.h> to fix.

Failure should be reproducible in main with this
twister -i -p efm32gg_stk3701a          -s samples/net/sockets/http_client/sample.net.sockets.http_client


Command meili:create doesn't create index without settings

Description
Running php bin/console meili:create - didnt create index when no settings is present in configuration aka:
    indices:
        - name: shopping_gallery_tenant
          class: App\Entity\ShoppingGalleryTenant
          enable_serializer_groups:  true

Expected behavior
Index is created when no settings is present
Current behavior
Index is not created
Environment (please complete the following information):

OS: [e.g. Debian GNU/Linux]
Meilisearch version: v:0.23.1
meilisearch-symfony version: v0.7.2

When added settings, index is created, but next problem is that data cant be imported with meili:import even when i debug and rows are fetched from DB

Hello, @reflexator thanks for your report!
Can you give me more information about your meili:import command, by the way, is there any kind of error?

No errors:
php bin/console meili:create
Creating index dev_shopping_gallery_tenant for App\Entity\ShoppingGalleryTenant
Done!

If you look to command -
https://github.com/meilisearch/meilisearch-symfony/blob/abd5611594ae784890d19c90795881f0db9d681a/src/Command/MeiliSearchCreateCommand.php#L67
Only creates IndexInstance but don't call meili to create index, it only does when settings is present and maybe
$indexInstance->waitForTask($task['uid']);

Is called

Thanks for the information! We are in the v0.27 release cycle now, so it could be complicated for me to work on this issue right now.
Feel free to send a PR if you have the time to do that ❤


Image orientation wrong after using ACTION_PICK intent

(I know this is probably an "issue" originating from my limited understanding how images are handled, but I'm so keen to use your cropper that I thought, I'd give it a shot. If this is the wrong place for this kind of question, please feel free to close it.)
I'm using a dialog which prompts the user to either use the camera to take a picture or pick an existing image from a library:
    private void createDialog() {
        // define the Dialog items
        final CharSequence[] items = {"Camera", "Library", "Cancel"};
        // create the Dialog
        AlertDialog.Builder builder = new AlertDialog.Builder(CropAndSaveImageActivity.this);
        // set the Dialog title
        builder.setTitle("Change Image:");
        // set the Dialog's items and their onClick events
        builder.setItems(items, new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int item) {
                // take a picture with the Camera
                if (items[item].equals("Camera")) {
                    captureImage();
                }
                // select an image from a Library
                else if (items[item].equals("Library")) {
                    Intent intent = new Intent(
                            Intent.ACTION_PICK,
                            android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
                    intent.setType("image/*");
                    startActivityForResult(
                            Intent.createChooser(intent, "Select File"),
                            REQUEST_IMAGE_SELECTION);
                }
                // cancel the Dialog
                else if (items[item].equals("Cancel")) {
                    dialog.dismiss();
                }
            }
        });
        // show the Dialog
        builder.show();
    }

The Camera Intent works "as intended" (so I skipped pasting the relevant code), but when picking an image from a library, the image is always shown in landscape in the cropper. It works when using the built-in CropImage.startPickImageActivity(), but I'd prefer to use 2 different intents.
So here's the relevant code from onActivityResult():
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (resultCode == RESULT_OK) {
            // the result from the image capture (camera) intent
            if (requestCode == REQUEST_IMAGE_CAPTURE) {
                CropImage.activity(mCurrentPhotoURI)
                        .setGuidelines(CropImageView.Guidelines.ON)
                        .setFixAspectRatio(fixAspectRatio)
                        .setRequestedSize(requiredWidth, requiredHeight)
                        .setOutputUri(mCurrentPhotoURI)
                        .start(this);
            }

            // the result from the crop intent
            else if (requestCode == CropImage.CROP_IMAGE_ACTIVITY_REQUEST_CODE) {
                CropImage.ActivityResult result = CropImage.getActivityResult(data);
                mCurrentPhotoURI = result.getUri();
                mCurrentPhotoPath = mCurrentPhotoURI.getPath();
                // resize the bitmap to have the exact required dimension
                Bitmap bitmap = decodeSampledBitmapFromPath(mCurrentPhotoPath, requiredWidth, requiredHeight, true);
                // show the bitmap in the ImageView
                mImageView.setImageBitmap(bitmap);
            }
            // the result from the pick intent:
            // pick the image and save it to the path as specified in mCurrentPhotoPath
            else if (requestCode == REQUEST_IMAGE_SELECTION) {
                Uri selectedImageUri = data.getData();
                Bitmap bitmap = null;
                // get the image from the Uri (selectedImageUri)
                try {
                    InputStream is = getContentResolver().openInputStream(selectedImageUri);
                    bitmap = BitmapFactory.decodeStream(is);
                    if (is != null) {
                        is.close();
                    }
                    // write the image to mCurrentPhotoPath
                    FileOutputStream outputStream = new FileOutputStream(mCurrentPhotoPath);
                    bitmap.compress(Bitmap.CompressFormat.JPEG, compressionPercentage, outputStream);
                    outputStream.close();
                } catch (IOException e) {
                    Log.e(TAG, e.getMessage());
                }

                // get the Uri of the new image location
                File file = new File(mCurrentPhotoPath);
                mCurrentPhotoURI = Uri.fromFile(file);
                // launch the cropper
                CropImage.activity(mCurrentPhotoURI)
                        .setGuidelines(CropImageView.Guidelines.ON)
                        .setFixAspectRatio(fixAspectRatio)
                        .setRequestedSize(requiredWidth, requiredHeight)
                        .setOutputUri(mCurrentPhotoURI)
                        .start(this);
            }
        }
    }

Any ideas what I'm doing wrong here? Thx.

The problem is with this code:
InputStream is = getContentResolver().openInputStream(selectedImageUri);
bitmap = BitmapFactory.decodeStream(is);
if (is != null) {
    is.close();
}
// write the image to mCurrentPhotoPath
FileOutputStream outputStream = new FileOutputStream(mCurrentPhotoPath);
bitmap.compress(Bitmap.CompressFormat.JPEG, compressionPercentage, outputStream);
outputStream.close();

When you re-encode the image you loose the exif data telling the orientation of the image.
Just don't do it, pass selectedImageUri to the cropper.

Heh ... awesome, that works! Thanks a lot!
(I have to admit, this Uri & path stuff is all still rather confusing to me.  Happy to buy you a drink next time I'm in Tel Aviv (that is, if you're around there sometimes :P) Very nice library, keep it up!)

Won't say no to a free drink :)