[PDI-13633] Regression: Database Connections with JNDI mix up JNDI name ...

...with Connection name
@mattcasters, @brosander, @mattyb149 could your review it?
Interface is unchanged.
Kettle core looks for JNDI datasource itself (not querying the server's datasource provider).
So, there is no chance for collisions of names.

@mattyb149, @brosander, review it please

Needs unit and/or integration tests

@mattyb149, @brosander, review it please

Please see #1236

see also fix https://github.com/pentaho/pentaho-kettle/pull/1265


Hello world tutorial error: RuntimeException: [ONNXRuntimeError] : 6 : RUNTIME_EXCEPTION : Exception during initialization: CHECK failed: it != end(): key not found: profile

Hello everyone,
I am having some trouble with my Minisforum um790 pro.
For context, I have followed the steps on both the automated installation (https://ryzenai.docs.amd.com/en/latest/inst.html) using the install.bat script as well as the manual one (https://ryzenai.docs.amd.com/en/latest/manual_installation.html). The only exception regarding following the steps was that I used Visual Studio 2022 instead of 2019 as it is hidden behind a Microsoft subscription.
I did this by changing the following line from the bat script
reg query "HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\VisualStudio\16.0" >nul 2>&1
into
reg query "HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\VisualStudio\17.0" >nul 2>&1.
I run the automated installation using vs code, in the same manner as the youtube tutorial resulting in the following error message:
RuntimeException                          Traceback (most recent call last)
Cell In[8], line 9
      6 aie_options = onnxruntime.SessionOptions()
      7 aie_options.enable_profiling = True
----> 9 aie_session = onnxruntime.InferenceSession(
     10     onnx_model_path,
     11     providers = ['VitisAIExecutionProvider'],
     12     sess_options=aie_options,
     13     provider_options=[{'config_file': config_file_path}]
     14 )
     16 start = timer()
     17 ryzen_outputs = aie_session.run(None, {'input': input_data})

File c:\Users\chris\anaconda3\envs\ryzenai-1.1-20240530-182215\lib\site-packages\onnxruntime\capi\onnxruntime_inference_collection.py:383, in InferenceSession.__init__(self, path_or_bytes, sess_options, providers, provider_options, **kwargs)
    380 disabled_optimizers = kwargs["disabled_optimizers"] if "disabled_optimizers" in kwargs else None
    382 try:
--> 383     self._create_inference_session(providers, provider_options, disabled_optimizers)
    384 except (ValueError, RuntimeError) as e:
    385     if self._enable_fallback:

File c:\Users\chris\anaconda3\envs\ryzenai-1.1-20240530-182215\lib\site-packages\onnxruntime\capi\onnxruntime_inference_collection.py:435, in InferenceSession._create_inference_session(self, providers, provider_options, disabled_optimizers)
    432     disabled_optimizers = set(disabled_optimizers)
    434 # initialize the C++ InferenceSession
--> 435 sess.initialize_session(providers, provider_options, disabled_optimizers)
    437 self._sess = sess
    438 self._sess_options = self._sess.session_options

RuntimeException: [ONNXRuntimeError] : 6 : RUNTIME_EXCEPTION : Exception during initialization: CHECK failed: it != end(): key not found: profile

In turn the manual installation is run via an jupyter environment resulting in the following error message:
RuntimeException                          Traceback (most recent call last)
Cell In[6], line 9
      6 aie_options = onnxruntime.SessionOptions()
      7 aie_options.enable_profiling = True
----> 9 aie_session = onnxruntime.InferenceSession(
     10     onnx_model_path,
     11     providers = ['VitisAIExecutionProvider'],
     12     sess_options=aie_options,
     13     provider_options=[{'config_file': config_file_path}]
     14 )
     16 start = timer()
     17 ryzen_outputs = aie_session.run(None, {'input': input_data})

File ~\anaconda3\envs\Ryzentest\lib\site-packages\onnxruntime\capi\onnxruntime_inference_collection.py:383, in InferenceSession.__init__(self, path_or_bytes, sess_options, providers, provider_options, **kwargs)
    380 disabled_optimizers = kwargs["disabled_optimizers"] if "disabled_optimizers" in kwargs else None
    382 try:
--> 383     self._create_inference_session(providers, provider_options, disabled_optimizers)
    384 except (ValueError, RuntimeError) as e:
    385     if self._enable_fallback:

File ~\anaconda3\envs\Ryzentest\lib\site-packages\onnxruntime\capi\onnxruntime_inference_collection.py:435, in InferenceSession._create_inference_session(self, providers, provider_options, disabled_optimizers)
    432     disabled_optimizers = set(disabled_optimizers)
    434 # initialize the C++ InferenceSession
--> 435 sess.initialize_session(providers, provider_options, disabled_optimizers)
    437 self._sess = sess
    438 self._sess_options = self._sess.session_options

RuntimeException: [ONNXRuntimeError] : 6 : RUNTIME_EXCEPTION : Exception during initialization: CHECK failed: it != end(): key not found: profile

I have also attached the error log of the jupyter notebook in ryzenlog.txt.
ryzenlog.txt
If someone could help me find out what I did wrong it would very much be appreciated.
Best regards

Hi @ChristiaanBoe,
I was able to reproduce your issue, and this is what fixed it for me. If you'd like to give it a try and let me know if it works on your end, that would be great!
In the quantization section in Step 3, update it to the following. As well, you'll want to restart the Jupyter Notebook before rerunning all the cells so that there's no cached data.
vai_q_onnx.quantize_static(
    input_model_path,
    output_model_path,
    calibration_data_reader=None,
    quant_format=vai_q_onnx.QuantFormat.QDQ,
    calibrate_method=vai_q_onnx.PowerOfTwoMethod.MinMSE,
    activation_type=vai_q_onnx.QuantType.QUInt8,
    weight_type=vai_q_onnx.QuantType.QInt8,
    enable_ipu_cnn=True,
    extra_options={'ActivationSymmetric': True}
)

Thanks,
Victoria

Hello @vgodsoe ,
Thank you so much for your help so far!
I have tried using your method resulting in the following onnx files:
ONNX files.zip
Unfortunatly using both the automated and the manual install I am still greeted with an onnxRuntime error however it appears I now get different outputs.
I also used the #59 method for both automated and manual methods.
Manual error normal:
Cell In[6], line 9
      6 aie_options = onnxruntime.SessionOptions()
      7 aie_options.enable_profiling = True
----> 9 aie_session = onnxruntime.InferenceSession(
     10     onnx_model_path,
     11     providers = ['VitisAIExecutionProvider'],
     12     sess_options=aie_options,
     13     provider_options=[{'config_file': config_file_path}]
     14 )
     16 start = timer()
     17 ryzen_outputs = aie_session.run(None, {'input': input_data})

File ~\anaconda3\envs\Ryzentest\lib\site-packages\onnxruntime\capi\onnxruntime_inference_collection.py:383, in InferenceSession.__init__(self, path_or_bytes, sess_options, providers, provider_options, **kwargs)
    380 disabled_optimizers = kwargs["disabled_optimizers"] if "disabled_optimizers" in kwargs else None
    382 try:
--> 383     self._create_inference_session(providers, provider_options, disabled_optimizers)
    384 except (ValueError, RuntimeError) as e:
    385     if self._enable_fallback:

File ~\anaconda3\envs\Ryzentest\lib\site-packages\onnxruntime\capi\onnxruntime_inference_collection.py:435, in InferenceSession._create_inference_session(self, providers, provider_options, disabled_optimizers)
    432     disabled_optimizers = set(disabled_optimizers)
    434 # initialize the C++ InferenceSession
--> 435 sess.initialize_session(providers, provider_options, disabled_optimizers)
    437 self._sess = sess
    438 self._sess_options = self._sess.session_options

RuntimeException: [ONNXRuntimeError] : 6 : RUNTIME_EXCEPTION : Exception during initialization: CHECK failed: it != end(): key not found: profile

Manual error using #59
RuntimeException                          Traceback (most recent call last)
Cell In[10], line 23
     15 cache_dir = Path(os.path.join(os.getcwd(), 'cache'))
     17 provider_options = [{
     18 'config_file': os.path.join('..', path, 'vaip_config.json'), # Adjust the config file path as necessary
     19 'cacheDir': str(cache_dir), # Convert the cache directory Path object to string
     20 'cacheKey': 'modelcachekey_quick'
     21 }]
---> 23 aie_session = ort.InferenceSession(model, providers=providers,
     24 provider_options=provider_options)
     26 start = timer()
     27 ryzen_outputs = aie_session.run(None, {'input': input_data})

File ~\anaconda3\envs\ryzentestweird\lib\site-packages\onnxruntime\capi\onnxruntime_inference_collection.py:383, in InferenceSession.__init__(self, path_or_bytes, sess_options, providers, provider_options, **kwargs)
    380 disabled_optimizers = kwargs["disabled_optimizers"] if "disabled_optimizers" in kwargs else None
    382 try:
--> 383     self._create_inference_session(providers, provider_options, disabled_optimizers)
    384 except (ValueError, RuntimeError) as e:
    385     if self._enable_fallback:

File ~\anaconda3\envs\ryzentestweird\lib\site-packages\onnxruntime\capi\onnxruntime_inference_collection.py:435, in InferenceSession._create_inference_session(self, providers, provider_options, disabled_optimizers)
    432     disabled_optimizers = set(disabled_optimizers)
    434 # initialize the C++ InferenceSession
--> 435 sess.initialize_session(providers, provider_options, disabled_optimizers)
    437 self._sess = sess
    438 self._sess_options = self._sess.session_options

RuntimeException: [ONNXRuntimeError] : 6 : RUNTIME_EXCEPTION : Exception during initialization: attrs_create_cif
attrs_create_cif
(unknown)
__NLG_Return2
RtlCaptureContext2
initialize_onnxruntime_vitisai_ep
compile_onnx_model_vitisai_ep_with_options
PyInit_onnxruntime_pybind11_state
PyInit_onnxruntime_pybind11_state
PyInit_onnxruntime_pybind11_state
PyInit_onnxruntime_pybind11_state
PyInit_onnxruntime_pybind11_state
PyInit_onnxruntime_pybind11_state
PyInit_onnxruntime_pybind11_state
PyInit_onnxruntime_pybind11_state
PyInit_onnxruntime_pybind11_state
PyInit_onnxruntime_pybind11_state
PyInit_onnxruntime_pybind11_state
PyInit_onnxruntime_pybind11_state
public: void __cdecl pybind11::error_already_set::discard_as_unraisable(class pybind11::object) __ptr64
_PyArg_ParseTuple_SizeT
_PyObject_MakeTpCall
_PyErr_FormatFromCauseTstate
_Py_NewReference
_PyEval_EvalFrameDefault
_PyFunction_Vectorcall
_Py_NewReference
_PyEval_EvalFrameDefault
_PyFunction_Vectorcall
_PyFunction_Vectorcall
PyCode_Optimize
_Py_NewReference

Resulting in the following error log:
errorlog manual #59.txt
Using the automated method normally I got the following error messages:
RuntimeException                          Traceback (most recent call last)
Cell In[9], line 9
      6 aie_options = onnxruntime.SessionOptions()
      7 aie_options.enable_profiling = True
----> 9 aie_session = onnxruntime.InferenceSession(
     10     onnx_model_path,
     11     providers = ['VitisAIExecutionProvider'],
     12     sess_options=aie_options,
     13     provider_options=[{'config_file': config_file_path}]
     14 )
     16 start = timer()
     17 ryzen_outputs = aie_session.run(None, {'input': input_data})

File ~\anaconda3\envs\ryzentestweird\lib\site-packages\onnxruntime\capi\onnxruntime_inference_collection.py:383, in InferenceSession.init(self, path_or_bytes, sess_options, providers, provider_options, **kwargs)
    380 disabled_optimizers = kwargs["disabled_optimizers"] if "disabled_optimizers" in kwargs else None
    382 try:
--> 383     self._create_inference_session(providers, provider_options, disabled_optimizers)
    384 except (ValueError, RuntimeError) as e:
    385     if self._enable_fallback:

File ~\anaconda3\envs\ryzentestweird\lib\site-packages\onnxruntime\capi\onnxruntime_inference_collection.py:435, in InferenceSession._create_inference_session(self, providers, provider_options, disabled_optimizers)
    432     disabled_optimizers = set(disabled_optimizers)
    434 # initialize the C++ InferenceSession
--> 435 sess.initialize_session(providers, provider_options, disabled_optimizers)
    437 self._sess = sess
    438 self._sess_options = self._sess.session_options

RuntimeException: [ONNXRuntimeError] : 6 : RUNTIME_EXCEPTION : Exception during initialization: CHECK failed: it != end(): key not found: profile

With the following log:
errorlog automated.txt
Using the automated method using #59 I simply get a kernel shutdown
With the following log:
errorlog automated #59.txt
I feel like the problem might be with finding the the voe-4.0-win_amd64 folder.
Victoria thank you again for all your support!
Christiaan

I had the same issue, which is fixed by this commit https://github.com/amd/RyzenAI-SW/commit/b361b5b53d31b309096786bb710f8fbb8a10c0de

Hey @vgodsoe  @ryomo after some fiddling and reinstalling Windows 11 I got the NPU to work (I think). I still find some weird bugs, as I first have to run the NPU execution cell, quantize the onnx file again and then execute that file via the NPU to get it to work. I was also a bit suprised regarding the low speed of the NPU on the minisforum. It usually is about two times as slow and at best of times the inference times are equal (see the attached image), is this the same result you guys get from the hello world notebook running on the Minisforum um790 pro?

Hi.
I get the same results from this hello world model.
I guess that the initial aie_session.run() includes some kind of build time, which is longer than cpu_session.run().
So, the second run gets faster and nearly same results between the NPU and CPU in this simple model.
FYI, other quantized models which I'm working on are showing faster inference speeds via the NPU than via the CPU. (But super low accuracy for now 😢 )

Hey @ryomo @vgodsoe
Your work seems super interesting, to me the runtime seems to have quite a bit of variance, I am looking forward to seeing your solution!
What I noticed so far is that the IPU really shines compares to GPUs when it comes to large models with larges input sizes as it can use the more numerous CPU ram as opposed to CUDA RAM.
As I used the manual installation method one thing I noticed is that in my global variables NUM_OF_DPU_RUNNERS=1 could this be higher for the Minisforum um790pro, I am a bit afraid of changing anything at this point lest my programming environment shatters like a precious crystal structure.

Now I have converted hello_world.ipynb to a normal Python script to check what's going on.
It prints more logs and shows [Vitis AI EP] No. of Operators :   CPU     7, which seems to indicate that it's not working on the NPU lol.

I am a bit afraid of changing anything at this point lest my programming environment shatters like a precious crystal structure.

I completely agree.

Hi @ryomo and @ChristiaanBoe
Thank you for your feedback! Love to see them. I checked in a new hello world example, and I wanted to share a couple of updates that will hopefully help!

If the there's only one convolutional layer, the compiler for the NPU automatically decides to only run the model on the NPU. I've updated the hello_world example with 2 conv layers and now the compiler picks it up for the NPU and you should see ops running on the NPU.
With the updated Jupyter Notebook, I've also added a Python script to make it easier for developers running the example to do debug or update the code. Sometimes, Jupyter Notebook doesn't show the full output messages, so this script is useful if you want to see all of the console updates.
In both the Jupyter Notebook and the Python script, I've specified a "cache" folder. This will store the compiled model and the compilation report. These are great for being able to see what ops are running on the CPU vs. the NPU. The updated example will generate a report for the NPU.
As @ryomo noted earlier, on the first execution on the NPU, the compiler is called for the model so the initial run will be slower.  Subsequent runs should show the model more performant (since it used the compiled model from the cache), however, being a small "hello_world" model, you won't really see the performance gains in this example.
If you did want to play with the NUM_OF_DPU_RUNNERS, 2 and 4 are good options. Here's how you can add it into the code os.environ['NUM_OF_DPU_RUNNERS'] = "4"

Thanks,
Victoria

Thank you for your clarifications and updates! The detailed explanations are very helpful.

Hello @vgodsoe ,
Thank you so much for the clarifications and the continued support :)
I have been playing around with the NUM_OF_DPU_RUNNERS: rather surprisingly I found that both the NPU as well as the CPU appear to speed up roughly the same amount, is this an expected result?
All the best,
Christiaan


feat: allow selection of a ado pipeline yaml

tl;dr
After this change, one can specify the yaml path to the Azure DevOps Pipeline yaml
Rationale
We have two different usecases that cannot be satisfied with the current setup:

our pipeline is in a .azuredevops folder
we have projects with multiple pipelines (ie a simple application that has an BFF api and the website)

With the hardcoded specification for the /azure-pipelines.yaml, this failed for our templates.
Solution
By adding an additional field, yamlPath to the inputs for the component, which defaults to the previous value, we can satisfy our scenarios, without breaking existing cases.
Benefits

Allows to place the file in a different folder
Enables the usage of multiple pipelines, ie

    - id: createApiPipeline
      name: API - Create Azure Pipeline
      action: azure:pipeline:create
      input:
        ...
        yamlPath: "/.azure-pipelines/api.yml"

    - id: runAzurePipeline
      name: API - Run Azure Pipeline
      action: azure:pipeline:run
      input:
        ...
        pipelineId: ${{ steps.createApiPipeline.output.pipelineId }}

    - id: createWebPipeline
      name: Web - Create Azure Pipeline
      action: azure:pipeline:create
      input:
        ...
        yamlPath: "/azure-pipelines/web.yml"

    - id: runWebAzurePipeline
      name: Web - Run Azure Pipeline
      action: azure:pipeline:run
      input:
        ...
        pipelineId: ${{ steps.createWebPipeline.output.pipelineId }}

hejhej,
any updates? Is there something missing?
Tagging people to bring this up @clemensheithecker
Best,
m

Looks good to me! Thank you! 👍🎉


--fix appears to truncate versus round

$ eva -f 1
> .1 + 4
         4.0

$ eva '.1 + 4'
         4.0999999999

I would have expected the result to be rounded to the specified number of decimal places (and produce 4.1) instead of truncated.

Thanks for showing this, it seemed to be a bug on the radix formatting part.

Fixed for base 10 but other bases might still have this issue, not sure.

Awesome, thanks.


Add Dockerfile

Hello,
I started using a Dockerfile to run the application and its dependencies as well as solving CORS issue with a nginx proxy.
Readme
The Dockerfile is helpful in development mode to run the application and its dependencies.
Fast way (using docker-compose)
Commands:
cd docker/
docker-compose up

Flexible way (using docker)
Commands:
cd docker/
docker build -t ohif-viewers .
docker run --rm -p 8080:8080 -p 3000:3000 ohif-viewers

Usage

OHIF Viewers: http://DOCKER_MACHINE_IP:3000
Orthanc port: http://DOCKER_MACHINE_IP:8080

Hi Pedro,
Thanks for this pull request. This is probably not very necessary anymore since we now have the CORS proxy built into the Meteor server. For those that want to use Orthanc (or DCM4CHEE) on Docker, we can just point Meteor towards that.
Cheers,
Erik


Unable to set network_server.gateway.backend.mqtt.password via ENV

Is this a bug or a feature request?
bug?
What did you expect?
To be able to set the network_server.gateway.backend.mqtt.password via an environment variable similar to other config values
What happened?
I am able to see the ENV injected in my kubernetes container - however the loraserver receives a bad credentials error from mqtt.
Setting the password directly in the config file works as expected
# Connect with the given password (optional)
password="<my password>"

What version are you using?
2.6.1
How can your issue be reproduced?
Set the environment variable NETWORK_SERVER.GATEWAY.BACKEND.MQTT.PASSWORD and connect to an mqtt broker with authentication
Could you share your log output?
ENV on container
NETWORK_SERVER.GATEWAY.BACKEND.MQTT.PASSWORD=<my password>

credential error
time="2019-08-13T17:19:31Z" level=error msg="gateway/mqtt: connecting to mqtt broker failed, will retry in 2s: Bad user name or password"

Works for me from the cli using the latest master version (fish shell, which is why I needed to add env in front of the env variables).
This sets the env. variable and let loraserver print the configuration file. As you can see, it does set the password:
~/W/P/L/R/loraserver (master|✔) $ env NETWORK_SERVER.GATEWAY.BACKEND.MQTT.PASSWORD=foobar ./build/loraserver configfile |grep -B 10 -A 10 foobar

    #   * "{{ .CommandType }}" as an substitution for the command type
    command_topic_template="gateway/{{ .GatewayID }}/command/{{ .CommandType }}"

    # MQTT server (e.g. scheme://host:port where scheme is tcp, ssl or ws)
    server="tcp://localhost:1883"

    # Connect with the given username (optional)
    username=""

    # Connect with the given password (optional)
    password="foobar"

    # Quality of service level
    #
    # 0: at most once
    # 1: at least once
    # 2: exactly once
    #
    # Note: an increase of this value will decrease the performance.
    # For more information: https://www.hivemq.com/blog/mqtt-essentials-part-6-mqtt-quality-of-service-levels
    qos=0


Users/bgavril/m106fix

These are cherry picked from master / m105 and have been reviewed / approved


Also hide parent container if all items are hidden in a filter

I have a need to also hide the parent container if there are no .mix items showing. My code looks like this:

Cars

    Some link text
    Some link text

Bikes

    Some link text
    Some link text

So if all items are filtered out it also hides either the .itemKey heading or the .app-glossary-item-wrapper
I hope this makes sense?
Thank you!

Hi,
This isn't possible out of the box with MixItUp.
Typically, all targets must be siblings of the same parent element, so I'm not sure if your markup structure will actually work.
However, if you wanted to hide or show parts of the DOM using custom javascript in reaction to a certain filter result, you could do that using the onMixEnd callback function, and the state object which is provided to that callback as the first argument.
Be aware however that if the container or a parent element of any target is hidden at the start of an animation, this will most likely break the geometry calculations needed for the animations when you filter the items back in.
In conclusion, I'm pretty sure what you want to do won't be possible without breaking animations, but I would recommend having a play around with the onMixEnd callback anyway.
Hope that helps.


light-client: p2p reactor

Tendermint light-clients use a list of RPC nodes to talk to and to ask for "light-blocks".
LazyLedger light-clients will operate similarly to tendermint light-client but will do DA checks though (#65). For this, they need to be able to discover and add peers. For this, we'd need a light-client related p2p reactor.
Note that the tendermint team experimented with a similar reactor (without DA checks) but abandoned the idea for now:
https://github.com/tendermint/tendermint/pull/4508
In this context also, we should keep an eye on the progress of the p2p-refactor: https://github.com/tendermint/tendermint/blob/master/docs/architecture/adr-061-p2p-refactor-scope.md
An alternative to using tendermint's p2p layer, could be a libp2p-based solution. This would be more work intensive but in the light of the optimint work where we will also use libp2p (cc @Wondertan @tzdybal).

This enables node-type d) in the opening comment of: https://github.com/lazyledger/lazyledger-specs/issues/3

@Wondertan I think here would be the right place to talk about the other idea you've mentioned yesterday: using pubsub for light-clients for the headers.

So the idea is to use libp2p.PubSub for header broadcasting:

Setup: Pubsub has multiple routers and for start, we can simply go with FloodSub router, which basically sends pubs to all know connection. Later on, we can go with the GossipSub router for message propagation efficiency. Also, we can omit to discover peers for now and just rely on connecting them manually.
Protocol: We can create a custom protocol that wraps one pubsub.Topic and one pubsub.Subscription, that simply does Header serde and pubsubing. For the topic namespace, we can come up with any suitable name, like celestial_header_share. In case, we need multiple places/components to listen for new Headers, we can use more than just one pubsub.Subscription. NOTE: It more efficient to use multiple subscriptions through code provided by PubSub's topic than wrapping one of them and implementing own multiplexing on top. NOTE2: We can omit scoring and relay concepts of pubsub for the first version of the protocol, but later on they would be very helpful.
Usage: As discussed, we can start to use the protocol in two places. Once the block is committed in consensus, instantly publish its header to the protocol. Then light client code will receive it in the place where it processes headers instead of RPC response/subscription.

Closing this as this will be implemented in https://github.com/celestiaorg/celestia-node and should be defined as part of https://github.com/celestiaorg/celestia-node/issues/1


Give inc0@ access to kubeflow-dev so that he can work on the GH issue example

see https://github.com/kubeflow/examples/pull/203#issuecomment-412088928

This change is

/assign @inc0
/assign @lluunn

/lgtm
/approve

/approve


[system-probe-changelog] bail early if we redeploy the same version

What does this PR do?
If the commit hash is the same as the only currently deployed, don't parse any commits or hit git, just post the empty slack message.

Motivation

Additional Notes

Possible Drawbacks / Trade-offs

Describe how to test/QA your changes

Reviewer's Checklist

[ ] If known, an appropriate milestone has been selected; otherwise the Triage milestone is set.
[ ] Use the major_change label if your change either has a major impact on the code base, is impacting multiple teams or is changing important well-established internals of the Agent. This label will be use during QA to make sure each team pay extra attention to the changed behavior. For any customer facing change use a releasenote.
[ ] A release note has been added or the changelog/no-changelog label has been applied.
[ ] Changed code has automated tests for its functionality.
[ ] Adequate QA/testing plan information is provided. Except if the qa/skip-qa label, with required either qa/done or qa/no-code-change labels, are applied.
[ ] At least one team/.. label has been applied, indicating the team(s) that should QA this change.
[ ] If applicable, docs team has been notified or an issue has been opened on the documentation repo.
[ ] If applicable, the need-change/operator and need-change/helm labels have been applied.
[ ] If applicable, the k8s/<min-version> label, indicating the lowest Kubernetes version compatible with this feature.
[ ] If applicable, the config template has been updated.

/merge


Document convertHexToRGB migration

Shouldn't this change be documented in the migration guide? It renames convertHexToRGB to hexToRgb (breaking the API), but isn't documented.
Originally posted by @zettca in https://github.com/mui-org/material-ui/pull/14391#issuecomment-568519662

We might have considered this module private in the past.
@zettca if you want to update the migration guide, the change is welcomed :).
There is still about 40% of the developers that are left to migrate from v3 to v4, it can help.

We might have considered this module private in the past.

And have discussed making it public:
https://github.com/mui-org/material-ui/issues/13039


various test fixes

kernel: increase main stack size for ztests on nios2
tests: uoscore: increase main stack

verified locally with twister all on all platforms, skipping ci.


Opt in for per-app language preferences

https://developer.android.com/guide/topics/resources/app-languages

Nice!

As a bonus: The release APK just got considerably smaller by ommiting unsupported locales from the build \o/

This issue is fixed with version 8.0.0


Ensure the UI doesn't make it easy to accidentally delete money

Where by "delete money" I mean "send money to a typo'd pubkey". Two approaches:

Add some error checking code to pubkeys so that typos and other corruptions are caught. @bkase likes this, I actually think I like this too, although I wasn't as hot about it originally. I think we should probably do this anyway.
In the UI, ask a fullnode if there's an account with that PK, and if not prompt for confirmation for sending money to a new account.

base58check has some basic error detection.


CR "metadata.name" invalid format should throw exception on the user console

When a user supplies unsupported metadata.name Jaeger operator should throw an exception on user console.
$ oc create -f jaeger-services-final.yaml
jaeger.jaegertracing.io/jaegerqe.test created

Current flow:

deploys ES cluster
try to deploy jaeger services(throws an exception on the jaeger-operator log)

Expected flow:

validate CR file
continue to deploy if the user supplied a valid CR file.

Operator log: jaeger-operator-545c69455d-j7zjg.log
CR file:
apiVersion: jaegertracing.io/v1
kind: Jaeger
metadata:
  name: "jaegerqe.test"
spec:
  ingress:
    security: none
  strategy: production
  collector:
    replicas: 1
    image: jaegertracing/jaeger-collector:1.12
    resources:
      requests:
        memory: "512Mi"
        cpu: "1"
      limits:
        memory: "512Mi"
        cpu: "1"
    options:
      log-level: info
      metrics-backend: prometheus
      collector:
        num-workers: 1
        queue-size: 20000
      es:
        bulk:
          size: 524288
          workers: 1
          flush-interval: 200ms
        tags-as-fields:
          all: false
  query:
    replicas: 1
    image: jaegertracing/jaeger-query:1.12
    resources:
      requests:
        cpu: "500m"
        memory: "512Mi"
      limits:
        cpu: "500m"
        memory: "512Mi"
    options:
      log-level: info
      metrics-backend: prometheus
      query:
        port: 16686
      es:
        timeout: 10s
  agent:
    strategy: sidecar
    image: jaegertracing/jaeger-agent:1.12
    resources:
      requests:
        cpu: "200m"
        memory: "128Mi"
      limits:
        cpu: "200m"
        memory: "128Mi"
    options:
      log-level: info
      metrics-backend: prometheus
      processor:
        jaeger-compact:
          server-queue-size: 10000
          workers: 10
  storage:
    type: elasticsearch
    esIndexCleaner:
      enabled: false
    dependencies:
      enabled: false
    elasticsearch:
      image: quay.io/openshift/origin-logging-elasticsearch5:latest
      nodeCount: 3
      resources:

I remember seeing some validation features for OLM, perhaps we could reuse it here?

I started implementing this and reported the following issues in the process:

operator-framework/operator-sdk#1607
operator-framework/operator-sdk#1608
operator-framework/operator-sdk#1609

So should we postpone all the validation related issues until these SDK issues are resolved?

This particular issue has a different solution, but in general, we can do "some" validation now, and improve once the SDK issues are fixed.


Mint: element is not attached to the page document

After being presented with the Mint / Intuit logic screen and entering the SMS verification code (and pressing Enter), I get the following error message.
Name: mint-amazon-tagger
Version: 1.34

You may be asked for an auth code at the command line! Be sure to press ENTER after typing the 6 digit code.
Logging into Mint|Traceback (most recent call last):
  File "/Library/Frameworks/Python.framework/Versions/3.7/bin/mint-amazon-tagger-cli", line 8, in <module>
    sys.exit(main())
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/mintamazontagger/cli.py", line 77, in main
    counter_progress_factory=counter_progress_cli)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/mintamazontagger/tagger.py", line 148, in create_updates
    mint_category_name_to_id = mint_client.get_categories()
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/mintamazontagger/mintclient.py", line 85, in get_categories
    mint_api = self.get_mintapi()
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/mintamazontagger/mintclient.py", line 70, in get_mintapi
    chromedriver_download_path=home_dir)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/mintamazontagger/api.py", line 500, in create
    return Mint(email, password, **opts)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/mintamazontagger/api.py", line 496, in __init__
    chromedriver_download_path=chromedriver_download_path)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/mintamazontagger/api.py", line 584, in login_and_get_token
    chromedriver_download_path=chromedriver_download_path)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/mintamazontagger/api.py", line 403, in get_web_driver
    imap_password, imap_server, imap_folder)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/mintamazontagger/api.py", line 312, in _sign_in
    email_input.clear()  # clear email and user specified email
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/selenium/webdriver/remote/webelement.py", line 95, in clear
    self._execute(Command.CLEAR_ELEMENT)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/selenium/webdriver/remote/webelement.py", line 633, in _execute
    return self._parent.execute(command, params)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/selenium/webdriver/remote/webdriver.py", line 321, in execute
    self.error_handler.check_response(response)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/selenium/webdriver/remote/errorhandler.py", line 242, in check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.StaleElementReferenceException: Message: stale element reference: element is not attached to the page document
  (Session info: chrome=90.0.4430.212)

Hi @kwylie, A quick workaround is to follow the login flow in the browser and get through the signin process manually. Then try running the application again. It should skip 2FA/SMS verification on the second attempt after a successful login.

  Not sure if this is a change on Intuit's side or not.  Let me know if there's anything I can do to help test.

I believe Mint's login pages might have changed.  Same problem as @kwylie with the same errors, and then I have to hit Ctrl-Break because the script never stops running.

I think it's related to this issue in mintapi

No idea what this repo is lol, but it looks like this issue might be fixed with https://github.com/mrooney/mintapi/pull/260
It fixed the issue in the previous post for me and it would be great to see if it works for others too.

Thanks, yes, that was likely the issue. I just cut version 1.35 and am releasing that version now. Please try that and reopen if you continue to have issues.

Hmmm... having this issue again, on v1.35.  Any ideas?


Add new chat client classes

Codecov Report
All modified and coverable lines are covered by tests :white_check_mark:

Project coverage is 100.00%. Comparing base (d4fbbbf) to head (01b9607).

Additional details and impacted files
@@            Coverage Diff             @@
##              main       #39    +/-   ##
==========================================
  Coverage   100.00%   100.00%
==========================================
  Files           56        65     +9
  Lines         2305      2856   +551
==========================================
+ Hits          2305      2856   +551

:umbrella: View full report in Codecov by Sentry.
:loudspeaker: Have feedback on the report? Share it here.


长城宽带hysteria配置

你好，目前用xray和hysteria。Hysteria很好用但有时长城宽带好像封udp端口。以前长城宽带不稳定但现在xray比较好用。晚上8-9点还可以稳定看1080p60hz的youtube。之前这是不可能的。只是我发现hysteria+udp是比xray反应更速好很多了。有没有用户发现个好hysteria长城宽带的配置？推荐试哪一个端口数？谢谢帮助啊

指望长城不限制UDP，简直是。。
你用udp转伪tcp，如果还不行，换宽带

I was so wrong this whole time. There's no problem using UDP on 长城宽带. The problem was me using an expired certificate so I had to switch to allowinsecure=true.  Every request feels like it takes around half the time now.  Thumbs up to you guys!
Now my only problem is finding a good Android app for Hysteria. Sager seems bloated+overkill+unsupported  and ClashmetaforAndroid is great but a bit buggy. I hope V2rayNG adds support. Love that app.

You may also try https://github.com/MatsuriDayo/Matsuri which is a fork of SagerNet but I've heard its support for hysteria is more active.


Address data privacy and security concerns

Summarized Feedback from<EMAIL_ADDRESS>
Users have concerns about data privacy and security, because the application's messages may imply potential access to their browsing data.


chore: not use root as default login user name

Codecov Report

Merging #1549 (6e266a7) into master (ba22055) will not change coverage.
The diff coverage is n/a.

Additional details and impacted files
@@           Coverage Diff           @@
##           master    #1549   +/-   ##
=======================================
  Coverage   24.73%   24.73%
=======================================
  Files         168      168
  Lines       14998    14998
=======================================
  Hits         3710     3710
  Misses      11017    11017
  Partials      271      271

Flag
Coverage Δ

backend_integration
8.99% <ø> (-0.04%)
:arrow_down:

backend_ut
27.25% <ø> (ø)

Flags with carried forward coverage won't be shown. Click here to find out more.

Continue to review full report in Codecov by Sentry.

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


Feature: add bundles support to PDP

Description
As part of a customer ask, the retail react app will now be supporting product bundles. This PR adds support for product bundles in the PDP, and there will be follow up PRs to add support for cart/checkout pages and wishlist/order history pages. This PR is large due to the addition of mocked data and unit tests. Excluding those, the numbers of changes is ~500 lines of code.

Types of Changes

[ ] Bug fix (non-breaking change that fixes an issue)
[x] New feature (non-breaking change that adds functionality)
[ ] Documentation update
[x] Breaking change (could cause existing functionality to not work as expected)
[ ] Other changes (non-breaking changes that does not fit any of the above)

Breaking changes include:

Removing a public function or component or prop
Adding a required argument to a function
Changing the data type of a function parameter or return value
Adding a new peer dependency to package.json

Changes
The functionality of product bundles is very similar to product sets except for a few key diferences:

product bundles can modify quantity at the top level
child products for bundles have a fixed quantity and cannot be added to cart or wishlist individually from bundle PDP
add to cart modal displays bundles differently than regular products or product sets

The main files changed were:

packages/template-retail-react-app/app/pages/product-detail/index.jsx

add logic to render product bundles in same way as sets

packages/template-retail-react-app/app/components/product-view/index.jsx

add logic to render product bundles in small ways different than sets (ie: no add to cart button on child products)
add logic to disable add to cart button if child products of sets/bundles are not able to be ordered (out of stock or unfulfillable)

packages/template-retail-react-app/app/hooks/use-add-to-cart-modal.js

add logic to render product bundles differently  (displays child products and chosen variants) than regular products/product sets in add to cart modal

How to Test-Drive This PR
For testing manually:

git checkout feature/bundles_pdp
npm ci
cd packages/template-retail-react-app
npm run start
Search for 'bundle' in the web app when it's done loading

For unit tests:

git checkout feature/bundles_pdp
npm ci
cd packages/template-retail-react-app
npm run test

Checklists

General

[x] Changes are covered by test cases
[ ] CHANGELOG.md updated with a short description of changes (not required for documentation updates)

Accessibility Compliance
You must check off all items in one of the follow two lists:

[ ] There are no changes to UI

or...

[ ] Changes were tested with a Screen Reader (iOS VoiceOver or Android Talkback) and had no issues
[ ] Changes comply with WCAG 2.0 guidelines levels A and AA
[ ] Changes to common UI patterns and interactions comply with WAI-ARIA best practices

Localization

[x] Changes include a UI text update in the Retail React App (which requires translation)

@joeluong-sfcc Actually, let's not have this PR be merged into develop yet. We want to be able to easily find the diff for product bundle changes, once we've done the work for all the pages.


add endpoint  compound annual growth rate

What bug or feature you wants to report.

assign it to me @nikhil25803


An error raises when I run demo.py

Traceback (most recent call last):
File "./demo.py", line 95, in
ctx, args.nms_thresh, args.force_nms)
File "./demo.py", line 39, in get_detector
.get_symbol(len(CLASSES), nms_thresh, force_nms)
File "/home/sheny/mxnet-ssd/symbol/symbol_vgg16_reduced.py", line 162, in get_symbol
net = get_symbol_train(num_classes)
File "/home/sheny/mxnet-ssd/symbol/symbol_vgg16_reduced.py", line 118, in get_symbol_train
clip=True, interm_layer=0)
File "/home/sheny/mxnet-ssd/symbol/common.py", line 111, in multibox_layer
from_layer = mx.symbol.Scale(data=from_layer, mode="spatial",
AttributeError: 'module' object has no attribute 'Scale'

I have used git clone --recurisve to pull the entire repository, but this error still happen

I got the same error.

I have solved this problem by using the mxnet included in mxnet-ssd, because the author add some layer such as Scale in mxnet.

Yes, you have to use the included mxnet, and make sure python import this specific lib otherwise it will fail to load special layers

@rongrongxiangxin It's not about CUDA, it's the repo you used and imported.

@shenyuan416  I also used the mxnet included in mxnet-ssd, and build to generate libmxnet.so. How to add some layer such as Scale? Thanks.

@rongrongxiangxin You may add the environment variables to system, the special layers such as Scale have been included in mexnet-ssd/menet.


Maas deprecation warnings and errors in Newton

Do NOT include any confidential information, this issue will be created on a public repo
This section is completed by the issue reporter
On which version(s) do you encounter this issue?
Please provide the output to 'git describe --all' for  all deployments where you have confirmed it occurs.
What type of issue is this? Please tick the appropriate box.

[x] bug - existing functionality that does not work for you as documented
[ ] feature - new functionality that you would like to see added

What is the expected behavior?
No warnings
What is actually happening?
When running setup-maas.yml you run into several warning and errors for

maas_requires_pip_packages
plugin_files.stdout_lines
maas_filesystem_monitors
maas_filesystem_overrides
vhost_json
inventory_hostname == groups['swift_proxy'][0]

Warnings:
[DEPRECATION WARNING]: Using bare variables is deprecated. Update your playbooks so that the environment value uses the full variable syntax ('{{maas_requires_pip_packages}}').
This feature
will be removed in a future release. Deprecation warnings can be disabled by setting deprecation_warnings=False in ansible.cfg.

Error:
fatal: [infra03_nova_conductor_container-ce254a90]: FAILED! => {"failed": true, "msg": "The conditional check 'inventory_hostname == groups['swift_proxy'][0]' failed. The error was: error while evaluating conditional (inventory_hostname == groups['swift_proxy'][0]): list object has no element 0\n\nThe error appears to have been in '/opt/rpc-openstack/rpcd/playbooks/roles/rpc_maas/tasks/main.yml': line 48, column 3, but may\nbe elsewhere in the file depending on the exact syntax problem.\n\nThe offending line appears to be:\n\n\n- include: swift_access_check.yml\n  ^ here\n"}

What were you attempting to do when you encountered this error (give as much detail as possible)?
See above
How can we reproduce this issue?
See above
How can we verify your issue is addressed?
No warning
If you are using or know of a workaround please describe the necessary steps?
N/A
What is your evaluation on the importance of this issue, and why?
Prio 2

This section is completed during the issue resolution process. If you are reporting an issue, please do not modify the section below.
Which branches are impacted by this issue?
Remove branches that are not impacted.
For each pull request, update the branch line to reference it.

[ ] master
[ ] newton-14.0

Upgrade impact. Consider the impact on moving between major, minor and patch releases.

[ ] This change does not impact upgrades
[ ] This change addresses a potential upgrade impact
[ ] The upgrade impact is being tracked by another issue.

The issue tracking the upgrade impact is:
Testing impact

[ ] An issue/pull-request has been create or exists to track the testing gap, and is referenced below
[ ] This change includes additional testing
[ ] This change is tested by the existing setup

Additional testing links:
Release note

[ ] This change includes a release note.
[ ] This change does not require a release note.

Doc Impact
Does your change require documentation?

[ ] Yes, and I submitted an issue to Docs issues
[ ] Yes, and I contributed a documentation patch to docs-rpc
[ ] No documentation required for this change

Additional documentation links (please add links if you have ticked yes):

Nice catch. I'm going to target this for r14.0.0rc1 and mark it as prio-2.

FYI - This will need to be backported to the newton-14.0 branch before it's closed.

@alextricity25 Submitted a pr for newton-14.0


GitHub PAT permissions are insufficient

The repo permissions given to the PAT in the current version of this page are not sufficient; creating the task fails with an error about not finding the repository.  I needed to add the hook permissions as well. (I added both read and write, but presumably write should be enough.)

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

ID: 5f246d4b-b6bc-3058-ebf8-f7964bdf28b9
Version Independent ID: 6a0db8fa-aa31-258b-7fbe-21482c7f81c6
Content: Tutorial - Automate container image builds - Azure Container Registry Tasks
Content Source: articles/container-registry/container-registry-tutorial-build-task.md
Service: container-registry
GitHub Login: @dlepow
Microsoft Alias: danlep

Thanks for the feedback! We are currently investigating and will update you shortly.

It also needs more repo permissions, otherwise the task is unable to clone the repo for building the image.  I gave it the full control permission and it was able to move past that step.

Thanks for sharing the details. Thanks for the feedback! I have assigned the issue to the content author to investigate further and update the document as appropriate.

@ianhinder - Thanks for your question. I ran through the steps of the tutorial, using an access token with the documented permissions to create the webhook with ACR Tasks, then ran the task successfully both manually and triggering through a git commit/push to my public fork of the acr-build-helloworld-node repo. So I don't reproduce your need to add permissions to the token.
Are you seeing the issue with a public fork of the same repo, or are you trying with a different repo?
Thanks!

On 31 May 2019, at 20:46, Dan Lepow <notifications<EMAIL_ADDRESS>wrote:
@ianhinderhttps://github.com/ianhinder - Thanks for your question. I ran through the steps of the tutorial, using an access token with the documented permissions to create the webhook with ACR Tasks, then ran the task successfully both manually and triggering through a git commit/push to my public fork of the acr-build-helloworld-node repo. So I don't reproduce your need to add permissions to the token.
Are you seeing the issue with a public fork of the same repo, or are you trying with a different repo?
It's with my own private repo.  Probably a public repo automatically grants the extra permissions that were missing.  So I suppose the tutorial works as-is, but the permissions added are only sufficient if you are using a public repo, which I assume many users won't be.

@ianhinder - That information is helpful. I'll confirm the token permissions expected for a private repo and I will plan to add a note to the article. Thanks!
#in-progress

Hi @dlepow , yes we do need hook permissions. I think Write should be enough for that.

Article has been updated. Thanks again @ianhinder for pointing out the issue.
#please-close


ci: Allow-list for secret-scanner

Description
Implement Arista secret-scanner allow list for passed examples in doc
Checklist:

[x] My code follows the style guidelines of this project
[x] I have performed a self-review of my code
[x] I have run pre-commit for code linting and typing (pre-commit run)
[x] I have made corresponding changes to the documentation
[x] I have added tests that prove my fix is effective or that my feature works
[x] New and existing unit tests pass locally with my changes (tox -e testenv)

/secret-scanner apply allow list


Android system ui configuration

Introduces a new UX behavior called SystemScreenConfig, which allows you to control the visibility of the status bar and navigation bar. Also listens to changes made by outside factors, and automatically reverts
This PR contains:

[ ] Changelog
[x] Documentation
[x] Tests

@mortoray how would show be independent when there isn't another platform with this behavior?

Changes and refactor is made, requesting review

@sebbert is currently checking if the docs are building properly, it's a bit experimental.

@kusma We came to the conclusion that we have no way in UX now to make this some kind of singleton to prevent multiple instances.  One motivating use-class greatly limits what can be done:
<Android>
	<SystemScreenConfig IsDim="true" Theme="Dark"/>
</Android>
<iOS>
	<SystemScreenConfig Theme="Light"/>
</iOS>

But it should report an error if a second instance is rooted.

@mortoray: I did not come to that conclusion, just that the approach you suggested wouldn't work. That's no excuse for making a broken API that we can't easily get rid of in the future.
A few options:

Document that only one instance is allowed, and give run-time error if that requirement is broken. (Basically what you suggest above, @mortoray, but the code doesn't do it ATM)
Inspect the rooted ones, and give an error if they are in an inconsistent state.
Give the states a documented priority, and use the the currently higherst priority rooted state.
Basically anything except from silently overwriting state.

@kusma Yes, by issue I warning I mean to imply that using more than one is strictly undefined behaviour. No need for priority or any kind of resolution. No need to check for consistency since there can only be one node.

@mortoray: I kind of want this to be an error rather than a warning, so that when we can make this a singleton, we can expect apps to not try this kind of shenanigans ;)

@kusma I want it to be an error as well, that's why I said: "But it should report an error if a second instance is rooted." ;P

Whitespaces are removed, Timer is refactored, and small changes to SystemScreenConfig are applied.
Docs are verified to work by sebbert, i've seen it myself.
Should be all good. @mortoray @kusma (the reviewers)

@petterroea What about the changes I requested to the overall structure?

More changes by review of @mortoray

Re-refactored the code after discussion on slack

Here is a video showing the test in action:

As you can see, there is some sizing glitches on the app, but this is apparently a fuselibs issue. @cbaggers mentioned this might require a rewrite of some fundamental Android stuff.

it's just the old super&root view stuff again. This will probably work just fine after that.
related: this https://github.com/fusetools/fuselibs-public/issues/103 & 1 internal ticket

@kusma changes made. Highlight is a new suggestion to the timer API

@kusma Allright, changes are made

Yeah, so just two minor nits, and I think this is good to go!

@kusma 🎊 However, i want to hear @cbaggers ' opinion on this being merged now, given the underlying fuse Android bootstrap has some fundamental issues that causes some weird layout glitches on the app when the status bar is toggled

@petterroea: Fair enough! Thanks for bearing with me, and I think the result looks really good!

@kusma I had a chat with @cbaggers , he is against merging as this would introduce a visual bug caused by errors in our Android root view code.
This bug is a part of a bigger issue that, according to @cbaggers , needs to be fixed some time anyways

@petterroea: OK.

If anything this means we should make an issue on, and start thinking of fixing this, but i have no idea if this would happen any time soon

I have no idea what the underlying issue is. @cbaggers, is this something you'll follow up on? If not, care to elaborate?

@kusma merging this would introduce a graphical bug as a statusbar size gap is left below the app root view.
The issue is due to our current root/super view setup in Fuse.Platform.SystemUI
I can't think of a way to fix this other than to change that bootstrapping to do 'the usual android thing' but this means we loose callback on softkeyboard resize etc. This is the correct way to go but I believe it needs to be a separate task.

@cbaggers: Right, so if I understand you correctly, you're saying that Fuse.Platform.SystemUI expects to be the only one meddling with the system UI, or it'll get in a bad state? If so, I totally get that, and yeah, we'll probably have to fix this first. I guess an alternative could be to let Fuse.Platform.SystemUI in on the action in this PR instead of going around its back?

Closing as abandoned. REcorded desired feature in https://github.com/fusetools/fuselibs-public/issues/825


pip install no longer works...

Just tried to install on Gadi for local development with pip install -e . in the root directory and get the following error:
(benchcab-dev) pip install -e .
Traceback (most recent call last):
  File "/g/data/v14/REDACTED/apps/miniconda3/envs/benchcab-dev/bin/pip", line 6, in <module>
    from pip._internal.cli.main import main
  File "/g/data/v14/REDACTED/apps/miniconda3/envs/benchcab-dev/lib/python3.9/site-packages/pip/_internal/cli/main.py", line 10, in <module>
    from pip._internal.cli.autocompletion import autocomplete
  File "/g/data/v14/REDACTED/apps/miniconda3/envs/benchcab-dev/lib/python3.9/site-packages/pip/_internal/cli/autocompletion.py", line 10, in <module>
    from pip._internal.cli.main_parser import create_main_parser
  File "/g/data/v14/REDACTED/apps/miniconda3/envs/benchcab-dev/lib/python3.9/site-packages/pip/_internal/cli/main_parser.py", line 9, in <module>
    from pip._internal.build_env import get_runnable_pip
  File "/g/data/v14/REDACTED/apps/miniconda3/envs/benchcab-dev/lib/python3.9/site-packages/pip/_internal/build_env.py", line 19, in <module>
    from pip._internal.cli.spinners import open_spinner
  File "/g/data/v14/REDACTED/apps/miniconda3/envs/benchcab-dev/lib/python3.9/site-packages/pip/_internal/cli/spinners.py", line 9, in <module>
    from pip._internal.utils.logging import get_indentation
  File "/g/data/v14/REDACTED/apps/miniconda3/envs/benchcab-dev/lib/python3.9/site-packages/pip/_internal/utils/logging.py", line 29, in <module>
    from pip._internal.utils.misc import ensure_dir
  File "/g/data/v14/REDACTED/apps/miniconda3/envs/benchcab-dev/lib/python3.9/site-packages/pip/_internal/utils/misc.py", line 43, in <module>
    from pip._internal.exceptions import CommandError, ExternallyManagedEnvironment
  File "/g/data/v14/REDACTED/apps/miniconda3/envs/benchcab-dev/lib/python3.9/site-packages/pip/_internal/exceptions.py", line 18, in <module>
    from pip._vendor.requests.models import Request, Response
  File "/g/data/v14/REDACTED/apps/miniconda3/envs/benchcab-dev/lib/python3.9/site-packages/pip/_vendor/requests/__init__.py", line 43, in <module>
    from pip._vendor import urllib3
  File "/g/data/v14/REDACTED/apps/miniconda3/envs/benchcab-dev/lib/python3.9/site-packages/pip/_vendor/urllib3/__init__.py", line 13, in <module>
    from .connectionpool import HTTPConnectionPool, HTTPSConnectionPool, connection_from_url
  File "/g/data/v14/REDACTED/apps/miniconda3/envs/benchcab-dev/lib/python3.9/site-packages/pip/_vendor/urllib3/connectionpool.py", line 12, in <module>
    from .connection import (
  File "/g/data/v14/REDACTED/apps/miniconda3/envs/benchcab-dev/lib/python3.9/site-packages/pip/_vendor/urllib3/connection.py", line 15, in <module>
    from .util.proxy import create_proxy_ssl_context
  File "/g/data/v14/REDACTED/apps/miniconda3/envs/benchcab-dev/lib/python3.9/site-packages/pip/_vendor/urllib3/util/__init__.py", line 8, in <module>
    from .ssl_ import (
  File "/g/data/v14/REDACTED/apps/miniconda3/envs/benchcab-dev/lib/python3.9/site-packages/pip/_vendor/urllib3/util/ssl_.py", line 17, in <module>
    from .url import BRACELESS_IPV6_ADDRZ_RE, IPV4_RE
ValueError: source code string cannot contain null bytes

Does a pip install no longer work? Is there a preferred method to install on Gadi?

I was able to pip install successfully with module load conda && conda activate benchcab-dev && pip install --user .. Although from looking at your output, it looks like the location of your benchcab-dev environment is different to mine: when I run which python while the environment is activated outputs /scratch/tm70/sb8430/conda/envs/benchcab-dev/bin/python. It could be worth trying to setup the environment again, to create a custom conda environment I follow the instructions here

Yes, you are correct. I do use a custom conda installation. However, I have never had any issues with it before. I'll see what I can do. Thanks for your help

I still had issues with this when installing from "base nothing" - put together a reproducible example of the failures and update this issue.


Make WTGC description more clear

Git.io is not a "3rd part service", it is official GitHub URL shortener. Many projects use it.

Ohhh, didn't know that. Well, can you keep to original to maintain consistency?

I want to use this short vanity git.io URL everywhere. Is it a problem? If yes, I can change it to full URL.

It's cool :)

@DiegoRBaquero, @feross
FYI, https://git.io/webtorrent. :wink:

@DiegoRBaquero, @feross
Please update https://webtorrent.io/faq page too.

@FluorescentHallucinogen That gets updated the next time the site is built. I'll kick off a build.


Unable to add video dynamically

I'm developing an application using Ionic and in that I'm allowing user to upload videos. So for playing videos I have integrated Video.js library.
But when I try to add video like this
$scope.$on('vjsVideoReady', function(evt, videoData) {
                console.info('videoData :: ', videoData.vid.player().src);
                var source = { type: "video/mp4", src: $sce.trustAsResourceUrl("https://dg-users.s3.amazonaws.com/052188e99455195695ad0e14633b694c") };
                videoData.vid.player().src({ type: source.type, src: source.src });
            });

I get the MediaError : The media could not be loaded, either because the server or network failed or because the format is not supported.
The same video link I'm able to play by just using video.js lib.
I also tried the example given on this repo. But same result. Please tell me what I doing wrong?

@tushargosalia I have never tried to load a video this way and will try to duplicate your issue. With that said, there is a more straight forward way of adding videos by making use of the vjs-media attribute.
In your situation you could have it set up like the following
HTML
<video class="video-js vjs-default-skin" controls vjs-video vjs-media="media"></video>

JS
$scope.media = {
    sources: [
        {
            src: 'https://dg-users.s3.amazonaws.com/052188e99455195695ad0e14633b694c',
            type: 'video/mp4'
        }
    ],
    poster: 'https://dg-users.s3.amazonaws.com/poster.jpg'
};

In doing this, you're able to leverage Angular's data binding capabilities so that whenever you update $scope.media your video will update. Let me know if this makes sense!

@LonnyGomes Thanks a lot for quick reply. Yeah I agree with you and it's working but when I try to make video fullscreen I'm experiencing flickering issue i.e. when I tap/click on fullscreen button causes it to go on full screen for like 100ms then come back to non-fullscreen.

@tushargosalia does this happen to be within an iframe? I've seen this behavior in those instances. If not, does this only happen when using just video.js?

I'm not using iframe and yeah..I think the issue is with video.js https://github.com/videojs/video.js/issues/2887
So I don't think you can do anything on this.

Hmm, the link doesn't work, but good to know. I'm going to go ahead and close this but am going to open a new issue to improve the explanation of vis-media.

@LonnyGomes Don't click on that link just copy it..and thanks a lot for your help.


Hold on to CString values for duration of import data creation call.

Fixes #32

Will drop #33 :)

Will drop #33 :)

Oh sorry I didn't see this, I got the notification for the issue before the notification of the PR, my bad.


Classroom changes 272 2

🗣 Description
Add policy group 5 in Classroom policy stating that only verified teachers can create classes.
Fixes #272
💭 Motivation and context
Public Comment

🧪 Testing

✅ Pre-approval checklist

[ ] This PR has an informative and human-readable title.
[ ] Changes are limited to a single goal - eschew scope creep!
[ ] If applicable, All future TODOs are captured in issues, which are referenced in the PR description.
[ ] The relevant issues PR resolves are linked preferably via closing keywords.
[ ] All relevant type-of-change labels have been added.
[ ] I have read and agree to the CONTRIBUTING.md document.
[ ] These code changes follow cisagov code standards.
[ ] All relevant repo and/or project documentation has been updated to reflect the changes in this PR.
[ ] Tests have been added and/or modified to cover the changes in this PR.
[ ] All new and existing tests pass.

✅ Pre-merge Checklist

[ ] This PR has been smoke tested to ensure main is in a functional state when this PR is merged.
[ ] Squash all commits into one PR level commit using the Squash and merge button.

✅ Post-merge Checklist

[ ] Delete the branch to clean up.
[ ] Close issues resolved by this PR if the closing keywords did not activate.

Ready for another review.

I just added the needed code changes. I'll approve once you:

Modify the policy name in the drift rule so it's the same as the md policy
Add the pending TTP mapping

@adhilto I will work on getting the TTP mapping, but the drift rules file already has the correct policy statement.

@adhilto The TTP mappings have been added.


Can "View Full Log" display the log in a new tab?

It's inconvenient to have "view full log" directly download the log, especially when the downloaded log doesn't have file extensions for OS like Windows.

It's by design for download behavior. If you want to set default application to view log, we could add file extensions for the log file.

It's by design for download behavior. If you want to set default application to view log, we could add file extensions for the log file.

@Binyang2014 Thanks for reply. I think that's true but again it's quite inconvenient. My download looks like:

When I click to open it, it always asks me to choose application:

I remember the design used to be opened in browser in previous versions. May I ask why that design has been abandoned?

@Binyang2014 Thanks for reply. I think that's true but again it's quite inconvenient. My download looks like:

When I click to open it, it always asks me to choose application:

I remember the design used to be opened in browser in previous versions. May I ask why that design has been abandoned?

The user log maybe quiet large. Render large file in browser may cause browser using much CPU/Mem and cause other pages slow down. Using download method will avoid this problem.
We can change download file name to user-stdout.log and user-stderr.log. Then you can choose vs code to open file with .log extension.

The user log maybe quiet large. Render large file in browser may cause browser using much CPU/Mem and cause other pages slow down. Using download method will avoid this problem.
We can change download file name to user-stdout.log and user-stderr.log. Then you can choose vs code to open file with .log extension.

Sounds reasonable to me. Thanks!

Sounds reasonable to me. Thanks!


Introduce an incremental bounce

Currently, in order to bounce a request which has SEPARATE* placement, you need to be running instance_count * 2 slaves. This can be quite a pain for requests with many instances. This PR creates a new type of bounce where we shut down old tasks as new ones are spun up (vs waiting for all new tasks to be ready first). Using this, you only need a minimum of instance_count + 1 slaves to bounce the same request

Got this working well in staging, also added an option for it in the UI

LGTM


fix: support minimum gas price in args

Closes #2813

Summary
In the previous solution, the minGasPrice was already defined by default. This PR fixes it by basing it on the params.
Checklist

[x] I added — tests to prove my changes
[ ] I updated — all the necessary docs
[ ] I reviewed — the entire PR myself, using the GitHub UI
[ ] I described — all breaking changes and the Migration Guide

Sorry. I still need to edit something.

:shipit:


Update SqlToolsService to .59

Contains updated SqlClient for issue described in https://github.com/microsoft/sqltoolsservice/pull/1124

Pull Request Test Coverage Report for Build 379368584

0 of 0   changed or added relevant lines in 0 files are covered.
No unchanged relevant lines lost coverage.
Overall coverage remained the same at 41.213%

Totals

Change from base Build 375699172:
0.0%

Covered Lines:
21788

Relevant Lines:
48492

💛  - Coveralls


Request: make items autocraftable even if there are already some in the system

In Ae2 you could middle click on an item and it would bring up the auto crafting option, when there was a pattern set up for it, regardless if there were already some of the items in the system or not. I've searched a lot but can't find a compareable option for refined storage, which leads me to believe that it doesn't exist.
It's inconvenient, since sometimes you just want to stock up on something, without clearing that item out completely first.
Also in botania for example there are recepies that double items. Those can never be auto crafted with refined storage, since you need at least one exemplar of the item in the sytem to dupe it, yet can't have one in there to start a crafting job.

"ctrl + shift + click will force open the crafting thing"
#628

Thx. I thought I tried every combination. Seems not. Would be good if this would be in the documentation somewhere.

Added it to the wiki


[RFC] Config profiling

I created a script to check the tokens_per_second and peak_memory for any config/recipe testing different flags.
It still needs some polishing, but I wanted to get comments about the outcome before I go further and submit a PR.
Goal:
To have a page with these 2 graphs and table for every model config (thats a lot of configs :O), so users can understand their options.
PS: It sounds like it will be frustrating to update all of these anytime we make a major change. If we could automate it with CI, that would be nice, but is that possible?
TLDR:

Take DEFAULT config and iterate over [bsz, max_seq_len]
Apply all MEMORY related flags and iterate over [bsz, max_seq_len]
Apply all SPEED related flags and iterate over [bsz, max_seq_len]
Take smallest and max_seq_len that runs without OOM, and iterate over the flags one by one, so we can measure impact.

IMPORTANT: default values differ from our configs. They are the values without optimization, e.g. checkpointing, regular Adam, etc.
Outcomes:

For the graphs, the configs are constant, and bsz/seq_len change
For the table, I pick 2 seq_len (small one and large one), and run checkpointing on/off, compile on/off, etc...

Under the hood, the flags look like this:
SPEED_FLAGS = {
    "compile":
        {
            "values": [True],
        },
    "fsdp_sharding_strategy":
        {
            "values": ["NO_SHARD"],
            "allowed_recipes": ["lora_finetune_distributed", "full_finetune_distributed"]
        },
}

Blockers
Want these three low hanging fruits to land first:

Configurable FSDP: https://github.com/pytorch/torchtune/pull/1024
Expandable segments: https://github.com/pytorch/torchtune/issues/1185
compile model+loss: https://github.com/pytorch/torchtune/issues/1228

Run:
python profile_config.py --yaml_name llama3_1/8B_lora_single_device --recipe_type lora_finetune_single_device
Outputs (still needs polishing):

max_seq_len = 1024

description
memory Vs default (%)
toks/s vs default (%)
batch_size
max_seq_len
max_peak_memory_alloc
mean_tokens_per_second_per_gpu

config_Default
0
0
1
1024
28.97
1636.5

config_AllMemoryOptimization
-30.62
-8.49
1
1024
20.1
1497.53

config_AllSpeedOptimization
-5.11
9.19
1
1024
27.49
1786.84

enable_activation_checkpointing-True
-29.72
-19.56
1
1024
20.36
1316.32

minimal_lora-rank_8__qv_proj_only
-11.32
7.71
1
1024
25.69
1762.66

compile-True
-5.11
9.06
1
1024
27.49
1784.82

optimizer.component-bitsandbytes.optim.PagedAdamW8bit
-0.48
-6.42
1
1024
28.83
1531.44

optimizer_in_bwd-True
0
0.41
1
1024
28.97
1643.22

memory_efficient_fsdp_wrap-False
0
0.32
1
1024
28.97
1641.78

fsdp_sharding_strategy-NO_SHARD
0
0.27
1
1024
28.97
1640.97

fsdp_cpu_offload-True
0
0.08
1
1024
28.97
1637.74

max_seq_len = 4096

description
memory Vs default (%)
toks/s vs default (%)
batch_size
max_seq_len
max_peak_memory_alloc
mean_tokens_per_second_per_gpu

config_Default
0
0
1
4096
61.23
2286.6

config_AllMemoryOptimization
-58.03
-13.49
1
4096
25.7
1978.14

config_AllSpeedOptimization
-9.64
13.99
1
4096
55.33
2606.41

enable_activation_checkpointing-True
-57.54
-23.13
1
4096
26
1757.64

minimal_lora-rank_8__qv_proj_only
-20.22
8.47
1
4096
48.85
2480.22

compile-True
-9.64
13.72
1
4096
55.33
2600.22

optimizer.component-bitsandbytes.optim.PagedAdamW8bit
-0.23
-2.67
1
4096
61.09
2225.47

fsdp_cpu_offload-True
0
-0.18
1
4096
61.23
2282.41

fsdp_sharding_strategy-NO_SHARD
0
-0.19
1
4096
61.23
2282.29

optimizer_in_bwd-True
0
-0.21
1
4096
61.23
2281.8

memory_efficient_fsdp_wrap-False
0
-0.29
1
4096
61.23
2280.05

These are really interesting experiments. What would be a bit more helpful is to plot each combination of (bsz, max_seq_len) on a single plot with the two axes being WPS and peak memory. That way I can immediately see the tradeoff between memory and speed. Although, with the way it's laid out now, I find it interesting that increasing max seq len does increase throughput upto a certain point, then it hurts it. And batch size seems to be the biggest contributor to increasing throughput, even over the speed optimized config.
Another thing that would be helpful is if you could list out what flags you're modifying for the memory and speed optimized configs.


Failed to resolve a dependency

Failed to resolve: com.androidhuman.rxfirebase2:firebase-core:<IP_ADDRESS>
What I'm doing wrong?

Same here

will look into this as soon as possible.
2018년 6월 19일 (화) 오후 10:31, mdelbo<EMAIL_ADDRESS>작성:

Same here
—
You are receiving this because you are subscribed to this thread.
Reply to this email directly, view it on GitHub
https://github.com/kunny/RxFirebase/issues/37#issuecomment-398399501,
or mute the thread
https://github.com/notifications/unsubscribe-auth/ABhdmFXzvfHyyCTtbxS--c4tbU79u11uks5t-P0YgaJpZM4UpCH_
.

--
김태호 (Taeho Kim)
Software Engineer, Android

A new version that fixed this issue has released. However, please note that you have to declare firebase-core artifact as well, since Firebase changed its artifact release strategy.
Please refer to updated README for more details.


Feature understandings

I am setting up my environment to make a switch from Swarm to Overnode, but have some questions, before I pull the trigger. Apologizes upfront if the docs exist - I did look before posting, and happy to have links to docs as answers.
How would a compose file entry with the below section be entered for Overnode? Is this native support, or does it require something different?
deploy:
mode: replicated
replicas: 3
placement:
max_replicas_per_node: 1
I have a macvlan setup for a home-assistant container, such that it can interact with various broadcast devices. Does the Weavenet implementation handle this by default (ie. will it route broadcast messages received by the NICs of the devices to all containers), or allow for it somehow? I need the container on the bridge network as well, hence I'm not running it in host mode.
I've made the assumption Overnode orchestration will redeploy a container that was running on a node that has failed to a new node, similar to K3s, or Swarm - but it doesn't appear to actually say that anywhere. Is this assumption incorrect?

Hi,
The overnode does not move containers. The placement is static. It is by design to make app design and troubleshooting easy. However, you still can achieve high-availability. Make sure you have got 2 or more nodes running an instance of the same service. And place haproxy or similar in front of it. HAProxy will automatically route the traffic to alive instance(s).
I think, the replicas configuration in the compose file is ignored by standalone docker-compose (ie. not in swarm mode), which is used by overnode.

I have a macvlan setup for a home-assistant container, such that it can interact with various broadcast devices. Does the Weavenet implementation handle this by default (ie. will it route broadcast messages received by the NICs of the devices to all containers), or allow for it somehow? I need the container on the bridge network as well, hence I'm not running it in host mode.

Regarding this one. I can not answer this question because I do not fully understand it. But general considerations are the following:

each host will listen to the ports of exposed containers (you need to define in the compose file which ports to expose)
containers within the cluster can proxy the traffic, multiplex, discard or whatever. It is up to you what containers (apps) you use and how you configure it.
weavenet will assist with traffic going between the containers in the cluster (regardless on what nodes they are running) and will assist with traffic going in/out of the cluster via the exposed ports.

Thank you for the fast responses! Not a match for my use case unfortunately. I was really interested in the integrated prom stack.

No worries. But I suggest you think again. Whatever you can do on a bare VM hosts, you can actually do in containers via overnode.

You usecase is very usual and can be done with overnode quite easily. Each of your nodes will have 1 haproxy container running and exposing port (eg. 8123 from your example) on a host. This haproxy container will send the traffic to your upstream web backend within the cluster network. So no matter where your backend is running, it will be accessible on each node. Here is the example for haproxy + grafana web backend: https://github.com/overnode-org/overnode/tree/master/examples/infrastructure/grafana

As a second option, which you probably do not realise, is that it is possible to use other networks with overnode. I believe your compose example will work with overnode too. It means you would not use the network created by overnode for your application, but you will use the overnode network to launch the containers by overnode. Not sure why you would use this option as the point 1 above is easier to implement and maintain, but you can do this too.

Hope it helps.

The first option doesn't solve the use case it is just a proxy setup for a single exposed port, in my example the web gui - this is the out of the box usage. The use case is the macvlan, which allow the container to receive broadcast packets to random and from random ports - because logically the container sits directly on the domain with an IP and MAC.
The second option actually might work, if Overnode allows me to join other networks - in this case the macvlan network, but still routes the exposed port via weavenet.

if Overnode allows me to join other networks - in this case the macvlan network, but still routes the exposed port via weavenet.

It would allow to join other networks. Not sure what you mean "routes the exposed port via weavenet". If your incoming traffic comes to macvlan exposed port, your service would be responsible to listen to this traffic and do something about it or proxy to other backend service containers, which would be accessible via weavenet cluster network. I frequently use socat container to wire a traffic on host to the weavenet, for example: https://github.com/overnode-org/overnode/blob/master/examples/infrastructure/loki/loki/link.yml#L13


Methond to Method

Typo fixed.

CI gfxreconstruct build queued with queue ID 89840.

CI gfxreconstruct build # 3554 running.

CI gfxreconstruct build # 3554 passed.


My node disappered on general dashboard

At the 25th or 26th of its running period my node is not listed on the general dashboard. I checked it out with /node/ too but it is stated 'Unknown node ID'.
Meanwhile I have checked out my node ID:8099 and saw that the node is still working in its 26th day.
I have connected to the VPS that I am running the node and tried to do some transections on concordium.client. I have tried two transections; first one between the accounts connected to the node and it was finalized successfully.
Then I found a random concordium account adress on git hub and sent a transection to that address it was also finalized successfully.
Now the node is still not shown on dashboard.
I am sending screenshots.

Discussion ongoing in same issue reported to email support. Will close report here.


com.facebook.sdk.login error 308

Hey,
I'm using react-native-facebook-login since 5 months, but i've update xcode to 8.0 and now when i'm trying to signin with facebook on simulator (on iOS 10)
i get this error :
The operation could not be completed com.facebook.sdk.login error 308.
How can i fix it ?

You saved my day!

i've found my error.
You need to head over to the “Capabilities” section in Xcode and enable “Keychain Sharing”.

Enabling Keychain Sharing now solved, any other solution?


Make create_type/0 reversible

Ecto 2.2 added Ecto.Migration.execute/2 which defines a reversible SQL operation. It would be handy if this was used in the definition of create_type/0 :)

Thanks for the contribution, @xtian! 💯


feat(svg): support gradients and patterns for background color in SVG renderer

SVG renderer now supports using gradients and patterns as background and pattern supports repeat strategy (repeat-x, repeat-y, no-repeat).

Fix a bug in the canvas renderer - the gradient background isn't updated due to the cache after resizing.
Refer to the commit https://github.com/ecomfe/zrender/commit/81a890320c0b083317ddf10d6150b95bc9703882.

Reproduction link for radial gradient
Reproduction link for linear gradient

Enhance encodeBase64 compatibility.

Resolves apache/echarts#17029
Resolves apache/echarts#17735

hi @plainheart
Is there a plan to publish the changes?

@zhiqingchen We are going to prepare for releasing v5.4.1 this week. Please keep an eye on it. :)


add support for Actions

This will allow for PORO support, in addition to integrating with ActionMailer.
In the future, we should rename mailings to messages and change the inference that Caffeinate only handles ActionMailer-based stuff to any-based stuff.
Resolves https://github.com/joshmn/caffeinate/issues/14
cc @jon-sully

Thanks for being so on this! I might need a little time to fully grok the idea of the Action ("built your on ___'er" like my Text'er) and feel which parts of the abstraction it covers. Will review though!

Thanks for being so on this! I might need a little time to fully grok the idea of the Action ("built your on ___'er" like my Text'er) and feel which parts of the abstraction it covers. Will review though!

Sure! The idea here is just to create something that works just like ActionMailer::Base (with the delegation to instance methods):
class UserMailer < ActionMailer::Base
  def welcome(mailing)
  end
end

to
class UserAction < Caffeinate::Action
  def welcome(mailing)
  end
end

Can be invoked the same.
This means that internal changes remain minimal. If, from an Action, a developer needs to break out, they can:
class UserAction < Caffeinate::Action
  def welcome(mailing)
    SomeThing.new # whatever
  end
end

It's kind of hacky, kind of gross, but I didn't want to make a ton of internal changes. Right now, as is, Action-based drips won't support Caffeinate's deliver_later support but that's just because I'm kind of lazy right now.

class ApplicationTexter
  acts_like_action_mailer

  def deliver
    # Developer should implement logic here for how to synchronously do their delivery in whatever medium this is
  end
end

class UserTexter < ApplicationTexter
  def welcome(texting)
    @user = texting.subscriber
    @external_number = @user.phone
    @internal_number = Rails.config.company_texting_number
  end
end

# dripper setup
class RandomDripper
  drip :welcome, sender: :user_texter, delay: 30.minutes
end

# Caffeinate effectively calls this under the hood?
message = UserTexter.welcome(mailing)
message.deliver
# pretty similar to ActionMailer?

Just some API ideas coming to mind 🤔 trying to think about how all of this would come together for a third delivery mechanism. Mailers, Texters, maybe WebPushers?

@jon-sully Ahhh I see your thinking now! Pushing up a change that reflects that use-case. Watch this.

So here's the situation now:
There's the Action which will implement #deliver (following pattern of Mail::Message). Then we'll fall into #do_delivery (again like Mail::Message) and use its delivery_method logic to handle deliver.
I imagine:
class FancyClient
  def initialize(phone_number, message)
    @phone_number = phone_number
    @message = message
  end

  def deliver!
    HTTParty.post ...
  end
end

class UserAction < Caffeinate::Action
  def welcome(mailing)
    FancyClient.new(mailing.subscriber.phone_number, "welcome")
  end
end

And then under the hood, all should be well..............

🤔 I've given this a good read-over and mulled it in my head but I think I just feel like of lukewarm about it, personally — trying to pinpoint why, exactly. I think what I like about my project's current Texter setup is that Texters are technically independent of Caffeinate altogether; their sole goal is to implement the ActionMailer API on the outside but send texts instead. In that way, Caffeinate doesn't need to know anything special about them at all.
The entire footprint for spoofed integration is that a new ActionMailer 'spoofer' must:

Receive an unknown class method and convert it to an instance method on a new instance
Return something from that instance method call which can receive:

#deliver to 'do the delivering process'
#perform_deliveries= as a flag for whether or not the delivery should go ahead
#caffeinate_mailing= as a temporary pointer to what prompted the message

And should call Caffeinate::ActionMailer::Interceptor.delivering_email self at the beginning of the #deliver method
And should update the @caffeinate_mailing after the delivery work is done

And in practice, I don't think that's actually that much code:
class ApplicationTexter
  # NOTE: Delegates unknown class methods to a new instance
  class << self
    delegate_missing_to :new
  end

  attr_accessor :caffeinate_mailing
  attr_writer :perform_deliveries

  def deliver
    @perform_deliveries ||= true
    Caffeinate::ActionMailer::Interceptor.delivering_email self
    return unless @perform_deliveries

    @sms.save!
    @sms.send!

    if caffeinate_mailing
      caffeinate_mailing.update!(sent_at: Caffeinate.config.time_now, skipped_at: nil)
      caffeinate_mailing.caffeinate_campaign.to_dripper.run_callbacks(:after_send, caffeinate_mailing, self)
    end
  end

  def render(template_name = nil)
    # helper to render SMS body from view html.erb files
  end

  def message(kwargs)
    tap do
      @sms = Sms.new(kwargs)
    end
  end
end

And this particular setup means that subclasses (in parity with ActionMailer) are pretty simple:
class UserTexter < ApplicationTexter
  def long_term_followup(texting)
    @user = texting.subscriber.decorate

    message(
      sender: Rails.robot,
      recipient: @user,
      internal_number: Rails.config.our_phone_number,
      external_number: @user.phone,
    )
  end
end

So these follow the ActionMailer-style API without any Caffeinate classes / inheritance:
# how you would use one directly
UserTexter.long_term_followup(params).deliver

# how you'd use one in a dripper, it wouldn't know any better!
class WelcomeDripper
  drip :long_term_followup, mailer: :UserTexter, delay: 2.days
end

So the question (to me) becomes, okay what can Caffeinate offer that simples / removes some of this ^ code and makes my life as the developer simpler? And that's challenging because I still want to uphold the ActionMailer-style API of Class.method(args).deliver so that these Texters can be used elsewhere too.
I like the idea that Caffeinate::Action automatically covers the "pre-send" and "after-send" logic so that I wouldn't have to call Caffeinate::ActionMailer::Interceptor.delivering_email self and caffeinate_mailing.update!... myself; that's a win!
I also like that Caffeinate::Action smooths over the "class method but it's an instance" funkiness that ActionMailer does  for me too; so I can remove the class << self; delegate_missing_to :new stuff from my class.
But beyond those two things, I'm pretty sure I'd still need the rest of my code in place, right? And ApplicationTexter would be inheriting from Caffeinate::Action (which is fine since it currently is a PORO) but I'd still have two layers — the ApplicationTexter then individual Texters by recipient (per ActionMailer's norms). So still the same number of files.
That's kind of where I'm at — trying to weigh the balance of having to inherit from another class (which wouldn't work if my Texters were already inheriting from something) for the sake of saving some code (which is valuable for sure) at the cost of more complexity and machinery.
And, I should totally note, I don't mean any of this negatively and I love the stuff you built in this PR! Just hope to iterate toward a solid API that feels natural to Texters (or WebPushers, or etc.) in their own stand-alone context

Sorry for the delayed reply. Was doing interviews all day.
@jon-sully these are great points.

And in practice, I don't think that's actually that much code:

I don't think it is either. But, I don't want to make the user (developer) to have to think — having one way of doing things means it's less brittle, and keeping that footprint as small as possible is one way of doing this.

But beyond those two things, I'm pretty sure I'd still need the rest of my code in place, right?

I probably should have shown what your stuff would look like if this was merged. I'd like to think it's much cleaner and has even less surface area. You'd remove your ApplicationTexter, too.
If you tell yourself a Caffeinate::Action is the equivalent to Mail::Message I think it might be more palatable.
class TexterAction < Caffeinate::Action
  class Envelope
    def initialize(user)
      @sms = Sms.new(
        sender: Rails.robot,
        recipient: user,
        internal_number: Rails.config.our_phone_number,
        external_number: user.phone,
        )
    end

    def deliver!
      # whatever else you need to compose
      @sms.save!
      @sms.send!
    end
  end

  def long_term_followup(texting)
    user = texting.subscriber.decorate

    Envelope.new(user)
  end
end

I am personally a huge fan of this because of how contained it is and how predictable it is, and how testable it is. I can make sure that Envelope is handling everything correctly, and I can let Caffeinate do the work about whether or not it should be delivered, if the mailing (texting) should be marked as sent, etc.
Let me know if this helps clarify things or if you have further thoughts. Again, I haven't had this use-case yet myself (and that's ultimately how personally find things I need to build — usually after many iterations) so I have the obvious blindspots. The goal of Caffeinate is to provide a way of scheduling and executing some action on/at/after a specific time, and hiding the logic surrounding that is key so that the user doesn't end up shooting themselves in the foot.

For parity with ActionMailer I think we want to use #deliver not #deliver! (with the exclamation mark)

They delegate to the Mail::Message (action_mailer/message_delivery.rb). I added the bang though. These won't work with async delivery as it sits. Need to document that and improve upon it.

We should make sure that this will work for actions that inherit from Caffeinate::Action but are invoked outside of the Caffeinate context.

I'd need to see a use case for that to agree; how would that work when you're not passing it a mailing? They're expected to take a mailing object and a mailing object only. Kind of funky thing to check side the method definition, no?

I think we should bolster the docs a little more with this one.

Same.
RE: converting names — v3.0 :)

If you tell yourself a Caffeinate::Action is the equivalent to ActionMailer::Base, and the subsequent Envelope is a Mail::Message, I think it might be more palatable. :)

Ah! 💡 There is is. Yep, bringing in Envelope made it much more clear and yeah, this does actually. help to get more in line with ActionMailer's "mailer vs. Mail object" paradigm.
Probably would still need a top-level Texter and subclasses (the same way that we typically have ApplicationMailer < ActionMailer::Base and UserMailer < ApplicationMailer) since those subclasses are typically subclassed per-recipient (e.g. we have Users and Agents, so we'd want a UserTexter and AgentTexter) and the Envelope definition would probably live up in the root Texter, but I think that's actually fine.
Thanks for circling back on that example! Since examples make the whole thing more visible, here's how I'd envision this whole thing working from my eyes (still the same Caffeinate::Action code):
class ApplicationTexter < Caffeinate::Action
  class Envelope
    def initialize(kwargs)
      @sms = Sms.new(kwargs.reverse_merge(
        sender: Rails.robot,
        direction: :outbound
      ))
    end

    def deliver!(action)
      @action.action_name # :long_term_followup
      @sms.save!
      @sms.send!
    end
  end

  def message(kwargs)
    Envelope.new kwargs.reverse_merge(
      body: render
    )
  end

  def render
    # finds the appropriate view file w/ application renderer
  end
end

# -----

class UserTexter < ApplicationMailer
  def long_term_followup(texting)
    @user = texting.subscriber.decorate

    message(
      external_number: @user.mobile,
      internal_number: Rails.config.our_phone_number,
      recipient: @user
    )
  end
  # view at: app/views/user_texter/long_term_followup.text.erb
end

class AgentTexter < ApplicationMailer
  def getting_started_followup(texting)
    @agent = texting.subscriber.decorate

    message(
      external_number: @agent.mobile,
      internal_number: Rails.config.our_phone_number,
      recipient: @agent
    )
  end
  # view at: app/views/agent_texter/getting_started_followup.text.erb
end

I think you're close with this example. I think the Envelope's #deliver! should handle the render body. Something like:
class ApplicationTexter < Caffeinate::Action
  class Envelope
    def initialize(kwargs)
      @sms = Sms.new(kwargs.reverse_merge(
        sender: Rails.robot,
        direction: :outbound
      ))
    end

    def deliver!(action)
      @sms.body = render(action)
      @sms.save!
      @sms.send!
    end

    private
    def render(action)
      # action.action_name
    end
  end
end

I added the bang though

We could probably support both #deliver and #deliver! Just checking for either/or and calling as such. I suppose just as well, Envelope could also just alias too.

I think you're close with this example. I think the Envelope's #deliver! should handle the render body. Something like:

I agree! I realized that after finishing my last comment since action_name being available makes the hard part of rendering much easier (knowing which template to render!).

I'd need to see a use case for that to agree; how would that work when you're not passing it a mailing? They're expected to take a mailing object and a mailing object only. Kind of funky thing to check side the method definition, no?

Sure; I have a real example for you. We have a UserTexter that is responsible for firing off texts from a few different contexts:

When called directly somewhere in the app, passing params directly (such as a 2FA code)
When called by Caffeinate for running a drip callback
When sending a Notification message via Noticed

In each of these cases the method in question receives slightly different arguments, but that's okay:
class UserTexter < ApplicationMailer
  # From a Caffeinate drip
  def long_term_followup(texting)
    @user = texting.subscriber.decorate

    message(
      external_number: @user.mobile,
      internal_number: Rails.config.our_phone_number,
      recipient: @user
    )
  end

  # Called directly somewhere in the app:
  # UserTexter.two_factor_code(@user).deliver
  def two_factor_code(user)
    @code = user.two_factor_code

    message(external_number: user.mobile, internal_number: "123")
  end

  # Invoked by Noticed
  # (Which calls under the hood: UserTexter.new_comment_notification(comment: SomeComment).deliver)
  def new_comment_notification(params)
    @comment = params[:comment]

    message(external_number: user.mobile, internal_number: "123", recipient: user)
  end
end

So that's 3 different ways that Texter (or mailer) methods can work slightly differently for different context. They do receive different arguments, but I'm just saying that we'll want to make sure that direct-invocation (like two_factor_code) doesn't blow up when you try to run UserTexter.two_factor_code(@user).deliver because the Caffeinate middleware is trying to run pre- or post-hooks looking for a mailing that doesn't exist

Sure; I have a real example for you. We have a UserTexter that is responsible for firing off texts from a few different contexts:

The design here makes it so that we don't care about the underlying return of the object (from the Action) since it's processed independently. :) Normally, Caffeinate looks at the returning Mail::Message object and checks for a caffeinate_mailing attr. Here, we achieve the same since we're going through a Caffeinate::Action and handling the funky method_missing which allows us to intercept and instantiate something that we do care about (and apply the necessary mailing).


Enable Pull Dog for the repository

I sent you an e-mail about this @deviantony, along with a video that demonstrates the whole thing. This pull request assumes you've watched the video first.
It's important that you install the GitHub app before merging this. If you don't, Pull Dog will not detect that the repo has been set up.
As per the video (and as you can see in pull-dog.json), lazy mode has been enabled, meaning that a POST request from the build server will be needed before Pull Dog starts.
The POST request that has to be made is of the following form:
POST https://dogger.io/api/pull-dog/provision
{
	"repositoryHandle": "59239347",
	"apiKey": "<your API key from the dashboard, as seen in the video>",
	"commitReference": "<GIT commit ID>",
	"configuration": {
		"buildArguments": {
			"PORTAINER_TAG": "develop"
		}
	}
}

The GIT commit ID can be fetched from the build server using git rev-parse --short HEAD.
The PR that was used in the video is here (apparently the video got really blurry): https://github.com/pull-dog-user/portainer/pull/1
You have been invited to my fork, in case you want to play around with it there instead.

I sent yet another email with a video link that has better quality.

Thanks @ffMathy :-)

@deviantony I hope it'll work out for you! Also, this was targeted develop. It needs to be in master for it to work.

I've added it to the master branch.


Polymorphing does not revert correctly for NPC Actors

Reproduction Steps:

Copy Bandit and Mammoth from dnd5e srd compendium
Drag Bandit onto canvas
Drag Mammoth onto Bandit Sheet
Observe new Bandit (Mammoth) Sheet does not a have a revert button
Reopen the sheet and use the new button to revert
Observe that the button initially reverts the token size but nothing else seems to change.
No errors are thrown though there are some deprecation warnings

https://user-images.githubusercontent.com/52298102/199598461-bf687403-b9b5-4762-afb5-d5f28e7db13f.mp4
Comparison: Original Bandit Vs 'Reverted' Bandit

Duplicate of #1823


pull request for e2e test at 12/12/2016 07:15:02

:white_check_mark: Validation status: passed

File
Status
Preview URL
Details

optest/docs/updated_at.md
:white_check_mark:Succeeded

For more details, please refer to the build report.
Note: If you changed an existing file name or deleted a file, broken links in other files to the deleted or renamed file are listed only in the full build report.


wsmancli: fix compilation

Motivation for this change
Without this fix the package build fails with a linking error. Fixes #14872.
Things done

[X] Tested using sandboxing
(nix.useChroot on NixOS,
or option build-use-chroot in nix.conf
on non-NixOS)
Built on platform(s)

[X] NixOS
[ ] OS X
[ ] Linux

[X] Tested compilation of all pkgs that depend on this change using nix-shell -p nox --run "nox-review wip"
[X] Tested execution of all binary files (usually in ./result/bin/)
[X] Fits CONTRIBUTING.md.

Merged in 28f17215b9ad833f73483b7aac2065a9a4329b1d.