code splitting example with webpack 2

Hi, webpack has released 2.2.0, so we can use import to load module dynamically, so I think an official example about react-router and webpack 2  is very necessary.

That would be fantastic, been trying to figure out this problem today myself.

I added Promise support to the async functions in #3719. There are some examples in the tests: https://github.com/ReactTraining/react-router/pull/3719/files#diff-7f51f7b8bcc1ab598f60a81f4bc21724
This is probably better represented as a PR. If you want to put something together, we can definitely work on getting it added in.

So will this work?
<Route path='/page' render={() => import('./components/page')} />

Will webpack effectively split my code by creating a "page.js" file and requesting it only when I navigate to the url /page?


tests/microgrid/test_client.py is flaky

What happened?
Lately we failures on tests/microgrid/test_client.py very often. In particular:
tests/microgrid/test_client.py::TestMicrogridGrpcClient::test_inverter_data FAILED [ 35%]
tests/microgrid/test_client.py::TestMicrogridGrpcClient::test_ev_charger_data FAILED [ 36%]
tests/microgrid/test_client.py::TestMicrogridGrpcClient::test_charge FAILED [ 36%]
tests/microgrid/test_client.py::TestMicrogridGrpcClient::test_discharge FAILED [ 36%]
tests/microgrid/test_client.py::TestMicrogridGrpcClient::test_set_bounds FAILED [ 36%]

What did you expect instead?
Test should always pass.
Affected version(s)
v0.25ish
Affected part(s)
Microgrid (API, component graph, etc.) (part:microgrid), Unit, integration and performance tests (part:tests)
Extra information

`pytest` logs for the failure
=========================== short test summary info ============================
FAILED tests/microgrid/test_client.py::TestMicrogridGrpcClient::test_inverter_data - grpc.aio._call.AioRpcError: <AioRpcError of RPC that terminated with:
	status = StatusCode.UNAVAILABLE
	details = "Failed to list components. Microgrid API: [::]:57899. Err: failed to connect to all addresses; last error: UNKNOWN: ipv6:%5B::%5D:57899: Failed to connect to remote host: Connection refused"
	debug_error_string = "UNKNOWN:failed to connect to all addresses; last error: UNKNOWN: ipv6:%5B::%5D:57899: Failed to connect to remote host: Connection refused {created_time:"2023-09-12T08:55:10.296421026+00:00", grpc_status:14}"
>
FAILED tests/microgrid/test_client.py::TestMicrogridGrpcClient::test_ev_charger_data - grpc.aio._call.AioRpcError: <AioRpcError of RPC that terminated with:
	status = StatusCode.UNAVAILABLE
	details = "Failed to list components. Microgrid API: [::]:57899. Err: failed to connect to all addresses; last error: UNKNOWN: ipv6:%5B::%5D:57899: Failed to connect to remote host: Connection refused"
	debug_error_string = "UNKNOWN:failed to connect to all addresses; last error: UNKNOWN: ipv6:%5B::%5D:57899: Failed to connect to remote host: Connection refused {created_time:"2023-09-12T08:55:10.390244461+00:00", grpc_status:14}"
>
FAILED tests/microgrid/test_client.py::TestMicrogridGrpcClient::test_charge - grpc.aio._call.AioRpcError: <AioRpcError of RPC that terminated with:
	status = StatusCode.UNAVAILABLE
	details = "Failed to set power. Microgrid API: [::]:57899. Err: failed to connect to all addresses; last error: UNKNOWN: ipv6:%5B::%5D:57899: Failed to connect to remote host: Connection refused"
	debug_error_string = "UNKNOWN:failed to connect to all addresses; last error: UNKNOWN: ipv6:%5B::%5D:57899: Failed to connect to remote host: Connection refused {created_time:"2023-09-12T08:55:10.422726408+00:00", grpc_status:14}"
>
FAILED tests/microgrid/test_client.py::TestMicrogridGrpcClient::test_discharge - grpc.aio._call.AioRpcError: <AioRpcError of RPC that terminated with:
	status = StatusCode.UNAVAILABLE
	details = "Failed to set power. Microgrid API: [::]:57899. Err: failed to connect to all addresses; last error: UNKNOWN: ipv6:%5B::%5D:57899: Failed to connect to remote host: Connection refused"
	debug_error_string = "UNKNOWN:failed to connect to all addresses; last error: UNKNOWN: ipv6:%5B::%5D:57899: Failed to connect to remote host: Connection refused {created_time:"2023-09-12T08:55:10.484575096+00:00", grpc_status:14}"
>
FAILED tests/microgrid/test_client.py::TestMicrogridGrpcClient::test_set_bounds - assert 4 == 0
 +  where 4 = len([target_metric: TARGET_METRIC_POWER_ACTIVE\nbounds {\n  lower: -10\n  upper: 2\n}\n, component_id: 1\ntarget_metric: TARGET_METRIC_POWER_ACTIVE\nbounds {\n  lower: -10\n  upper: 2\n}\n, component_id: 2\ntarget_metric: TARGET_METRIC_POWER_ACTIVE\nbounds {\n  lower: -10\n  upper: 2\n}\n, component_id: 3\ntarget_metric: TARGET_METRIC_POWER_ACTIVE\nbounds {\n  lower: -10\n  upper: 2\n}\n])
 +  and   0 = len([])
 +    where [] = <bound method MockMicrogridServicer.get_bounds of <tests.microgrid.mock_api.MockMicrogridServicer object at 0x7fde85ebc150>>()
 +      where <bound method MockMicrogridServicer.get_bounds of <tests.microgrid.mock_api.MockMicrogridServicer object at 0x7fde85ebc150>> = <tests.microgrid.mock_api.MockMicrogridServicer object at 0x7fde85ebc150>.get_bounds
================= 5 failed, 360 passed, 10 warnings in 47.42s ==================

=================================== FAILURES ===================================
__________________ TestMicrogridGrpcClient.test_inverter_data __________________

self = <frequenz.sdk.microgrid.client._client.MicrogridGrpcClient object at 0x7fde865fc050>

    async def components(self) -> Iterable[Component]:
        """Fetch all the components present in the microgrid.

        Returns:
            Iterator whose elements are all the components in the microgrid.

         If the application cancels immediately after
            # the Call object is created, we will observe this
            # `CancelledError`.
            if not self.cancelled():
                self.cancel()
            raise

        # NOTE(lidiz) If we raise RpcError in the task, and users doesn't
        # 'await' on it. AsyncIO will log 'Task exception was never retrieved'.
        # Instead, if we move the exception raising here, the spam stops.
        # Unfortunately, there can only be one 'yield from' in '__await__'.

        Returns:
            Iterator whose elements are all the components in the microgrid.

        Raises:
            AioRpcError: if connection to Microgrid API cannot be established or
                when the api call exceeded timeout
        """
        try:
            # grpc.aio is missing types and mypy thinks this is not awaitable,
            # but it is
            component_list = await self.api.ListComponents(
                microgrid_pb.ComponentFilter(),
                timeout=DEFAULT_GRPC_CALL_TIMEOUT,  # type: ignore[arg-type]
            )  # type: ignore[misc]
        except grpc.aio.AioRpcError as err:
            msg = f"Failed to list components. Microgrid API: {self.target}. Err: {err.details()}"
>           raise grpc.aio.AioRpcError(
                code=err.code(),
                initial_metadata=err.initial_metadata(),
                trailing_metadata=err.trailing_metadata(),
                details=msg,
                debug_error_string=err.debug_error_string(),
            )
E           grpc.aio._call.AioRpcError: <AioRpcError of RPC that terminated with:
E           	status = StatusCode.UNAVAILABLE
E           	details = "Failed to list components. Microgrid API: [::]:57899. Err: failed to connect to all addresses; last error: UNKNOWN: ipv6:%5B::%5D:57899: Failed to connect to remote host: Connection refused"
E           	debug_error_string = "UNKNOWN:failed to connect to all addresses; last error: UNKNOWN: ipv6:%5B::%5D:57899: Failed to connect to remote host: Connection refused {created_time:"2023-09-12T08:55:10.296421026+00:00", grpc_status:14}"
E           >

src/frequenz/sdk/microgrid/client/_client.py:238: AioRpcError
_________________ TestMicrogridGrpcClient.test_ev_charger_data _________________

self = <frequenz.sdk.microgrid.client._client.MicrogridGrpcClient object at 0x7fde86409fd0>

    async def components(self) -> Iterable[Component]:
        """Fetch all the components present in the microgrid.

        Returns:
            Iterator whose elements are all the components in the microgrid.

         If the application cancels immediately after
            # the Call object is created, we will observe this
            # `CancelledError`.
            if not self.cancelled():
                self.cancel()
            raise

        # NOTE(lidiz) If we raise RpcError in the task, and users doesn't
        # 'await' on it. AsyncIO will log 'Task exception was never retrieved'.
        # Instead, if we move the exception raising here, the spam stops.
        # Unfortunately, there can only be one 'yield from' in '__await__'.

        Returns:
            Iterator whose elements are all the components in the microgrid.

        Raises:
            AioRpcError: if connection to Microgrid API cannot be established or
                when the api call exceeded timeout
        """
        try:
            # grpc.aio is missing types and mypy thinks this is not awaitable,
            # but it is
            component_list = await self.api.ListComponents(
                microgrid_pb.ComponentFilter(),
                timeout=DEFAULT_GRPC_CALL_TIMEOUT,  # type: ignore[arg-type]
            )  # type: ignore[misc]
        except grpc.aio.AioRpcError as err:
            msg = f"Failed to list components. Microgrid API: {self.target}. Err: {err.details()}"
>           raise grpc.aio.AioRpcError(
                code=err.code(),
                initial_metadata=err.initial_metadata(),
                trailing_metadata=err.trailing_metadata(),
                details=msg,
                debug_error_string=err.debug_error_string(),
            )
E           grpc.aio._call.AioRpcError: <AioRpcError of RPC that terminated with:
E           	status = StatusCode.UNAVAILABLE
E           	details = "Failed to list components. Microgrid API: [::]:57899. Err: failed to connect to all addresses; last error: UNKNOWN: ipv6:%5B::%5D:57899: Failed to connect to remote host: Connection refused"
E           	debug_error_string = "UNKNOWN:failed to connect to all addresses; last error: UNKNOWN: ipv6:%5B::%5D:57899: Failed to connect to remote host: Connection refused {created_time:"2023-09-12T08:55:10.390244461+00:00", grpc_status:14}"
E           >

src/frequenz/sdk/microgrid/client/_client.py:238: AioRpcError
_____________________ TestMicrogridGrpcClient.test_charge ______________________

self = <frequenz.sdk.microgrid.client._client.MicrogridGrpcClient object at 0x7fde85dbac90>
component_id = 83, power_w = 12

    async def set_power(self, component_id: int, power_w: float) -> None:
        """Send request to the Microgrid to set power for component.

        If power > 0, then component will be charged with this power.
        If power < 0, then component will be discharged with this power.
        If power == 0, then stop charging or discharging component.

        Args:
            component_id: id of the component to set power.
            power_w: power to set for the component.

         If the application cancels immediately after
            # the Call object is created, we will observe this
            # `CancelledError`.
            if not self.cancelled():
                self.cancel()
            raise

        # NOTE(lidiz) If we raise RpcError in the task, and users doesn't
        # 'await' on it. AsyncIO will log 'Task exception was never retrieved'.
        # Instead, if we move the exception raising here, the spam stops.
        # Unfortunately, there can only be one 'yield from' in '__await__'.

        If power > 0, then component will be charged with this power.
        If power < 0, then component will be discharged with this power.
        If power == 0, then stop charging or discharging component.

        Args:
            component_id: id of the component to set power.
            power_w: power to set for the component.

        Raises:
            AioRpcError: if connection to Microgrid API cannot be established or
                when the api call exceeded timeout
        """
        try:
            await self.api.SetPowerActive(
                microgrid_pb.SetPowerActiveParam(
                    component_id=component_id, power=power_w
                ),
                timeout=DEFAULT_GRPC_CALL_TIMEOUT,  # type: ignore[arg-type]
            )  # type: ignore[misc]
        except grpc.aio.AioRpcError as err:
            msg = f"Failed to set power. Microgrid API: {self.target}. Err: {err.details()}"
>           raise grpc.aio.AioRpcError(
                code=err.code(),
                initial_metadata=err.initial_metadata(),
                trailing_metadata=err.trailing_metadata(),
                details=msg,
                debug_error_string=err.debug_error_string(),
            )
E           grpc.aio._call.AioRpcError: <AioRpcError of RPC that terminated with:
E           	status = StatusCode.UNAVAILABLE
E           	details = "Failed to set power. Microgrid API: [::]:57899. Err: failed to connect to all addresses; last error: UNKNOWN: ipv6:%5B::%5D:57899: Failed to connect to remote host: Connection refused"
E           	debug_error_string = "UNKNOWN:failed to connect to all addresses; last error: UNKNOWN: ipv6:%5B::%5D:57899: Failed to connect to remote host: Connection refused {created_time:"2023-09-12T08:55:10.422726408+00:00", grpc_status:14}"
E           >

src/frequenz/sdk/microgrid/client/_client.py:587: AioRpcError
____________________ TestMicrogridGrpcClient.test_discharge ____________________

self = <frequenz.sdk.microgrid.client._client.MicrogridGrpcClient object at 0x7fde8623d710>
component_id = 73, power_w = -15

    async def set_power(self, component_id: int, power_w: float) -> None:
        """Send request to the Microgrid to set power for component.

        If power > 0, then component will be charged with this power.
        If power < 0, then component will be discharged with this power.
        If power == 0, then stop charging or discharging component.

        Args:
            component_id: id of the component to set power.
            power_w: power to set for the component.

         If the application cancels immediately after
            # the Call object is created, we will observe this
            # `CancelledError`.
            if not self.cancelled():
                self.cancel()
            raise

        # NOTE(lidiz) If we raise RpcError in the task, and users doesn't
        # 'await' on it. AsyncIO will log 'Task exception was never retrieved'.
        # Instead, if we move the exception raising here, the spam stops.
        # Unfortunately, there can only be one 'yield from' in '__await__'.

        If power > 0, then component will be charged with this power.
        If power < 0, then component will be discharged with this power.
        If power == 0, then stop charging or discharging component.

        Args:
            component_id: id of the component to set power.
            power_w: power to set for the component.

        Raises:
            AioRpcError: if connection to Microgrid API cannot be established or
                when the api call exceeded timeout
        """
        try:
            await self.api.SetPowerActive(
                microgrid_pb.SetPowerActiveParam(
                    component_id=component_id, power=power_w
                ),
                timeout=DEFAULT_GRPC_CALL_TIMEOUT,  # type: ignore[arg-type]
            )  # type: ignore[misc]
        except grpc.aio.AioRpcError as err:
            msg = f"Failed to set power. Microgrid API: {self.target}. Err: {err.details()}"
>           raise grpc.aio.AioRpcError(
                code=err.code(),
                initial_metadata=err.initial_metadata(),
                trailing_metadata=err.trailing_metadata(),
                details=msg,
                debug_error_string=err.debug_error_string(),
            )
E           grpc.aio._call.AioRpcError: <AioRpcError of RPC that terminated with:
E           	status = StatusCode.UNAVAILABLE
E           	details = "Failed to set power. Microgrid API: [::]:57899. Err: failed to connect to all addresses; last error: UNKNOWN: ipv6:%5B::%5D:57899: Failed to connect to remote host: Connection refused"
E           	debug_error_string = "UNKNOWN:failed to connect to all addresses; last error: UNKNOWN: ipv6:%5B::%5D:57899: Failed to connect to remote host: Connection refused {created_time:"2023-09-12T08:55:10.484575096+00:00", grpc_status:14}"
E           >

src/frequenz/sdk/microgrid/client/_client.py:587: AioRpcError
___________________ TestMicrogridGrpcClient.test_set_bounds ____________________

self = <tests.microgrid.test_client.TestMicrogridGrpcClient object at 0x7fde866ba190>

    async def test_set_bounds(self) -> None:
        """Check if set_bounds is able to set bounds for component."""
        servicer = mock_api.MockMicrogridServicer()
        server = mock_api.MockGrpcServer(servicer, port=57899)
        await server.start()

        try:
            microgrid = self.create_client(57899)

            servicer.add_component(
                38, components_pb.ComponentCategory.COMPONENT_CATEGORY_INVERTER
            )

            num_calls = 4

            target_metric = microgrid_pb.SetBoundsParam.TargetMetric
            expected_bounds = [
                microgrid_pb.SetBoundsParam(
                    component_id=comp_id,
                    target_metric=target_metric.TARGET_METRIC_POWER_ACTIVE,
                    bounds=metrics_pb.Bounds(lower=-10, upper=2),
                )
                for comp_id in range(num_calls)
            ]
            for cid in range(num_calls):
                await microgrid.set_bounds(cid, -10.0, 2.0)
                await asyncio.sleep(0.1)

        finally:
            assert await server.graceful_shutdown()

>       assert len(expected_bounds) == len(servicer.get_bounds())
E       assert 4 == 0
E        +  where 4 = len([target_metric: TARGET_METRIC_POWER_ACTIVE\nbounds {\n  lower: -10\n  upper: 2\n}\n, component_id: 1\ntarget_metric: TARGET_METRIC_POWER_ACTIVE\nbounds {\n  lower: -10\n  upper: 2\n}\n, component_id: 2\ntarget_metric: TARGET_METRIC_POWER_ACTIVE\nbounds {\n  lower: -10\n  upper: 2\n}\n, component_id: 3\ntarget_metric: TARGET_METRIC_POWER_ACTIVE\nbounds {\n  lower: -10\n  upper: 2\n}\n])
E        +  and   0 = len([])
E        +    where [] = <bound method MockMicrogridServicer.get_bounds of <tests.microgrid.mock_api.MockMicrogridServicer object at 0x7fde85ebc150>>()
E        +      where <bound method MockMicrogridServicer.get_bounds of <tests.microgrid.mock_api.MockMicrogridServicer object at 0x7fde85ebc150>> = <tests.microgrid.mock_api.MockMicrogridServicer object at 0x7fde85ebc150>.get_bounds

tests/microgrid/test_client.py:605: AssertionError

I'm wondering if it is because we're running some tests parallel now.  When pytest_min and pytest_max were running one after the other it was all fine.
I guess the nicer solution is to just do a complete rewrite of the mock_api from mocking a service to mocking a client.
But a quick solution can be to just use different ports and check if they are free before starting the mock api.

They should run in different machines (virtual or not, GitHub should handle the load of their physical machines), so I doubt it is that, but who knows :shrug:

Ah, tests seem to be failing in for the cross-arch test, things are definitely much slower inside QEMU.

No, they also fail for the normal nox tests:

https://github.com/frequenz-floss/frequenz-sdk-python/actions/runs/6186797412/job/16795233606

I've been doing some tests locally and this is definitely not related to running pytest_min and pytest_max in parallel, I can reproduce this more or less easily locally (maybe 1 in 2 or 3 runs fail locally) when running with nox (running pytest directly). Nox is slower, so I guess this is just another timing issue with the server not starting up in time or something.
Even at least some of the failures seen in #654 are the same as this, so maybe it just happens that the GitHub runners for Mac are slow: https://github.com/frequenz-floss/frequenz-sdk-python/actions/runs/6146555906/job/16676164697?pr=654#step:8:1569
Looking a bit more into it, I see in the logs that when getting component data, there are a lot of retries ^1. When listing components, the code doesn't have any retry logic. By adding retry logic to the ListComponents() call, then I can't reproduce this issue any more, which seems to confirm the issue is the mock server taking too long to start.
Here is a patch to implement retry logic to ListComponents:
diff --git a/src/frequenz/sdk/microgrid/client/_client.py b/src/frequenz/sdk/microgrid/client/_client.py
index c075d2fd..4065557c 100644
--- a/src/frequenz/sdk/microgrid/client/_client.py
+++ b/src/frequenz/sdk/microgrid/client/_client.py
@@ -226,22 +226,47 @@ class MicrogridGrpcClient(MicrogridApiClient):
             AioRpcError: if connection to Microgrid API cannot be established or
                 when the api call exceeded timeout
         """
-        try:
-            # grpc.aio is missing types and mypy thinks this is not awaitable,
-            # but it is
-            component_list = await self.api.ListComponents(
-                microgrid_pb.ComponentFilter(),
-                timeout=DEFAULT_GRPC_CALL_TIMEOUT,  # type: ignore[arg-type]
-            )  # type: ignore[misc]
-        except grpc.aio.AioRpcError as err:
-            msg = f"Failed to list components. Microgrid API: {self.target}. Err: {err.details()}"
-            raise grpc.aio.AioRpcError(
-                code=err.code(),
-                initial_metadata=err.initial_metadata(),
-                trailing_metadata=err.trailing_metadata(),
-                details=msg,
-                debug_error_string=err.debug_error_string(),
-            )
+        retry_spec: RetryStrategy = self._retry_spec.copy()
+        error: grpc.aio.AioRpcError | None = None
+        component_list: microgrid_pb.ComponentList | None = None
+        while True:
+            _logger.debug("Making call to `ListComponents`")
+            try:
+                # grpc.aio is missing types and mypy thinks this is not awaitable,
+                # but it is
+                component_list = await self.api.ListComponents(
+                    microgrid_pb.ComponentFilter(),
+                    timeout=DEFAULT_GRPC_CALL_TIMEOUT,  # type: ignore[arg-type]
+                )  # type: ignore[misc]
+                break
+            except grpc.aio.AioRpcError as err:
+                error = err
+                api_details = f"Microgrid API: {self.target}."
+                _logger.exception(
+                    "`ListComponentData`: exception: %s api: %s",
+                    err.details(),
+                    api_details,
+                )
+
+            if interval := retry_spec.next_interval():
+                _logger.warning(
+                    "`ListComponentData`: connection ended, "
+                    "retrying %s in %0.3f seconds.",
+                    retry_spec.get_progress(),
+                    interval,
+                )
+                await asyncio.sleep(interval)
+            else:
+                _logger.warning(
+                    "`ListComponentData`: connection ended, "
+                    "retry limit exceeded %s.",
+                    retry_spec.get_progress(),
+                )
+                if error is not None:
+                    raise error
+
+        assert component_list is not None
+
         components_only = filter(
             lambda c: c.category
             is not components_pb.ComponentCategory.COMPONENT_CATEGORY_SENSOR,

We could add this, but I'm not sure if this is what we really want. In any case, the long term solution seems to be not to run an actual mock server, specially when it takes so long to start up. It is secondary, but this would also allow us to run tests in parallel (#229).
```
tests/microgrid/test_client.py::TestMicrogridGrpcClient::test_meter_data
----------------------------------------------------------------------------------------------------------------------------------------------------- live log setup ------------------------------------------------------------------------------------------------------------------------------------------------------
DEBUG    asyncio:selector_events.py:54 Using selector: EpollSelector
------------------------------------------------------------------------------------------------------------------------------------------------------ live log call ------------------------------------------------------------------------------------------------------------------------------------------------------
DEBUG    grpc._cython.cygrpc:_server.py:60 Using AsyncIOEngine.POLLER as I/O engine
DEBUG    frequenz.sdk.microgrid.client._client:_client.py:233 Making call to `ListComponents`
DEBUG    frequenz.sdk.microgrid.client._client:_client.py:233 Making call to `ListComponents`
DEBUG    frequenz.sdk.microgrid.client._client:_client.py:233 Making call to `ListComponents`
DEBUG    frequenz.sdk.microgrid.client._client:_client.py:362 Making call to `GetComponentData`, for component_id=83
WARNING  frequenz.sdk.microgrid.client._client:_client.py:383 `GetComponentData`, for component_id=83: connection ended, retrying (1/∞) in 0.046 seconds.
DEBUG    frequenz.sdk.microgrid.client._client:_client.py:362 Making call to `GetComponentData`, for component_id=83
WARNING  frequenz.sdk.microgrid.client._client:_client.py:383 `GetComponentData`, for component_id=83: connection ended, retrying (2/∞) in 0.043 seconds.
DEBUG    frequenz.sdk.microgrid.client._client:_client.py:362 Making call to `GetComponentData`, for component_id=83
WARNING  frequenz.sdk.microgrid.client._client:_client.py:383 `GetComponentData`, for component_id=83: connection ended, retrying (3/∞) in 0.001 seconds.
DEBUG    frequenz.sdk.microgrid.client._client:_client.py:362 Making call to `GetComponentData`, for component_id=83
WARNING  frequenz.sdk.microgrid.client._client:_client.py:383 `GetComponentData`, for component_id=83: connection ended, retrying (4/∞) in 0.035 seconds.
DEBUG    frequenz.sdk.microgrid.client._client:_client.py:362 Making call to `GetComponentData`, for component_id=83
WARNING  frequenz.sdk.microgrid.client._client:_client.py:383 `GetComponentData`, for component_id=83: connection ended, retrying (5/∞) in 0.033 seconds.
DEBUG    frequenz.sdk.microgrid.client._client:_client.py:362 Making call to `GetComponentData`, for component_id=83
WARNING  frequenz.sdk.microgrid.client._client:_client.py:383 `GetComponentData`, for component_id=83: connection ended, retrying (6/∞) in 0.004 seconds.
DEBUG    frequenz.sdk.microgrid.client._client:_client.py:362 Making call to `GetComponentData`, for component_id=83
WARNING  frequenz.sdk.microgrid.client._client:_client.py:383 `GetComponentData`, for component_id=83: connection ended, retrying (7/∞) in 0.011 seconds.
DEBUG    frequenz.sdk.microgrid.client._client:_client.py:362 Making call to `GetComponentData`, for component_id=83
PASSED                                                                                [ 40%]
```

Ok,  maybe it is slowness.  But I wonder why there's slowness if there are two VMs.  Maybe they're forced to share the same CPU?  Also I have never seen this issue when running the tests locally.
About retries:
Just want to mention that the retries in the logs are expected, because the mock drops the connection after sending 3 values I think, but we try to receive a lot more.  This is just to test that the automatic reconnection to data streams work as expected.
The streaming methods have automatic retry, because the client exposes only a channel, for these methods, and there's no direct way for users of the client to be informed of such a failure.  Also the reconnection happens in a completely independent task.
I'm doubtful about adding retry to non-streaming methods.  First it will block the caller until a connection is established, which might never happen.  But also if there's a failure,  the error gets propagated up immediately, unlike with the streaming methods, where the connections happen in a separate task.
We might still have to improve resiliency in higher layers,  like the initialize method, maybe.

I'm doubtful about adding retry to non-streaming methods. First it will block the caller until a connection is established, which might never happen. But also if there's a failure, the error gets propagated up immediately, unlike with the streaming methods, where the connections happen in a separate task.

Yeah, we definitely shouldn't do that just to make flaky tests pass, since I'm not familiar with the code I wasn't sure. What you say makes sense.

Ok, maybe it is slowness. But I wonder why there's slowness if there are two VMs. Maybe they're forced to share the same CPU? Also I have never seen this issue when running the tests locally.

Weird, I can reproduce locally more or less easily without having a high load. Having a base load of ~9% CPU usage, it takes me about 10 runs to have it failing. If I make the CPU work a lot [^1], I can reproduce it on every run (using nox -R -s pytest_max -- --log-cli-level=DEBUG -x tests/microgrid/test_client.py).
[^1]: I used this: https://www.baeldung.com/linux/cpu-spike-bash
```sh
fulload() {
  dd if=/dev/zero of=/dev/null |
  dd if=/dev/zero of=/dev/null |
  dd if=/dev/zero of=/dev/null |
  dd if=/dev/zero of=/dev/null &
}
fulload; read; killall dd
```

I noticed the first tests, which don't fail, use different port numbers for the grpc server, this is a workaround to make the tests non-flaky. I'm not sure why the pick-a-different-port approach wasn't taken for all tests and why it started failing only recently, as the tests seem to have been like this since this repo was created.
This is also a related commit 01728befc9d2c0891dc0fe75194a5a9ccd332638, where the graceful shutdown is added (or improved). It also seems like the timeout is super small.
We could increment that time-out, to give the server more time to shut down before we run the next test, but that's still inherently flaky, it just reduces the likeliness, while using an incrementing port will ensure the tests are not flaky. I will submit a PR with this change.

On a second thought, the port thing should be solution, as the issue is not in the termination but in the waiting for the server to be really up. :thinking:

BTW, now I'm not being able to reproduce the flakiness locally anymore. I wonder if something changed in the grpc dependency and this was an upstream problem.

It seems like the flakiness mutated to an internal Python error :roll_eyes:
tests/microgrid/test_client.py::TestMicrogridGrpcClient::test_charge Exception ignored in: <function BackgroundService.__del__ at 0x7f9e240be700>
Traceback (most recent call last):
  File "/home/runner/work/frequenz-sdk-python/frequenz-sdk-python/src/frequenz/sdk/actor/_background_service.py", line 237, in __del__
    self.cancel("{self!r} was deleted")
  File "/home/runner/work/frequenz-sdk-python/frequenz-sdk-python/src/frequenz/sdk/actor/_background_service.py", line 130, in cancel
    task.cancel(msg)
  File "/opt/hostedtoolcache/Python/3.11.5/x64/lib/python3.11/asyncio/base_events.py", line 761, in call_soon
    self._check_closed()
  File "/opt/hostedtoolcache/Python/3.11.5/x64/lib/python3.11/asyncio/base_events.py", line 519, in _check_closed
Error:     raise RuntimeError('Event loop is closed')
RuntimeError: Event loop is closed

INTERNALERROR> Traceback (most recent call last):
INTERNALERROR>   File "/home/runner/work/frequenz-sdk-python/frequenz-sdk-python/.nox/ci_checks_max/lib/python3.11/site-packages/_pytest/main.py", line 271, in wrap_session
INTERNALERROR>     session.exitstatus = doit(config, session) or 0
INTERNALERROR>                          ^^^^^^^^^^^^^^^^^^^^^
INTERNALERROR>   File "/home/runner/work/frequenz-sdk-python/frequenz-sdk-python/.nox/ci_checks_max/lib/python3.11/site-packages/_pytest/main.py", line 325, in _main
INTERNALERROR>     config.hook.pytest_runtestloop(session=session)
INTERNALERROR>   File "/home/runner/work/frequenz-sdk-python/frequenz-sdk-python/.nox/ci_checks_max/lib/python3.11/site-packages/pluggy/_hooks.py", line 493, in __call__
INTERNALERROR>     return self._hookexec(self.name, self._hookimpls, kwargs, firstresult)
INTERNALERROR>            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
INTERNALERROR>   File "/home/runner/work/frequenz-sdk-python/frequenz-sdk-python/.nox/ci_checks_max/lib/python3.11/site-packages/pluggy/_manager.py", line 115, in _hookexec
INTERNALERROR>     return self._inner_hookexec(hook_name, methods, kwargs, firstresult)
INTERNALERROR>            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
INTERNALERROR>   File "/home/runner/work/frequenz-sdk-python/frequenz-sdk-python/.nox/ci_checks_max/lib/python3.11/site-packages/pluggy/_callers.py", line 152, in _multicall
INTERNALERROR>     return outcome.get_result()
INTERNALERROR>            ^^^^^^^^^^^^^^^^^^^^
INTERNALERROR>   File "/home/runner/work/frequenz-sdk-python/frequenz-sdk-python/.nox/ci_checks_max/lib/python3.11/site-packages/pluggy/_result.py", line 114, in get_result
INTERNALERROR>     raise exc.with_traceback(exc.__traceback__)
INTERNALERROR>   File "/home/runner/work/frequenz-sdk-python/frequenz-sdk-python/.nox/ci_checks_max/lib/python3.11/site-packages/pluggy/_callers.py", line 77, in _multicall
INTERNALERROR>     res = hook_impl.function(*args)
INTERNALERROR>           ^^^^^^^^^^^^^^^^^^^^^^^^^
INTERNALERROR>   File "/home/runner/work/frequenz-sdk-python/frequenz-sdk-python/.nox/ci_checks_max/lib/python3.11/site-packages/_pytest/main.py", line 350, in pytest_runtestloop
INTERNALERROR>     item.config.hook.pytest_runtest_protocol(item=item, nextitem=nextitem)
INTERNALERROR>   File "/home/runner/work/frequenz-sdk-python/frequenz-sdk-python/.nox/ci_checks_max/lib/python3.11/site-packages/pluggy/_hooks.py", line 493, in __call__
INTERNALERROR>     return self._hookexec(self.name, self._hookimpls, kwargs, firstresult)
INTERNALERROR>            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
INTERNALERROR>   File "/home/runner/work/frequenz-sdk-python/frequenz-sdk-python/.nox/ci_checks_max/lib/python3.11/site-packages/pluggy/_manager.py", line 115, in _hookexec
INTERNALERROR>     return self._inner_hookexec(hook_name, methods, kwargs, firstresult)
INTERNALERROR>            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
INTERNALERROR>   File "/home/runner/work/frequenz-sdk-python/frequenz-sdk-python/.nox/ci_checks_max/lib/python3.11/site-packages/pluggy/_callers.py", line 152, in _multicall
INTERNALERROR>     return outcome.get_result()
INTERNALERROR>            ^^^^^^^^^^^^^^^^^^^^
INTERNALERROR>   File "/home/runner/work/frequenz-sdk-python/frequenz-sdk-python/.nox/ci_checks_max/lib/python3.11/site-packages/pluggy/_result.py", line 114, in get_result
INTERNALERROR>     raise exc.with_traceback(exc.__traceback__)
INTERNALERROR>   File "/home/runner/work/frequenz-sdk-python/frequenz-sdk-python/.nox/ci_checks_max/lib/python3.11/site-packages/pluggy/_callers.py", line 77, in _multicall
INTERNALERROR>     res = hook_impl.function(*args)
INTERNALERROR>           ^^^^^^^^^^^^^^^^^^^^^^^^^
INTERNALERROR>   File "/home/runner/work/frequenz-sdk-python/frequenz-sdk-python/.nox/ci_checks_max/lib/python3.11/site-packages/_pytest/runner.py", line 114, in pytest_runtest_protocol
INTERNALERROR>     runtestprotocol(item, nextitem=nextitem)
INTERNALERROR>   File "/home/runner/work/frequenz-sdk-python/frequenz-sdk-python/.nox/ci_checks_max/lib/python3.11/site-packages/_pytest/runner.py", line 133, in runtestprotocol
INTERNALERROR>     reports.append(call_and_report(item, "call", log))
INTERNALERROR>                    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
INTERNALERROR>   File "/home/runner/work/frequenz-sdk-python/frequenz-sdk-python/.nox/ci_checks_max/lib/python3.11/site-packages/_pytest/runner.py", line 224, in call_and_report
INTERNALERROR>     report: TestReport = hook.pytest_runtest_makereport(item=item, call=call)
INTERNALERROR>                          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
INTERNALERROR>   File "/home/runner/work/frequenz-sdk-python/frequenz-sdk-python/.nox/ci_checks_max/lib/python3.11/site-packages/pluggy/_hooks.py", line 493, in __call__
INTERNALERROR>     return self._hookexec(self.name, self._hookimpls, kwargs, firstresult)
INTERNALERROR>            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
INTERNALERROR>   File "/home/runner/work/frequenz-sdk-python/frequenz-sdk-python/.nox/ci_checks_max/lib/python3.11/site-packages/pluggy/_manager.py", line 115, in _hookexec
INTERNALERROR>     return self._inner_hookexec(hook_name, methods, kwargs, firstresult)
INTERNALERROR>            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
INTERNALERROR>   File "/home/runner/work/frequenz-sdk-python/frequenz-sdk-python/.nox/ci_checks_max/lib/python3.11/site-packages/pluggy/_callers.py", line 130, in _multicall
INTERNALERROR>     teardown[0].send(outcome)
INTERNALERROR>   File "/home/runner/work/frequenz-sdk-python/frequenz-sdk-python/.nox/ci_checks_max/lib/python3.11/site-packages/_pytest/skipping.py", line 266, in pytest_runtest_makereport
INTERNALERROR>     rep = outcome.get_result()
INTERNALERROR>           ^^^^^^^^^^^^^^^^^^^^
INTERNALERROR>   File "/home/runner/work/frequenz-sdk-python/frequenz-sdk-python/.nox/ci_checks_max/lib/python3.11/site-packages/pluggy/_result.py", line 114, in get_result
INTERNALERROR>     raise exc.with_traceback(exc.__traceback__)
INTERNALERROR>   File "/home/runner/work/frequenz-sdk-python/frequenz-sdk-python/.nox/ci_checks_max/lib/python3.11/site-packages/pluggy/_callers.py", line 77, in _multicall
INTERNALERROR>     res = hook_impl.function(*args)
INTERNALERROR>           ^^^^^^^^^^^^^^^^^^^^^^^^^
INTERNALERROR>   File "/home/runner/work/frequenz-sdk-python/frequenz-sdk-python/.nox/ci_checks_max/lib/python3.11/site-packages/_pytest/runner.py", line 368, in pytest_runtest_makereport
INTERNALERROR>     return TestReport.from_item_and_call(item, call)
INTERNALERROR>            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
INTERNALERROR>   File "/home/runner/work/frequenz-sdk-python/frequenz-sdk-python/.nox/ci_checks_max/lib/python3.11/site-packages/_pytest/reports.py", line 362, in from_item_and_call
INTERNALERROR>     longrepr = item.repr_failure(excinfo)
INTERNALERROR>                ^^^^^^^^^^^^^^^^^^^^^^^^^^
INTERNALERROR>   File "/home/runner/work/frequenz-sdk-python/frequenz-sdk-python/.nox/ci_checks_max/lib/python3.11/site-packages/_pytest/python.py", line 1833, in repr_failure
INTERNALERROR>     return self._repr_failure_py(excinfo, style=style)
INTERNALERROR>            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
INTERNALERROR>   File "/home/runner/work/frequenz-sdk-python/frequenz-sdk-python/.nox/ci_checks_max/lib/python3.11/site-packages/_pytest/nodes.py", line 486, in _repr_failure_py
INTERNALERROR>     return excinfo.getrepr(
INTERNALERROR>            ^^^^^^^^^^^^^^^^
INTERNALERROR>   File "/home/runner/work/frequenz-sdk-python/frequenz-sdk-python/.nox/ci_checks_max/lib/python3.11/site-packages/_pytest/_code/code.py", line 701, in getrepr
INTERNALERROR>     return fmt.repr_excinfo(self)
INTERNALERROR>            ^^^^^^^^^^^^^^^^^^^^^^
INTERNALERROR>   File "/home/runner/work/frequenz-sdk-python/frequenz-sdk-python/.nox/ci_checks_max/lib/python3.11/site-packages/_pytest/_code/code.py", line 989, in repr_excinfo
INTERNALERROR>     reprtraceback = self.repr_traceback(excinfo_)
INTERNALERROR>                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
INTERNALERROR>   File "/home/runner/work/frequenz-sdk-python/frequenz-sdk-python/.nox/ci_checks_max/lib/python3.11/site-packages/_pytest/_code/code.py", line 913, in repr_traceback
INTERNALERROR>     entries = [
INTERNALERROR>               ^
INTERNALERROR>   File "/home/runner/work/frequenz-sdk-python/frequenz-sdk-python/.nox/ci_checks_max/lib/python3.11/site-packages/_pytest/_code/code.py", line 914, in <listcomp>
INTERNALERROR>     self.repr_traceback_entry(entry, excinfo if last == entry else None)
INTERNALERROR>   File "/home/runner/work/frequenz-sdk-python/frequenz-sdk-python/.nox/ci_checks_max/lib/python3.11/site-packages/_pytest/_code/code.py", line 852, in repr_traceback_entry
INTERNALERROR>     source = self._getentrysource(entry)
INTERNALERROR>              ^^^^^^^^^^^^^^^^^^^^^^^^^^^
INTERNALERROR>   File "/home/runner/work/frequenz-sdk-python/frequenz-sdk-python/.nox/ci_checks_max/lib/python3.11/site-packages/_pytest/_code/code.py", line 754, in _getentrysource
INTERNALERROR>     source = entry.getsource(self.astcache)
INTERNALERROR>              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
INTERNALERROR>   File "/home/runner/work/frequenz-sdk-python/frequenz-sdk-python/.nox/ci_checks_max/lib/python3.11/site-packages/_pytest/_code/code.py", line 262, in getsource
INTERNALERROR>     astnode, _, end = getstatementrange_ast(
INTERNALERROR>                       ^^^^^^^^^^^^^^^^^^^^^^
INTERNALERROR>   File "/home/runner/work/frequenz-sdk-python/frequenz-sdk-python/.nox/ci_checks_max/lib/python3.11/site-packages/_pytest/_code/source.py", line 185, in getstatementrange_ast
INTERNALERROR>     astnode = ast.parse(content, "source", "exec")
INTERNALERROR>               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
INTERNALERROR>   File "/opt/hostedtoolcache/Python/3.11.5/x64/lib/python3.11/ast.py", line 50, in parse
INTERNALERROR>     return compile(source, filename, mode, flags,
INTERNALERROR>            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
INTERNALERROR> SystemError: AST constructor recursion depth mismatch (before=117, after=167)
<actor_restart_limit> Resetting restart limit to None

#699 seems to have improved things a lot. Maybe we can put this on hold now until we rewrite tests not to use the grpc mock server.

Can this be closed? The issue seems to be gone with the last fix mentioned.

Yeah, let's do that, also this code was now moved to https://github.com/frequenz-floss/frequenz-client-microgrid-python/ and it shouldn't be too long before we completely get rid of the grpc mock in there.


update code

Issue #, if available:
Description of changes:
By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice.

update file to be merged


JSON array as parameter input

Hello.
Is it possible to use a JSON array as a parameter value in the parameters input?
For example
parameters: param1=
Thank you.

@bishal-pdMSFT We are running into issues, when trying to do this. Due to the AZURE_CREDENTIALS, it also seems like that any { and } get replaced with *** in the Actions page and passing a JSON array always fails with Failed to parse JSON. Here are more details:

Hi @marvinbuss, will it be possible to please share the exact parameter input. Are you passing a json or a json string something like this
'{"costCenter":"ABCD", "owner":"XYZ"}'

Hi @t-dedah, I am passing a JSON string as input (e.g. '{"costCenter":"ABCD", "owner":"XYZ"}'). { gets replaced with *** it seems. Using a JSON as secret is also not recommended by the Actions team. We should consider moving to a different auth method with individual secrets for clientId and clientSecret. See here: https://docs.github.com/en/actions/learn-github-actions/security-hardening-for-github-actions#using-secrets

@marvinbuss I am little confused. What secrets are you trying to pass as parameters? shouldn't we use azure login task for that? Also I consoled out '{"costCenter":"ABCD", "owner":"XYZ"}' and everything looks okay to me.
Will it be possible to share repro steps for the issue?

Please try this workflow:
name: Deployment

on:
  push:
    branches: [ main ]
    paths:
      - 'infra/**'
  pull_request:
    branches: [ main ]
    paths:
      - 'infra/**'

env:
  AZURE_SUBSCRIPTION_ID: 'your-sub-id'
  AZURE_LOCATION: 'northeurope'
  AZURE_TAGS: '{"costCenter":"ABCD", "owner":"XYZ"}'

jobs:
  create-resource-groups:
    runs-on: ubuntu-latest

    steps:
    # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it
    - name: Check Out Repository
      id: checkout_repository
      uses: actions/checkout@v2

    # Login to Azure
    - name: Azure Login
      id: azure_login
      uses: azure/login@v1
      with:
        creds: ${{ secrets.AZURE_CREDENTIALS }}

    # Deploy Resource Groups
    - name: Deploy Resource Groups
      id: resource_groups_deployment
      uses: azure/arm-deploy@v1
      with:
        scope: subscription
        subscriptionId: ${{ env.AZURE_SUBSCRIPTION_ID }}
        region: ${{ env.AZURE_LOCATION }}
        template: ${{ github.workspace }}/infra/ResourceGroups/deploy.resourceGroups.json
        parameters: ${{ github.workspace }}/infra/ResourceGroups/params.resourceGroups.json tags='${{ env.AZURE_TAGS }}'

    # Log out from Azure
    - name: Log out from Azure
      id: azure_logout
      uses: azure/cli@v1
      with:
        azcliversion: latest
        inlineScript: |
          az logout

@marvinbuss Thanks for sharing the workflow. So we tested it out and the issue is with AZ CLI, workaround is to not store AZURE_TAGS as env variable but just directly use it as a string tags='{"costCenter":"ABCD", "owner":"XYZ"}'

Thanks, but what if I want to reuse the value for x number of deployments? I want to create a variable for it.

@marvinbuss I totally agree its inconvenient but as its how AZ CLI works, we might not have many options.

@marvinbuss I agree its inconvenient but as its how AZ CLI works we might not have any good option.

But the root cause of the replacement is not the Azure CLI, but how the Azure credentials are stored. Were you able to resproduce this behavior?

I get same error even without storing any AZURE CREDENTIAL. Just running this command without login gives a 'json parse failed' error. I might be wrong but isnt it the behaviour of az comand?

az deployment group validate --resource-group E2eTestResourceGroupForArmAction --template-uri https://raw.githubusercontent.com/Azure/azure-docs-json-samples/master/azure-resource-manager/emptyRG.json --parameters tags='${{ env.AZURE_TAGS }}'

I get same error even without storing any AZURE CREDENTIAL. Just running this command without login gives a 'json parse failed' error. I might be wrong but isnt it the behaviour of az comand?

az deployment group validate --resource-group E2eTestResourceGroupForArmAction --template-uri https://raw.githubusercontent.com/Azure/azure-docs-json-samples/master/azure-resource-manager/emptyRG.json --parameters tags='${{ env.AZURE_TAGS }}'

@t-dedah No this is not the behavior of az cli. The issue is, that we are storing a JSON as secret (AZURE_CREDENTIALS). If you remove the reference to it, everything will run just fine. The issue is Azure/login. The Action needs to accept individual secrets rather than a json. This requires an improvment.

@t-dedah why are you closing this without confirmation from the user or any comment from your side?

Hi,
Are there any updates regarding how to add for example tags as parameters?
Or even more complex structures as objects in an array?
Tried as sugested:

and get the error:

Or is it better to skip this action and run a regular shell with AZ CLI ?

Hi @gummigroda Can you please try this?
tags="{\"costCenter\":\"12345\", \"owner\":\"IT\", \"Service\": \"Identity\"}"

I get same error even without storing any AZURE CREDENTIAL. Just running this command without login gives a 'json parse failed' error. I might be wrong but isnt it the behaviour of az comand?

az deployment group validate --resource-group E2eTestResourceGroupForArmAction --template-uri https://raw.githubusercontent.com/Azure/azure-docs-json-samples/master/azure-resource-manager/emptyRG.json --parameters tags='${{ env.AZURE_TAGS }}'

@t-dedah No this is not the behavior of az cli. The issue is, that we are storing a JSON as secret (AZURE_CREDENTIALS). If you remove the reference to it, everything will run just fine. The issue is Azure/login. The Action needs to accept individual secrets rather than a json. This requires an improvment.

This is the reason why it will not work. If you use the new Workload Identity Federation, this issue will most likely be solved, as you are not storing a JSON as secret then.

Please try this workflow, then you will see the issue:
name: Deployment

on:
  push:
    branches: [ main ]
    paths:
      - 'infra/**'
  pull_request:
    branches: [ main ]
    paths:
      - 'infra/**'

env:
  AZURE_SUBSCRIPTION_ID: 'your-sub-id'
  AZURE_LOCATION: 'northeurope'
  AZURE_TAGS: '{"costCenter":"ABCD", "owner":"XYZ"}'

jobs:
  create-resource-groups:
    runs-on: ubuntu-latest

    steps:
    # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it
    - name: Check Out Repository
      id: checkout_repository
      uses: actions/checkout@v2

    # Login to Azure
    - name: Azure Login
      id: azure_login
      uses: azure/login@v1
      with:
        creds: ${{ secrets.AZURE_CREDENTIALS }}

    # Deploy Resource Groups
    - name: Deploy Resource Groups
      id: resource_groups_deployment
      uses: azure/arm-deploy@v1
      with:
        scope: subscription
        subscriptionId: ${{ env.AZURE_SUBSCRIPTION_ID }}
        region: ${{ env.AZURE_LOCATION }}
        template: ${{ github.workspace }}/infra/ResourceGroups/deploy.resourceGroups.json
        parameters: ${{ github.workspace }}/infra/ResourceGroups/params.resourceGroups.json tags='${{ env.AZURE_TAGS }}'

    # Log out from Azure
    - name: Log out from Azure
      id: azure_logout
      uses: azure/cli@v1
      with:
        azcliversion: latest
        inlineScript: |
          az logout

I think you have to put the line between quotes, did you try understanding?
         parameters: "${{ github.workspace }}/infra/ResourceGroups/params.resourceGroups.json tags='${{ env.AZURE_TAGS }}'"

And better to use https://docs.microsoft.com/en-us/azure/active-directory/develop/workload-identity-federation

When googling "azure/arm-deploy json array parameter" this issue is the first hit.
After reading the comments above, I'm none the wiser.
I've tried escaping quotes, encapsulating the whole thing with a single quote and without escapes, and... No go. & gh variable set ELASTIC_POOL_SKU --env dev --body '''{\"name\": \"BasicPool\", \"tier\": \"Basic\", \"capacity\": 50}''' is my last attempt at setting a variable.
 parameters: >
            el_sku=${{vars.ELASTIC_POOL_SKU}}

Result:
Error: ERROR: Failed to parse string as JSON:
'{\maxSizeBytes":5242880000, "perDatabaseSettings":{"maxCapacity": 5, "minCapacity": 0}}' el_sku='{"name": "BasicPool", "tier": "Basic", "capacity": 50}'
Which leads me to believe I should not have escaped the double quotes.
So... Change that so that gh variable list shows:
ELASTIC_POOL_PROPERTIES  {"maxSizeBytes":5242880000, "perDatabaseSettings":{"maxCapacity": 5, "minCapacity": 0}}
Error: ERROR: Failed to parse string as JSON:
{maxSizeBytes:5242880000,
Error detail: Expecting property name enclosed in double quotes: line 1 column 2 (char 1)
Wait... What?!? gh variable list clearly disagrees. "maxSizeBytes" is definitively quoted.

A shot in the dark, but here's what I would try:
Setting the variable:
& gh variable set ELASTIC_POOL_SKU --env dev --body '{"name": "BasicPool", "tier": "Basic", "capacity": 50}'

parameters: >
el_sku='${{vars.ELASTIC_POOL_SKU}}'

Quoting the value is one of the things I tried.
It expands into:

parameters: services.json location=norwayeast environment=dev retention=7 project_name=smartskill ip_list=[] elastic_pool_properties='{"maxSizeBytes":5242880000, "perDatabaseSettings":{"maxCapacity": 5, "minCapacity": 0}}' el_sku='{"name": "BasicPool", "tier": "Basic", "capacity": 50}' adAdminUser='***'

(the last parameter is a secret)

Error: ERROR: Failed to parse string as JSON:
'{maxSizeBytes:5242880000,
Error detail: Expecting value: line 1 column 1 (char 0)

If the error message is to be believed, the double quote goes AWOL somewhere along the way. (I am reworking this to single parameters now)


Omission in Documentation?

I'm new to using Gurobi in Julia, so I was following your README, looking at the examples.  In particular, I was looking at Example 1.4.  I could run the code and solve the optimization problem, but I noticed that any parameters I attempted to manipulate through a combination of
 env = Gurobi.Env()

and
 setparam!(env, name, v)

had no effect on the results.
After more time than I care to admit, I realized that the problem was the following line in Example 1.4:
m = Model(solver=GurobiSolver())

As soon as I updated this to read
m = Model(solver=GurobiSolver(env))

My parameter manipulations had the expected effect.
For the seasoned Gurobi users out there, it is perhaps obvious that we somehow need to inform Gurobi of the changes made to the environment.  However, this was not obvious to a noob like me.  You might consider updating the troublesome line in Example 1.4 to spare future noobs the same confusion.

Happy to consider pull requests. We receive no support from Gurobi for maintaining this package.

There is a brief mention about sharing env's right at the bottom of the readme. Maybe it just needs to be made more explicit.
@gdowdy3 you can edit the readme in Github by navigating to https://github.com/JuliaOpt/Gurobi.jl/blob/master/README.md and clicking the pencil icon on the top right of the file.


bad argument #1 to "tonumber" (value expected)

Hello, I got an issue when I tried to run this simple test code on the CPU

The error:

I don't really know what's going on, as nobody mentioned an issue like this, so sorry if this is a stupid bug report 😅

I think that commit should fix it


Serialization: Serialize both the substituted and unsubstituted type for a NameAliasType

@swift-ci Please smoke test


use separate specialized variable instead of "updatetime"

Hi! Great idea for a plugin, but I was confused that the search was taking so long when I first tried it, until I read the docs here and it mentioned that it was waiting for updatetime ms before highlighting. In my vimrc, I happened to have updatetime set to 4s, and I don't see a reason why the delay for writing to a swap file should be linked to the highlighting delay.
Could you use something like g:Illuminate_delay which defaults to 100 or similar?

Hey! updatetime is the value used for the CursorHold autocmd which is the autocmd that drives the illumination. I like the idea however of the variable as the delay since it offers a decoupling from the CursorHold autocmd the user might be using for other things, the only weird thing is implementation since I would have to move away from CursorHold and use CursorMoved then keep track of time since last illumination which I'm open to do as long as it results in no overhead. I'll try it out and get back to you 👍

Added support for g:Illuminate_delay using timers to avoid reliance on updatetime and CursorHold. Default time is 250 millis. #2


2021 Hyundai Elantra Fingerprint

Fingerprint for 2021 Hyundai Elantra
Test Route: 82e9cdd3f43bf83e|2021-05-15--02-42-51
Minor issues left to resolve:

Check Lane Follow Assist Warning
Sometimes on brake message appears: "Smart Cruise Control Requirements Not Met"

Are you sure this requires a new car? Why can't the existing ELANTRA be used?

Are you sure this requires a new car? Why can't the existing ELANTRA be used?

Model year is "All new" which also includes a new harness (A2 I believe) I used Sonata as a reference as another A harness vehicle, I assumed the features being different would be problematic.

Thanks for the PR!


Getting ImportError when building docker image

ImportError: cannot import name 'tracing_enabled' from 'langchain_core.tracers.context' (/usr/local/lib/python3.11/site-packages/langchain_core/tracers/context.py)

Thanks for raising it @mikkelkrogsholm let us take it with our partners and Langchain and update asap!

Fixed with Langchain


on mobile and ipad - sliding to finger touch speed  possibility (similar to what instagram has for their instagram stories)

Hi I would like to know if there is a way in which the sliding on mobile is similar to what the instagram stories slide like. I have added   swipeToSlide and it does improve the experience but it would be nicer if it would slide a bit smoother. Is there way to do this?

See PR #1334 and if you like it, please vote to get it into the main component.


ActiveRecord::ConnectionAdapters::PostgreSQLColumn#number? has been removed in rails 5

Trying to migrate to rails 5, but having some problems with this gem.
I'm getting undefined method 'number?' for #<ActiveRecord::ConnectionAdapters::PostgreSQLColumn:0x007fd89fda3d40> which is called here https://github.com/plataformatec/simple_form/blob/65a64ff80de256171e40e516027814d116ce5751/lib/simple_form/inputs/base.rb#L118
The number? method was removed here https://github.com/rails/rails/commit/b93b39eff6829ee05ffec1cc8c505f69cbb53fdc according to git bisect
I'm using these gems

rails 5.0.0.beta1
simple_form master
pg 0.18.4

pg 0.17.x worked in 4.x but isn't supported in rails 5.

Same

@oleander
Hey! I've got a PR https://github.com/plataformatec/simple_form/pull/1342
For now you can use my fork in your Gemfile:
gem 'simple_form', github: 'kesha-antonov/simple_form', branch: 'rails-5-0'

+1
@kesha-antonov PR worked for me. Tks!

@jp7jp Does it work as in "not crash" or "it does what its suppose to do"?

Same problem here...

Any plans for this PR to get merged?

:+1:
Thanks, @kesha-antonov!
Those who are interested can see Kesha's commit here (and yes, it appears to "do what it's supposed to do").
Those who want to use this exact commit in their Gemfile can add this:
gem 'simple_form', github: 'kesha-antonov/simple_form', ref: 'a1561c930f3be279f3580c2510f2555f2e67a4f4'

There is a ticket #1395 to collect all rails5 issues

Confirmed that this bug still exists in the final 5.0.0 release.
Confirmed that @kesha-antonov’s patch above fixes it.

I had this problem as well

I was looking through the code for how to fix this, including the mocks in the test suite.
Kesha's PR doesn't do the tests but @lucasmazza has a PR that @olivierlacan referenced that does the trick, for those who are interested:
https://github.com/plataformatec/simple_form/pull/1417/files

Closed by #1417

gem 'simple_form', github: 'kesha-antonov/simple_form', branch: 'rails-5-0'
fixed my error


Added update to Strem.App for version 0.7.246

[x] Have you signed the Contributor License Agreement?
[x] Have you checked that there aren't other open pull requests for the same manifest update/change?
[x] This PR only modifies one (1) manifest
[x] Have you validated your manifest locally with winget validate --manifest <path>?

[x] Does your manifest conform to the 1.4 schema?

Note: <path> is the name of the directory containing the manifest you're submitting.

Microsoft Reviewers: Open in CodeFlow

@grofit Can you change your PR title?

@grofit Can you change your PR title?

Is that ok?

Is that ok?

Ok.


cannot visualize live best-of-generation plot for simple example

simple.py is missing the probe import when ea_solve is called with viz=True
NameError                                 Traceback (most recent call last)
<ipython-input-34-a788e1ed9f16> in <module>
      5 # output captures the sys.stdout
      6 with Capturing() as output:
----> 7     results = ea_solve(
      8         f, bounds=[(-5.12, 5.12) for _ in range(5)], maximize=True,
      9         generations=100, viz=True

~/.virtualenvs/deap/lib/python3.8/site-packages/leap_ec/simple.py in ea_solve(function, bounds, generations, pop_size, mutation_std, maximize, viz, viz_ylim)
     55
     56     if viz:
---> 57         plot_probe = probe.PopulationPlotProbe(
     58             context, ylim=viz_ylim, ax=plt.gca())
     59         pipeline.append(plot_probe)

NameError: name 'probe' is not defined

Hi @dshen109, thanks for reporting!
This is a duplicate of #110 .  It's fixed in the develop branch, and will be part of the upcoming v0.6 release.


chore: Cache k8s 1.19.13 and 1.20.9

Cache k8s 1.19.13 and 1.20.9

Should v1.19.7 be removed?
The principles listed in the file mention: "For supported minor versions: Keep 4 patch versions" and there are 5 with this PR. It seems like a similar case for 1.20.9 as well.

In another PR, we should be removing versions like this for the Linux k8s versions as well. It's nice to be seeing this as an example.


fix(go.dev): use @surface0 instead of @text for the logo background

🔧 What does this fix? 🔧
as said in the title

note that below is an old screenshot

🗒 Checklist 🗒

[X] I have read and followed Catppuccin's contributing guidelines.
[X] I have updated the version appropriately in the ==UserStyle== header of the catppuccin.user.css file.

Iirc this was intentional. How does the before and after look in latte?

even if i change the color to blue or another color the color refuses to change

unless if i switch to another flavor

This screenshot is from the current iteration of the userstyle:

In light-mode:

Your changes in Mocha then turns the contrast into a worse state:

Feel free to close this then @Flapperoo.

This screenshot is from the current iteration of the userstyle:
In latte:
Your changes in Mocha then turns the contrast into a worse state:

The current iteration looks just fine to me. This might be on your end?

i think the first one looks better yeah

Closing as this is an unnecessary change.

Closing as this is an unnecessary change.

i was about to hit the close button before you did lol


Prepend com.almasb. to Java module names

Prepend com.almasb. to FXGL's Java module names to meet the Module names are strongly recommended to be the same as the name of the super-package. suggestion listed here: https://blog.joda.org/2017/04/java-se-9-jpms-module-naming.html
If you changed the module names accordingly, they'd get picked up by https://github.com/sormuras/modules automatically.
For example, from
module fxgl.entity {
    requires fxgl.core;
    requires java.xml;

    opens com.almasb.fxgl.entity.component to fxgl.core;
    opens com.almasb.fxgl.entity.components to fxgl.core;

    exports com.almasb.fxgl.entity;
    exports com.almasb.fxgl.entity.component;
    exports com.almasb.fxgl.entity.components;
    exports com.almasb.fxgl.entity.level;
    exports com.almasb.fxgl.entity.level.text;
    exports com.almasb.fxgl.entity.level.tiled;
    exports com.almasb.fxgl.physics;
    exports com.almasb.fxgl.physics.box2d.dynamics;
}

to
module com.almasb.fxgl.entity {
    requires com.almasb.fxgl.core;
    requires java.xml;

    opens com.almasb.fxgl.entity.component to com.almasb.fxgl.core;
    opens com.almasb.fxgl.entity.components to com.almasb.fxgl.core;

    exports com.almasb.fxgl.entity;
    exports com.almasb.fxgl.entity.component;
    exports com.almasb.fxgl.entity.components;
    exports com.almasb.fxgl.entity.level;
    exports com.almasb.fxgl.entity.level.text;
    exports com.almasb.fxgl.entity.level.tiled;
    exports com.almasb.fxgl.physics;
    exports com.almasb.fxgl.physics.box2d.dynamics;
}

Besides the mentioned "module name" to "super package" relationship ... with adding com.github.almasb=fxgl to maven-group-alias.properties FXGL could be already mapped as...
fxgl.achievement=com.github.almasb:fxgl-achievement
fxgl.all=com.github.almasb:fxgl
fxgl.animation=com.github.almasb:fxgl-animation
fxgl.core=com.github.almasb:fxgl-core
fxgl.effects=com.github.almasb:fxgl-effects
fxgl.entity=com.github.almasb:fxgl-entity
fxgl.events=com.github.almasb:fxgl-events
fxgl.input=com.github.almasb:fxgl-input
fxgl.io=com.github.almasb:fxgl-io
fxgl.media=com.github.almasb:fxgl-media
fxgl.notification=com.github.almasb:fxgl-notification
fxgl.test=com.github.almasb:fxgl-test
fxgl.time=com.github.almasb:fxgl-time
fxgl.ui=com.github.almasb:fxgl-ui

...but that would (b)lock com.github.almasb to fxgl, in the context of the sormuras/modules project.

Many thanks for this @sormuras

You're welcome!


Animate matching segments.

The highlight can be hard to see. Animate it with a radiating pulse.

Ah! I don’t think I initially understood the intention behind animation. I thought it was going to be just a fade-in of all matches, auto or otherwise, but now I get that it pulses on the matches. Super cool.
Small idea for settings UI to make it a tiny bit more clear:
Pulse-animate Matches [X]
Pulse Speed __ seconds
I think “pulse” tells more about what to expect from, and the benefit of, the animation. And “Matches” could be there, because it doesn’t [and probably shouldn’t] work on Auto-Matches.


Docs for self hosted version

Some docs about installation and usage on a self hosted system would be nice. Not everybody (inlcuding me) is familiar with running Ruby apps, especially as a web service.

better yet, if we can make this into a docker container.

It still requires a Redis instance, so a single Docker container won't be enough by itself. However, that should at least be documented somewhere :)

Made it work with this Dockerfile:
FROM ruby:2.7.2
RUN git clone https://github.com/timdorr/spotifeed
WORKDIR /spotifeed
RUN git checkout a105f0956b33444c71a47a1cddff44f12b77c297
RUN bundle install
EXPOSE 8083
RUN apt-get update
RUN apt-get upgrade
RUN apt-get install redis-server -y
CMD puma -p 8083 & redis-server

then ran
docker build . -t spotifeed
docker run -d --name spotifeed -p 8083:8083 -e SPOTIFY_CLIENT_ID=YOUR_SPOTIFY_CLIENT_ID -e SPOTIFY_CLIENT_SECRET=YOUR_SPOTIFY_CLIENT_SECRET spotifeed

A simpler alternative approachable to even more people would be to add a deply to heroku button.
All you then need is to add your 2 env vars (SPOTIFY_CLIENT_ID and SPOTIFY_CLIENT_SECRET) in heroku which you can get from Spotify dashboard.

While I currently host this on Heroku, I'll be moving over to my own startup, Spaceship, very soon. So, for entirely selfish reasons, I won't be adding a Heroku button :)

Thanks for the dockerfile, @davidfregoli! This got me up and running in a few minutes. I have one question, does the app need a persistent volume, meaning does spotifeed cache its RSS feeds somewhere?

Thanks for the dockerfile, @davidfregoli! This got me up and running in a few minutes. I have one question, does the app need a persistent volume, meaning does spotifeed cache its RSS feeds somewhere?

Just in Redis. I also use Cloudflare to do additional caching, but that's optional.

Just in Redis. I also use Cloudflare to do additional caching, but that's optional.


Add a binding for pcap_loop

I recently ran into a situation where a tool I help maintain and tcpdump had different behavior with a somewhat exotic libpcap implementation. I eventually tracked this down to the fact that tcpdump uses pcap_loop and since said tool is going through this crate, it was using pcap_next_ex. This difference was actually a bug in the libpcap implementation, I spent a frustrating amount of time convincing people that the bug was in libpcap, because I couldn't closely imitate the libpcap calls of tcpdump.
Since that time, I've been wanting a way to call pcap_loop from this crate, because that would have made my life a lot easier. So I finally got around to putting one together, here it is.
I don't really care about the public API. Ideas like a better name are very welcome.

Due to significant changes on main since this was proposed, I will close it. If you get around to addressing the comments and adapting to the current code base, I'll be happy to review it.

sigh I force-pushed to the branch before re-opening the PR which has killed the PR. I'll open a fresh one.


(PDB-5096) Add command performance test

You should also check that the metrics endpoint is working. Someone might be missing the configuration for it.


Presentation missing

hello dear @christinaGi @ATHKID @AimiliaMyriam
I have noticed that we have not committed the final presentation at the project repo. Please add the file to the repo because there are people that would like to know what this project is about and the files that are currently here are not very user friendly.
Thank you :)

Παρουσίαση-Olico.pdf

It seems like I do not have access to the files

me and christine haven't access either

I have tried to push the presentation after downloading locally from the link @AimiliaMyriam provided and the message was
ERROR: Permission to argifood/olico.git denied to xelinorg.
fatal: Could not read from remote repository.
They have removed access and I can not manage the repo settings as well.
We could fork and work on our own workspaces as this is valid flow when working with github. Then we have to make pull requests back to the original repository.
I do not like that we do not have access to the original repo though. I would like the presentation to be there at least. It would be nice to work some more on the projects if we feel like, but if we do not have access I am not willing to do it.
We could ask about what is the rules or if there were any rules about this that we have not paid attention.
I will not close this issue but thank you for getting back to this :)

We will go issue ASAP.
Thank u
G.karamanolis
On Tue, 9 Apr 2019 at 01:15, @xelin.org<EMAIL_ADDRESS>wrote:

I have tried to push the presentation after downloading locally from the
link @AimiliaMyriam https://github.com/AimiliaMyriam provided and the
message was
ERROR: Permission to argifood/olico.git denied to xelinorg.
fatal: Could not read from remote repository.
They have removed access and I can not manage the repo settings as well.
We could fork and work on our own workspaces as this is valid flow when
working with github. Then we have to make pull requests back to the
original repository.
I do not like that we do not have access to the original repo though. I
would like the presentation to be there at least. It would be nice to work
some more on the projects if we feel like, but if we do not have access I
am not willing to do it.
We could ask about what is the rules or if there were any rules about this
that we have not paid attention.
I will not close this issue but thank you for getting back to this :)
—
You are receiving this because you are subscribed to this thread.
Reply to this email directly, view it on GitHub
https://github.com/argifood/olico/issues/2#issuecomment-481028214, or mute
the thread
https://github.com/notifications/unsubscribe-auth/AFF5IQZ_qTkv088hwC2JWBmIbjYEXEYxks5ve79qgaJpZM4cihd6
.

--
Georgios Karamanolis
Co-Founder & CTO/CIO
<EMAIL_ADDRESS>| +302169002600 Internal: 313 | +306937038101
Crowdpolicy | www.crowdpolicy.com
Grammou 82, 18345 Athens Greece (https://goo.gl/gBAk4n)
https://twitter.com/crowdpolicy https://www.facebook.com/CrowdPolicy
https://www.linkedin.com/company/crowdpolicy

Είμαστε εδώ για κάθε σας ερώτημα με την υπηρεσία Crowd 360
http://crowdpolicy.com/crowd360-approach/. Για οποιοδήποτε θέμα
υποστήριξης μπορείτε να επικοινωνήσετε μαζί μας στο www.crowdpolicy.com/360
https://docs.google.com/forms/d/e/1FAIpQLSe_i2RfUHucm3dWDgPXZT8tap0caGP9TFkjNU1m2HP1_ogONw/viewform
.

--
MESSAGE CONFIDENTIALITY AND SECURITY NOTICE
===============================================
This message and/or its
attachments may contain confidential and privileged information and is
intended for the named person or entity to which it is addressed. Any use,
copying or distribution of this information by anyone other than the
intended recipient(s) is prohibited by law. If you receive this in error,
please immediately delete it from your system and notify the sender.
The
contents of this message contain personal opinions of the sender, which are
not the official views of Crowdpolicy nor do they consist a provision of
financial or advisory services unless expressly stated otherwise. This
message is not a solicitation and/or an offer or acceptance of any proposal
in relation to any contract or transaction unless expressly otherwise
indicated in the message itself.
The Internet is not a secure or
error-free environment, and Crowdpolicy does not accept liability for any
loss or damage arising from the use of this message or from delayed,
intercepted, corrupted or virus-infected e-mail transmission.

Hello,
I am the guy helped you to make the repo in the hackathon. This is normal
as we close the repos for evaluation, I will reopen the repo and give
access to your team later this day. Anythink else you might want my e-mail
is<EMAIL_ADDRESS>Please share my contact with the whole team.
Thanks,
George Zaimis
On Tue, 9 Apr 2019 at 01:17, Georgios Karamanolis<EMAIL_ADDRESS>wrote:

We will go issue ASAP.
Thank u
G.karamanolis
On Tue, 9 Apr 2019 at 01:15, @xelin.org<EMAIL_ADDRESS>wrote:

I have tried to push the presentation after downloading locally from the
link @AimiliaMyriam https://github.com/AimiliaMyriam provided and the
message was
ERROR: Permission to argifood/olico.git denied to xelinorg.
fatal: Could not read from remote repository.
They have removed access and I can not manage the repo settings as well.
We could fork and work on our own workspaces as this is valid flow when
working with github. Then we have to make pull requests back to the
original repository.
I do not like that we do not have access to the original repo though. I
would like the presentation to be there at least. It would be nice to work
some more on the projects if we feel like, but if we do not have access I
am not willing to do it.
We could ask about what is the rules or if there were any rules about
this that we have not paid attention.
I will not close this issue but thank you for getting back to this :)
—
You are receiving this because you are subscribed to this thread.
Reply to this email directly, view it on GitHub
https://github.com/argifood/olico/issues/2#issuecomment-481028214, or mute
the thread
https://github.com/notifications/unsubscribe-auth/AFF5IQZ_qTkv088hwC2JWBmIbjYEXEYxks5ve79qgaJpZM4cihd6
.

--
Georgios Karamanolis
Co-Founder & CTO/CIO
<EMAIL_ADDRESS>| +302169002600 Internal: 313 | +306937038101
Crowdpolicy | www.crowdpolicy.com
Grammou 82, 18345 Athens Greece
https://maps.google.com/?q=Grammou+82,+18345+Athens+Greece&entry=gmail&source=g
(https://goo.gl/gBAk4n)
https://twitter.com/crowdpolicy https://www.facebook.com/CrowdPolicy
https://www.linkedin.com/company/crowdpolicy

Είμαστε εδώ για κάθε σας ερώτημα με την υπηρεσία Crowd 360
http://crowdpolicy.com/crowd360-approach/. Για οποιοδήποτε θέμα
υποστήριξης μπορείτε να επικοινωνήσετε μαζί μας στο www.crowdpolicy.com/360
https://docs.google.com/forms/d/e/1FAIpQLSe_i2RfUHucm3dWDgPXZT8tap0caGP9TFkjNU1m2HP1_ogONw/viewform .

--
MESSAGE CONFIDENTIALITY AND SECURITY NOTICE
===============================================
This message and/or its
attachments may contain confidential and privileged information and is
intended for the named person or entity to which it is addressed. Any use,
copying or distribution of this information by anyone other than the
intended recipient(s) is prohibited by law. If you receive this in error,
please immediately delete it from your system and notify the sender.
The
contents of this message contain personal opinions of the sender, which are
not the official views of Crowdpolicy nor do they consist a provision of
financial or advisory services unless expressly stated otherwise. This
message is not a solicitation and/or an offer or acceptance of any proposal
in relation to any contract or transaction unless expressly otherwise
indicated in the message itself.
The Internet is not a secure or
error-free environment, and Crowdpolicy does not accept liability for any
loss or damage arising from the use of this message or from delayed,
intercepted, corrupted or virus-infected e-mail transmission.

The access restored for the team. I will not close the issue as this is not the issue.
Thanks,
George Zaimis

The presentation is on the master for everyone to view. I did a pull request and the I have merged from the UI. I did not try to push but looks like the access to commit is back. What is missing is the administrative rights on the repo so we can not change the description for instance! This is a bit problematic so I will work on my own fork and I will make a pull request if we want to continue something here.
@AimiliaMyriam @ATHKID @christinaGi what ever you would like to know or if something is not working for you open an issue and if someone is active will try to help.


Registering for push notifications always fails

func application(application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: NSData) {
    SBDMain.registerPushToken(deviceToken) { (response, error) in
	if let error = error {
		print(error.localizedDescription)
	}

	print(response)
}

Always fails with following print output:

The operation couldn’t be completed. (Connection required. error 800101.)
nil

Hi @Arcanfel
800101 means you need to establish a connection first.
https://docs.sendbird.com/ios#change_log
Please call connectWithUser first then call registerPushToken.
Without connectWithUser, we don't know what user_id we should associate the token with.
Thanks!
Jin

Hi @sf-jin-ku! Thanks for the prompt update:)


Remove text-transform from material buttons

Overrides angular material's default styling to allow for sentence case buttons:

Coverage remained the same at 33.868% when pulling 863d4a1a621b8df0ad4cf6f681d9d7b70d7583d5 on thevoiceofzeke:styleUpdates into 77d5363658590f64d466c8cde2ebf5962d8ea331 on UW-Madison-DoIT:master.

Coverage remained the same at 33.868% when pulling 6e7903bfacb40a97ea895015b63cb6581100f35e on thevoiceofzeke:styleUpdates into 77d5363658590f64d466c8cde2ebf5962d8ea331 on UW-Madison-DoIT:master.


Added reading the prototype configuration from JSON file

Added an implementation to read the prototype configuration from a JSON file, including a few unit test cases. This merge request addresses issue #141.

Thanks @matejmoravec for re-opening the PR (#324) in your own name after the migration from GitLab.
Unfortunately, it looks like the additional merge commit you added undid some of my finalizing changes, which made the code ready for integration. For instance, DaphneUserConfig.h uses "GSS" as the default task partitioning scheme again, and the example config files from the test case, which I had moved to another directory, have re-appeared in their former place... But no worries, this can easily be fixed. Please remove your merge commit by executing the following in your local repository:
# go back to my finalizing commit
git reset --hard 69fe6528d552d3ed0ceaa664dda3fba8ff6cd42c
git push origin HEAD --force

Furthermore, I've just edited your PR such that it requests integration into daphne-eu:main (instead of daphne-eu:141-prototype-configuration).

Thank you,  @pdamme , for your review. I did what you suggested, and I hope PR is now ready to be merged. I'm sorry for my mistakes, and I will be more careful next time.

Thanks, @matejmoravec. Looks good now. I've just merged it in.


Interested in getting this project running.

Hello!
I tried to get this project running locally and I see it creating diffs in the database but I can't get it to tweet them out.
If anyone is familiar with getting past this error code, please let me know!
I also fear this project may just be a little outdated now and need some overhaul work to get running again, and if anyone could even help point me in the right directions of what needs to be updated or tweaked to get this up; I am very interested in doing the work to get it there.
Basically, just seeing if anyone is out there :)
Even if this post is a month or 3 or 4 old when you see it, feel free to respond!
I'll try get back to you!
(Error trace attached although maybe not too helpful)

--- Logging error ---
Traceback (most recent call last):
File "python\python36\lib\site-packages\diffengine_init_.py", line 650, in process_entry
twitter.tweet_diff(version.diff, token, lang)
File "python\python36\lib\site-packages\diffengine\twitter.py", line 62, in tweet_diff
raise TwitterAchiveUrlNotFoundError(diff)
diffengine.exceptions.twitter.TwitterAchiveUrlNotFoundError: 1
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "python\python36\lib\logging_init_.py", line 994, in emit
msg = self.format(record)
File "python\python36\lib\logging_init_.py", line 840, in format
return fmt.format(record)
File "python\python36\lib\logging_init_.py", line 577, in format
record.message = record.getMessage()
File "python\python36\lib\logging_init_.py", line 338, in getMessage
msg = msg % self.args
TypeError: not all arguments converted during string formatting
Call stack:
File "Python\Python36\Scripts\diffengine-script.py", line 11, in
load_entry_point('diffengine==0.2.7', 'console_scripts', 'diffengine')()
File "python\python36\lib\site-packages\diffengine_init_.py", line 618, in main
result = process_entry(entry, f, twitter_handler, sendgrid_handler, lang)
File "python\python36\lib\site-packages\diffengine_init_.py", line 652, in process_entry
logging.warning("error occurred while trying to tweet", str(e))
Message: 'error occurred while trying to tweet'
Arguments: ('1',)

Just updating I've managed to get this project's tweeting functionality working by using this repo instead:
https://github.com/xuv/NYTdiff


Experience exit code with previously working background task

Describe the bug
CRA 3.3.0 worked great, and then all versions after it seem to fail our CircleCI builds because we use yarn start to run e2e tests.
Did you try recovering your dependencies?
Yes and only when reverting to CRA 3.3.0 does it work again.
Using yarn version 1.16 and node 10.16
Environment
linux node10 docker container
Steps to reproduce

Upgrade to CRA >3.3.0
Run yarn start as a background test in CircleCI (works fine CRA <=3.3.0)
Fails (>3.3.0) or exits with error code 1 (as of 3.4.1)

Expected behavior
That it wouldn't exit as a failure when it's not a failed process
Actual behavior
background task exits as a failed process
CRA 3.3.1 does this after yarn start:
#!/bin/bash -eo pipefail
yarn start
yarn run v1.16.0
$ yarn css
$ node-sass src/css/styles.scss src/css/styles.css
Rendering Complete, saving .css file...
Wrote CSS to /root/project/src/css/styles.css
$ tachyons src/css/styles.css > src/css/app.min.css --minify
Node#moveTo was deprecated. Use Container#append.
$ concurrently -r -k "yarn css:watch" "react-scripts start"
$ chokidar "src/css/*.scss" -c "yarn css"
Watching "src/css/*.scss" ..
ℹ ｢wds｣: Project is running at http://<IP_ADDRESS>/
ℹ ｢wds｣: webpack output is served from /
ℹ ｢wds｣: Content not from webpack is served from /root/project/public
ℹ ｢wds｣: 404s will fallback to /index.html
Starting the development server...

TypeError [ERR_INVALID_ARG_TYPE]: The "path" argument must be of type string. Received type undefined
    at validateString (internal/validators.js:125:11)
    at Object.join (path.js:1147:7)
    at noopServiceWorkerMiddleware (/root/project/node_modules/react-scripts/node_modules/react-dev-utils/noopServiceWorkerMiddleware.js:14:26)
    at Layer.handle [as handle_request] (/root/project/node_modules/express/lib/router/layer.js:95:5)
    at trim_prefix (/root/project/node_modules/express/lib/router/index.js:317:13)
    at /root/project/node_modules/express/lib/router/index.js:284:7
    at Function.process_params (/root/project/node_modules/express/lib/router/index.js:335:12)
    at next (/root/project/node_modules/express/lib/router/index.js:275:10)
    at launchEditorMiddleware (/root/project/node_modules/react-scripts/node_modules/react-dev-utils/errorOverlayMiddleware.js:20:7)
    at Layer.handle [as handle_request] (/root/project/node_modules/express/lib/router/layer.js:95:5)

CRA 3.4.1 simply exits with no useful error message:
With no error log, I might add. sucks to debug. Even SSH into container reveals nothing useful.

Related? https://github.com/facebook/create-react-app/pull/7203

Update: Strangely, https://github.com/facebook/create-react-app/releases/tag/v3.4.0 seems to work!

Can confirm: yarn run start running as part of a docker-compose-based development environment exits without any error message with 3.4.1, working properly with 3.4.0.

This is most certainly a duplicate of #8688, at least in my environment.


gapi.auth.authorize with immediate=true fails on Internet Explorer 11 with default Internet Zone settings for https://accounts.google.com

From<EMAIL_ADDRESS>on May 06, 2014 12:31:57
Using Internet Explorer 11, go to " http://royalpvpgod.com/t0.html " (the source of this web page is enclosed).
Hit Authorize (immediate=false). It will bring up a popup window and then print "SUCCESS" in the text window.
Now hit Authorize (immediate=true). This will print "FAILURE". According to the documentation, so long as the user is logged in this should do a "behind the scenes" token refresh and return successfully.
This was definitely working 2 days ago on IE. It appears to have broken around 5pm PST last Sunday. It still works fine on Firefox, and Chrome (haven't tried the others).
Attachment: t0.html
Original issue: http://code.google.com/p/google-api-javascript-client/issues/detail?id=146

Unfortunately some history appears to have been lost in the issue tracker transition to github. There was a developer report in the Google Code tracker indicating that the issue has been resolved. Is anyone still seeing the incorrect behavior?

I don't see this error on IE8 and IE9, but currently for IE11 whole OAuth flow fails for me. In the pop-up there's nothing displayed where there should be displayed scopes that are authorized.

hoping this issue will be resolved.  affecting my users!

Any news on this one?

I abandoned the Google SDK in favor of hello.js.  That seems to work great across all browsers.

Is anyone still seeing this problem? If so, do the mentioned workarounds resolve the issue? If the issue is in fact the same as the one for which this ticket was originally opened, it is due to a design decision in Internet Explorer combined with Zone security settings which disallow communication between the client application and Google's servers, and a fix in the google-api-javascript-client may be infeasible.

Yes, I still see this problem. In Edge, I see "redirecting" white page. In IE 11 there is page "page doesnt exist"

@hakimCZE is the app on which you see this behavior in the same security zone (likely Internet Zone) as https://accounts.google.com ? Also, what is the URL in the address bar of the "page doesn't exist" window?

/cc @TMSCH for more ideas

@hakimCZE are you using gapi.auth.authorize or gapi.auth2.authorize?

yeah this issue is coming now.. trusted site is not practical solution for this. Please advice something else...?

@TMSCH we are using gapi.auth2.authorize
@bsittler and yes, the authorization page is on live public site. The second I am not sure, as there is redirect from our internal devel site to OAuth login page. Developer that has responsibility for it is playing dead and is unwilling to do something about it, so I cant provide more info right now :/

@sachinyadav1990 are both accounts.google.com and the affected web application in the same Internet Security Zone?


ZenFone 5z?

would a Port to ZenFone 5z be possible? I would love to test

when porting to a new device, you need to provide the device's fdt file, resolution and codename. you can join the group chat for more help.

hi Bigfoot can you please share the group chat link ??
is it discord? if not share it anyways thanks

telegram and discord links are in readme.md


Canton SharedDimension encoding problem?

Describe the bug
When using the "Cantons" shared dimension on a map, cantonal names with special characters are not shown correctly
To Reproduce
Steps to reproduce the behavior:

Go to this map
Have a look at the legend

Expected behavior
Names are displayed correctly
Environment (please complete the following information):

Visualize environment and version: TEST (https://github.com/visualize-admin/visualization-tool/commit/2224452d87378e8a5e48cff099091801ec84a05f)
Browser and version: Chrome, Edge, Firefox

@ptbrowne can you point me to the query used to check please?

Thank you, it was a data loading regression which i could quickly fix. Thank you for bringing to attention @AFoletti and pushing up- and downward @ptbrowne. Please close.


Handle the case of still pending promises in ad-hoc queries

Now that we've started integrating the new data APIs into the codebase, there are many, many places where we need to decide on the behavior to adopt if a query happens to return a promise that is still pending.
Every such instance has been tagged in the codebase with the following comment:
TODO(#5607): what should happen if the promise is still pending?

At the moment, we simply treat unresolved promises the same as missing data.

A very related question that will come up in pretty much all the same places: when are we okay with looking at the raw promise itself rather than waiting for the data to resolve?


Add prepare release gh action

I will clean the commit logs after https://github.com/gluesql/gluesql/pull/1487 merged

Pull Request Test Coverage Report for Build<PHONE_NUMBER>
Details

54 of 62 (87.1%)  changed or added relevant lines in 13 files are covered.
11 unchanged lines in 3 files lost coverage.
Overall coverage increased (+0.09%) to 98.346%

Changes Missing Coverage
Covered Lines
Changed/Added Lines
%

core/src/executor/aggregate/state.rs
13
14
92.86%

core/src/executor/join.rs
5
6
83.33%

storages/sled-storage/src/lock.rs
7
9
77.78%

storages/sled-storage/src/alter_table.rs
10
14
71.43%

Files with Coverage Reduction
New Missed Lines
%

pkg/python/src/payload.rs
1
0.0%

pkg/python/src/lib.rs
5
0.0%

core/src/data/value/binary_op/integer/macros.rs
5
99.06%

Totals

Change from base Build<PHONE_NUMBER>:
0.09%

Covered Lines:
54456

Relevant Lines:
55372

💛  - Coveralls


Add support for SNS as Event Source

Hi
Thanks for gordon! It really rocks! This is a feature request to add support for creating an SNS Topic as an Event Source for Lambda, much like the CloudWatch Events is working currently.
The idea would be that you'd be able to define a Topic name and that it would be linked to the Lambda function specified.
Disclaimer: I've read this FAQ and this issue (#58) but I don't think they are contrary to this idea.

+1

+1

+1

+1

+1

+1

+1

+1
Is the lack of SNS as an event source due to the fact that CloudFormation doesn't have templates yet?  Would this be a good item for a contrib until they do?

+1

+1

+1


Updating the CONTRIBUTING.md file to include #expensify-bugs guidance

cc @JmillsExpensify @mallenexpensify
Details

Updated all guidance to embody the new world of Bug vs New Feature
Re-worked the Ask Questions header to be Slack Channels
Added guidance on #expensify-bug channel throughout
Cleaned up verbiage in some areas as I went through this, mainly for the sake of clarity

Fixed Issues
https://github.com/Expensify/Expensify/issues/240113

Hold on this please - need to get other changes ready before this is deployed to the production file.

Sure, just ping me when it's ready for review 👍

@dylanexpensify

Line 28: For discussing the difference of use-case behind each room, it isn't clear if discussing issues around bugs would be in the bug channel or the open source channel since it says it's only for reporting.

Fixed!

Line 49: A job may be fixing a bug or working on a new feature. (take it or leave it, I just think that sounds better)

Updated!

Line 55: is the identifying bug payment only if they propose a solution? I thought not. Also, "If the bug or feature is fixed by a PR that is not associated with your proposal, the contributor is not eligible for compensation unless they can find the PR that fixed it and prove their porposal preceded the one associated with the PR." to "If the bug or feature is fixed by a PR that is not associated with your proposal, then you will not be eligible for the associated compensation unless you can find the PR that fixed it and that yours preceded that one."

Line 55: is the identifying bug payment only if they propose a solution? -- what do you mean @dylanexpensify? Can you expand this a little more?
If the bug or feature is fixed by a PR that is not associated with your proposal, then you will not be eligible for the associated compensation unless you can find the PR that fixed it and that yours preceded that one.
Added!

Ah yeah, so line 55 basically makes it seem like you have to report the bug and propose a solution to get the reporting bonus, but to my knowledge I thought they could just report the bug and get the bonus and not need to provide a potential solution!

Thanks for no scoping this PR @nathanmetcalf 🎯.

@michaelhaxhiu is this still on hold?

Yes still on hold while Slack support gives us hell 🔥

Let's do this thing now, just got unblocked and ready to proceed.

:hand: This PR was not deployed to staging yet because QA is ongoing. It will be automatically deployed to staging after the next production release.

It's live

🚀 Deployed to staging by @michaelhaxhiu in version: 1.2.27-0 🚀

platform
result

🤖 android 🤖
success ✅

🖥 desktop 🖥
success ✅

🍎 iOS 🍎
success ✅

🕸 web 🕸
success ✅

🚀 Deployed to production by @roryabraham in version: 1.2.27-4 🚀

platform
result

🤖 android 🤖
success ✅

🖥 desktop 🖥
success ✅

🍎 iOS 🍎
cancelled 🔪

🕸 web 🕸
success ✅

🚀 Deployed to production by @roryabraham in version: 1.2.27-4 🚀

platform
result

🤖 android 🤖
success ✅

🖥 desktop 🖥
success ✅

🍎 iOS 🍎
success ✅

🕸 web 🕸
success ✅


Unable to connect to Adafruit QTPY ESP32-C3

The Adafruit QTPY ESP32-C3 enumerates on the WebSerial ESPTool:

However, it does not connect, the output log is as follows...
Adafruit WebSerial ESPTool loaded.
Connecting...
Connected successfully.
Try to reset.
Performing sync...
Error: Couldn't sync to ESP. Try resetting.

Related PR, https://github.com/adafruit/Adafruit_WebSerial_ESPTool/pull/22

I'll have to wait until I can get my hands on one.

Ok, just ordered a QTPY ESP32-C3 this morning.

I figured out why it worked for me. I had put it in bootloader mode by holding boot0 and pressing reset. It didn't just work otherwise. We're going to be referring people to https://nabucasa.github.io/esp-web-flasher/ and I just tested on there and it works fine (after putting in bootloader mode).

I figured out why it worked for me. I had put it in bootloader mode by holding boot0 and pressing reset. It didn't just work otherwise. We're going to be referring people to https://nabucasa.github.io/esp-web-flasher/ and I just tested on there and it works fine (after putting in bootloader mode).

THANK YOU SO MUCHH


anoncoin-qtc.exe has stopped working

I don't know if there is a conflict from a previous install. I know Sam bridge is running and i2p is connected.
RE: https://wiki.anoncoin.net/How_to_install_Anoncoin:
"In the Private I2P Destination Details windows, you can easily copy your private key by clicking on the button Copy "Privatekey" parameter to the clipboard." The problem is the program fails to start, so this part of the instructions is not possible

Just a few other details. I'm using Windows 8.1 . I did not change anything other than selecting the option to generate the private key when going through the setup phase.


Launching on Android builds two times

Launching on Android builds the application two times in a row.
Maybe tns debug android --get-debug-port triggers application build. @blagoev

I have the same problem too

Already fixed here. Closing this 10x

I have tested this and it is still compiling twice