Poor Performance Issues during response deSerialization

We are using the latest  Simple.OData.Client 5.2.2  version.  There is a severe performance issues when the record count goes up.
In our Scenario, for 12000 records,  Simple.OData.Client takes more than 1 minute . If we watch the fiddler call, OData calls completes in 10 seconds.  We found that the following code in ResponseReader takes good amount of time.
private ODataResponse ReadResponse(ODataReader odataReader)
{
ResponseNode rootNode = null;
var nodeStack = new Stack();
        while (odataReader.Read())
        {
            if (odataReader.State == ODataReaderState.Completed)
                break;

            switch (odataReader.State)
            {
                case ODataReaderState.ResourceSetStart:
                    StartFeed(nodeStack, CreateAnnotations(odataReader.Item as ODataResourceSet));
                    break;

                case ODataReaderState.ResourceSetEnd:
                    EndFeed(nodeStack, CreateAnnotations(odataReader.Item as ODataResourceSet), ref rootNode);
                    break;

                case ODataReaderState.ResourceStart:
                    StartEntry(nodeStack);
                    break;

                case ODataReaderState.ResourceEnd:
                    EndEntry(nodeStack, ref rootNode, odataReader.Item);
                    break;

                case ODataReaderState.NestedResourceInfoStart:
                    StartNavigationLink(nodeStack, (odataReader.Item as ODataNestedResourceInfo).Name);
                    break;

                case ODataReaderState.NestedResourceInfoEnd:
                    EndNavigationLink(nodeStack);
                    break;
            }
        }

        return ODataResponse.FromNode(rootNode);
    }

We end-up using both Simple.OData.Client GetCommandTextAsync() for the ODATA expression builder from Linq expression and HttpClient for execution which just takes 12 seconds for 12000 records.
It would be a great help if you could expose a public method ExecuteAsync in BoundClient which returns Task.
partial class BoundClient
{
public Task ExecuteAsync()
{
}
}
This will help us to use JsonConvert.DeserializeObject   from Newtonsoft.Json or any better library for DeSerialization of HttpResponseMessage as shown below.
///
/// class JsonHelperExtensions
///
public static class JsonHelperExtensions
{
public static async Task<List> DeserializeHttpResponseMessage(this Task tasKHttpResponseMessage)
{
var httpResponseMessage = await tasKHttpResponseMessage.ConfigureAwait(false);
        string content = await httpResponseMessage.Content.ReadAsStringAsync().ConfigureAwait(continueOnCapturedContext: false);

        return JsonConvert.DeserializeObject<ODataResponse<List<T>>>(content).Value;
    }

}
public class ODataResponse<T>
{
    [JsonProperty("@odata.context")]
    public string ODataContext { get; set; }

    public T Value { get; set; }
}

Appreciate your help!

Thank you so much for the investigation. I am away until Sunday but will work on this when I am back next week.

@raviraj1976 I want to thoroughly investigate this and possible other performance problems (and your suggestion to use JSON.NET is one of the options), but I need a reference result set to run benchmarks. Is it possible for you to send me OData payload for result set with 1000+ records, and in addition a service metadata file? Then I can mock HTTP communication and benchmark result parsing.
Basically I need:

HTTP response payload (can be obtained using Fiddler or other tools, 1000 records should be enough but I don't mind 10K either).
OData service metadata file (available at <service_url>/$metadata endpoint).
If response contains sensitive information, perhaps you can obfuscate it.
You can send this to vagif.abilov at gmail.

Thanks in advance.

Also, would it be sufficient if the library expose settings custom response reader in ODataClientSettings? Currently response is read by one of OData adapters (either V3 or V4), and the code looks like this:
                        var responseReader = _session.Adapter.GetResponseReader();
                        return createResult(await responseReader.GetResponseAsync(response).ConfigureAwait(false));

this code returns Func<ODataResponse, T> where T is a client POCO type.
Will this work for you?

This will work for me as long as I can use JSON.Net or any other for
Deseiralization. HttpResponseMessgae as a out put result is straight
forward since it contains the entire case Brent. Otherwise I may have to
iterate through the response reader since all the data will not be
available at once.
I can send the metadata & Json result only on your email and will not post
it on sites.
Thanks & Regards
Raviraj
On Sun, Jul 15, 2018 at 3:39 AM Vagif Abilov<EMAIL_ADDRESS>wrote:

Also, would it be sufficient if the library expose settings custom
response reader in ODataClientSettings? Currently response is read by one
of OData adapters (either V3 or V4), and the code looks like this:
                    var responseReader = _session.Adapter.GetResponseReader();
                    return createResult(await responseReader.GetResponseAsync(response).ConfigureAwait(false));

this code returns Func<ODataResponse, T> where T is a client POCO type.
Will this work for you?
—
You are receiving this because you were mentioned.
Reply to this email directly, view it on GitHub
https://github.com/object/Simple.OData.Client/issues/497#issuecomment-405073568,
or mute the thread
https://github.com/notifications/unsubscribe-auth/ARInIqnLJiznm7dfmOKZ80qPllJpxpd3ks5uGvG-gaJpZM4VEmug
.

I will check what does it takes to make response reader (i.e. HttpResponseMessage converter) pluggable. You can send me the requested information to<EMAIL_ADDRESS>

Tried to create an example using http://services.odata.org/V4/Northwind/Northwind.svc/$metadata.  This doesn't have enough data. when tried to send an email to<EMAIL_ADDRESS>, bounced with an error saying address not found.

Sorry, my address is<EMAIL_ADDRESS>

My mistake

BTW, what else you can do it the following:
            var clientRequest = await client
                .For<Transfers>()
                .Filter(x => some filter)
                .BuildRequestFor()
                .FindEntriesAsync();
            var clientResponse = await clientRequest.RunAsync();
            var responseMessage = clientResponse.ResponseMessage;

ResponseMessage is an actual HttpResponseMessage that you can process instead of letting SOD call slow Microsoft libraries.
Hope this helps.

Thanks @raviraj1976 , we were having significant performance issues with the OData deserialization, average batch size was 12,000 items,  wire time was approx 1sec, deserialization took approx 6seconds.   Changed to JsonConvert to deserialize and total return time now 1.5sec      For a batch run of 10 queries, OData serializer took 82 seconds, JsonConvert = 12 seconds.

@jafin I presume that the data structure is relatively simple i.e. contains no subtypes etc?

In our case we had subtypes and the performance improved post using JsonConvert for deserialuzation.
Sent from my iPhone

On Aug 22, 2018, at 5:58 AM, Paul Hatcher<EMAIL_ADDRESS>wrote:
@jafin I presume that the data structure is relatively simple i.e. contains no subtypes etc?
—
You are receiving this because you were mentioned.
Reply to this email directly, view it on GitHub, or mute the thread.

@raviraj1976 Thanks for that, I'll need to do some experiments - I would have thought that OOB JsonConvert wouldn't know how to interpret the odata annotations required to select the appropriate subtype etc.
If you have the time, have another go with the latest Simple.OData.Client codebase (no nuget as yet) as I've done some optimisation on the deserialization - there's a few more bits to do, but I had large improvement in performance.

@phatcher I think the structure had only a few subtypes. I'll checkout the current code and see if there is any change.

@jafin while there are several improvement on the, thanks to the work being done by @phatcher I suspect that the major performance loss is attributed to Microsoft.OData.Edm parser, especially since the release of the version 7.x. I recently started building performance benchmark results and would like to compare performance of the previous version of Simple.OData.Client that used ODataLib 6 with the new version to get a better idea about differences. But you will never have performance close to the performance of JSON serialiser that is not aware of OData-specific nuances. If you want to prioritise performance of large batches, the best you can do is issue HTTP requests using our library, receive response as a stream (you can do it with Simple.OData.Client) and apply a deserialiser of your choice to that stream. Since you control data schema, you can handle it as efficient as it can be.

@object I'd prefer NOT to use the Json Deserializer for the fact of missing out on the correct parsing of the schema.  We are just trying to minimize the time our Xamarin client is tasking to performing an initial data load, and noticed that wire time was not the problem,  using the hack for the Json serializer speed things up by a huge factor.
I have run @phatcher's features/512_metaline line (00bfe7b42c7330d452af65ba106bdbcd2b528dff)  and it has made a significant performance improvement.   (I also tried the Object\v5 branch (194744cd4ba8175afafc0cd546a21bd6c6193160) but noticed no real change.
I'd love to see those changes merged in, would be awesome!.
Simple.Odata client 5.4

// * Summary *

BenchmarkDotNet=v0.11.1, OS=Windows 10.0.16299.547 (1709/FallCreatorsUpdate/Redstone3)
Intel Core i7-7700 CPU 3.60GHz (Kaby Lake), 1 CPU, 8 logical and 4 physical cores
Frequency=3515624 Hz, Resolution=284.4445 ns, Timer=TSC
  [Host]     : .NET Framework 4.7.2 (CLR 4.0.30319.42000), 64bit RyuJIT-v4.7.3130.0
  Job-GBSWSC : .NET Framework 4.7.2 (CLR 4.0.30319.42000), 64bit RyuJIT-v4.7.3130.0

IterationCount=10  LaunchCount=1  WarmupCount=1

                                   Method |    Mean |    Error |   StdDev |
----------------------------------------- |--------:|---------:|---------:|
 'Simple OData use internal Deserializer' | 7.671 s | 0.3987 s | 0.2372 s |
 'Simple OData use Json.Net Deserializer' | 1.269 s | 0.0596 s | 0.0394 s |
       'Microsoft.OData DataServiceQuery' | 4.686 s | 0.1362 s | 0.0811 s |

tip OData Client features/512_Metadata
IterationCount=10  LaunchCount=1  WarmupCount=1

                                   Method |    Mean |    Error |   StdDev |
----------------------------------------- |--------:|---------:|---------:|
 'Simple OData use internal Deserializer' | 1.754 s | 0.1355 s | 0.0896 s |
 'Simple OData use Json.Net Deserializer' | 1.286 s | 0.0313 s | 0.0186 s |
       'Microsoft.OData DataServiceQuery' | 4.843 s | 0.2032 s | 0.1209 s |

The performance is near inline with the native Json.Net Deserializer!

@jafin thank you for these benchmarks. They indeed show that we should apply @phatcher's changes ASAP. I will try to do this during the weekend.

@phatcher can you send me a PR with your improvements?

@object Will do, have some other improvements I want to kick in first, should save a few million more calls :-)

Terrific!

Microsoft released "5.8.4" version which includes the performance fix?

@raviraj1976 was there any information about performance differences?
BTW there is 5.5.0-beta2 Nuget package which include Paul's performance improvements.

We are yet to pull 5.5.0-beta2. I will keep you posted
On Tue, Aug 28, 2018 at 3:04 PM Vagif Abilov<EMAIL_ADDRESS>wrote:

@raviraj1976 https://github.com/raviraj1976 was there any information
about performance differences?
BTW there is 5.5.0-beta2 Nuget package which include Paul's performance
improvements.
—
You are receiving this because you were mentioned.
Reply to this email directly, view it on GitHub
https://github.com/object/Simple.OData.Client/issues/497#issuecomment-416704063,
or mute the thread
https://github.com/notifications/unsubscribe-auth/ARInIhSTFfgKVRskkpFhk8_ByzF3FCmPks5uVZRFgaJpZM4VEmug
.

BTW, what else you can do it the following:
            var clientRequest = await client
                .For<Transfers>()
                .Filter(x => some filter)
                .BuildRequestFor()
                .FindEntriesAsync();
            var clientResponse = await clientRequest.RunAsync();
            var responseMessage = clientResponse.ResponseMessage;

ResponseMessage is an actual HttpResponseMessage that you can process instead of letting SOD call slow Microsoft libraries.
Hope this helps.

Quick question.
Can we  use   .BuildRequestFor() with FindEntryAsync()? We found an issue using BuildRequestFor() with FindEntryAsync() with 5.4 version.   With BuildRequestFor(), FindEntryAsync returns multiple row and without it, it returns a single record.
Any thoughts?
Thanks & Regards
Raviraj

Hmm, BuildRequestFor doesn't know whether you will retrieve all results or just the first one. It just converts specified clauses to OData request. But you can use Top clause to make it a part of the request.

@jafin I'd appreciate it if you could re-run your benchmark with the 5.5 release as it should be even better than your previous results

Thank you for the information. Just curious why the version shows <IP_ADDRESS> with Simple.OData.Client.5.4.0? and why the dependent assemblies(Simple.OData.Client.Dynamic.dll, Simple.OData.Client.V4.Adapter.dll,
Simple.OData.Client.V3.Adapter.dll , Microsoft.OData.Core,Microsoft.Data.OData,  are not copied to the target bin folder along with Simple.OData.Client.Core.dll?

..\..\packages\Simple.OData.Client.5.4.0\lib\net452\Simple.OData.Client.Core.dll

..\..\packages\Simple.OData.Client.5.4.0\lib\net452\Simple.OData.Client.Dynamic.dll

..\..\packages\Simple.OData.Client.5.4.0\lib\net452\Simple.OData.Client.V3.Adapter.dll

..\..\packages\Simple.OData.Client.5.4.0\lib\net452\Simple.OData.Client.V4.Adapter.dll

@raviraj1976 There was a bug in 5.4 (and a few earlier versions) that resulted in empty assembly version.
And when it comes to dependent assemblies, because Simple.OData.Client.Core doesn't have dependencies on specific OData protocol (it loads them at runtime depending on the OData service version), when you include a reference to just this assembly, corresponding adapter and Microsoft OData assemblies are not copied automatically. You have to either add a NuGet package or reference them manually.

Hi @phatcher, I'm working with @jafin on this issue. We appreciate your efforts to improve performance. Having tested with v5.5 I can say deserialization is still unfortunately slow.
Profiling what ODataClient is doing when it's receiving our message (about 2,500 entities, but there are some collections so I'd say about 25,000 entities total) there are ~70,000 calls to IsNotMapped.
The implementation is:
return member.GetCustomAttributes().Any(x => x.GetType().Name == "NotMappedAttribute");

I did a quick-and-dirty cache:
[ThreadStatic] private static IDictionary<MemberInfo, bool> _memberInfos;

public static bool IsNotMapped(this MemberInfo member)
{
    if (_memberInfos == null)
        _memberInfos = new Dictionary<MemberInfo, bool>();

    if (!_memberInfos.TryGetValue(member, out var result))
    {
        result = member.GetCustomAttributes().Any(x => x.GetType().Name == "NotMappedAttribute");

        _memberInfos.Add(member, result);
    }

    return result;
}

And performance was improved by about a third - 2.27s spent deserialising reduced down to 1.49s.
Someone else called out the performance of IsNotMapped over here, among other reflection-based things.

@taspeotis Have a look at my features/479_TypeCache branch (see #562) as I've implement the cache you mentioned along with some other bits.
The amortized call time for IsNotMapped is reduces to about ~20% of the original on my benchmarks

@taspeotis No problem, BTW you can grab from the main v5 branch now as it has been merged in and there will likely be more stuff in there as well by the time you test it

Closing as I think we've address the issues raised here, any more performance issues raise a specific issue


Call Number Type 5 not currently handled?

At one of the libraries in our consortium a call number type 5 is used for a particular location.  A user from this institution has reported an error using the SpineOMatic PC App for holdings marked with this type.   Is there a way to get call number type 5 handled with the PC app that I'm just not seeing?  It seems that "Other" handles 4, 7 and 8.  Five denotes a Title is used but I don't see a choice to select this type of entry.  I'm not sure if there are true titles so if 5 is not handled should I just suggest that the indicator be globally updated to something else as the solution?
Daniel Cromwell

@dancromwell, what are the values for the fields on the "Call Number Format" tab in SpineOMatic? Is the "Ex Libris parsing" radio button selected with "<parsed_call_number>" set as the field to use? If the call number type is mapped to parsing routine 5 in Alma (https://knowledge.exlibrisgroup.com/Alma/Product_Documentation/010Alma_Online_Help_(English)/Physical_Resource_Management/070_Configuring_Resource_Management/060_Configuring_Call_Number_Parsing_when_Printing_Labels), the <parsed_call_number> element should contain what they are after.
After scanning the barcode in SpineOMatic, you can look at the value Alma returned by clicking the "Current XML" tab and looking for the <parsed_call_number> element.

@mgobat here is an image of the Current XML

@dancromwell, I'm puzzled by this behavior. In the XML example you provided above, you should just see
KID
TOO

as the call number on the label if the "Ex Libris parsing" radio button is selected and the <parsed_call_number> field is specified. It should be printing the call number as defined/parsed by Alma. These settings will give you the "Call# Parser: Ex Libris" text right below the scanned in call number.
I believe the "Call number type 5 is not handled by any parsing routine." message should only appear if you have the "SpineOMatic parsing" radio button selected and an XML element specified, for example <call_number>. If the "SpineOmatic parsing" radio button is selected, then the settings that appear when you click "Tweak and Test" are used to parse the call number. You can specify on each of the tabs which call number types should be handled by those particular settings. Since you are seeing "Call number type 5 is not handled...", then 5 is not included in any of the "Handles Call Number Type(s)" fields on the "Tweak and Test" tabs. Does that make sense?

@mgobat on the "Call Number Format" tab in the SpineOMatic settings the "Ex Libris parsing" radio button is selected.   I do see there is a button for "Tweak $ Test" but this perhaps is only relevant to when "SpineOMatic parsing is selected, no?   I mention this because the 5 is indeed not handled by any of the call number types here and so I wonder if that is related to the message regarding not handling type 5 even while having selected Ex Libris parsing.
I was told that the handling error message is not given for call number type 4 like it is for type 5 but that type 4 was also not being displayed in the preview and can't be successfully printed either.   One thing that I have noticed is that $k is used by this school with both type 4 and 5 and that the XML for the <parsed_cal_number" data has <call_no_1> blank.  I'm pulling at straws but wonder if the $k in the call number data is playing a role in the issues they are having.  When the type is 0 and there is not $k the $h data starts in <call_no_1> in contrast to 4 and 5 with $k starting in <call_no_2>.  Perhaps a wild goose chase but...

@mgobat here is an image of the Alma parsing table and Title is included which I would expect to be associated with 1st indicator 5:

@mgobat I am guessing you have a lot of other pressing work.  Just wondering if you had a chance to look into this anymore.  Thanks.

@mgobat OK, I understand.  My user is ust still puzzled about her use of the indicators 4 and 5 and the error message in SpineOMtic given we should be using Alma parsing per our setup of the mapping table.

@dancromwell, let me confirm a few things. It's basically a summary of previous comments:

You have the "Ex Libris parsing" radio button selected with <parsed_call_number> as the source file.
Call number types 4 and 5 are NOT configured on any of the call number tabs on the "Tweak & Test" panel.
Scanning in a barcode for an item with call number type 4 does NOT produce a "Call number type 4 is not handled by any parsing routine." message box.
Scanning in a barcode for an item with call number type 5 DOES produce a "Call number type 5 is not handled by any parsing routine" message box.

Assumptions, I'd like confirmed:

In the case of call number type 4, nothing prints in the preview box.
In the case of call number type 5, "Unhandled Call Number Type" appears in the preview box.

What happens if you add call number types 4 and 5 to one of the call number tabs on the "Tweak & Test" panel", but still have the "Ex Libris parsing" radio button selected when you scan in a barcode?
Thanks...
-mark
Also, the image you provided earlier for the call number type 5 appears to just be a subset of the XML actually returned, as there is no <call_number_type> element in the image. Could you provide the full XML for the call number type 5 test case, too?
Thank you.

@@.***>,
Here are my replies to the summary and assumptions:

You have the "Ex Libris parsing" radio button selected with <parsed_call_number> as the source file. [dec - Yes]
Call number types 4 and 5 are NOT configured on any of the call number tabs on the "Tweak & Test" panel. [dec - 4 is but 5 is not]
Scanning in a barcode for an item with call number type 4 does NOT produce a "Call number type 4 is not handled by any parsing routine." message box. [dec - Yes, there is no message, but nothing displays in preview in SpineOMatic.]
Scanning in a barcode for an item with call number type 5 DOES produce a "Call number type 5 is not handled by any parsing routine" message box. [dec - Yes]

Assumptions, I'd like confirmed:

In the case of call number type 4, nothing prints in the preview box. [dec - correct, nothing displays in preview area, only the title is shown in the top of the above the barcode box]
In the case of call number type 5, "Unhandled Call Number Type" appears in the preview box. [dec - nothing displays in the preview area, but a pop-up window comes up immediately after I hit return after pasting in the barcode.  After clicking the "OK" in the pop-up message the title appears over the barcode box in SpineOMatic.]
@.***

What happens if you add call number types 4 and 5 to one of the call number tabs on the "Tweak & Test" panel", but still have the "Ex Libris parsing" radio button selected when you scan in a barcode? [dec - I added 5 to the "Other" pane and now it behaves the same as 4, basically no preview but also no pop-up with message.]
Also, the image you provided earlier for the call number type 5 appears to just be a subset of the XML actually returned, as there is no <call_number_type> element in the image. Could you provide the full XML for the call number type 5 test case, too?

Default
???
??

9938187045906579
false
The tooth book /
LeSieg, Theo.,
9780375824920
1st Random House bright and early board book ed.

(OCoLC)52585719
(Aleph)001432586FCC01
(EXLNZ-01FALSC_NETWORK)9912655855506561
New York :
2003, c1981.
Random House
2251099350006579
false
Title
5
KID TOO
Title
5
KID TOO

false

2351099330006579
34201011615782
2022-09-06Z
2022-09-05Z
Item in place
1
false
Book
BOOK
12 Regular Loan/ NonRequest
12

2022-09-06Z

4.99
75974

Indian River/Ft. Pierce
IRCFO
Kids' Books
KID

false
1st Random House bright and early board book ed.
New York : Random House, 2003, c1981.
eng

Indian River State College
Miley Library on the Massey Campus
3209 Virginia Avenue

Fort Pierce

***<EMAIL_ADDRESS>772-462-7600
34981-5599
FL

KID
TOO
The tooth book / by Dr. Seuss writing as Theo. LeSieg ; illustrated by Joe Mathieu.

10/28/2022
Daniel Cromwell
Systems Specialist Technical Services
Library Services
Florida Virtual Campus (FLVC)
Email<EMAIL_ADDRESS>From: mgobat @.>
Sent: Thursday, October 27, 2022 3:52 PM
To: ExLibrisGroup/SpineOMatic @.>
Cc: Daniel Cromwell @.>; Mention @.>
Subject: Re: [ExLibrisGroup/SpineOMatic] Call Number Type 5 not currently handled? (Issue #51)
@dancromwellhttps://nam11.safelinks.protection.outlook.com/?url=https%3A%2F%2Fgithub.com%2Fdancromwell&data=05|01|dcromwell%40flvc.org|6b4b3eecd8024eecb3c208dab854c645|60ebd441a2f94841802f22bf1380b4ae|0|0|638024971510396207|Unknown|TWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D|3000|||&sdata=aOhql%2F6YsB8tQ94YQ0jlKYA%2F%2FUWH9q9hqcTHwGggRvc%3D&reserved=0, let me confirm a few things. It's basically a summary of previous comments:

You have the "Ex Libris parsing" radio button selected with <parsed_call_number> as the source file.
Call number types 4 and 5 are NOT configured on any of the call number tabs on the "Tweak & Test" panel.
Scanning in a barcode for an item with call number type 4 does NOT produce a "Call number type 4 is not handled by any parsing routine." message box.
Scanning in a barcode for an item with call number type 5 DOES produce a "Call number type 5 is not handled by any parsing routine" message box.

Assumptions, I'd like confirmed:

In the case of call number type 4, nothing prints in the preview box.
In the case of call number type 5, "Unhandled Call Number Type" appears in the preview box.

What happens if you add call number types 4 and 5 to one of the call number tabs on the "Tweak & Test" panel", but still have the "Ex Libris parsing" radio button selected when you scan in a barcode?
Thanks...
-mark
Also, the image you provided earlier for the call number type 5 appears to just be a subset of the XML actually returned, as there is no <call_number_type> element in the image. Could you provide the full XML for the call number type 5 test case, too?
Thank you.

Reply to this email directly, view it on GitHubhttps://nam11.safelinks.protection.outlook.com/?url=https%3A%2F%2Fgithub.com%2FExLibrisGroup%2FSpineOMatic%2Fissues%2F51%23issuecomment-1293994269&data=05|01|dcromwell%40flvc.org|6b4b3eecd8024eecb3c208dab854c645|60ebd441a2f94841802f22bf1380b4ae|0|0|638024971510396207|Unknown|TWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D|3000|||&sdata=a69TE3JfLjw8IVqBhekuQZENZ%2Ft7x1zcv0fDwzgaRmI%3D&reserved=0, or unsubscribehttps://nam11.safelinks.protection.outlook.com/?url=https%3A%2F%2Fgithub.com%2Fnotifications%2Funsubscribe-auth%2FAR6WCRP5MPRV4E2X7KNAVNLWFLMPVANCNFSM6AAAAAAQNRQWUA&data=05|01|dcromwell%40flvc.org|6b4b3eecd8024eecb3c208dab854c645|60ebd441a2f94841802f22bf1380b4ae|0|0|638024971510552433|Unknown|TWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D|3000|||&sdata=x4D3IAuKillifFGrt3LAu41oeTUg5q3cXrmGGmSiYcU%3D&reserved=0.
You are receiving this because you were mentioned.Message ID: @.***>

@dancromwell, its looking like the problem is the empty <call_no_1>. Is there ever a case where you'd have another part of the call number empty? For example, would you ever have values in <call_no_1> and <call_no_3>, but not <call_no_2>? The current code stops processing the call number when it finds an empty "part", hence why you get nothing on the label when <call_no_1> is empty.

@dancromwell, is this still an issue?  Thanks.

@mgobat I'm sorry.  I must have missed your previous message.  While I have not communicated with the local person here who first reported the problem in a while, I'm sure she still would like a resolution.   Let me investigate your question regarding empty parts of the call number.  I will need to look at some of the local data for the user's institution.
Daniel

@mgobat I'm not totally sure I understand what determines the parts such as call_no_1, call_no_2, and call_no_3.   The holding record that contains the call number in this case has an 852 that looks like this:
852 5_ |a FFpl |b IRCFO |c KID |h TOO |k KID
The parsing routine is 3 in Alma which says:
Split by a space:
Splits the call number at spaces and subfield i.
If the character ^ is present in the call number, it is converted to a space but does not break at that point.
Example:
Call number = $$hG635.H4$$iA3 1989^a
Label printed:
G635.H4
A3
1989 a

In the 852 I do notice that the call number consists of $h and $k where $k is the prefix and is being placed before $h but in the XML it is put into call_no_2 instead of call_no_1:
<call_no_1> </call_no_1>
<call_no_2>KID</call_no_2>
<call_no_3>TOO</call_no_3>
Daniel

@mgobat I just tested by modifying the 852 in the holding record in Alma to be:
852 5_ |a FFpl |b IRCFO |c KID |h KID |i TOO
That is put the prefix in subfield h and the call number in subfield i.
The label is successfully generated.   So it looks like change the way the call number is entered is a possible solution.
Daniel

@dancromwell, can you confirm with your user that the change in call number entry is acceptable? Thank you.

@mgobat yes, I will check with the user.  I also put in a support case with Ex Libris to check and see if there is any chance that when the prefix subfield k is present if they could place it in call_no_1 with the rest of the call number as entered placed in the following call number tags in the XML.  I have not gotten an answer yet.
Daniel


Add files via upload

Adding Hellenic Open University

@DimDim79 I am sorry, the domain ac.eap.gr is removed from our trusted domains list because it was abused in the past. If you are the student of this school, please enroll to GitHub Student Developer Program. Then apply for JetBrains educational subscription with your GitHub account (GitHub tab at https://www.jetbrains.com/shop/eform/students).

@DimDim79 I am sorry, the domain ac.eap.gr is removed from our trusted domains list because it was abused in the past. If you are the student of this school, please enroll to GitHub Student Developer Program. Then apply for JetBrains educational subscription with your GitHub account (GitHub tab at https://www.jetbrains.com/shop/eform/students).


start script should preserve .env changes

Bug
Why aren't we syncing LDAP users on STAGE?

Expected behavior
Any changes to .env are probably by design and we should keep them around so the app finds what it is looking for on startup.

Actual behavior
Apparently we lost an environment variable with PR #1344 and STAGE stopped syncing to AD.

Repro steps
... dunno...  I just looked a STAGE and it didn't work.

Build
oh the irony...

Severity
2. blocks functionality

Details/Notes | Michael says he knows what needs to happen.  "do a comparison between .env.example and .env to see if the latter is missing something the former has"...  I'm assuming this would be automated...

migrated to new tmobile/sawtooth-next-directory repo


"impossible condition" warning in TestProcessGlobs

This line of code is giving a compiler warning of impossible condition: nil != nil: https://github.com/abcxyz/abc/blob/23bee49450c6b00195da7b3c3dc94fbab60703b8/templates/common/render/action_test.go#L543
@kevya-google , as the author of this, do you know what was intended here? It's not immediately clear to me.

Looks like this might have been a bad merge conflict resolution (the same stanza is repeated 3 lines up)


[QUESTION] Safe wrapper for IDF component

I would like to write a safe wrapper for an IDF component (golioth-sdk).
My first approach was to write a -sys crate using the esp-idf-sys dependency and add the additional component in the Cargo.toml via
[[package.metadata.esp-idf-sys.extra_components]]
component_dirs = ["vendor/port/esp_idf/components"]
bindings_header = "src/bindings.h"
bindings_module = "golioth"

Then I wrote an sdk library that provides a safe wrapper around the -sys crate. This all works like a charm.
Unfortunately, if a crate wants to use the sdk library, it must add the [[package.metadata.esp-idf-sys.extra_components]] configuration to its root crate (as mentioned in the docs). Otherwise, esp-idf-sys will not generate the bindings for the Golioth component even if it is configured in the -sys crate.
What would be the right way to write a safe wrapper for an idf component? Would I have to write a custom build script with embuild?
Dependency structure:
esp-idf-sys <- golioth-sdk-sys <- golioth-sdk <- <some-project>
I appreciate any help on this topic!

This is because of esp-idf-sys will honor only direct dependencies' Cargo.toml of the root crate, as described here.
This limitation was introduced so that a user sees directly which dependencies can use extra esp-idf components, since the feature allows to depend on arbitrary code not in the crate graph of cargo.
The solution is simple, a user of the wrapper must also depend on the -sys library. So with your example, golioth-sdk-sys and golioth-sdk must be depended on.

Alright, thank you for the clarification!


Changing render location

Is there an easy way to have the skylight render on top of another component vs. the one it was called in?

Hi @jaysig, I don't know if is that you want, but you can use SkylightStateless and show or hide your modal based in a prop.

Do I need to use Redux for this if I'm nesting it within another component, or is there a way to pass the state down?


NLog doesn't work with xUnit when 'netcoreapp1.1' is targeted.

Type (choose one):

Bug

NLog version:

5.0.0-beta09 (previous beta releases are also affected)

Platform:

.NET Core

To reproduce:

Create following .csproj
<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFramework>netcoreapp1.1</TargetFramework>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="NLog" Version="5.0.0-beta09" />
    <PackageReference Include="xunit" Version="2.3.0-beta3-build3705" />
    <DotNetCliToolReference Include="dotnet-xunit" Version="2.3.0-beta3-build3705" />
  </ItemGroup>

</Project>

Add dummy test class
using Xunit;

namespace MyFirstUnitTests
{
    public class Class1
    {
        [Fact]
        public void PassingTest()
        {
            Assert.Equal(4, Add(2, 2));
        }

        int Add(int x, int y)
        {
            return x + y;
        }
    }
}

Run with following commands:
dotnet restore
dotnet xunit

It fails with following error message
Running .NET Core tests for framework netcoreapp1.1...
Error: assembly specified in the dependencies manifest was not found -- package: system.diagnostics.tracesource', version: '4.0.0', path: 'runtimes/win/lib/netstandard1.3/System.Diagnostics.TraceSource.dll'

When you change target from netcoreapp1.1 to, for example, net47, it works correctly.
Running desktop CLR tests for framework net47...
xUnit.net Console Runner (64-bit Desktop .NET 4.0.30319.42000)
  Discovering: CurlThin.Tests
  Discovered:  CurlThin.Tests
  Starting:    CurlThin.Tests
  Finished:    CurlThin.Tests
=== TEST EXECUTION SUMMARY ===
   CurlThin.Tests  Total: 1, Errors: 0, Failed: 0, Skipped: 0, Time: 0,206s

It seems like it's a compatibility issue between xunit and NLog, but I need your help on this. I'm not even sure how to debug this issue.

dotnet build gives the same error?

dotnet build succeeds, no errors are thrown.

Thanks for checking.
Honestly I have no idea. I try to google something.
Could you please try adding system.diagnostics.tracesource to <PackageReference ?

I've already tried adding System.Diagnostics.Tracesource as <PackageReference> but it doesn't help. I also tried googling before posting this issue but I ended up with nothing.

Related: https://github.com/dotnet/corefx/issues/3378

Could you please try specifying the runtime in the csproj?

I tried, it didn't help. I decided I'll do my tests with MS test driver. I changed my .csproj to following
<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFramework>netcoreapp1.1</TargetFramework>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="NLog" Version="5.0.0-beta09" />
    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.0.0" />
    <PackageReference Include="Microsoft.TestPlatform.TestHost" Version="15.0.0" />
    <PackageReference Include="xunit" Version="2.3.0-beta3-build3705" />
    <PackageReference Include="xunit.runner.visualstudio" Version="2.3.0-beta3-build3705" />
  </ItemGroup>

  <ItemGroup>
    <ProjectReference Include="..\CurlThin.Native\CurlThin.Native.csproj" />
    <ProjectReference Include="..\CurlThin\CurlThin.csproj" />
  </ItemGroup>

</Project>

I run my tests with
dotnet restore
dotnet test

It works, so I suppose xunit's dotnet xunit command is somehow broken.
Before we waste too many hours here, I suggest to close this issue, because it appears to be very hard to debug. I'll stick with dotnet test instead of dotnet xunit.

Well maybe it would be nice to report it at xunit.

There is very similiar issue reported on xunit repository 2 days ago https://github.com/xunit/xunit/issues/1336

OK thanks, will close this one indeed.


Uploading Grafana Dashboards

Did I get it correct, that uploading a Grafana dashboard is done via adding the dashboard JSON to the values.yaml?
serverDashboardFiles: {}

Any reason why you should not use an upload curl job (like the datesource registration)? Would be nice to have a way to define a list of publically reachable endpoints hosting the dashboard files.

@afritzler did you get this working, I dont know what is the format that this is expecting?
Is it the path to the file, JSON, yaml?

@dkoshkin Not really. I was also not able to find a working example so far. From looking at the template files, it seems like local dashboard files should be referenced here.

Hey @afritzler, here is what I got:
Note that the graphs have DS_PROMETHEUS variable that needs to be substituted with the datasource name.
Also in the Grafana dropdown all of the graphs are being shown twice, will update if I find a fix.
serverDashboardFiles:
  all-nodes-dashboard.json: |+
    {
      "__inputs": [
          {
              "description": "",
              "label": "prometheus",
              "name": "prometheus",
              "pluginId": "prometheus",
              "pluginName": "Prometheus",
              "type": "datasource"
          }
      ],
      "__requires": [
          {
              "id": "grafana",
              "name": "Grafana",
              "type": "grafana",
              "version": "4.1.1"
          },
          {
              "id": "graph",
              "name": "Graph",
              "type": "panel",
              "version": ""
          },
          {
              "id": "prometheus",
              "name": "Prometheus",
              "type": "datasource",
              "version": "1.0.0"
          },
          {
              "id": "singlestat",
              "name": "Singlestat",
              "type": "panel",
              "version": ""
          }
      ],
      "annotations": {
          "list": []
      },
      "description": "Dashboard to get an overview of one server",
      "editable": true,
      "gnetId": 22,
      "graphTooltip": 0,
      "hideControls": false,
      "id": null,
      "links": [],
      "refresh": false,
      "rows": [
          {
              "collapse": false,
              "height": "250px",
              "panels": [
                  {
                      "alerting": {},
                      "aliasColors": {},
                      "bars": false,
                      "datasource": "prometheus",
                      "editable": true,
                      "error": false,
                      "fill": 1,
                      "grid": {},
                      "id": 3,
                      "legend": {
                          "avg": false,
                          "current": false,
                          "max": false,
                          "min": false,
                          "show": true,
                          "total": false,
                          "values": false
                      },
                      "lines": true,
                      "linewidth": 2,
                      "links": [],
                      "nullPointMode": "connected",
                      "percentage": false,
                      "pointradius": 5,
                      "points": false,
                      "renderer": "flot",
                      "seriesOverrides": [],
                      "span": 6,
                      "stack": false,
                      "steppedLine": false,
                      "targets": [
                          {
                              "expr": "sum(rate(node_cpu{mode=\"idle\"}[2m])) * 100",
                              "hide": false,
                              "intervalFactor": 10,
                              "legendFormat": "",
                              "refId": "A",
                              "step": 50
                          }
                      ],
                      "thresholds": [],
                      "timeFrom": null,
                      "timeShift": null,
                      "title": "Idle cpu",
                      "tooltip": {
                          "msResolution": false,
                          "shared": true,
                          "sort": 0,
                          "value_type": "cumulative"
                      },
                      "type": "graph",
                      "xaxis": {
                          "mode": "time",
                          "name": null,
                          "show": true,
                          "values": []
                      },
                      "yaxes": [
                          {
                              "format": "percent",
                              "label": "cpu usage",
                              "logBase": 1,
                              "max": null,
                              "min": 0,
                              "show": true
                          },
                          {
                              "format": "short",
                              "label": null,
                              "logBase": 1,
                              "max": null,
                              "min": null,
                              "show": true
                          }
                      ]
                  },
                  {
                      "alerting": {},
                      "aliasColors": {},
                      "bars": false,
                      "datasource": "prometheus",
                      "editable": true,
                      "error": false,
                      "fill": 1,
                      "grid": {},
                      "id": 9,
                      "legend": {
                          "avg": false,
                          "current": false,
                          "max": false,
                          "min": false,
                          "show": true,
                          "total": false,
                          "values": false
                      },
                      "lines": true,
                      "linewidth": 2,
                      "links": [],
                      "nullPointMode": "connected",
                      "percentage": false,
                      "pointradius": 5,
                      "points": false,
                      "renderer": "flot",
                      "seriesOverrides": [],
                      "span": 6,
                      "stack": false,
                      "steppedLine": false,
                      "targets": [
                          {
                              "expr": "sum(node_load1)",
                              "intervalFactor": 4,
                              "legendFormat": "load 1m",
                              "refId": "A",
                              "step": 20,
                              "target": ""
                          },
                          {
                              "expr": "sum(node_load5)",
                              "intervalFactor": 4,
                              "legendFormat": "load 5m",
                              "refId": "B",
                              "step": 20,
                              "target": ""
                          },
                          {
                              "expr": "sum(node_load15)",
                              "intervalFactor": 4,
                              "legendFormat": "load 15m",
                              "refId": "C",
                              "step": 20,
                              "target": ""
                          }
                      ],
                      "thresholds": [],
                      "timeFrom": null,
                      "timeShift": null,
                      "title": "System load",
                      "tooltip": {
                          "msResolution": false,
                          "shared": true,
                          "sort": 0,
                          "value_type": "cumulative"
                      },
                      "type": "graph",
                      "xaxis": {
                          "mode": "time",
                          "name": null,
                          "show": true,
                          "values": []
                      },
                      "yaxes": [
                          {
                              "format": "percentunit",
                              "label": null,
                              "logBase": 1,
                              "max": null,
                              "min": null,
                              "show": true
                          },
                          {
                              "format": "short",
                              "label": null,
                              "logBase": 1,
                              "max": null,
                              "min": null,
                              "show": true
                          }
                      ]
                  }
              ],
              "repeat": null,
              "repeatIteration": null,
              "repeatRowId": null,
              "showTitle": false,
              "title": "New row",
              "titleSize": "h6"
          },
          {
              "collapse": false,
              "height": "250px",
              "panels": [
                  {
                      "alerting": {},
                      "aliasColors": {},
                      "bars": false,
                      "datasource": "prometheus",
                      "editable": true,
                      "error": false,
                      "fill": 1,
                      "grid": {},
                      "id": 4,
                      "legend": {
                          "avg": false,
                          "current": false,
                          "max": false,
                          "min": false,
                          "show": true,
                          "total": false,
                          "values": false
                      },
                      "lines": true,
                      "linewidth": 2,
                      "links": [],
                      "nullPointMode": "connected",
                      "percentage": false,
                      "pointradius": 5,
                      "points": false,
                      "renderer": "flot",
                      "seriesOverrides": [
                          {
                              "alias": "node_memory_SwapFree{instance=\"<IP_ADDRESS>:9100\",job=\"prometheus\"}",
                              "yaxis": 2
                          }
                      ],
                      "span": 9,
                      "stack": true,
                      "steppedLine": false,
                      "targets": [
                          {
                              "expr": "sum(node_memory_MemTotal) - sum(node_memory_MemFree) - sum(node_memory_Buffers) - sum(node_memory_Cached)",
                              "intervalFactor": 2,
                              "legendFormat": "memory usage",
                              "metric": "memo",
                              "refId": "A",
                              "step": 4,
                              "target": ""
                          },
                          {
                              "expr": "sum(node_memory_Buffers)",
                              "interval": "",
                              "intervalFactor": 2,
                              "legendFormat": "memory buffers",
                              "metric": "memo",
                              "refId": "B",
                              "step": 4,
                              "target": ""
                          },
                          {
                              "expr": "sum(node_memory_Cached)",
                              "interval": "",
                              "intervalFactor": 2,
                              "legendFormat": "memory cached",
                              "metric": "memo",
                              "refId": "C",
                              "step": 4,
                              "target": ""
                          },
                          {
                              "expr": "sum(node_memory_MemFree)",
                              "interval": "",
                              "intervalFactor": 2,
                              "legendFormat": "memory free",
                              "metric": "memo",
                              "refId": "D",
                              "step": 4,
                              "target": ""
                          }
                      ],
                      "thresholds": [],
                      "timeFrom": null,
                      "timeShift": null,
                      "title": "Memory usage",
                      "tooltip": {
                          "msResolution": false,
                          "shared": true,
                          "sort": 0,
                          "value_type": "individual"
                      },
                      "type": "graph",
                      "xaxis": {
                          "mode": "time",
                          "name": null,
                          "show": true,
                          "values": []
                      },
                      "yaxes": [
                          {
                              "format": "bytes",
                              "label": null,
                              "logBase": 1,
                              "max": null,
                              "min": "0",
                              "show": true
                          },
                          {
                              "format": "short",
                              "label": null,
                              "logBase": 1,
                              "max": null,
                              "min": null,
                              "show": true
                          }
                      ]
                  },
                  {
                      "cacheTimeout": null,
                      "colorBackground": false,
                      "colorValue": false,
                      "colors": [
                          "rgba(50, 172, 45, 0.97)",
                          "rgba(237, 129, 40, 0.89)",
                          "rgba(245, 54, 54, 0.9)"
                      ],
                      "datasource": "prometheus",
                      "editable": true,
                      "error": false,
                      "format": "percent",
                      "gauge": {
                          "maxValue": 100,
                          "minValue": 0,
                          "show": true,
                          "thresholdLabels": false,
                          "thresholdMarkers": true
                      },
                      "id": 5,
                      "interval": null,
                      "links": [],
                      "mappingType": 1,
                      "mappingTypes": [
                          {
                              "name": "value to text",
                              "value": 1
                          },
                          {
                              "name": "range to text",
                              "value": 2
                          }
                      ],
                      "maxDataPoints": 100,
                      "nullPointMode": "connected",
                      "nullText": null,
                      "postfix": "",
                      "postfixFontSize": "50%",
                      "prefix": "",
                      "prefixFontSize": "50%",
                      "rangeMaps": [
                          {
                              "from": "null",
                              "text": "N/A",
                              "to": "null"
                          }
                      ],
                      "span": 3,
                      "sparkline": {
                          "fillColor": "rgba(31, 118, 189, 0.18)",
                          "full": false,
                          "lineColor": "rgb(31, 120, 193)",
                          "show": false
                      },
                      "targets": [
                          {
                              "expr": "((sum(node_memory_MemTotal) - sum(node_memory_MemFree) - sum(node_memory_Buffers) - sum(node_memory_Cached)) / sum(node_memory_MemTotal)) * 100",
                              "intervalFactor": 2,
                              "metric": "",
                              "refId": "A",
                              "step": 60,
                              "target": ""
                          }
                      ],
                      "thresholds": "80, 90",
                      "title": "Memory usage",
                      "type": "singlestat",
                      "valueFontSize": "80%",
                      "valueMaps": [
                          {
                              "op": "=",
                              "text": "N/A",
                              "value": "null"
                          }
                      ],
                      "valueName": "avg"
                  }
              ],
              "repeat": null,
              "repeatIteration": null,
              "repeatRowId": null,
              "showTitle": false,
              "title": "New row",
              "titleSize": "h6"
          },
          {
              "collapse": false,
              "height": "250px",
              "panels": [
                  {
                      "alerting": {},
                      "aliasColors": {},
                      "bars": false,
                      "datasource": "prometheus",
                      "editable": true,
                      "error": false,
                      "fill": 1,
                      "grid": {},
                      "id": 6,
                      "legend": {
                          "avg": false,
                          "current": false,
                          "max": false,
                          "min": false,
                          "show": true,
                          "total": false,
                          "values": false
                      },
                      "lines": true,
                      "linewidth": 2,
                      "links": [],
                      "nullPointMode": "connected",
                      "percentage": false,
                      "pointradius": 5,
                      "points": false,
                      "renderer": "flot",
                      "seriesOverrides": [
                          {
                              "alias": "read",
                              "yaxis": 1
                          },
                          {
                              "alias": "{instance=\"<IP_ADDRESS>:9100\"}",
                              "yaxis": 2
                          },
                          {
                              "alias": "io time",
                              "yaxis": 2
                          }
                      ],
                      "span": 9,
                      "stack": false,
                      "steppedLine": false,
                      "targets": [
                          {
                              "expr": "sum(rate(node_disk_bytes_read[5m]))",
                              "hide": false,
                              "intervalFactor": 4,
                              "legendFormat": "read",
                              "refId": "A",
                              "step": 8,
                              "target": ""
                          },
                          {
                              "expr": "sum(rate(node_disk_bytes_written[5m]))",
                              "intervalFactor": 4,
                              "legendFormat": "written",
                              "refId": "B",
                              "step": 8
                          },
                          {
                              "expr": "sum(rate(node_disk_io_time_ms[5m]))",
                              "intervalFactor": 4,
                              "legendFormat": "io time",
                              "refId": "C",
                              "step": 8
                          }
                      ],
                      "thresholds": [],
                      "timeFrom": null,
                      "timeShift": null,
                      "title": "Disk I/O",
                      "tooltip": {
                          "msResolution": false,
                          "shared": true,
                          "sort": 0,
                          "value_type": "cumulative"
                      },
                      "type": "graph",
                      "xaxis": {
                          "mode": "time",
                          "name": null,
                          "show": true,
                          "values": []
                      },
                      "yaxes": [
                          {
                              "format": "bytes",
                              "label": null,
                              "logBase": 1,
                              "max": null,
                              "min": null,
                              "show": true
                          },
                          {
                              "format": "ms",
                              "label": null,
                              "logBase": 1,
                              "max": null,
                              "min": null,
                              "show": true
                          }
                      ]
                  },
                  {
                      "cacheTimeout": null,
                      "colorBackground": false,
                      "colorValue": false,
                      "colors": [
                          "rgba(50, 172, 45, 0.97)",
                          "rgba(237, 129, 40, 0.89)",
                          "rgba(245, 54, 54, 0.9)"
                      ],
                      "datasource": "prometheus",
                      "editable": true,
                      "error": false,
                      "format": "percentunit",
                      "gauge": {
                          "maxValue": 1,
                          "minValue": 0,
                          "show": true,
                          "thresholdLabels": false,
                          "thresholdMarkers": true
                      },
                      "id": 7,
                      "interval": null,
                      "links": [],
                      "mappingType": 1,
                      "mappingTypes": [
                          {
                              "name": "value to text",
                              "value": 1
                          },
                          {
                              "name": "range to text",
                              "value": 2
                          }
                      ],
                      "maxDataPoints": 100,
                      "nullPointMode": "connected",
                      "nullText": null,
                      "postfix": "",
                      "postfixFontSize": "50%",
                      "prefix": "",
                      "prefixFontSize": "50%",
                      "rangeMaps": [
                          {
                              "from": "null",
                              "text": "N/A",
                              "to": "null"
                          }
                      ],
                      "span": 3,
                      "sparkline": {
                          "fillColor": "rgba(31, 118, 189, 0.18)",
                          "full": false,
                          "lineColor": "rgb(31, 120, 193)",
                          "show": false
                      },
                      "targets": [
                          {
                              "expr": "(sum(node_filesystem_size{device!=\"rootfs\"}) - sum(node_filesystem_free{device!=\"rootfs\"})) / sum(node_filesystem_size{device!=\"rootfs\"})",
                              "intervalFactor": 2,
                              "refId": "A",
                              "step": 60,
                              "target": ""
                          }
                      ],
                      "thresholds": "0.75, 0.9",
                      "title": "Disk space usage",
                      "type": "singlestat",
                      "valueFontSize": "80%",
                      "valueMaps": [
                          {
                              "op": "=",
                              "text": "N/A",
                              "value": "null"
                          }
                      ],
                      "valueName": "current"
                  }
              ],
              "repeat": null,
              "repeatIteration": null,
              "repeatRowId": null,
              "showTitle": false,
              "title": "New row",
              "titleSize": "h6"
          },
          {
              "collapse": false,
              "height": "250px",
              "panels": [
                  {
                      "alerting": {},
                      "aliasColors": {},
                      "bars": false,
                      "datasource": "prometheus",
                      "editable": true,
                      "error": false,
                      "fill": 1,
                      "grid": {},
                      "id": 8,
                      "legend": {
                          "avg": false,
                          "current": false,
                          "max": false,
                          "min": false,
                          "show": true,
                          "total": false,
                          "values": false
                      },
                      "lines": true,
                      "linewidth": 2,
                      "links": [],
                      "nullPointMode": "connected",
                      "percentage": false,
                      "pointradius": 5,
                      "points": false,
                      "renderer": "flot",
                      "seriesOverrides": [
                          {
                              "alias": "transmitted ",
                              "yaxis": 2
                          }
                      ],
                      "span": 6,
                      "stack": false,
                      "steppedLine": false,
                      "targets": [
                          {
                              "expr": "sum(rate(node_network_receive_bytes{device!~\"lo\"}[5m]))",
                              "hide": false,
                              "intervalFactor": 2,
                              "legendFormat": "",
                              "refId": "A",
                              "step": 10,
                              "target": ""
                          }
                      ],
                      "thresholds": [],
                      "timeFrom": null,
                      "timeShift": null,
                      "title": "Network received",
                      "tooltip": {
                          "msResolution": false,
                          "shared": true,
                          "sort": 0,
                          "value_type": "cumulative"
                      },
                      "type": "graph",
                      "xaxis": {
                          "mode": "time",
                          "name": null,
                          "show": true,
                          "values": []
                      },
                      "yaxes": [
                          {
                              "format": "bytes",
                              "label": null,
                              "logBase": 1,
                              "max": null,
                              "min": null,
                              "show": true
                          },
                          {
                              "format": "bytes",
                              "label": null,
                              "logBase": 1,
                              "max": null,
                              "min": null,
                              "show": true
                          }
                      ]
                  },
                  {
                      "alerting": {},
                      "aliasColors": {},
                      "bars": false,
                      "datasource": "prometheus",
                      "editable": true,
                      "error": false,
                      "fill": 1,
                      "grid": {},
                      "id": 10,
                      "legend": {
                          "avg": false,
                          "current": false,
                          "max": false,
                          "min": false,
                          "show": true,
                          "total": false,
                          "values": false
                      },
                      "lines": true,
                      "linewidth": 2,
                      "links": [],
                      "nullPointMode": "connected",
                      "percentage": false,
                      "pointradius": 5,
                      "points": false,
                      "renderer": "flot",
                      "seriesOverrides": [
                          {
                              "alias": "transmitted ",
                              "yaxis": 2
                          }
                      ],
                      "span": 6,
                      "stack": false,
                      "steppedLine": false,
                      "targets": [
                          {
                              "expr": "sum(rate(node_network_transmit_bytes{device!~\"lo\"}[5m]))",
                              "hide": false,
                              "intervalFactor": 2,
                              "legendFormat": "",
                              "refId": "B",
                              "step": 10,
                              "target": ""
                          }
                      ],
                      "thresholds": [],
                      "timeFrom": null,
                      "timeShift": null,
                      "title": "Network transmitted",
                      "tooltip": {
                          "msResolution": false,
                          "shared": true,
                          "sort": 0,
                          "value_type": "cumulative"
                      },
                      "type": "graph",
                      "xaxis": {
                          "mode": "time",
                          "name": null,
                          "show": true,
                          "values": []
                      },
                      "yaxes": [
                          {
                              "format": "bytes",
                              "label": null,
                              "logBase": 1,
                              "max": null,
                              "min": null,
                              "show": true
                          },
                          {
                              "format": "bytes",
                              "label": null,
                              "logBase": 1,
                              "max": null,
                              "min": null,
                              "show": true
                          }
                      ]
                  }
              ],
              "repeat": null,
              "repeatIteration": null,
              "repeatRowId": null,
              "showTitle": false,
              "title": "New row",
              "titleSize": "h6"
          }
      ],
      "schemaVersion": 14,
      "style": "dark",
      "tags": [
          "prometheus"
      ],
      "templating": {
          "list": []
      },
      "time": {
          "from": "now-1h",
          "to": "now"
      },
      "timepicker": {
          "refresh_intervals": [
              "5s",
              "10s",
              "30s",
              "1m",
              "5m",
              "15m",
              "30m",
              "1h",
              "2h",
              "1d"
          ],
          "time_options": [
              "5m",
              "15m",
              "1h",
              "6h",
              "12h",
              "24h",
              "2d",
              "7d",
              "30d"
          ]
      },
      "timezone": "browser",
      "title": "All Nodes",
      "version": 1
    }

I've also tried before but failed. Will see this example later. I tried without the + and it failed, could have been that.
But it would be nicer to use external references so we don't have such a big file.

Seems that the json file support is broken and being deprecated.
Perhaps the chart should use something like grafana-watcher until it gets fixed upstream.

Example YAML by @dkoshkin worked for me with my own exported dashboard. Thx!

@travishaagen the example above also worked for me. However I always end up with 2 identical dashboards.

This is actually a problem with grafana and loading the dashboards from a file.
I've had good luck using a sidecar to load the dashboards until it gets fixed upstream in Grafana.
https://github.com/apprenda/kismatic-charts/tree/master/charts/grafana

@dkoshkin - Where could i get the Example yaml file?  I dont see any thing attached.

@dkoshkin - How are you launching the sidecar?  I am using the chart given above. https://github.com/apprenda/kismatic-charts/tree/master/charts/grafana

I don't use the serverDashboardFiles property anymore, but instead wrote a parent Helm Chart that has a batch/job template that uses Grafana's REST API to create a dashboard. It uses the same technique that the Grafana chart currently uses to create a datasource in grafana/templates/job.yaml.
One thing to note is that when you upload a dashboard, you need to make sure the root "id" field in your dashboard JSON is null or else Grafana will complain.

@travishaagen. Could you share some additional details on how you are doing it with the stable grafana helm chart? I have to setup multiple dashboards when the grafana pod is deployed

Two ways that my team has tried:

Define a configmap that contains the dashboard JSON definitions and then inject configmap properties into environment variables that gets sent by the CURL command in the job. You could have all of your dashboards defined in a single configmap, with each having their own name/key. This can be nice if you want to add template logic to the dashboard YAML.
Define a file for each dashboard JSON, write a bash script that iterates over them and builds up the CURL command. In this case, the job executes the bash script directly, instead of the CURL command.

Example configmap:
apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ template "fullname" . }}-grafana-dashboard-configmap
data:
  dashboard.json: |+
    {
      "id": null,
     ...
    }

Example job:
apiVersion: batch/v1
kind: Job
metadata:
  labels:
    app: {{ template "fullname" . }}
    chart: "{{ .Chart.Name }}-{{ .Chart.Version }}"
    heritage: "{{ .Release.Service }}"
    release: "{{ .Release.Name }}"
  name: {{ template "fullname" . }}-grafana-dashboard-job
spec:
  activeDeadlineSeconds: 450
  template:
    metadata:
      labels:
        app: {{ template "fullname" . }}
        release: "{{ .Release.Name }}"
    spec:
      containers:
      - name: {{ template "fullname" . }}-grafana-dashboard-curl
        image: "appropriate/curl:latest"
        env:
        - name: DASHBOARD_JSON
          valueFrom:
            configMapKeyRef:
              name: {{ template "fullname" . }}-grafana-dashboard-configmap
              key: dashboard.json
        args:
          - "http://{{ .Values.grafana.server.adminUser }}:{{ .Values.grafana.server.adminPassword }}@{{ template "grafana.fullname" . }}:{{ .Values.grafana.server.service.httpPort }}/api/dashboards/db"
          - "--max-time"
          - "10"
          - "-H"
          - "Content-Type: application/json;charset=UTF-8"
          - "--data-binary"
          - "{ \"dashboard\":$(DASHBOARD_JSON), \"overwrite\":false }"
      restartPolicy: "OnFailure"

Again, this is all done in a parent Helm Chart that has the Grafana chart as a dependency.

@travishaagen
Thx for the info. The steps were helpful to try.
So if I get it correct if I do step 1 then step 2 is not needed
Could you share some info on how you are doing step2 wither bash script with helm? I have currently 6 dashboards that need to load and would like to avoid populating json data in files

@travishaagen. Could you share your helm charts so that i can understand the flow? I am new to helm and trying to understand it.

@linuxbsdfreak Having the same issue as you, seems like a bit an issue with helm. I have the same problem in a few other charts having to put the contents of the file instead of referencing a file. It makes it incredibly difficult to create additional dashboards/ have some actual version control in a chart.

I confirm that adding dashboards using serverDashboardFiles, grafana creates the dashboards twice.

@fiunchinho
we got the same problem here

I've created a PR to address these issues and able to import using the Grafana API endpoint with a Job.
Tested it and dashboards are imported once and can even be imported with the URL alone (no need to copy long JSONs to values.yaml)

The import job provided with the stable chart (v0.8.3) does not work, as the current json templates include environment variables (e.g. ${DS_PROMETHEUS}) that do not get expanded by the import job. Will try a workaround that replaces the environment variables after downloading the json specs from the grafana repo.

@mbarison this has nothing to do with the chart itself, the data source syntax you quote is the Grafana best practice on importing dashboards.
The charts should not care what you include in the dashboard json, just import it.

Like I said, you're mixing 2 things. The chart just import the dashboard json file. It shouldn't manipulate it.
Check the json files from Grafana site and you'll see that this is their suggested import. You should Google the error and you'll notice it was there long before Helm.

In my opinion, the dashboard import job is a convenience for the user to automate the set up of dashboards, so that whether there are multiple dashboards and multiple clusters, human interaction is kept at a minimum.
Grafana's suggested import procedure is a two steps procedure:

Import the JSON spec defining your dashboard
Use a dialog box in the GUI to specify the datasource to be used with the imported dashboard

The Job spec supplied with the Grafana chart only performs step 1, and leaves the dashboard in an unusable state. Moreover, as the import happens through the API rather than the GUI, step 2 is not accessible anymore. So now if I want to fix my dashboards, I have to manually go through the imported specs and modify them by hand. Which I don't think is the spirit of what Helm is used for.
I do agree that the problem is with Grafana and not with Helm, but if the idea is to automate the provisioning of Grafana, Helm should accommodate for Grafana's flaws, not work against them.
I will try my approach, and if you don't like it, you can shoot it down at the PR ;)

How did it go @mbarison ?


Project full refactoring: Stage 1

Dear author,
First of all thanks for this beautiful idea and the project.

I have covered Stage 1 refactoring in a total of 17 iterations(branches) and now decided to send a PR for your consideration as your next major release.
Most of the refactoring addresses the cyclomatic complexity of the code and the separation of the "concerns".
Stage 2 will be refactoring/separating the glitch class itself into domain models etc. - currently it "knows" and is doing a lot of things.
All tests are passed, as usual, and the project is installable via setup.py as usual - nothing is broken.
This refactoring flow can be considered as a study material as well.
At the end, we will have a full project rewrite :)

Hello, thanks for the clarification :)
Indeed the project is a very interesting one in terms of showing and teaching something, especially when you glitch your worst picture and it gets shiny :D
I got your point and will continue my work and not will not open a new PRs as we have concluded)


editor: delete key support

fixes https://github.com/lockbook/lockbook/issues/1611
@steverusso UAT this before merging!

Regular delete works (removes a single character after the cursor), but using delete with selected text just does a regular delete (removes one character after the end of the selection) and then de-selects the selected text.

Regular delete works (removes a single character after the cursor), but using delete with selected text just does a regular delete (removes one character after the end of the selection) and then de-selects the selected text.

potentially related: #1665

regular delete & deleting with selection works


fix: [termdebug] correct K/-/+ mappings check

// and did same like 'saved_mousemodel' chk

@Shane-XB-Qian Thanks! Could you please add some tests?


[Core] Add "set" methods and copy constructors to Vectors, misc Quat stuff

This PR does a few things, takes the Set feature of Vectors/Quat in C# and Core's Quat and adds them to Core's Vectors and Color, add other misc set methods to Quat, add self-constructors, add get_-less Euler return to Quat just like the other functions that return a value and aren't prefixed with get_, and fix two minor mistakes.
This is mostly to try and improve consistency between C# and Core (and Core's Quat vs Vectors).
Some of these additions may not be desired. Tag this PR as "discussion" and "enhancement".
Fixes https://github.com/godotengine/godot/issues/24001

Moving to 3.2 milestone as we're about to enter the beta stage and release freeze for Godot 3.1. Only bug fixes against issues of the 3.1 milestone (or enhancements to core features of the 3.1 roadmap) will be considered until 3.1-stable is released.
Note: If it's merged after 3.1-stable is released, this change might be considered for cherry-picking into a later 3.1.x release.

We discussed this on IRC today (logs from 14:20). The conclusion was:

The added set methods don't seem useful as one can do assignments instead. Since most of them can't be bound to GDScript which doesn't support overloaded methods (apart from constructors), it doesn't seem useful to add those in the core now. If an actual use case arises we can reconsider.
Adding Quat.euler() doesn't seem useful as it's a duplicate of Quat.get_euler().
The copy constructors seem fine, but they used to work in the past as per #24001, so this should be investigated further.
The added Color(Color p_from, float alpha) constructor seems fine to solve #27792, but it would be better in its own PR.

So closing this PR, follow-ups can be made for what's discussed above.


buildx: make it easier to download precompiled binaries from other repos

After this change, callers can pass a release URL of the form:
https://github.com/docker/buildx/releases/tag/v0.11.1
and get the release binaries from the the github api

this is a re-roll of https://github.com/docker/actions-toolkit/pull/127, but integrates better with the htc changes.
i'm still not 100% sure how we should expose this in setup-buildkit-actions

actually, one sec, i'm going to update it to also support releases/latest

chatted off-list, we're going to use the approach here - https://github.com/docker/actions-toolkit/commit/20e2f43513a1128b738d409a95345e860c4fc598


Add generic converter API, and extra helper functions + docs.

Addresses #2, #3, and supersedes #4.
Adds new convert_pil and convert_array endpoints for use with Pillow objects and numpy arrays.
Additionally, some helper methods were added to make conversion functions a little less laborious to use.

@mihasket , does the final commit look good to you?

Yes, it looks fine. Thank you so much for taking the time to respond!

Keen to see the PR closed and a new release on PyPI..

Quick note: __init__.py has to be updated with new APIs. https://github.com/pnappa/CLImage/blob/master/climage/init.py#L10
- from climage.__main__ import convert, to_file, main
+ from climage.__main__ import convert, convert_pil, to_file, main

For future reference to me, I pushed to pip using this guide: https://packaging.python.org/en/latest/tutorials/packaging-projects/


tour: [REPLACE WITH SHORT DESCRIPTION]

Context: https://tour.golang.org/welcome/1
Change the title above to describe your issue and add your feedback here, including code if necessary

tour: [REPLACE WITH SHORT DESCRIPTION]


Proposal to build a Humble.sh connector for Hummingbot client

Proposal for CoinAlpha to build a Humble.sh connector to the Hummingbot client, the most widely used open source market making bot.

Hi, please engage with the community at the Algorand Forum.
https://forum.algorand.org/t/xgov-39-humble-sh-hummingbot-connector/9911

Nothing more on your side, people will vote on proposals when we start the process

Great.
When does the voting process begin?
Thanks,
Martin Sigwald
Business Development Manager**Telegram: @tinchosig
CoinAlpha http://coinalpha.com/ | Hummingbot http://hummingbot.org/
On Wed, Jul 19, 2023 at 12:22 PM Stéphane @.***> wrote:

Nothing more on your side, people will vote on proposals when we start the
process
—
Reply to this email directly, view it on GitHub
https://github.com/algorandfoundation/xGov/pull/39#issuecomment-1642295301,
or unsubscribe
https://github.com/notifications/unsubscribe-auth/ATWXBH3N7ZQW6HHYLQPFKFLXQ73UTANCNFSM6AAAAAAZXSSG44
.
You are receiving this because you were mentioned.Message ID:
@.***>

Hi all,
On the community discussion thread someone suggested we add Pact.fi to the
proposal, since it has more volume than humble.
Would it be possible to edit the proposal to include that inside the scope
and adjust the total amount of the grant (since extra work would be
required)? Or do you think it would make more sense to put in a separate
proposal for pact.fi?
The benefit of bundling them is that the overall number would be lower that
if we submit to grant requests, since we would need to put in roughly the
same amount for both, given the risk of one passing and the other not.
Please advise.
Thanks!
Martin Sigwald
Business Development Manager**Telegram: @tinchosig
CoinAlpha http://coinalpha.com/ | Hummingbot http://hummingbot.org/
On Wed, Jul 19, 2023 at 1:15 PM Martin Sigwald @.***>
wrote:

Great.
When does the voting process begin?
Thanks,
Martin Sigwald
Business Development Manager**Telegram: @tinchosig
CoinAlpha http://coinalpha.com/ | Hummingbot http://hummingbot.org/
On Wed, Jul 19, 2023 at 12:22 PM Stéphane @.***>
wrote:

Nothing more on your side, people will vote on proposals when we start
the process
—
Reply to this email directly, view it on GitHub
https://github.com/algorandfoundation/xGov/pull/39#issuecomment-1642295301,
or unsubscribe
https://github.com/notifications/unsubscribe-auth/ATWXBH3N7ZQW6HHYLQPFKFLXQ73UTANCNFSM6AAAAAAZXSSG44
.
You are receiving this because you were mentioned.Message ID:
@.***>


go.mod: remove replace inet.af/tcpproxy => github.com/inetaf/tcpproxy

By copying https://github.com/inetaf/tcpproxy/blob/91f861402626/tcpproxy.go to pkg/tcpproxy/tcpproxy.go.

Test failure is irrelevant https://github.com/containers/gvisor-tap-vsock/actions/runs/11388213298/job/31684676909?pr=409
E: Failed to fetch mirror+file:/etc/apt/apt-mirrors.txt/pool/main/e/edk2/ovmf_2022.02-3ubuntu<IP_ADDRESS>_all.deb  404  Not Found [IP: <IP_ADDRESS> 80]

@cfergeau I could confirm that this PR has no issue https://github.com/containers/gvisor-tap-vsock/issues/387
It seems that everything works fine

@cfergeau I can confirm that this PR has no issue #387 It seems that everything works fine

Ah great, thanks for checking!

/lgtm
/approve


Add react node text util

Description
I wanted to implement a simple matchFilter for the SingleSelectWithFilter that can match on the content attribute, which is a ReactNode.
Proposed Changes

I added a small util called getReactNodeTextContent that converts a ReactNode into a string by keeping only the text content (it strips the html tags)

Potential Breaking Changes
None.
Acceptance Criteria

[x] The proposed changes are covered by unit tests
[x] The potential breaking changes are clearly identified
[x] README.md is adjusted to reflect the proposed changes (if relevant)

Codecov Report

Merging #1170 into master will not change coverage.
The diff coverage is n/a.

@@           Coverage Diff           @@
##           master    #1170   +/-   ##
=======================================
  Coverage   99.74%   99.74%
=======================================
  Files         350      350
  Lines        8537     8537
  Branches     2033     2033
=======================================
  Hits         8515     8515
  Misses         22       22

Continue to review full report at Codecov.

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


Update ObjectHandlerBase.cs

Q
A

Bug fix?
yes

New feature?
no

New sample?
no

Related issues?
no (not submitted)

What's in this Pull Request?
Prevent the "url.Replace(webUrlPathAndQuery, "{site}");" from happening when dealing with theme files in the root site collection "/".

Hi @stefvanhooijdonk, I'm your friendly neighborhood Microsoft Pull Request Bot (You can call me MSBOT). Thanks for your contribution!
You've already signed the contribution license agreement. Thanks!
The agreement was validated by Microsoft and real humans are currently evaluating your PR.
TTYL, MSBOT;

Hi,
Thanks for your contribution. Can you expand a little bit more about the purpose of this PR? What is the scenario/bug that it fixes?
Thanks.

When doing an export of the root site collection ( “/” ) with a theme applied, the code changed the file url of a theme file
from
/_layouts/themecatalog/palettefile.spcolor
to
/_layouts/themecatalog{site}palettefile.spcolor
This would then fail when applying to a new site.
The code change prevents this from happening.
--
Groetjes,
Stef
From: Paolo Pialorsi<EMAIL_ADDRESS>Reply-To: OfficeDev/PnP-Sites-Core<EMAIL_ADDRESS>Date: Tuesday 26 July 2016 at 10:03
To: OfficeDev/PnP-Sites-Core<EMAIL_ADDRESS>Cc<EMAIL_ADDRESS><EMAIL_ADDRESS>Mention<EMAIL_ADDRESS>Subject: Re: [OfficeDev/PnP-Sites-Core] Update ObjectHandlerBase.cs (#675)
Resent-From<EMAIL_ADDRESS>Resent-To: Stef van Hooijdonk<EMAIL_ADDRESS>Resent-Date: Tuesday 26 July 2016 at 10:04
Hi,
Thanks for your contribution. Can you expand a little bit more about the purpose of this PR? What is the scenario/bug that it fixes?
Thanks.
—
You are receiving this because you were mentioned.
Reply to this email directly, view it on GitHubhttps://github.com/OfficeDev/PnP-Sites-Core/pull/675#issuecomment-235191579, or mute the threadhttps://github.com/notifications/unsubscribe-auth/AQZnbuyXqyqLI6LxFFVkdV0ZOeptIDHKks5qZb9mgaJpZM4JSrep.

Thx Stef,
We'll have a look at this PR in the upcoming weeks.

Hi Stef,
I've tried to repro this by first uploading the following custom theme files:
<pnp:ProvisioningTemplate ID="composedlook_files" Version="1" xmlns:pnp="http://schemas.dev.office.com/PnP/2015/12/ProvisioningSchema">
  <pnp:Files>
    <pnp:File Src="garagebg.jpg" Folder="_catalogs/theme/15" Overwrite="true" />
    <pnp:File Src="garagelogo.png" Folder="_catalogs/theme/15" Overwrite="true" />
    <pnp:File Src="garagewhite.spcolor" Folder="_catalogs/theme/15" Overwrite="true" />
  </pnp:Files>
</pnp:ProvisioningTemplate>

and then applying a custom theme with:
<pnp:ProvisioningTemplate ID="composedlook_add_2" Version="1" xmlns:pnp="http://schemas.dev.office.com/PnP/2015/12/ProvisioningSchema">
  <!-- Set custom composed look -->
  <pnp:ComposedLook Name="CL_2" Version="1"
                    BackgroundFile="{sitecollection}/_catalogs/theme/15/garagebg.jpg"
                    ColorFile="{sitecollection}/_catalogs/theme/15/garagewhite.spcolor"
                    FontFile="" />
</pnp:ProvisioningTemplate>

When I then extract a site with this custom theme it is correctly extracted, the code path you want to change is never hit because the references to the theme files in the themecatalog is replaced by the {themecatalog} or {sitecollection}/_catalogs/theme tokens and as such the "If (url.IndexOf(webUrlPathAndQuery, StringComparison.InvariantCultureIgnoreCase) > -1)" never is valid.
What's strange in your comment is the /_layouts/themecatalog reference since the themecatalog should be referenced using the site collection and not filesystem.
For now I'm gonna close this PR, please elaborate more if the above approach isn't working for you.

Hi @stefvanhooijdonk, I'm your friendly neighborhood Microsoft Pull Request Bot (You can call me MSBOT). Thanks for your contribution!
You've already signed the contribution license agreement. Thanks!
The agreement was validated by Microsoft and real humans are currently evaluating your PR.
TTYL, MSBOT;

Re-opening this PR for additional testing

The situation I tried to resolve was for a ROOT site collection, just like Camilo.
--
Groetjes,
Stef van Hooijdonk
From: Bert Jansen<EMAIL_ADDRESS>Reply-To: OfficeDev/PnP-Sites-Core<EMAIL_ADDRESS>Date: Wednesday, 16 November 2016 at 11:37
To: OfficeDev/PnP-Sites-Core<EMAIL_ADDRESS>Cc: Stef van Hooijdonk<EMAIL_ADDRESS>Mention<EMAIL_ADDRESS>Subject: Re: [OfficeDev/PnP-Sites-Core] Update ObjectHandlerBase.cs (#675)
Resent-From: Stef van Hooijdonk<EMAIL_ADDRESS>Re-opening this PR for additional testing
—
You are receiving this because you were mentioned.
Reply to this email directly, view it on GitHubhttps://github.com/OfficeDev/PnP-Sites-Core/pull/675#issuecomment-260912150, or mute the threadhttps://github.com/notifications/unsubscribe-auth/AQZnbvy6MuY8McIpJwhZv0T_Yp6iSlL2ks5q-tzagaJpZM4JSrep.

Have merged the PR, thanks for the additional clarification.


Missing option of disconnecting the touch event from the relay

Can we have an option for each button that disconnects from the physical relay?
For example i have a TX Ultimate on my entrance wall but there is only one light connected there.
the other two buttons on my 3-gang switch are for controlling other things in the room via home assistant.
if i press the 1st button the physical relay should toggle but if i press the other two buttons, i don't want the physical relays to activate or make any mechanical noises.

Solved in dev


Users with incorrect display name get tenant visibility when editing profile

@sallakarppinen : It looks like the FontAwesome work is part of this PR as well. Would you be able to submit a PR from a branch that doesn't have this included so we can keep the PRs focussed?

@nicolaasmatthijs, done - seems that I can't close pull requests here so could you close this one for me?


New PoST proof

Need to implement https://github.com/spacemeshos/research/issues/37, once finalised.

@barakshani  Is it ready for implementation?

No.
Ideally this issue, or the one referenced above, will contain content for implementation.

Closed by https://github.com/spacemeshos/post/pull/39.


More than 2 decimals appear in the tooltip when setting :format="{ decimals: 2 }" and :step="0.01"

Problem
When setting :format="{ decimals: 2 }", the value in the tooltip shows more than 2 decimals.

However, the modelValue returned respects the 2 decimals.
How to reproduce

Setup :format ="{ decimals: 2 }" and :step="0.01"
Move the slider handle manually and observe the value in the tooltip

Desired state
When setting :format="{ decimals: 2 }", the value in the tooltip should return 2 decimals.

Edit
Found my mistake. I wrote :format="{ decimal: 2 }" (decimal without s) instead of :format="{ decimals: 2 }"


[Issue-1687] - DS Requests - adds stronger confirm when creating a request to delete a ds

related to #1687

Refer to this link for build results (access rights to CI server needed):
https://builds.apache.org/job/incubator-trafficcontrol-PR/1099/
Test PASSed.


C++ compiling torchvision is too troublesome！！！

🚀 The feature
C++ compiling torchvision is too troublesome. After debugging for 3 days, I haven't found the problem. Since libtorch can solve the C++ installation problem of torch, why does torchvison not provide an interface such as libtorchvison and package compiled code?
Motivation, pitch
C++ compiling torchvision is too troublesome. After debugging for 3 days, I haven't found the problem. Since libtorch can solve the C++ installation problem of torch, why does torchvison not provide an interface such as libtorchvison and package compiled code?
Alternatives
No response
Additional context
No response

Can pytoch+torchvision provide a basic C++ image call? The compilation process is too unfriendly to beginners.

Hmm can you elaborate the trouble?
Maybe this example can help you.
To install torchvision from source please clone the repo and run python setup.py develop

As @oke-aditya suggested, it would be nice to have a bit more details on what the problem is, with the steps you followed / the error message you're getting, etc.
It's not clear to me yet whether you're just trying to compile torchvision from source, or if you are trying to use torchvision from within C++. If that's the latter, please note that we have recently changed the way people are supposed to use the C++ API, so any previous workflow that you may have will be outdated (https://github.com/pytorch/vision/pull/4375).
If the instructions we already have in place are unclear, please let us know so we can update accordingly. Thanks!


Parser error when method name is a language keyword

Input
→ View on sorbet.run
# typed: true

class Promise
  extend T::Sig

  sig { returns(Promise) }
  def then
    self
  end
end

# Calling #then on the same line works

Promise.new.then.then

# But adding a line break after the `.` causes an error

Promise.new.
  then.
  then

Observed output
editor.rb:19: unexpected token "then" https://srb.help/2001
    19 |  then.
          ^^^^
Errors: 1

Expected behavior
I would expect Sorbet to detect no errors in this code.

Ruby successfully interprets this input as a call to the Promise#then method, but Sorbet's parser seems to think it is an instance of the then language keyword.
In the wild I've encountered this with methods like ActiveRecord::QueryMethods#or and Concurrent::Promise#then.
While it is possible to work around by changing the wrapping style, it introduces a bit of friction to do so.

I figured I’d have a go at fixing this, but after reading through some of the lexer code, it looks like this is intentional behaviour rather than a bug:
https://github.com/sorbet/sorbet/blob/306fb9efbd4ef05ac37e77caa46990d29b93c502/parser/parser/cc/lexer.rl#L1834-L1858
Sorry for the noise 🙂

The workarounds I've thought for for this issue are

Put the dot at the beginning of the line instead of the end:

Promise.new
  .then
  .then

I actually favor this style, but the code base I'm working in universally puts the dots at the ends of lines rather than at the beginnings (we have a Rubocop rule that enforces this).

Use aliases for conflicting methods when possible. For example, use yield_self instead of then, and use RSpec's & instead of  and.

This is fine, but my impression is that most people favor the "keyword" versions of these methods. then was added as an alias to yield_self because the former is more readable and shorter. So getting people to use the non-conflicting aliases is cutting against the grain a little bit.

Reformat the code. For example, put everything on one line, instead of having each method call on a different line. For example, change this

Hippopotamus.
  where(foo_id: foo_ids).
  or(Hippopotamus.where(bar_id: bar_ids)).
  load

to this
Hippopotamus.
  where(foo_id: foo_ids).or(
    Hippopotamus.where(bar_id: bar_ids)
  ).load

While there are some scenarios in which this is an OK solution, it usually results in formatting that's more unusual and harder to read.
If we go ahead with adopting Sorbet, I'll propose making the code-convention change described in (1). With Rubocop's auto-correct feature, it wouldn't be much work switching over to it (though it would add a substantial amount of noise to Git history).
I'm curious whether anyone has any other ideas about how to deal with this problem.


add cn version 'declarative-object-management-configuration.md'

This change is

@chenopis Sorry to ask, but I don't understand what this failing mean, how should i modify this file?

@Lion-Wei Unfortunately, only admins can see the error messages. :(

It is saying that it the file simple_deployment.yaml cannot be found. It is probably coming from the include code.html lines, e.g.
{% include code.html language="yaml" file="simple_deployment.yaml" ghlink="/docs/tutorials/object-management-kubectl/simple_deployment.yaml" %}

You may want to copy the file to somewhere in the /cn directory structure and change the file path of those include tags.

cc @markthink

thx, finally worked.

Once someone from one of the other CN orgs gives an LGTM, I can merge this.

@Lion-Wei  please fix this PR， thanks.

Sorry to be a pest, but we need get through our backlog of PRs. Ping @Lion-Wei.

ping @Lion-Wei

ping @Lion-Wei

Sorry didn't notice, but I don't have enough time for now, how about I close this pr temporarily? I will resubmit it as soon as possible. I am really sorry about that. @chenopis @zhangxiaoyu-zidif @steveperry-53

If you have time to fix the PR, just reopen it. @Lion-Wei

Okay， thx @zhangxiaoyu-zidif