New top level object: "warnings"

Presently, the spec allows for a top level item of 'data' or 'errors' but not both. Therefore, unless you cram something nonstandard into the meta object, there is no way to provide feedback to the user/developer that the request was executed, but with warnings.
Example use cases for warnings include:

The endpoint you called has been deprecated
Data provided in the request was truncated or formatted during processing
You tried to create a duplicate entity, so we did an upsert and returned the existing one
Certain attributes were hidden from the response due to scope permissions

All of these are valuable for the developer to know, but JSON:API doesn't give us anywhere official to put them.
Under this proposal, API developers MAY return a top-level 'warnings' key in responses (there is no reason to submit POST data with a warning.) It would be permitted regardless of whether 'data' or 'errors' is present. The 'warnings' key, if present, MUST be an array containing one or more Warning Objects.
A Warning Object should have the same schema as an Error Object, less the 'status' key.

Thank a lot for your proposal! To be honest I'm skeptical about it. But let me share some thoughts how it could be implemented using an extension in v1.1 anyways.
An extension can define additional members of the top-level document:

An extension MAY define new members within the document structure defined by this specification.

The name of a member defined by an extension must be prefixes with a namespace:

The name of every new member introduced by an extension MUST be prefixed with the extension’s namespace followed by a colon (:).

That means it could not just be warnings, but it could be warnings:warnings if that extension registers warnings as its namespace.
Maybe it would be good to extend scope a little bit and support other debug information like info as well. In that case a broader namespace like debug may be more appropriate.

All of these are valuable for the developer to know, but JSON:API doesn't give us anywhere official to put them.

In most cases APIs are meant to be consumed by computer programs. Not sure if API response is the best way to communicate with the developers who are developing clients consuming them.
In my experience developers inspect the API response only if changing how client consumes that API or if debuging an issue, which might be related to an API response. So I wouldn't expect that such a warning is noticed by a developer at all.
Additionally it comes with a noticable trade-off of increased payload size. Avoiding to send data, which is not needed, over the wire (over-fetching), is one of the most hyped features of GraphQL.

I think about adding some level attribute to the error object is better:
{
	"errors":[
		{
			"title": "This is a warning",
			"detail": "We are testing a warning error type.",
			"level": "warning"
		},
		{
			"title": "This is a debug thing",
			"detail": "We are testing a debug error type.",
			"level": "debug"
		}
	]
}

I agree with @jelhan that API responses are not necessarily the best way to communicate with developers, but that only pertains to the "deprecated" use case. All of the other use cases mentioned by @mattholden can be handled by the client to inform the end user.
Another use case is where there is a non-fatal error that prevents the API from returning some data (perhaps where a downstream service is unavailable), but the API can still return meaningful and useful data to the client. In this scenario the client needs to know that some data may be missing.
In my opinion, it would be extremely useful to either have a top-level warnings object or to amend the specification to allow both data and errors objects to be returned in the same response.

So.... pitching in here as I've got an interest in this one also :-)
You're all right, well sort of.
All error and non-error information should go into logs somewhere with errors being reported back to the caller somehow - whether the caller is a UI or some middle-man process.
However there are occasions where the caller does need both the data - as it has been changed and committed to the database but also to be informed of other non-error information and react in some way because it needs to act on that in some way, such as notify a user.
Typically such scenarios come about where we are interfacing with systems outside of our control or having to obey legacy or legal rules that we cannot override because they don't fit neatly into our chosen framework.
Ideally the "errors" structure would be expanded into a "messages" structure of which "errors" is but one, but in the meantime going down the extension route seems the most common sense approach, use that to fine tune it into a workable solution then propose it get adopted into the main spec at some point.
I'm thinking of the "atomic:operations" extension when I say that.
So then I propose we define an extension for "messages" which at the very least includes a "messageType" attribute, the "message" and I think it should also include as a minimum a timestamp attribute. Anything else can go in the message itself or in a "meta" section (per message).
Anyone interested in pitching in with this, beyond Emis? As I was typing "I propose...." I suddenly felt a chill and a sense of the jaws of a trap closing in on me and a voice saying "ok, go on then, you do it...." :-P But it was just my imagination, wasn't it?

Situation one:

Add multiple new members, like warnings, info and debug to the top object.

Situation two:

Start allowing errors next to data in the top object.
Add a level attribute to each error object. Omitting this attribute would default to some defined level, likely error.

Situation three:

Something else.

I see it as unlikely that support to the base specification is added before having experience with solutions implemented as extensions. I recommend focusing on achieving what you need in one or more extensions for the time being.

On Fri, Sep 1, 2023, 06:34 Ben @.***> wrote:

Situation two:

Start allowing errors next to data in the top object.
Add a level attribute to each error object. Omitting this attribute
would default to some defined level, likely error.

This seems unreasonable given the compatibility promises. An existing
client might not be able to tolerate responses that combined data and
errors, because detecting errors could, reasonably, cause days to be
ignored and the entire response is handled badly. Many developers would
quickly be confused by getting errors back with successful response codes.
Using a new warnings member that's allowed with either data or errors seems
best.
-Fred

I see it as unlikely that support to the base specification is added before having experience with solutions implemented as extensions. I recommend focusing on achieving what you need in one or more extensions for the time being.

That is understandable, thank you @jelhan. If we create an extension, is there a way of putting it forward for inclusion on the jsonapi.org website?
Is anyone on this thread interested in collaborating to create an extension? If so, then perhaps we should move this discussion to https://discuss.jsonapi.org/ (I believe that is the correct place for discussions about extensions)


Custom/modify shortcuts

What's the Problem?
My idea is to allow users to change the shortcuts that are in the Files app. This will allow the app to be customized more for each person as people might be used to one shortcut for an app but on Files it is different.
Solution/Idea
To allow user to customize shortcuts in the app
Alternatives
N/A
Priorities
No response
Files Version
Version: <IP_ADDRESS> OS Version: 10.0.19044.1682
Windows Version
Edition	Windows 10 Pro Version	21H2 Installed on	13/02/2022 OS build	19044.1682 Experience	Windows Feature Experience Pack 120.2212.4170.0
Comments
No response

You already can if you open the properties on the shortcut using the right click menu or toolbar > then customise (sometimes its in a ... menu)

You already can if you open the properties on the shortcut using the right click menu or toolbar > then customise (sometimes its in a ... menu)

I can't find it.

Properties

click Properties

Where?

You have to be on a shortcut for the shortcut spcific options

You have to be on a shortcut for the shortcut spcific options

What I mean is that to duplicate a tab in the Files app I need to right-click on the tab and press duplicate or press ctrl shift K. But on Google Chrome I have an extension which means that I can press shift d to duplicate a tab. So that is why I think it is a good idea to add an option to the app.

Oh you mean keyboard shortcuts. Merging with #1660 then

@Someone-Somwhere This feature will be included in the next release. Please see #9559 for more details.


Reset password flow - unknown error

I went through the forgotten password flow yesterday afternoon and only used the link from the email today and received an unknown error.
When sending a new forgotten password email today this worked as expected.
Why would the email from yesterday produce an unknown error (we state the link is valid for 5 days - is this correct?)
Steps:

Go to account
Select Forgotten Password
Enter email address and submit
<<Wait a period of time 12hrs/24hrs >>
Select link from email
Observe: An error message on the reset page

Expected:

Link to reset password works within the timeframe quoted that the link is active
Error messaging is helpful, articulates the issue and is displayed in line with other error messages (this looks like it's a different style to what we use elsewhere)

The link should be valid for 5 days (this is the default, and it hasn't been changed from the looks of things).

@davidpmccormick - I'll re-test this today and see what happens tomorrow. Will update if this can be closed or if it recurs

Re-tested and looks fine. Will close.


bug(MatDateRangePicker): Dates set in illogical order and more than necessary

Reproduction
https://stackblitz.com/edit/components-issue-uosggb?file=src%2Fapp%2Fexample-component.html
Steps to reproduce:

Open Date Picker
Choose beginning date
Choose ending date
4-6. Repeat steps 1-3

Expected Behavior
Steps 3,6: End date set, beginning date not set
Step 5: End date cleared, beginning date set
Actual Behavior
Steps 3,6: Both beginning date and end date set
Step 5: Beginning date set before end date is cleared
The behavior in steps 3 and 6 causes extra calls that are unnecessary and makes an app check for "changes" that do not modify the value before performing extra operations.
The behavior in step 5 makes the control briefly have a date range that is different than it actually does. In the case where some action is performed when both values are set, it appears they are both set when actually only the start date is set.
Environment

Angular: 11
CDK/Material: 11
Browser(s): all
Operating System (e.g. Windows, macOS, Ubuntu): all

Looks like this was resolved in the above PRs.


Download model outside China

Dear Nan Jing,
Can you provide another way to download models?! I'm from Brazil and can't download model from Baidu Drive.
Best regards,
Renato.

Dear Nan Jing,
Can you provide another way to download models?! I'm from Brazil and can't download model from Baidu Drive.
Best regards,
Renato.

Tell me your Email, I will sent to you.

Could you send a model ?
my email is<EMAIL_ADDRESS>

Hi,
Could you send me the model?
My email is<EMAIL_ADDRESS>Thanks,

Hi,
Could you send me the model and necessary files to work the software ?
My email is<EMAIL_ADDRESS>Thanks,

Hi,
Could you send me the model?
My email is<EMAIL_ADDRESS>Thanks,

@Jai-wei  please me also

Please also for me, thanks<EMAIL_ADDRESS>

can you send me the model
<EMAIL_ADDRESS>

Could you please send me the model? Thanks.
<EMAIL_ADDRESS>

Could you please send me the model? Many thanks
<EMAIL_ADDRESS>

Dear Nan Jing,
Could you please send me the models? Thanks!
<EMAIL_ADDRESS>


Gaussian blur that's a multiple of 10 will skew the image.

Any blur that's a multiple of 10 skews the image 45 degrees.

Well, it seems it also happen with other radius values that are not odd. Based on some testing with different image sizes, the images can get skewed if the radius is not odd.

I'll pull the code up today and have a look (back from Holidays now). Hopefulyl something jumps out.

can either of you provide a radius which will cause the example to skew on an actual device?
I've done some testing this morning and can't find any radius which causes skewing on a phone. The simulator skews with radius 10 but I believe this to be a bug in the simulator code.
You can easily try different radius by modifying the switch statement for the "advanced" section in the example


license-classifications.yml contains duplicate id Unlicense and LicenseRef-scancode-unlicense

During upgrade of our own license-classifications.yml I have noticed that there are two entries for maybe the same license in your license-classifications.yml:

Unlicense and LicenseRef-scancode-unlicense

LicenseRef-scancode-unlicense can't be found via web ui in scancode-licensedb and isn't used in one of your curations.
I haven't proved that for other ids - the only thing remarkable is, that the lines of file have increased from ~7400 to ~11500 since we last have updated around Feb, 2023.

License classifications are auto-generated by now, by importing ScanCode's LicenseDB as last happened ~3 weeks ago. While that maybe explains the increase in classifications, it does not explain why we have the Unlicense twice. Maybe @fviernau, who wrote the ScanCodeLicenseDbClassifications code, has an idea?

I'll need to look into this in detail later.
As a general remark, I believe we should have one classification per distinct license identifier.
So, if there are tow IDs for the same license, two classifications are needed.

@fviernau: LicenseRef-scancode-unlicense has no match in the web UI and the json either, so it seems that this classification is obsolete.


Floating Point

Several applications (optical flow, camera pipeline, unsharp) that currently wish to be supported, as well as future application need floating point support.
I suggest adding this as a new datatype along with Ints.

I think a longer discussion will need to be had for supporting floating point which should coordinate with the magma toolchain.


[WIP]Add cov to rolling object and test

[ ] Tests added / passed
[x] Passes flake8 dask

closes issue #4053
For some reason the rolling tests are failing for cov. I'll look into it tomorrow, and maybe someone more familiar could chime in by then

Looking at the exception it looks like maybe the data is just poorly suited for covariance calculations?  It looks like even the pandas solution is mostly nans and infs.

@mrocklin Should I write a test for it that uses data that is better suited?

Sure
On Thu, Oct 25, 2018 at 12:53 AM Tres DuBiel<EMAIL_ADDRESS>wrote:

@mrocklin https://github.com/mrocklin Should I write a test for it that
uses data that is better suited?
—
You are receiving this because you were mentioned.
Reply to this email directly, view it on GitHub
https://github.com/dask/dask/pull/4108#issuecomment-432914253, or mute
the thread
https://github.com/notifications/unsubscribe-auth/AASszH3S3E0MjfNjcMg_5qOT9E_fiZD4ks5uoUPcgaJpZM4Xso8E
.

This is implemented on master now.
In [24]: ts = dd.demo.make_timeseries(freq='5D')

In [25]: ts[['x', 'y']].rolling('10D').cov().compute()
Out[25]:
                     x         y
timestamp
2000-01-31 x       NaN       NaN
           y       NaN       NaN
2000-02-05 x  0.153086 -0.196409
           y -0.196409  0.251993
2000-02-10 x  0.072830 -0.090051
...                ...       ...
2000-12-20 y  0.093875  0.055034
2000-12-25 x  0.017639 -0.063415
           y -0.063415  0.227989
2000-12-30 x  0.066008 -0.032398
           y -0.032398  0.015902

[144 rows x 2 columns]

@dubielt1 let us know if you're interested in finding another issue to work on!


fix: delete deprecated command kubeadm in docs.

…in docs.

fix: delete deprecated command kubeadm in docs.

/retitle [zh]: delete removed kubeadm subcommand
(In this repo, we take “docs” as implied)


DKIM auth fails for a subdomain

This little fix adds --append-domain to the opendkim-keygen command to ensure the DKIM authentication does not fail for a subdomain, usually domain not found is returned.

Thanks! sorry it was a while since I fiddle with DKIM, trying to understand context.
This only affect the generated DNS records to be used with BIND etc and not OpenDKIM itself? as I understand the documentation subdomain signing is permitted by default?
From http://www.opendkim.org/opendkim-genkey.8.html

−S |   | (−−[no]subdomains) Disallows subdomain signing by this key. By default the key record will be generated such that verifiers are told subdomain signing is permitted. Note that for backward compatibility reasons, −S means the same as −−nosubdomains.

Maybe i misunderstand or confuse things?
Should there be some addition to README.md about this change btw?

To be more precise it's in the case you set a subdomain in POSTFIX_myhostname and you only want to setup DKIM on this subdomain and not all the domain (also I did some tests and the mail server / prodiver that receive the mail looks for a DNS record in the specified myhostname).
Example:
For POSTFIX_myhostname=subdomain.domain.tld, the actual configuration without --append-domain option generates  something like this :
selector._domainkey IN TXT	( "v=DKIM1; h=sha256; k=rsa; " ....

And with the options --append-domain :
selector._domainkey.subdomain.domain.tld. IN TXT ( "v=DKIM1; h=sha256; k=rsa; "...

As the DKIM signature is sent with subdomain.domain.tld the DNS TXT record that will be tested will be selector._domainkey.subdomain.domain.tld.  So it fails without --append-domain during the generation because selector._domainkey will be bind as selector._domainkey.domain.tld..

Aha! understand. Sorry for all questions. Just so I understand, would it work without --append-domain if the TXT records are put in a zone file named subdomain.domain.tld?  but with --append-domain it does not matter, the records could be in a domain.tld file?
There should be no problem with backwards compatibility then i guess.
As I understand the change now maybe no documentation is really needed? but feel free to add some to this PR if you want.

Yes, it's hard to understand when we don't manipulate it every day :)
And for sure the subdomain case is not the most common use.
Oki I'll add something to the doc :D
Thanks for the reactivity !

Yeap im always confused by SPF, DKIM and i kind of gave up at DMARC :)
Thanks! let's merge!


Change throwable to Exception

Laravel's exception handler requires Exception, but Throwable was passed

When you seed a module, that relies on a class it will thrown an error, this pr fixed the issue of #465

I understand, however this was already tried, here : https://github.com/nWidart/laravel-modules/commit/cf27210c5079353dc65fb603f10b69a6a30ddf17#diff-25c026c4d45602db72947d8a0f1a2ab3
And was later changed what it is now. It never fixed the issue fully, for everyone.

I am also facing the same issue and changing Throwable to Exception in the handle method and reportException parameter is the only solution. There is no other way around.

That's not true no. There also reports when using Exception.


chore(main): release 3.0.3

:robot: I have created a release beep boop
3.0.3 (2024-09-19)
Bug Fixes

fixed undefined error (a1b52cd)
fixed undefined error (a5546eb)
fixed undefined error (988ea62)

This PR was generated with Release Please. See documentation.

:robot: Created releases:

v3.0.3
:sunflower:


Preventing pydev code analysis and pylint tools from complaining

PBS generates dynamic class members, which is a great thing but can cause pydev, pylint and other checkers to fail.
Could attributes be added to the pbs module (in docs, comment and other) to prevent the most common python validators from complaining about these.

This issue will celebrate 5th birthday in 2 days :-)
I understand why it has a low priority, but consider this: Every developer who uses static analyzer (such as pylint or PyCharm) is going to ask: "How do I disable these warnings?".
And these days more people are using static analyzer than not.

I wish I could PR FAQ section about this to your docs.
Pylint supports this. [no-member] errors can be suppressed by adding following lines to pylintrc:
[TYPECHECK]
generated-members=sh

I wish I could PR FAQ section about this to your docs.

You can :)

Hm... Where do your docs live? I didn't find it in your repos...

gh-pages branch.  follow the readme instructions in that branch

Opened #374

Closing due to docs changes being live


atoma-vllm: Remove possible unused code

Deprecated.
See https://github.com/atoma-network/atoma-infer


how to send data from ESP32 to controller

Where and how to edit the "temperature-measurement-app/esp32" example for the ESP32 to send data  when the controller requests a value
or  how to make the esp32 send data to a controller continuesously, sending a string or double
after pairing , I send chip tool command>> ./chip-tool temperaturemeasurement read measured-value 0x0000000000000F00 1
the log shown below, the data feild is null
 [1654762261.360971][31325:31325] CHIP:DL: ChipLinuxStorage::Init: Using KVS config file: /tmp/chip_kvs [1654762261.361122][31325:31325] CHIP:DL: ChipLinuxStorage::Init: Using KVS config file: /tmp/chip_factory.ini [1654762261.361172][31325:31325] CHIP:DL: ChipLinuxStorage::Init: Using KVS config file: /tmp/chip_config.ini [1654762261.361203][31325:31325] CHIP:DL: ChipLinuxStorage::Init: Using KVS config file: /tmp/chip_counters.ini [1654762261.361309][31325:31325] CHIP:DL: writing settings to file (/tmp/chip_counters.ini-HCRJES) [1654762261.361506][31325:31325] CHIP:DL: renamed tmp file to file (/tmp/chip_counters.ini) [1654762261.361519][31325:31325] CHIP:DL: NVS set: chip-counters/reboot-count = 10 (0xA) [1654762261.361678][31325:31325] CHIP:DL: Got Ethernet interface: eno1 [1654762261.361754][31325:31325] CHIP:DL: Found the primary Ethernet interface:eno1 [1654762261.361848][31325:31325] CHIP:DL: Failed to get WiFi interface [1654762261.361854][31325:31325] CHIP:DL: Failed to reset WiFi statistic counts [1654762261.361869][31325:31325] CHIP:IN: UDP::Init bind&listen port=0 [1654762261.361897][31325:31325] CHIP:IN: UDP::Init bound to port=60160 [1654762261.361902][31325:31325] CHIP:IN: UDP::Init bind&listen port=0 [1654762261.361918][31325:31325] CHIP:IN: UDP::Init bound to port=53381 [1654762261.361923][31325:31325] CHIP:IN: BLEBase::Init - setting/overriding transport [1654762261.361927][31325:31325] CHIP:IN: TransportMgr initialized [1654762261.361947][31325:31325] CHIP:DIS: Init fabric pairing table with server storage [1654762261.361993][31325:31325] CHIP:IN: Loading from storage for fabric index 0x1 [1654762261.362878][31325:31325] CHIP:IN: Loading from storage for fabric index 0x2 [1654762261.363079][31325:31325] CHIP:IN: Loading from storage for fabric index 0x3 [1654762261.363925][31325:31325] CHIP:ZCL: Using ZAP configuration... [1654762261.364187][31325:31325] CHIP:CTL: System State Initialized... [1654762261.364211][31325:31325] CHIP:CTL: Setting attestation nonce to random value [1654762261.364219][31325:31325] CHIP:CTL: Setting CSR nonce to random value [1654762261.364249][31325:31325] CHIP:CTL: Setting attestation nonce to random value [1654762261.364260][31325:31325] CHIP:CTL: Setting CSR nonce to random value [1654762261.364517][31325:31325] CHIP:CTL: Generating NOC [1654762261.364760][31325:31325] CHIP:DIS: Verifying the received credentials [1654762261.365382][31325:31325] CHIP:DIS: Added new fabric at index: 0x1, Initialized: 1 [1654762261.365390][31325:31325] CHIP:DIS: Assigned compressed fabric ID: 0xF166D9A24477A520, node ID: 0x000000000001B669 [1654762261.366793][31325:31325] CHIP:DIS: Fabric (0x1) persisted to storage. Calling OnFabricPersistedToStorage [1654762261.366799][31325:31325] CHIP:CTL: Joined the fabric at index 1. Compressed fabric ID is: 0xF166D9A24477A520 [1654762261.366820][31325:31325] CHIP:CTL: Setting attestation nonce to random value [1654762261.366843][31325:31325] CHIP:CTL: Setting CSR nonce to random value [1654762261.367079][31325:31325] CHIP:CTL: Generating NOC [1654762261.367327][31325:31325] CHIP:DIS: Verifying the received credentials [1654762261.367949][31325:31325] CHIP:DIS: Added new fabric at index: 0x2, Initialized: 1 [1654762261.367956][31325:31325] CHIP:DIS: Assigned compressed fabric ID: 0x6E3E0115E9278888, node ID: 0x000000000001B669 [1654762261.369359][31325:31325] CHIP:DIS: Fabric (0x2) persisted to storage. Calling OnFabricPersistedToStorage [1654762261.369366][31325:31325] CHIP:CTL: Joined the fabric at index 2. Compressed fabric ID is: 0x6E3E0115E9278888 [1654762261.369398][31325:31325] CHIP:CTL: Setting attestation nonce to random value [1654762261.369411][31325:31325] CHIP:CTL: Setting CSR nonce to random value [1654762261.369643][31325:31325] CHIP:CTL: Generating NOC [1654762261.369894][31325:31325] CHIP:DIS: Verifying the received credentials [1654762261.370491][31325:31325] CHIP:DIS: Added new fabric at index: 0x3, Initialized: 1 [1654762261.370498][31325:31325] CHIP:DIS: Assigned compressed fabric ID: 0x4B83E447702799B6, node ID: 0x000000000001B669 [1654762261.371828][31325:31325] CHIP:DIS: Fabric (0x3) persisted to storage. Calling OnFabricPersistedToStorage [1654762261.371835][31325:31325] CHIP:CTL: Joined the fabric at index 3. Compressed fabric ID is: 0x4B83E447702799B6 [1654762261.379881][31325:31330] CHIP:DL: CHIP task running [1654762261.379916][31325:31330] CHIP:TOO: Sending command to node 0xf00 [1654762261.379927][31325:31330] CHIP:CSM: FindOrEstablishSession: PeerId = F166D9A24477A520:0000000000000F00 [1654762261.379935][31325:31330] CHIP:CSM: FindOrEstablishSession: No existing OperationalDeviceProxy instance found [1654762261.379971][31325:31330] CHIP:CTL: OperationalDeviceProxy[F166D9A24477A520:0000000000000F00]: State change 1 --> 2 [1654762261.379993][31325:31330] CHIP:DIS: MINMDNS: Sending query ANY/UNICAST for F166D9A24477A520-0000000000000F00._matter._tcp.local [1654762261.415594][31325:31330] CHIP:DIS: MINMDNS: received SRV record for F166D9A24477A520-0000000000000F00._matter._tcp.local [1654762261.415638][31325:31330] CHIP:DIS: MINMDNS: 	Operational SRV for F166D9A24477A520-0000000000000F00: 30AEA40321E8.local [1654762261.415647][31325:31330] CHIP:DIS: MINMDNS: received TXT record for F166D9A24477A520-0000000000000F00._matter._tcp.local [1654762261.415672][31325:31330] CHIP:DIS: MINMDNS: received AAAA record for 30AEA40321E8.local [1654762261.415682][31325:31330] CHIP:DIS: MINMDNS: 	IP address fe80::32ae:a4ff:fe03:21e8 found for 30AEA40321E8.local [1654762261.415687][31325:31330] CHIP:DIS: MINMDNS: received A record for 30AEA40321E8.local [1654762261.415692][31325:31330] CHIP:DIS: MINMDNS: 	IP address <IP_ADDRESS> found for 30AEA40321E8.local [1654762261.415750][31325:31330] CHIP:DIS: UDP:[fe80::32ae:a4ff:fe03:21e8%eno1]:5540: new best score: 3 [1654762261.415780][31325:31330] CHIP:DIS: UDP:<IP_ADDRESS>%eno1:5540: score has not improved: 2 [1654762261.415795][31325:31330] CHIP:DIS: Checking node lookup status after 36 ms [1654762261.415799][31325:31330] CHIP:DIS: Keeping DNSSD lookup active [1654762261.420065][31325:31330] CHIP:DIS: MINMDNS: received SRV record for F166D9A24477A520-0000000000000F00._matter._tcp.local [1654762261.420087][31325:31330] CHIP:DIS: MINMDNS: 	Operational SRV for F166D9A24477A520-0000000000000F00: 30AEA40321E8.local [1654762261.420096][31325:31330] CHIP:DIS: MINMDNS: received TXT record for F166D9A24477A520-0000000000000F00._matter._tcp.local [1654762261.420104][31325:31330] CHIP:DIS: MINMDNS: received AAAA record for 30AEA40321E8.local [1654762261.420113][31325:31330] CHIP:DIS: MINMDNS: 	IP address fe80::32ae:a4ff:fe03:21e8 found for 30AEA40321E8.local [1654762261.420120][31325:31330] CHIP:DIS: MINMDNS: received A record for 30AEA40321E8.local [1654762261.420125][31325:31330] CHIP:DIS: MINMDNS: 	IP address <IP_ADDRESS> found for 30AEA40321E8.local [1654762261.420141][31325:31330] CHIP:DIS: Discovered node without a pending query [1654762261.420163][31325:31330] CHIP:DIS: UDP:[fe80::32ae:a4ff:fe03:21e8%eno1]:5540: score has not improved: 3 [1654762261.420174][31325:31330] CHIP:DIS: UDP:<IP_ADDRESS>%eno1:5540: score has not improved: 2 [1654762261.420177][31325:31330] CHIP:DIS: Checking node lookup status after 40 ms [1654762261.420181][31325:31330] CHIP:DIS: Keeping DNSSD lookup active [1654762261.580385][31325:31330] CHIP:DIS: Checking node lookup status after 201 ms [1654762261.580449][31325:31330] CHIP:CTL: Updating device address to UDP:[fe80::32ae:a4ff:fe03:21e8%eno1]:5540 while in state 2 [1654762261.580455][31325:31330] CHIP:CTL: OperationalDeviceProxy[F166D9A24477A520:0000000000000F00]: State change 2 --> 3 [1654762261.580505][31325:31330] CHIP:SC: Initiating session on local FabricIndex 1 from 0x000000000001B669 -> 0x0000000000000F00 [1654762261.580737][31325:31330] CHIP:SC: Including MRP parameters [1654762261.580807][31325:31330] CHIP:IN: Prepared unauthenticated message 0x5621546ea3e8 to 0x0000000000000000 (0)  of type 0x30 and protocolId (0, 0) on exchange 28844i with MessageCounter:1222238575. [1654762261.580827][31325:31330] CHIP:IN: Sending unauthenticated msg 0x5621546ea3e8 with MessageCounter:1222238575 to 0x0000000000000000 at monotonic time:<PHONE_NUMBER>511BCA msec [1654762261.580887][31325:31330] CHIP:SC: Sent Sigma1 msg [1654762261.580901][31325:31330] CHIP:CTL: OperationalDeviceProxy[F166D9A24477A520:0000000000000F00]: State change 3 --> 4 [1654762261.580905][31325:31330] CHIP:DIS: Discovery does not require any more timeouts [1654762262.121245][31325:31330] CHIP:DIS: MINMDNS: received A record for RBOWNATH-NB1.local [1654762262.466644][31325:31330] CHIP:DIS: MINMDNS: received A record for RBOWNATH-NB1-mshome-net.local [1654762262.701421][31325:31330] CHIP:EM: Received message of type 0x31 with protocolId (0, 0) and MessageCounter:1925735699 on exchange 28844i [1654762262.701443][31325:31330] CHIP:EM: Found matching exchange: 28844i, Delegate: 0x7fed6c000e10 [1654762262.701463][31325:31330] CHIP:EM: Rxd Ack; Removing MessageCounter:1222238575 from Retrans Table on exchange 28844i [1654762262.701466][31325:31330] CHIP:EM: Removed CHIP MessageCounter:1222238575 from RetransTable on exchange 28844i [1654762262.701479][31325:31330] CHIP:SC: Received Sigma2 msg [1654762262.701489][31325:31330] CHIP:SC: Peer assigned session session ID 33315 [1654762262.702538][31325:31330] CHIP:SC: Found MRP parameters in the message [1654762262.702547][31325:31330] CHIP:SC: Sending Sigma3 [1654762262.702639][31325:31330] CHIP:EM: Piggybacking Ack for MessageCounter:1925735699 on exchange: 28844i [1654762262.702651][31325:31330] CHIP:IN: Prepared unauthenticated message 0x5621546ea3e8 to 0x0000000000000000 (0)  of type 0x32 and protocolId (0, 0) on exchange 28844i with MessageCounter:1222238576. [1654762262.702667][31325:31330] CHIP:IN: Sending unauthenticated msg 0x5621546ea3e8 with MessageCounter:1222238576 to 0x0000000000000000 at monotonic time:<PHONE_NUMBER>51202C msec [1654762262.702712][31325:31330] CHIP:SC: Sent Sigma3 msg [1654762263.046131][31325:31330] CHIP:EM: Retransmitting MessageCounter:1222238576 on exchange 28844i Send Cnt 1 [1654762263.046178][31325:31330] CHIP:IN: Sending unauthenticated msg 0x5621546ea3e8 with MessageCounter:1222238576 to 0x0000000000000000 at monotonic time:<PHONE_NUMBER>512183 msec [1654762263.368652][31325:31330] CHIP:EM: Retransmitting MessageCounter:1222238576 on exchange 28844i Send Cnt 2 [1654762263.368702][31325:31330] CHIP:IN: Sending unauthenticated msg 0x5621546ea3e8 with MessageCounter:1222238576 to 0x0000000000000000 at monotonic time:<PHONE_NUMBER>5122C6 msec [1654762263.910386][31325:31330] CHIP:EM: Retransmitting MessageCounter:1222238576 on exchange 28844i Send Cnt 3 [1654762263.910442][31325:31330] CHIP:IN: Sending unauthenticated msg 0x5621546ea3e8 with MessageCounter:1222238576 to 0x0000000000000000 at monotonic time:<PHONE_NUMBER>5124E4 msec [1654762264.841527][31325:31330] CHIP:EM: Retransmitting MessageCounter:1222238576 on exchange 28844i Send Cnt 4 [1654762264.841588][31325:31330] CHIP:IN: Sending unauthenticated msg 0x5621546ea3e8 with MessageCounter:1222238576 to 0x0000000000000000 at monotonic time:<PHONE_NUMBER>512887 msec [1654762265.291360][31325:31330] CHIP:EM: Received message of type 0x40 with protocolId (0, 0) and MessageCounter:1925735700 on exchange 28844i [1654762265.291392][31325:31330] CHIP:EM: Found matching exchange: 28844i, Delegate: 0x7fed6c000e10 [1654762265.291413][31325:31330] CHIP:EM: Rxd Ack; Removing MessageCounter:1222238576 from Retrans Table on exchange 28844i [1654762265.291421][31325:31330] CHIP:EM: Removed CHIP MessageCounter:1222238576 from RetransTable on exchange 28844i [1654762265.291443][31325:31330] CHIP:SC: Success status report received. Session was established [1654762265.293483][31325:31330] CHIP:IN: New secure session created for device <0000000000000F00, 1>, LSID:16582 PSID:33315! [1654762265.293501][31325:31330] CHIP:CTL: OperationalDeviceProxy[F166D9A24477A520:0000000000000F00]: State change 4 --> 5 [1654762265.293531][31325:31330] CHIP:TOO: Sending ReadAttribute to: [1654762265.293544][31325:31330] CHIP:TOO:     cluster 0x0000_0402, attribute: 0x0000_0000, endpoint 1 [1654762265.293559][31325:31330] CHIP:DMG: SendReadRequest ReadClient[0x7fed6c004290]: Sending Read Request [1654762265.293622][31325:31330] CHIP:IN: Prepared secure message 0x5621546ea3e8 to 0x0000000000000F00 (1)  of type 0x2 and protocolId (0, 1) on exchange 28845i with MessageCounter:6083540. [1654762265.293643][31325:31330] CHIP:IN: Sending encrypted msg 0x5621546ea3e8 with MessageCounter:6083540 to 0x0000000000000F00 (1) at monotonic time:<PHONE_NUMBER>512A4B msec [1654762265.293721][31325:31330] CHIP:DMG: MoveToState ReadClient[0x7fed6c004290]: Moving to [AwaitingIn] [1654762265.293741][31325:31330] CHIP:EM: Sending Standalone Ack for MessageCounter:1925735700 on exchange 28844i [1654762265.293757][31325:31330] CHIP:IN: Prepared unauthenticated message 0x7fed80cdb080 to 0x0000000000000000 (0)  of type 0x10 and protocolId (0, 0) on exchange 28844i with MessageCounter:1222238577. [1654762265.293774][31325:31330] CHIP:IN: Sending unauthenticated msg 0x7fed80cdb080 with MessageCounter:1222238577 to 0x0000000000000000 at monotonic time:<PHONE_NUMBER>512A4B msec [1654762265.293807][31325:31330] CHIP:EM: Flushed pending ack for MessageCounter:1925735700 on exchange 28844i [1654762265.354573][31325:31330] CHIP:EM: Received message of type 0x10 with protocolId (0, 0) and MessageCounter:1925735701 on exchange 28844i [1654762265.354609][31325:31330] CHIP:EM: OnMessageReceived failed, err = ../../src/messaging/ExchangeMgr.cpp:262: CHIP Error 0x00000070: Unsolicited msg with originator bit clear [1654762265.389583][31325:31330] CHIP:EM: Received message of type 0x10 with protocolId (0, 0) and MessageCounter:1925735702 on exchange 28844i [1654762265.389604][31325:31330] CHIP:EM: OnMessageReceived failed, err = ../../src/messaging/ExchangeMgr.cpp:262: CHIP Error 0x00000070: Unsolicited msg with originator bit clear [1654762265.435450][31325:31330] CHIP:EM: Received message of type 0x10 with protocolId (0, 0) and MessageCounter:1925735703 on exchange 28844i [1654762265.435484][31325:31330] CHIP:EM: OnMessageReceived failed, err = ../../src/messaging/ExchangeMgr.cpp:262: CHIP Error 0x00000070: Unsolicited msg with originator bit clear [1654762265.482566][31325:31330] CHIP:EM: Received message of type 0x10 with protocolId (0, 0) and MessageCounter:1925735704 on exchange 28844i [1654762265.482599][31325:31330] CHIP:EM: OnMessageReceived failed, err = ../../src/messaging/ExchangeMgr.cpp:262: CHIP Error 0x00000070: Unsolicited msg with originator bit clear [1654762265.530825][31325:31330] CHIP:EM: Received message of type 0x5 with protocolId (0, 1) and MessageCounter:12470809 on exchange 28845i [1654762265.530852][31325:31330] CHIP:EM: Found matching exchange: 28845i, Delegate: 0x7fed6c004290 [1654762265.530871][31325:31330] CHIP:EM: Rxd Ack; Removing MessageCounter:6083540 from Retrans Table on exchange 28845i [1654762265.530879][31325:31330] CHIP:EM: Removed CHIP MessageCounter:6083540 from RetransTable on exchange 28845i [1654762265.530925][31325:31330] CHIP:DMG: ReportDataMessage = [1654762265.530948][31325:31330] CHIP:DMG: { [1654762265.530954][31325:31330] CHIP:DMG:     AttributeReportIBs = [1654762265.530965][31325:31330] CHIP:DMG:     [ [1654762265.530971][31325:31330] CHIP:DMG:    	 AttributeReportIB = [1654762265.530992][31325:31330] CHIP:DMG:    	 { [1654762265.531001][31325:31330] CHIP:DMG:    		 AttributeDataIB = [1654762265.531012][31325:31330] CHIP:DMG:    		 { [1654762265.531023][31325:31330] CHIP:DMG:    			 DataVersion = 0x5d97a443, [1654762265.531033][31325:31330] CHIP:DMG:    			 AttributePathIB = [1654762265.531043][31325:31330] CHIP:DMG:    			 { [1654762265.531054][31325:31330] CHIP:DMG:    				 Endpoint = 0x1, [1654762265.531073][31325:31330] CHIP:DMG:    				 Cluster = 0x402, [1654762265.531081][31325:31330] CHIP:DMG:    				 Attribute = 0x0000_0000, [1654762265.531089][31325:31330] CHIP:DMG:    			 } [1654762265.531099][31325:31330] CHIP:DMG:    				  [1654762265.531108][31325:31330] CHIP:DMG:    				 Data = NULL [1654762265.531116][31325:31330] CHIP:DMG:    		 }, [1654762265.531127][31325:31330] CHIP:DMG:    		  [1654762265.531134][31325:31330] CHIP:DMG:    	 }, [1654762265.531145][31325:31330] CHIP:DMG:    	  [1654762265.531152][31325:31330] CHIP:DMG:     ], [1654762265.531164][31325:31330] CHIP:DMG:      [1654762265.531172][31325:31330] CHIP:DMG:     SuppressResponse = true, [1654762265.531179][31325:31330] CHIP:DMG:     InteractionModelRevision = 1 [1654762265.531186][31325:31330] CHIP:DMG: } [1654762265.531277][31325:31330] CHIP:TOO: Endpoint: 1 Cluster: 0x0000_0402 Attribute 0x0000_0000 DataVersion:<PHONE_NUMBER> [1654762265.531300][31325:31330] CHIP:TOO:   MeasuredValue: null [1654762265.531341][31325:31330] CHIP:EM: Sending Standalone Ack for MessageCounter:12470809 on exchange 28845i [1654762265.531377][31325:31330] CHIP:IN: Prepared secure message 0x7fed80cdb070 to 0x0000000000000F00 (1)  of type 0x10 and protocolId (0, 0) on exchange 28845i with MessageCounter:6083541. [1654762265.531392][31325:31330] CHIP:IN: Sending encrypted msg 0x7fed80cdb070 with MessageCounter:6083541 to 0x0000000000000F00 (1) at monotonic time:<PHONE_NUMBER>512B39 msec [1654762265.531441][31325:31330] CHIP:EM: Flushed pending ack for MessageCounter:12470809 on exchange 28845i [1654762265.531556][31325:31325] CHIP:CTL: Shutting down the commissioner [1654762265.531584][31325:31325] CHIP:CTL: Shutting down the controller [1654762265.531602][31325:31325] CHIP:CTL: Shutting down the commissioner [1654762265.531615][31325:31325] CHIP:CTL: Shutting down the controller [1654762265.531632][31325:31325] CHIP:IN: Expiring all connections for fabric 1!! [1654762265.531664][31325:31325] CHIP:CTL: Shutting down the commissioner [1654762265.531677][31325:31325] CHIP:CTL: Shutting down the controller [1654762265.531688][31325:31325] CHIP:IN: Expiring all connections for fabric 2!! [1654762265.531712][31325:31325] CHIP:CTL: Shutting down the commissioner [1654762265.531725][31325:31325] CHIP:CTL: Shutting down the controller [1654762265.531735][31325:31325] CHIP:IN: Expiring all connections for fabric 3!! [1654762265.531754][31325:31325] CHIP:CTL: Shutting down the System State, this will teardown the CHIP Stack [1654762265.531842][31325:31325] CHIP:DMG: IM WH moving to [Uninitialized] [1654762265.531854][31325:31325] CHIP:DMG: IM WH moving to [Uninitialized] [1654762265.531865][31325:31325] CHIP:DMG: IM WH moving to [Uninitialized] [1654762265.531876][31325:31325] CHIP:DMG: IM WH moving to [Uninitialized] [1654762265.531896][31325:31325] CHIP:DMG: All ReadHandler-s are clean, clear GlobalDirtySet [1654762265.531932][31325:31325] CHIP:BLE: BleConnectionDelegate::CancelConnection is not implemented. [1654762265.532079][31325:31325] CHIP:DL: writing settings to file (/tmp/chip_counters.ini-X17teP) [1654762265.532395][31325:31325] CHIP:DL: renamed tmp file to file (/tmp/chip_counters.ini) [1654762265.532427][31325:31325] CHIP:DL: NVS set: chip-counters/total-operational-hours = 0 (0x0) [1654762265.532442][31325:31325] CHIP:DL: Inet Layer shutdown [1654762265.532471][31325:31325] CHIP:DL: BLE shutdown [1654762265.532482][31325:31325] CHIP:DL: System Layer shutdown
log from ESP32 when the controller sends the command " ./chip-tool temperaturemeasurement read measured-value 0x0000000000000F00 1" :
I (909605) chip[EM]: Received message of type 0x30 with protocolId (0, 0) and MessageCounter:1503918206 on exchange 10352r I (909605) chip[IN]: CASE Server received Sigma1 message. Starting handshake. EC 0x3ffc64c8 I (909615) chip[IN]: CASE Server disabling CASE session setups I (909625) chip[SC]: Received Sigma1 msg I (909635) chip[SC]: CASE matched destination ID: fabricIndex 1, NodeID 0x0000000000000F00 I (909845) temperature-measurement-app: .  I (910655) chip[IN]: Prepared unauthenticated message 0x3ffc677c to 0x0000000000000000 (0)  of type 0x31 and protocolId (0, 0) on exchange 10352r with MessageCounter:1925735693. I (910655) chip[IN]: Sending unauthenticated msg 0x3ffc677c with MessageCounter:1925735693 to 0x0000000000000000 at monotonic time:<PHONE_NUMBER>0DE2DC msec I (910675) chip[SC]: Sent Sigma2 msg E (910675) chip[DL]: Long dispatch time: 1072 ms, for event type 3 I (910685) chip[EM]: Received message of type 0x32 with protocolId (0, 0) and MessageCounter:1503918207 on exchange 10352r I (910695) chip[SC]: Received Sigma3 msg I (912845) temperature-measurement-app: .  E (913245) chip[SC]: Unable to save session resumption state: 5001109 I (913245) chip[IN]: Prepared unauthenticated message 0x3ffc677c to 0x0000000000000000 (0)  of type 0x40 and protocolId (0, 0) on exchange 10352r with MessageCounter:1925735694. I (913255) chip[IN]: Sending unauthenticated msg 0x3ffc677c with MessageCounter:1925735694 to 0x0000000000000000 at monotonic time:<PHONE_NUMBER>0DED05 msec I (913275) chip[IN]: CASE Session established to peer: <000000000001B669, 1> I (913285) chip[IN]: CASE Server enabling CASE session setups E (913285) chip[DL]: Long dispatch time: 2602 ms, for event type 3 I (913295) chip[EM]: Received message of type 0x32 with protocolId (0, 0) and MessageCounter:1503918207 on exchange 10352r I (913305) chip[IN]: Prepared unauthenticated message 0x3ffd8274 to 0x0000000000000000 (0)  of type 0x10 and protocolId (0, 0) on exchange 10352r with MessageCounter:1925735695. I (913325) chip[IN]: Sending unauthenticated msg 0x3ffd8274 with MessageCounter:1925735695 to 0x0000000000000000 at monotonic time:<PHONE_NUMBER>0DED44 msec I (913335) chip[EM]: Received message of type 0x32 with protocolId (0, 0) and MessageCounter:1503918207 on exchange 10352r I (913345) chip[IN]: Prepared unauthenticated message 0x3ffd8274 to 0x0000000000000000 (0)  of type 0x10 and protocolId (0, 0) on exchange 10352r with MessageCounter:1925735696. I (913365) chip[IN]: Sending unauthenticated msg 0x3ffd8274 with MessageCounter:1925735696 to 0x0000000000000000 at monotonic time:<PHONE_NUMBER>0DED6F msec I (913385) chip[EM]: Received message of type 0x32 with protocolId (0, 0) and MessageCounter:1503918207 on exchange 10352r I (913395) chip[IN]: Prepared unauthenticated message 0x3ffd8274 to 0x0000000000000000 (0)  of type 0x10 and protocolId (0, 0) on exchange 10352r with MessageCounter:1925735697. I (913405) chip[IN]: Sending unauthenticated msg 0x3ffd8274 with MessageCounter:1925735697 to 0x0000000000000000 at monotonic time:<PHONE_NUMBER>0DED9A msec I (913425) chip[EM]: Received message of type 0x32 with protocolId (0, 0) and MessageCounter:1503918207 on exchange 10352r I (913435) chip[IN]: Prepared unauthenticated message 0x3ffd8274 to 0x0000000000000000 (0)  of type 0x10 and protocolId (0, 0) on exchange 10352r with MessageCounter:1925735698. I (913455) chip[IN]: Sending unauthenticated msg 0x3ffd8274 with MessageCounter:1925735698 to 0x0000000000000000 at monotonic time:<PHONE_NUMBER>0DEDC4 msec I (913475) chip[EM]: Received message of type 0x2 with protocolId (0, 1) and MessageCounter:10062556 on exchange 10353r I (913485) chip[EM]: Received message of type 0x10 with protocolId (0, 0) and MessageCounter:1503918208 on exchange 10352r I (913495) chip[IN]: Prepared secure message 0x3ffc677c to 0x000000000001B669 (1)  of type 0x5 and protocolId (0, 1) on exchange 10353r with MessageCounter:7251416. I (913505) chip[IN]: Sending encrypted msg 0x3ffc677c with MessageCounter:7251416 to 0x000000000001B669 (1) at monotonic time:<PHONE_NUMBER>0DEDFD msec I (913525) chip[EM]: Received message of type 0x10 with protocolId (0, 0) and MessageCounter:10062557 on exchange 10353r I (915845) temperature-measurement-app: .

where is this attribute value in the temperature-measurement-app/esp32
is there any documentation that i can read regarding this?

Ideally the cluster would have documentation.
If it does not have anything else defined, presumably the generic attribute accessors should work here.  See zzz_generated/app-common/app-common/zap-generated/attributes/Accessors.h.  Just make sure to call those from the Matter event loop or while holding the Matter stack lock.
Documentation is in a bad spot and a lot of it still needs to be created....

thanks for the feedback , much appropriated!! will work on that
Lol thats how it is with most documentations


Add support for feature toggles

Adds support for feature toggles using the https://github.com/mgsnova/feature library.

What benefits does this give us over just using environment variables? Especially given that you're already using one here?

What are your thoughts about using the RedisRepository?
repo = Feature::Repository::RedisRepository.new("feature_toggles")

# add/toggle features in Redis
Redis.current.hset("feature_toggles", "ActiveFeature", true)
Redis.current.hset("feature_toggles", "InActiveFeature", false)

This would allow us to enable/disable features just opening a Rails
console in each environment if we wish to.

just opening a Rails console

Possibly a bit less secure / auditable? Depends on how much you care about that, though.

@alecgibson it gives an API for working with features:
Feature.active?(:feature_name) # => true/false

Feature.inactive?(:feature_name) # => true/false

Feature.active_features # => [:list, :of, :features]

Feature.with(:feature_name) do
  # code
end

Feature.without(:feature_name) do
  # code
end

# this returns value_true if :feature_name is active, otherwise value_false
Feature.switch(:feature_name, value_true, value_false)

# switch may also take Procs that will be evaluated and it's result returned.
Feature.switch(:feature_name, -> { code... }, -> { code... })

And an API for testing behaviour with and without a feature:
Feature.run_with_activated(:feature) do
  # your test code
end

# you also can give a list of features
Feature.run_with_deactivated(:feature, :another_feature) do
  # your test code
end

I just wonder if the all this extra config boiler plate is over-complicating things for a syntax that's only slightly nicer than if ENV['MY_FEATURE_ENABLED'].present?.

@pmanrubia I went with a simple backend to start with knowing that we can easily swap it out for something else should we need to in the future.
The YAML backend gives us a bit more visibility and an audit trail for which features we have and whether they are enabled or disabled across environments which I think is a good thing to start with.

@alecgibson ENV is a primitive. I think it's a good thing to use a domain object such as Feature. We could write our own but there isn't a lot of code in the gem so I see no reason to. If we were to adopt a pure ENV approach then we have to think about things like how we handle defaults, how we limit surprises by ensuring everyone runs the application from a consistent environment.

a consistent environment

Isn't this exactly what the VM should be for? Although I think basically no one on the team other than me uses it...?
But yes, given that a bunch of us don't use the VM, maybe this is better. Alternatively could use something like dotenv, but by the time we're using a gem, we may as well use a gem that actually does what we want.


[4337] Implement sign user operation

Context / issue
Signs an user operation to allow the bundler to execute a transaction.
Proposed solution
Implement a method in the 4337Pack to allow signing a UserOperation

Implemented in signSafeUserOperation()


add vagrant images and packer/atlas support

This PR adds the ability to create virtualbox and VMWare images for blueflood.  It uses Packer to create the images and also enables us to build and host our images on Atlas.  For Blueflood-interested parties, they now have the option to get a working blueflood VM with:
vagrant init blueflood/blueflood
vagrant up

Would @tilogaat @GeorgeJahad @drenalin23 mind looking at this and accepting if appropriate?

+1


Privacy policy is not translated

The privacy policy on the website is not translated.

Due to the GDPR going into effect later this May and the possible legal effects if this issue is not resolved before that time, I believe this issue should be marked as priority. Especially since it is an easy-fix.

We're going to have a talk among each other about the privacy policy and the effect of the GDPR. Although this remains a priority, it seems reasonable to wait for this talk to have taken place before translating the privacy policy.

And now?


Flutter 2.8.1 DropdownButtonFormField unable to set initial value (Web)

Steps to Reproduce

Testing on Flutter 2.8.1 Stable for Web. Debug is working as expected but when deployed to test or production, it fails.
DropdownButton is fine, only issue is with DropdownButtonFormField!
When you set initial value for DropdownButtonFormField, the Dropdown is (looks) empty.
After selecting value from the Dropdown, it's successfully set and visible.
It worked in previous Flutter version 2.5.3 Stable.
Issue looks very similar to this one issue-56716

Expected results:

Expecting initial value to be shown same as it was in Flutter 2.5.3 Stable.

Actual results:

DropdownButtonFormField shows as empty

[✓] Flutter (Channel stable, 2.8.1, on macOS 12.1 21C52 darwin-arm, locale en-CZ)
[✓] Chrome - develop for the web
[✗] Flutter IDE Support (No supported IDEs installed)
[✓] Connected device (1 available)

This is a very basic example that shows DropdownButton and DropdownButtonFormField.

DropdownButton works as expected and shows initially set value.
DropdownButtonFormField unfortunately doesn't show the initially set value.
When run in debug, everything is working as expected but DropdownButtonFormField is not working properly when we deploy it on the web (production)

import 'package:flutter/material.dart';

class MinimalDropdown extends StatefulWidget {
  const MinimalDropdown({Key? key}) : super(key: key);

  @override
  State<MinimalDropdown> createState() => _MinimalDropdownState();
}

class _MinimalDropdownState extends State<MinimalDropdown> {
  String? selectedValue = 'A';

  @override
  Widget build(BuildContext context) {
    return Column(
      children: [
        DropdownButton<String>(
          value: selectedValue,
          items: ['A', 'B', 'C']
              .map(
                (String item) => DropdownMenuItem<String>(
                  child: Text(item),
                  value: item,
                ),
              )
              .toList(),
          onChanged: (String? value) {
            setState(() {
              selectedValue = value;
            });
          },
        ),
        DropdownButtonFormField<String>(
          value: selectedValue,
          items: ['A', 'B', 'C']
              .map(
                (String item) => DropdownMenuItem<String>(
                  child: Text(item),
                  value: item,
                ),
              )
              .toList(),
          onChanged: (String? value) {
            setState(() {
              selectedValue = value;
            });
          },
        ),
      ],
    );
  }
}

WEB / Deployment
flutter build web --release --web-renderer canvaskit -t lib/main.dart"

WEB / index.html
<script>
  window.flutterWebRenderer = 'canvaskit';
</script>

I've deployed a sample app to firebase hosting using your sample and the commands you run and the DropdownButtonFormField is working as expected. Site can be found https://test-2f735.web.app/#/. Is there any more information that you can provide?

file contents
web/index.html
<!DOCTYPE html>
<html>

<head>
  <!--
    If you are serving your web app in a path other than the root, change the
    href value below to reflect the base path you are serving from.

    The path provided below has to start and end with a slash "/" in order for
    it to work correctly.

    For more details:
    * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/base

    This is a placeholder for base href that will be replaced by the value of
    the `--base-href` argument provided to `flutter build`.
  -->
  <base href="$FLUTTER_BASE_HREF">

  <meta charset="UTF-8">
  <meta content="IE=Edge" http-equiv="X-UA-Compatible">
  <meta name="description" content="A new Flutter project.">

  <!-- iOS meta tags & icons -->
  <meta name="apple-mobile-web-app-capable" content="yes">
  <meta name="apple-mobile-web-app-status-bar-style" content="black">
  <meta name="apple-mobile-web-app-title" content="it">
  <link rel="apple-touch-icon" href="icons/Icon-192.png">

  <!-- Favicon -->
  <link rel="icon" type="image/png" href="favicon.png" />

  <title>it</title>
  <link rel="manifest" href="manifest.json">
</head>

<body>
  <!-- This script installs service_worker.js to provide PWA functionality to
       application. For more information, see:
       https://developers.google.com/web/fundamentals/primers/service-workers -->
  <script>
    var serviceWorkerVersion = null;
    var scriptLoaded = false;
    function loadMainDartJs() {
      if (scriptLoaded) {
        return;
      }
      scriptLoaded = true;
      var scriptTag = document.createElement('script');
      scriptTag.src = 'main.dart.js';
      scriptTag.type = 'application/javascript';
      document.body.append(scriptTag);
    }

    if ('serviceWorker' in navigator) {
      // Service workers are supported. Use them.
      window.addEventListener('load', function () {
        // Wait for registration to finish before dropping the <script> tag.
        // Otherwise, the browser will load the script multiple times,
        // potentially different versions.
        var serviceWorkerUrl = 'flutter_service_worker.js?v=' + serviceWorkerVersion;
        navigator.serviceWorker.register(serviceWorkerUrl)
          .then((reg) => {
            function waitForActivation(serviceWorker) {
              serviceWorker.addEventListener('statechange', () => {
                if (serviceWorker.state == 'activated') {
                  console.log('Installed new service worker.');
                  loadMainDartJs();
                }
              });
            }
            if (!reg.active && (reg.installing || reg.waiting)) {
              // No active web worker and we have installed or are installing
              // one for the first time. Simply wait for it to activate.
              waitForActivation(reg.installing || reg.waiting);
            } else if (!reg.active.scriptURL.endsWith(serviceWorkerVersion)) {
              // When the app updates the serviceWorkerVersion changes, so we
              // need to ask the service worker to update.
              console.log('New service worker available.');
              reg.update();
              waitForActivation(reg.installing);
            } else {
              // Existing service worker is still good.
              console.log('Loading app from service worker.');
              loadMainDartJs();
            }
          });

        // If service worker doesn't succeed in a reasonable amount of time,
        // fallback to plaint <script> tag.
        setTimeout(() => {
          if (!scriptLoaded) {
            console.warn(
              'Failed to load app from service worker. Falling back to plain <script> tag.',
            );
            loadMainDartJs();
          }
        }, 4000);
      });
    } else {
      // Service workers not supported. Just drop the <script> tag.
      loadMainDartJs();
    }
  </script>

  <script>
    window.flutterWebRenderer = 'canvaskit';
  </script>
</body>

</html>

lib/main.dart
import 'package:flutter/material.dart';

void main() => runApp(const MyApp());

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return const MaterialApp(home: MinimalDropdown());
  }
}

class MinimalDropdown extends StatefulWidget {
  const MinimalDropdown({Key? key}) : super(key: key);

  @override
  State<MinimalDropdown> createState() => _MinimalDropdownState();
}

class _MinimalDropdownState extends State<MinimalDropdown> {
  String? selectedValue = 'A';

  @override
  Widget build(BuildContext context) {
    return Column(
      children: [
        DropdownButton<String>(
          value: selectedValue,
          items: ['A', 'B', 'C']
              .map(
                (String item) => DropdownMenuItem<String>(
                  child: Text(item),
                  value: item,
                ),
              )
              .toList(),
          onChanged: (String? value) {
            setState(() {
              selectedValue = value;
            });
          },
        ),
        DropdownButtonFormField<String>(
          value: selectedValue,
          items: ['A', 'B', 'C']
              .map(
                (String item) => DropdownMenuItem<String>(
                  child: Text(item),
                  value: item,
                ),
              )
              .toList(),
          onChanged: (String? value) {
            setState(() {
              selectedValue = value;
            });
          },
        ),
      ],
    );
  }
}

video
https://user-images.githubusercontent.com/88313112/151306418-f1d3378b-b06f-4928-9b5f-da73a0c1b407.mov

Thank you @danagbemava-nc for your time testing the project.
I spent hours debugging the problem in our project. It seems that out of 20 or so Widgets (screens), there are 3 of them with deep subtree causing above issue.
Problem is that at every location (Screen) the issue seems to be different and doesn't make any sense as why it happens.
These Widgets are not even used during testing of this issue. They are just compiled.
One example is this:
import 'package:collection/collection.dart';

Template? _originalTemplate;

@override
  void didUpdateWidget(covariant TournamentRowWidget oldWidget) {
    super.didUpdateWidget(oldWidget);
    if (oldWidget.availableTemplates != widget.availableTemplates) {
      setState(() {
        availableTemplates = widget.availableTemplates;
        _originalTemplate = availableTemplates.firstWhereOrNull(
          (Template template) => template.id == tournament.clientTemplate?.id,
        );

        _chosenTemplate = _originalTemplate;
      });
    }
  }

_originalTemplate is variable that is used as value of a DropdownButtonFormField.
The above code causes the DropdownButtonFormField to NOT show the value at the start. ANY DropdownButtonFormField, ANYWHERE in the code won't have the "initial" value shown until user actually selects some value from the Dropdown.
I would like to stress out again that this part of code is NOT used anywhere, meaning that it just sits somewhere in the dart file and it's not even presented to the user.
We use flutter_bloc, Beamer (navigation) and other packages. We suspected that they could cause some issues  but we isolated 3 issues that when those part of code is commented, it starts working, regardless of packages used.
When we comment those 2 lines with firstWhereOrNull, the issue disappears and the strangest thing is when we swap firstWhereOrNull with singleWhereOrNull it starts working too.
As I said, I spend more than 12hours debugging this code and it just doesn't make any sense. Unfortunately I can't share code from our project here so is there any way (Discord, ...) I could contact someone from support to show them the issues and discuss it further?

Hi @s33m0n, there may very well be a bug in flutter that we need to fix. If that is the case, I would very much appreciate it if you could isolate the code that causes the issue into a reproducible sample so that we can fix the issue.
Thank you

This will be pretty hard to reproduce. I am trying to make a reproducible sample but our project is pretty big and I haven't had luck pinpointing the source of the problem...

Without a complete minimal reproducible sample, the issue is not actionable. Let's keep this open until you can come up with either a sample or a pattern of reproduction.

Ok, Just an update... So I pinpointed it to two packages that we use.
First one is synchronized: https://pub.dev/packages/synchronized
Second one is graphql: https://pub.dev/packages/graphql
For the first package, wrapping the method inside a Lock causes this issue.
For the second package, only use of a specific code (initializing a Client object from graphql package) causes this issue. This is pretty strange in my opinion.
Both packages were not updated for 8+ months. Could this be an issue between dart versions bundled inside the stable versions?
Keeping in mind that there were no issues with previous stable Flutter version 2.5.3
In the meantime I am still trying to reproduce the minimal sample.

Could this be an issue between dart versions bundled inside the Flutter stable versions?

There's a possibility, I just checked the changelog for flutter 2.8, and the only PR that was filed related to DropdownButtonFormField was a documentation PR and DropdownButtonFormField uses a DropdownButton underneath, so there's a chance the issue lies elsewhere.
Do bear in mind that for this to be a framework issue, we will need a sample without any third-party packages since framework issues ideally should be reproducible using only the code from the framework/dart.

danagbemava-nc Another small update. I was able to "fix" this issue by editing Flutter's Form.dart class like this.
So essentially removing the late keyword and settings the widget.value inside the initState()
 /// The current state of a [FormField]. Passed to the [FormFieldBuilder] method
 /// for use in constructing the form field's widget.
 class FormFieldState<T> extends State<FormField<T>> with RestorationMixin {
-  late T? _value = widget.initialValue;
+  T? _value;
+
+  @override
+  void initState() {
+    super.initState();
+    _value = widget.initialValue;
+  }

  ...
  ...

 }

Can you please look into this as to why it could work with this approach? Thank you

Hi @s33m0n, from what I can see, the commit that added the line of code you removed has been in the framework since before v.2.5.3. This is the commit https://github.com/flutter/flutter/commit/3eeadc28f36213f426361968c13b3657bc698cef.
Since you didn't encounter this issue prior to 2.8.1, I'm not entirely sure that the issue has been "fixed" completely.
We will need a sample or pattern which consistently reproduces the issue to take this forward.


sync internal node ready condition to v3 node condition

Issue:
When powered down, node shows Unavailable from Cluster explorer view but shows up as Active from cluster management view.
Solution
Norman embeds internalNodeStatus.Conditions to node.status.Conditions which causes the ready condition to show up correctly on v3 calls. Syncing it to v3 node.status.conditions for steve v1 node calls to get the same effect.
https://github.com/rancher/rancher/issues/35646

@snasovich Thanks for the review, will update review comments.
About syncing to v1 node, I don't understand why we need to sync it to v1 from v3 node? Here v3 is rancher's management node and v1 is core k8s downstream node. From cluster management view, UI relies on the v3 management node's conditions so we sync the ready condition from k8s core v1 node to v3 management node. Users have the option set labels and annotations on v3 management node, so we need to sync them to k8s core v1 downstream node.

@kinarashah , thank you for the clarifications. 👍
There was a misunderstanding on my end. I figured UI shows nodes based on the response from v1/management.cattle.io.nodes API call and automatically assumed we have v1 version of Node object somewhere in Rancher CRDs. However that API call returns Node objects from management.cattle.io/v3 so we're good. All these v1s / v3s are a bit confusing sometimes.


BAD_REQUEST response

When our app faced with BAD_REQUEST, it won't be back to normal.
2018-06-04T12:55:26.318090+00:00 app[schedule.1]: { Error
2018-06-04T12:55:26.318105+00:00 app[schedule.1]: at /app/node_modules/google-translate-api/index.js:105:17
2018-06-04T12:55:26.318106+00:00 app[schedule.1]: at process._tickCallback (internal/process/next_tick.js:109:7) code: 'BAD_REQUEST' }

Do we have limit on number of requests per second? Our app was working fine till it face with above error.

Yeah I've recently been getting this issue as well

Yeah I've recently been getting this issue as well

node_modules/google-translate-api/index.js:105:17  at <anonymous>
    at process._tickCallback (internal/process/next_tick.js:188:7) code: 'BAD_REQUEST'

same here!

The actual response code from google endpoint is
503 (Service Unavailable)
Google has probably changed their API specs.

Temporary Solution:

Setup a TOR HTTP Proxy:
https://www.marcus-povey.co.uk/2016/03/24/using-tor-as-a-http-proxy/
Use tunnel module from node packages to pass translate traffic from tor

var tunnel = require('tunnel');
...
...
    }).then(function (url) {
        return got(url, {
        agent: tunnel.httpOverHttp({
                proxy: {
                            host: 'localhost',
                            port: 8123
                        }
                 })
        }).then(function (res) {

Change tor IP address periodically

@nadalizadeh Your solution sounds great! But how can I force all of the translateService's traffic to go through the tor-proxy? Per request is yes! But the translateService has its own implementation of firing requests at the google-api endpoint! It would be nice, if we can have some kind of wrapper! Do you have any hint?

Same issues for me too..

Getting the same issues

{ Error
at /Users/hucheng/hooper/bytedance/project/people-fe/recruitment-web/node_modules/google-translate-api/index.js:105:17
at process._tickCallback (internal/process/next_tick.js:68:7) code: 'BAD_REQUEST' }

this package uses got  to request google translate:
//add this to index.js
var tunnel = require('tunnel');
var agent = tunnel.httpsOverHttp({
proxy: {
host: 'localhost',
port: 8123
}
});
//change index.js:76
got(url,agent)
//add this in tor config
MaxCircuitDirtiness 10

this package uses got to request google translate:
//add this to index.js
var tunnel = require('tunnel');
var agent = tunnel.httpsOverHttp({
proxy: {
host: 'localhost',
port: 8123
}
});
//change index.js:76
got(url,agent)
//add this in tor config
MaxCircuitDirtiness 10

would you consider adding a PR for that?

we need test this first.As in China, I found this solution not work.

Getting same issue.

Hey.
Google tightened the restrictions and now from a single IP address can make very few queries.
I added the use of a proxy server (IPv4, IPv6). Maybe my solution will help you.
https://github.com/extensionsapp/translatte
const translatte = require('translatte');

// Translate string to English using proxy
translatte('Вы говорите на русском?', {
    from: 'ru',
    to: 'en',
    agents: [
        'Mozilla/5.0 (Windows NT 10.0; ...',
        'Mozilla/4.0 (Windows NT 10.0; ...',
        'Mozilla/5.0 (Windows NT 10.0; ...'
    ],
    proxies: [
        'LOGIN:PASSWORD@<IP_ADDRESS>:12345',
        'LOGIN:PASSWORD@<IP_ADDRESS>:54321'
    ]
}).then(res => {
    console.log(res);
}).catch(err => {
    console.error(err);
});
// { text: 'Do you speak Russian?',
//   from: {
//     language: {
//       didYouMean: false,
//       iso: 'ru'
//     },
//     text: {
//       autoCorrected: false,
//       value: '',
//       didYouMean: false
//     }
//   },
//   raw: '' }

I don't know why but on my ubuntu laptop the API works with tor, but when on debian vps i get bad request, i have the same config the the 2 machines

Hey.
Google tightened the restrictions and now from a single IP address can make very few queries.
I added the use of a proxy server (IPv4, IPv6). Maybe my solution will help you.
https://github.com/extensionsapp/translatte
const translatte = require('translatte');

// Translate string to English using proxy
translatte('Вы говорите на русском?', {
    from: 'ru',
    to: 'en',
    agents: [
        'Mozilla/5.0 (Windows NT 10.0; ...',
        'Mozilla/4.0 (Windows NT 10.0; ...',
        'Mozilla/5.0 (Windows NT 10.0; ...'
    ],
    proxies: [
        'LOGIN:PASSWORD@<IP_ADDRESS>:12345',
        'LOGIN:PASSWORD@<IP_ADDRESS>:54321'
    ]
}).then(res => {
    console.log(res);
}).catch(err => {
    console.error(err);
});
// { text: 'Do you speak Russian?',
//   from: {
//     language: {
//       didYouMean: false,
//       iso: 'ru'
//     },
//     text: {
//       autoCorrected: false,
//       value: '',
//       didYouMean: false
//     }
//   },
//   raw: '' }

Tried this but ended up in getting below error -
"SyntaxError: Unexpected token ..." at line no "translatte/node_modules/got/source/create.js:49"
I just did 'npm install translatte' and tried your example. Do I need to do anything else?

I just did 'npm install translatte' and tried your example. Do I need to do anything else?

It seems you are using older version of node.js than required for package. Please check node -v.

I just did 'npm install translatte' and tried your example. Do I need to do anything else?

It seems you are using older version of node.js than required for package. Please check node -v.

I am using v8.4.0 node version. And now it is throwing me below error -
Error at "/home/ubuntu/workspace/Hadoop/node_modules/translatte/index.js:141:17". Code: 'BAD_REQUEST'

may be google doing some updates on translator and current interaction become outdated?
node 10, just installed and got BAD_REQUEST from begining. check few vpns (my private servers in different europe datacenters) to change public ip, but same result.

Same here, I received "BAD_REQUEST" error, What should I do?

I am using this for two BoTs  running under Windows.  I setup a Ubuntu v18 box yesterday with NodeJs. If I Stop the Windows BoTs and move / start them on the Ubuntu computer I receive bad request.  I can move the BoT back to Windows and it works fine.
Same public IP Ipv4 address for both computers.

Try this solution from another issue. Maybe the reason of BAD_REQUEST is the same.

I don't know why but on my ubuntu laptop the API works with tor, but when on Debian VPS I get bad request, I have the same config the 2 machines,
do you guys have any idea what might cause the problem?

Me too. and is this issue solved?


Is there a way to create a document in ES with this module?

Feature Description
Hi,
This module already has very rich functionality, and for that I'm very grateful! Have you considered adding the ability to create a document in ES using this module? Does this feature already exist? I've had a look at the custom types, and can't see anything that would do this.
It would be awesome if we had a resource similar to the puppet "file" resource so we could drop documents in. I'm not super familiar with custom types and providers, but to implement this, could a new provider be written for the "file" resource?
Thanks for your time!
Nick George

Some of the types and providers in this module like index settings, templates, and pipelines directly manipulate the Elasticsearch API to manage documents that can be represented as Puppet hashes. Whether this was a good idea at was somewhat as a gray area, as letting config management bleed over into manipulating a data store is a pretty unconventional use of Puppet. I think it's been generally useful though; as empowering the module to control all the settings that users may need and not just configuration files makes the module more complete from an end-user perspective.
I'm not sure about explicitly managing documents, though. I've sort of referenced the Puppetlabs MySQL module as a bit of a guiding example of what sorts of resources this module should handle, and though there are certainly parallels between the two right now (for example, the mysql module can manage a database schema in the same way this module can handle index settings), managing records/actual data is something kind of unusual and not something I've seen in it or any other modules that deal with data stores (mongo, postgres, etc.).
Perhaps some examples of a) what these resource would look like and b) what the use case is (i.e. what types of documents and what the intent of managing them via Puppet is) could help to clarify whether it'd be a good fit.

Hi Tyler,
I'm probably teaching you to suck eggs here, but one of the cool features of ES is that it can be used to store things like configuration data. For example, Kibana's saved objects like dashboards, visualisations and searches are all stored in Elasticsearch. I'm also considering moving some configuration (for a custom Kibana plugin) that I currently store on disk into Elasticsearch. It would be awesome if I could just write this config data straight into ES using this module.
There are a few small advantages to being able to store "files" in ES using the Puppet module.

It becomes possible configure software (like Kibana) completely, using Puppet. I understand that the Kibana module might one day have the ability to set dashboards etc via its module, and will probably do so using the Kibana API. Who knows, maybe they'd leverage this feature to implement the restoration of dashboards etc.
Once indexed, the document is available across the entire cluster immediately, as opposed to waiting for the next puppet run to complete on any nodes that may be running ES (to drop a file).
It seems to follow the ES philosophy of storing as much configuration as possible in ES itself, as opposed to on disk.
It becomes possible to store any document in ES using this module. I'm not aware of all the use-cases for ES, but I'm sure some people (other than me) would find this useful :)

My understanding of MySQL isn't the best, but it's just a SQL compliant database right, and can't be used to store anything approximating JSON (https://stackoverflow.com/questions/3564024/storing-data-in-mysql-as-json)? This is one of the areas where Elastic is awesome, in that you can index a JSON document straight into ES. So I'm guessing that the official MySQL module hasn't implemented anything similar simply because it's not possible.
I hope all that makes sense, and thanks for your time!
Nick

Hmm, I hadn't considered use cases like config-managing Kibana dashboards. In cases like that - and others as well, such as storing or configuring logstash pipelines via Puppet as well - the documents do tend to fit into the "configuration" bucket in addition to normal data documents.
I won't write off the idea entirely, since I think you're probably right, the custom types and providers this module has used thus far have been pretty successful (templates, pipelines, etc.) and potentially managing other resources probably has merit.
I'll label this appropriately and drop it into the backlog, so while it'd definitely be nice to have, I think it does fall behind some other items in the queue that are lagging that are more sorely needed to get the module more fully fleshed-out and feature complete (for example, the module still doesn't install/manage licenses, which is a common ask that the module should really handle). The plumbing to get to this feature is mostly laid out in the module at this point (we have templates, pipelines, indices, snapshot repositories, etc. that are all represented in the elasticsearch APIs) so the pieces are all there, it's primarily a matter of putting it together in the most sane way.

Thanks Tyler,
If I were to implement this (in my own code first initially, but would try a PR if the quality was good enough), would you recommend writing a new provider for the file resource, or would it just be simpler to go with a new type called something like "elasticsearch_document"?

The challenge with creating a new provider for the File type is that many of the properties of the type don't have any corollary with an Elasticsearch document such as owner, mode, et cetera (and these properties aren't gated behind a feature predicate per-provider, so a provider can't signal to a parent type "I don't support setting the mode parameter"). You can always fail-fast in the provider to ensure that consumers can only compile a catalog with parameters you support, but it's pretty trappy and I'm not sure what other oddities would crop up because of it.
For that reason it's probably simplest to start from a new type and provider entirely. Fortunately, the aforementioned resources from my previous comment (indices, snapshots, etc.) all behave slightly differently from each other which has a convenient by-product in that they illustrate how to tweak the underlying elastic_rest parent class to suit the behavior of the API in a way that makes sense for what you're trying to achieve. Perusing the type and provider code for all these native providers should actually provide a fairly significant jump-start to creating a new one, as both the types and providers already implement lots of tricks to make working with the API significantly easier.
As an example of this, consider fetching defining a document's json in Puppet and comparing it to the document you fetch from Elasticsearch. A GET against :9200/index/type/id will return some json with the actual body of the document in ._source, which you can express by defining metadata_pipeline for the provider's class in the same way elasticsearch_index does to pull out settings. Once you munge the data a bit to get it right, Puppet's built-in type/provider mechanisms will kick in for you to know when to update the document if it's out-of-sync, and so on.

Thanks a lot for that, it gives me a good basis on which to start. If I make any headway, I'll submit a PR.
Cheers,
Nick


Reorganized shelljs

Moved shelljs from "Miscellaneous" to "Command-line Utilities", inspired by the recent Cash MR :)
EditL Accidentally made MR to my own fork's master, unfortunately now this doesn't merge cleanly. I will fix when I get home I just didn't want to forget to make real MR.

https://github.com/sindresorhus/awesome-nodejs/commit/7378b68565b9b4a55af92e8485845d17468c6a00


A11y: All links should use blue #0070F0

Describe the task
The blue used for the links on the action page #3B82F6 does not meet 4:5:1 color contrast. The blue on the links on the about page pass contrast #0070F0.
Update styles to use this blue throughout.
https://webaim.org/resources/contrastchecker/ https://dequeuniversity.com/rules/axe/4.8/color-contrast
Acceptance Criteria

[ ] All blue links will use the darker blue

Hi, I'd like to take this on!


[IMPROVEMENT] - Faucet pull countdown/timer in negative faucet response

Right now when someone issues a the +faucet command when they've already withdrawn within a 24 hour period, it responds back with the information that they've already pulled from the faucet recently.
As it can be difficult to discern when the faucet will be ready to pull from again, adding a timer to the faucet response to indicate the next time someone can initiate the faucet command would help.
Suggested by Discord user MrTr3

closed with #14