"The read operation timed out"

Hello,
Getting the below errors rather frequently while running the script. It seems to occur on longer voice messages (>20 seconds usually, but varies). Any idea what is causing this and how I could fix it? It results in the audio being cut short and it won't send more audio until there is a break in activity (audio goes below threshold). Connections before and after what I have copied below are successful.
Running Python 3.10, numpy 1.22.3, opuslib 3.0.1, PyAudio 0.2.11, pycryptodome 3.12.0, websocket-client 1.2.3
Thanks
found audio - creating zello connection
Traceback (most recent call last):
  File "/home/pi/.local/lib/python3.10/site-packages/websocket/_socket.py", line 113, in recv
    bytes_ = _recv()
  File "/home/pi/.local/lib/python3.10/site-packages/websocket/_socket.py", line 90, in _recv
    return sock.recv(bufsize)
TimeoutError: The read operation timed out

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/home/pi/zellostream/zello.py", line 147, in create_zello_connection
    result = ws.recv()
  File "/home/pi/.local/lib/python3.10/site-packages/websocket/_core.py", line 362, in recv
    opcode, data = self.recv_data()
websocket._exceptions.WebSocketTimeoutException: The read operation timed out
found audio - creating zello connection
Traceback (most recent call last):
  File "/home/pi/.local/lib/python3.10/site-packages/websocket/_socket.py", line 113, in recv
    bytes_ = _recv()
  File "/home/pi/.local/lib/python3.10/site-packages/websocket/_socket.py", line 90, in _recv
    return sock.recv(bufsize)
TimeoutError: The read operation timed out

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/home/pi/zellostream/zello.py", line 147, in create_zello_connection
    result = ws.recv()
  File "/home/pi/.local/lib/python3.10/site-packages/websocket/_core.py", line 362, in recv
    opcode, data = self.recv_data()
websocket._exceptions.WebSocketTimeoutException: The read operation timed out
found audio - creating zello connection
Traceback (most recent call last):
  File "/home/pi/.local/lib/python3.10/site-packages/websocket/_socket.py", line 113, in recv
    bytes_ = _recv()
  File "/home/pi/.local/lib/python3.10/site-packages/websocket/_socket.py", line 90, in _recv
    return sock.recv(bufsize)
TimeoutError: The read operation timed out

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/home/pi/zellostream/zello.py", line 147, in create_zello_connection
    result = ws.recv()
  File "/home/pi/.local/lib/python3.10/site-packages/websocket/_core.py", line 362, in recv
    opcode, data = self.recv_data()
websocket._exceptions.WebSocketTimeoutException: The read operation timed out
found audio - creating zello connection
Traceback (most recent call last):
  File "/home/pi/.local/lib/python3.10/site-packages/websocket/_socket.py", line 113, in recv
    bytes_ = _recv()
  File "/home/pi/.local/lib/python3.10/site-packages/websocket/_socket.py", line 90, in _recv
    return sock.recv(bufsize)
TimeoutError: The read operation timed out

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/home/pi/zellostream/zello.py", line 147, in create_zello_connection
    result = ws.recv()
  File "/home/pi/.local/lib/python3.10/site-packages/websocket/_core.py", line 362, in recv
    opcode, data = self.recv_data()
websocket._exceptions.WebSocketTimeoutException: The read operation timed out
found audio - creating zello connection
Traceback (most recent call last):
  File "/home/pi/.local/lib/python3.10/site-packages/websocket/_socket.py", line 113, in recv
    bytes_ = _recv()
  File "/home/pi/.local/lib/python3.10/site-packages/websocket/_socket.py", line 90, in _recv
    return sock.recv(bufsize)
TimeoutError: The read operation timed out

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/home/pi/zellostream/zello.py", line 147, in create_zello_connection
    result = ws.recv()
  File "/home/pi/.local/lib/python3.10/site-packages/websocket/_core.py", line 362, in recv
    opcode, data = self.recv_data()
websocket._exceptions.WebSocketTimeoutException: The read operation timed out

I experience the same thing.  Usually several times a day and on longer transmissions.  Haven’t been able to figure it out

Should be fixed with the latest updates.  If not, we can reopen the issue.


Option to load GUI defaults when customizing qemu options

When activating
Advanced: Bypass configuration and manually specify arguments
all options set by GUI get deleted and it starts with an almost empty set.
It would be nice to have a button "load GUI values" when the option is active to start with all options set in the GUI but editable to customization. This would make it a lot easier to slightly modify the GUI values without specifying all options manually.
Thanks

That’s exactly the intended purpose of advanced option. It’s a bypass for the GUI for advanced users. If you need anything from the GUI you shouldn’t be checking that box.

Perhaps I just did not explain correctly. I got the intention of the setting.
But activating Advanced: Bypass configuration and manually specify arguments leads to all fields getting cleared.
In my opinion it would be easier if it would just leave all fields filled out with the gui values but makes them editable.
Otherwise I would have to configure a lot of lines for only changing one parameter. I think this would help other users, too.

The advanced option is ONLY for debugging. I might remove it in a later version since people are expecting more from it.


My scientists are researching too fast

I followed the tutorial at the beginning (the one in the info tab), then bought some researchers, and now most of the research tree has been researched.

If you want fair gameplay, reset and then prestige right as you unlock it. The research fixes itself after that prestige


sys_util: wait_for, spin on an expression

Hardware has asynchronous actions where the expectation is to spin on
registers and expressions against those registers for completion of the
action. This provides a common macro to spin, with a delay and timeout,
on such expressions.
Signed-off-by: Tom Burdick<EMAIL_ADDRESS>

Native posix failed the test case so it was excluded

Just in case you're not aware: native_posix can't spin.  The CPU is conceptually "infinitely fast", so interrupts won't occur until threads expressly yield.  Note that the busy wait implementation knows this, so in general if you have a hang in a spin loop on native_posix it's enough to add e.g. if (IS_ENABLED(CONFIG_ARCH_POSIX)) { k_busy_wait(10); } to your loop.


[State Restoration] Material DateRangePicker, adds some general state restoration tests

Related to https://github.com/flutter/flutter/issues/62916

Makes Material DateRangePicker state restorable.
Also made some drive-by additions to the state restoration property tests
Also added improvements to the existing date picker state restoration tests.

Pre-launch Checklist

[x] I read the Contributor Guide and followed the process outlined there for submitting PRs.
[x] I read the Tree Hygiene wiki page, which explains my responsibilities.
[x] I read and followed the Flutter Style Guide, including Features we expect every widget to implement.
[x] I signed the CLA.
[x] I listed at least one issue that this PR fixes in the description above.
[x] I updated/added relevant documentation (doc comments with ///).
[x] I added new tests to check the change I am making or feature I am adding, or Hixie said the PR is test-exempt.
[x] All existing and new tests are passing.

If you need help, consider asking for advice on the #hackers-new channel on Discord.

Manually setting Google testing to passing, since the failure seems unrelated to the PR changes.


[UUF Port] dotnet-interop: May need an update for .NET 8

Description
Unified User Feedback Port:
Customer feedback:
"This content does not appear to be correct for .NET 8. The project file format is different from what is documented here when using .NET 8 experimental template. There also no longer seems to be an AppBundle.The new template uses Microsoft.NET.Sdk.WebAssembly vs Microsoft.NET.Sdk"
Page URL
https://learn.microsoft.com/en-us/aspnet/core/client-side/dotnet-interop?view=aspnetcore-8.0
Content source URL
https://github.com/dotnet/AspNetCore.Docs/blob/main/aspnetcore/client-side/dotnet-interop.md
Document ID
efff6954-a035-d1da-5975-af04ff7c05ed
Article author
@pavelsavara

@wadepickett  did you verify the assertions above? Can you also remove the

label after creating issues?

after creating issues?

This one I should deal with via docfx.json ... the file needs a path entry to this doc that adds the Blazor ms.subservice. At that point, this article will get the correct labels, project, and assignment.
I opened https://github.com/dotnet/AspNetCore.Docs/issues/32710 to take care of that.
As for this article, @pavelsavara and I can look into the comments to see what's what. I see one thing for sure, the SDK line isn't versioned. However, I've been hardening those lines lately by just cross-linking the landing page and saying 'get the latest SDK.'
@pavelsavara ... I'll be free ....... free-er-ish 😄 .... in about a week. I can take a look then.

cc @maraf

@maraf ... Do you want to submit a PR here, or do you want to list the changes for me to make?
I'll be free in about a week. I must get this GIANT 🐘 Blazor tutorial wrapped up first, which will take me into about the middle of next week. Then, I should have some time ... to work on this and the other issue that we discussed a week or two ago. I'll play catch-up as soon as I can.

did not realized we have it covered in docs

I felt that it would be best to split the Blazor coverage from the non-Blazor coverage on this because readers are probably split into two groups of developers, each probably not wanting to be concerned looking at text and examples of the other. There's this article here for the non-Blazor coverage, and there's the Blazor article on this subject at ...
https://learn.microsoft.com/en-us/aspnet/core/blazor/javascript-interoperability/import-export-interop?view=aspnetcore-8.0
Dan and Artak approved the split.
This one ... the one outside of the Blazor node ... isn't generating the correct Blazor labeling and ping to me due to our DocFX config. I opened that issue to fix that shortly ... ASAP after I wrap up this big tutorial that I'm writing.

@maraf ... I started working on this, but I didn't get far before hitting a brick wall 💥...
dotnet workload install wasm-experimental

... yields ...

No workload update found.
Successfully installed workload(s) wasm-experimental android aspire ios maccatalyst maui-windows.

dotnet new wasmbrowser

... yields ...

No templates or subcommands found matching: 'wasmbrowser'.

... which is correct. wasmbrowser and wasmconsole aren't installed.

That is weird. Nothing has changed around these. What does dotnet --info print for you? Does it contain wasm-tools and wasm-exprimental workloads?

I can try a system restart if you think that would help, but I need to wrap up some work that I'm doing first.

Performed a system restart. Ran the commands again. No 🎲🎲 ... I'm not getting the workload to install, and I don't have the templates. Therefore, I can't see exactly what to update beyond the OP comments ... and even those are a bit vague (e.g., "project file format is different").

I'll go ahead and guess what the changes are and put that up in a PR for you to take a look at.


[APP-939] Reporting profiles broken on android

https://bsky.app/profile/furrydev.xyz/post/3khjbtaxbzi27

The textbox doesn't accept input until you put away your keyboard, plus pressing Send Report does nothing.

A video is available in the link

Fixed by https://github.com/bluesky-social/social-app/pull/2351


Retry initial API requests with exponential backoff

Currently agent retries host APIs 20 times with 3 secs interval (= total duration 1 min) while preparing .
With this p-r. agent will retry those APIs 15 times with exponential backoff intervals. Total duration of those retries will be about 6 hours:
$ perl -MList::Util -E 'for(0..20) { $sum += List::Util::min(0.5 * (2 ** $_), 15); } say $sum;'
255.5

Needs reconsideration...


allow contact search module to support no storage

allow contact search module to support no storage

Coverage decreased (-0.01%) to 44.402% when pulling 66ac7f974f40b4ca4c60778158f5837d03b4d706 on embbnux:feature-contact-search-no-storeage into 6ab0bb3df48de707e9e2e0bf6baf74384f1b2694 on ringcentral:master.


[Question] How to use conda-manager inside Spyder?

Hi, I installed Spyder 3 and conda-manager via conda. So how should I do to call it inside Spyder?
I had checked the menu, one-by-one to make sure I do not miss any thing and cannot find any idea how to do it.
Thanks.

Hi @tienhv there is work pending dfor a new release compatible with the latest spyder version. Should be available in a couple of weeks. Thanks for your patience.

Hello guys,
Was this issue resolved? Because I am having the same issue locating conda-manager in spyder 3.2.4 after running conda install conda-manager in windows 7?
Thanks,

Nop, conda-manager hasn't been updated to work with the latest Spyder, sorry.


Alertmanager sending duplicate notifications after 'resolved' notification when running with multiple replicas

What did you do?
I have VM (Victoriametrics) Alert running with Alertmanager, with 2 replicas each. I am ingesting the metric disk_usage with value > threshold value. As soon as I receive an email from alertmanager (which is after 20 minutes in my case, see below files), I am stopping the data ingestion, which stops the alert breach as well.

VM_rules.yaml

groups:
- name: test_group
  interval: 5m
  concurrency: 1
  rules:
    - alert: High Disk Usage
      expr: ((avg(disk_usage[5m]) by (instance)) > 95)
      for: 15m
      labels:
        severity: critical

alertmanager_config.yaml

global:
  resolve_timeout: 5m
  smtp_smarthost: smtp.gmail.com:587
  smtp_auth_username: XXX
  smtp_auth_password: XXX
  smtp_from<EMAIL_ADDRESS>route:
  group_by: [alert_id, instance]
  receiver: test-default
  group_interval: 5m
  repeat_interval: 12h
receivers:
- name: test-default
  email_configs:
  - to<EMAIL_ADDRESS>    send_resolved: true

What did you expect to see?
Alertmanager should send a 'fired' notification and a 'resolved' notification after I stop data ingestion because breach is stopped.
What did you see instead? Under which circumstances?
Alertmanager sends a 'fired' notification, but when the ingestion/breach is stopped, it sends a 'resolved' notification along with another 'fired' notification. And, 'resolved' email for this duplicate 'fired' email comes either instantaneously or in the next group_interval. Also, sometimes I see arbitrarily multiple pairs of duplicate 'fired-resolved' mails even after breach is stopped.
This unexpected behaviour is seen only when alertmanager is running with multiple (>=2) replicas.
Environment

Alertmanager version:
v.0.27.0

Hi! 👋 I think there are a number of situations where this can happen. To understand what is happening here, please share debug logs for both Alertmanager servers for when it happened.

Hi! 👋 There are a number of situations where this can happen. Please share debug level logs for both Alertmanager servers at the time this happened and we can help understand out what caused this.

Hey @grobinson-grafana!!
After enabling debug logs, it took few trials to reproduce the issue. Quite inconsistent behaviour.
Just one update, I have increased Alertmanager replica count to 3, so I am attaching debug level logs for all three servers of Alertmanager.

 I don't think there is anything you can do about this either I'm afraid.
The sequence of firing, resolved, firing resolved notifications can occur in rare cases when Prometheus sends the resolved alert to Alertmanager around the same time as the next flush. When this happens, some Alertmanager replicas can see the alert as resolved while others can still see it as active. This is what happened here.
We can see that Alertmanager 3 received the resolved alert from Prometheus. At the same time, it flushed the alert, as it had been 5 minutes since the last flush (your group_interval is 5m). It just so happens that the flush was 2ms after the resolved alert was received:
ts=2024-09-04T10:07:22.226Z caller=dispatch.go:164 level=debug component=dispatcher msg="Received alert" alert="High Core Usage[14f2e3b][resolved]"
ts=2024-09-04T10:07:22.284Z caller=dispatch.go:516 level=debug component=dispatcher aggrGroup="{}:{alert_id=\"101\", instance=\"11792\"}" msg=flushing alerts="[High Core Usage[14f2e3b][resolved]]"

However, if we look at Alertmanager 2, we can see that it flushed the alert 26ms before it received the resolved alert from Prometheus. Alertmanager 2 still thinks the alert is firing:
ts=2024-09-04T10:07:22.212Z caller=dispatch.go:516 level=debug component=dispatcher aggrGroup="{}:{alert_id=\"101\", instance=\"11792\"}" msg=flushing alerts="[High Core Usage[14f2e3b][active]]"
ts=2024-09-04T10:07:22.238Z caller=dispatch.go:164 level=debug component=dispatcher msg="Received alert" alert="High Core Usage[14f2e3b][resolved]"

What happens next is Alertmanager 3 sends the resolved notification, and gossips that it has sent a resolved notification to Alertmanagers 1 and 2:
ts=2024-09-04T10:07:23.484Z caller=notify.go:860 level=debug component=dispatcher receiver=Mail integration=email[0] aggrGroup="{}:{alert_id=\"101\", instance=\"11792\"}" alerts="[High Core Usage[14f2e3b][resolved]]" msg="Notify success" attempts=1 duration=1.199657271s

Alertmanager 2 waits 15 seconds (--peer-timeout=15s) and sees that a resolved notification was sent, but in Alertmanager 2 the alert is still firing, so it sends a firing notification, and gossips that it has sent a firing notification to Alertmanagers 1 and 3:
ts=2024-09-04T10:07:23.596Z caller=nflog.go:533 level=debug component=nflog msg="gossiping new entry" entry="entry:<group_key:\"{}:{alert_id=\\\"101\\\", instance=\\\"11792\\\"}\" receiver:<group_name:\"Mail\" integration:\"email\" > timestamp:<seconds:1725444443 nanos:484411839 > resolved_alerts:9876396428224961045 > expires_at:<seconds:1725530843 nanos:484411839 > "
ts=2024-09-04T10:07:38.406Z caller=notify.go:860 level=debug component=dispatcher receiver=Mail integration=email[0] aggrGroup="{}:{alert_id=\"101\", instance=\"11792\"}" alerts="[High Core Usage[14f2e3b][active]]" msg="Notify success" attempts=1 duration=1.192928752s

Alertmanager 1 waits 30 seconds (2 * --peer-timeout=30s) and sees that the last notification sent was a firing notification, but in Alertmanager 1 the alert is resolved as like Alertmanager 3 it received the resolved alert before the flush:
ts=2024-09-04T10:07:22.210Z caller=dispatch.go:164 level=debug component=dispatcher msg="Received alert" alert="High Core Usage[14f2e3b][resolved]"
ts=2024-09-04T10:07:22.320Z caller=dispatch.go:516 level=debug component=dispatcher aggrGroup="{}:{alert_id=\"101\", instance=\"11792\"}" msg=flushing alerts="[High Core Usage[14f2e3b][resolved]]"

Alertmanager 1 then sends the resolved notification, and gossips to Alertmanagers 2 and 3 that a resolved notification was sent:
ts=2024-09-04T10:07:38.565Z caller=nflog.go:533 level=debug component=nflog msg="gossiping new entry" entry="entry:<group_key:\"{}:{alert_id=\\\"101\\\", instance=\\\"11792\\\"}\" receiver:<group_name:\"Mail\" integration:\"email\" > timestamp:<seconds:1725444458 nanos:406291780 > firing_alerts:9876396428224961045 > expires_at:<seconds:1725530858 nanos:406291780 > "
ts=2024-09-04T10:07:53.606Z caller=notify.go:860 level=debug component=dispatcher receiver=Mail integration=email[0] aggrGroup="{}:{alert_id=\"101\", instance=\"11792\"}" alerts="[High Core Usage[14f2e3b][resolved]]" msg="Notify success" attempts=1 duration=1.285027004s

The next time Alertmanager 2 flushes it will see that the alert is resolved. And since the last notification sent was a resolved notification, it will do nothing.
I hope this helps!

Thanks @grobinson-grafana for helpful explanation of the root cause.
Can we overcome this issue by configuring the evaluation interval (interval) in alert rules as 5m while group_wait in alertmanager as 15m? What do you think?

It might help. You'll need to test it to find out I'm afraid. Remember though, 5m and 7m align at minutes 70, 140, etc, so there will still be overlap between elevations and flushes.
Another option is to disable resolved notifications. However, it depends how critical these are for your monitoring. Sometimes though, resolved notifications can create a lot of noise and even flap (as you have experienced).

It might help. You'll need to test it to find out I'm afraid. Remember though, 5m and 7m align at minutes 70, 140, etc, so there will still be overlap between evaluations and flushes.
Another option is to disable resolved notifications, depending on how critical these are for your monitoring. Sometimes though, resolved notifications can create a lot of noise and even flap (as you have experienced).

It might help. You'll need to test it to find out I'm afraid. Remember though, 5m and 7m align at minutes 70, 140, etc, so there will still be overlap between evaluations and flushes.
Another option is to disable resolved notifications, as sometimes resolved notifications can create a lot of noise and even flap (as you have experienced). However, this also depends on how critical resolved notifications are for your monitoring.

It might help. You'll need to test it to find out I'm afraid. Remember though, 5m and 7m align at minutes 70, 140, etc, so there will still be overlap between evaluations and flushes.
Another option is to disable resolved notifications, as sometimes resolved notifications can create a lot of noise and even flap (as is the case here). However, this also depends on how critical resolved notifications are for your monitoring.

Hey @grobinson-grafana!! I am trying to debug the logs where 2 pairs (fired and resolved) of duplicates were notified. I have a few doubts:

Does an Alertmanager instance create a gossiping entry when it receives a new alert or after flush?
Why --peer-timeout keeps on doubling as you explained above?
When does the peer-timeout timer start and what is its relevance?

I just want to point out in the logs myself where exactly the race between flush and alert being received, has occurred.
Would be great if you could help in understanding gossiping in brief.
Thanks!!

Does an Alertmanager instance create a gossiping entry when it receives a new alert or after flush?

Neither, after the notification is sent.

Why --peer-timeout keeps on doubling as you explained above?

The peers are arranged into positions, such as 0, 1, 2 etc. Peer 0 is the first to send the notification. If Peer 1 hasn't received a gossip from Peer 0 within --peer-timeout then it sends a notification. If Peer 2 hasn't received a gossip from Peer 1 within 2 * --peer-timeout then it sends a notification, etc.

When does the peer-timeout timer start and what is its relevance?

Starts when the flush happens.

Hey @grobinson-grafana!! I was debugging the logs to point out the race condition on a fresh set of logs (attached).
Alertmanager_logs.zip
I observed there's more than just a race between flushing of alerts and a new alert being received. I have tried to capture the flow of events in each Alertmanager instances as per the new logs.

Here, at timestamp 15.37.22 AM2 did not receive any alert from upstream. And, at timestamp 15.42.22 AM3 did not receive any alert while AM1 has received alert twice. Similarly, at timestamp 15.47.22 AM2 receives 3 alerts in total (1 before flush and 2 after the flush) while AM1 and AM3 did not get 'resolved' alert at all. This will definitely cause disagreement between Alertmanager replicas and thus trigger duplicate alerts.
This is just the case just with new logs but also in older ones (the ones attached in older comment). At timestamp 9.57.22 AM3 has received two alerts while AM2 received no alert at all.
AM3 (from older logs):
ts=2024-09-04T09:57:22.209Z caller=dispatch.go:164 level=debug component=dispatcher msg="Received alert" alert="High Core Usage[14f2e3b][active]"
ts=2024-09-04T09:57:22.258Z caller=dispatch.go:164 level=debug component=dispatcher msg="Received alert" alert="High Core Usage[14f2e3b][active]"
ts=2024-09-04T09:57:22.282Z caller=dispatch.go:516 level=debug component=dispatcher aggrGroup="{}:{alert_id=\"101\", instance=\"11792\"}" msg=flushing alerts="[High Core Usage[14f2e3b][active]]"

AM2 (from older logs):
ts=2024-09-04T09:57:18.513Z caller=cluster.go:341 level=debug component=cluster memberlist="2024/09/04 09:57:18 [DEBUG] memberlist: Initiating push/pull sync with: 01J6Y519SS43HS1TNCDFKVQK4M <IP_ADDRESS>:9094\n"
ts=2024-09-04T09:57:22.210Z caller=dispatch.go:516 level=debug component=dispatcher aggrGroup="{}:{alert_id=\"101\", instance=\"11792\"}" msg=flushing alerts="[High Core Usage[14f2e3b][active]]"
ts=2024-09-04T09:58:03.538Z caller=cluster.go:341 level=debug component=cluster memberlist="2024/09/04 09:58:03 [DEBUG] memberlist: Stream connection from=<IP_ADDRESS>:35528\n"

Isn't this a bigger issue than just rare event of race condition occurring? Or, am I missing to comprehend something here?

Hi! 👋 Yes, missing "Received alerts" can cause issues, as alerts must be sent to all Alertmanagers in the cluster to make sure the state of each alert is consistent across all replicas. I would recommend checking the logs for VictoriaMetrics to see what happened at this time that prevented those alerts from being sent to the Alertmanager 2 and 3, and what caused the duplicates on Alertmanager 1.

Yes, missing "Received alerts" can cause issues, as alerts must be sent to all Alertmanagers in the cluster to make sure the state of each alert is consistent across all replicas

Hi @grobinson-grafana!!

Should all the Alertmanager replicas receive "resolved alert" from VMAlerts?
Shouldn't this be an expectation from gossiping feature that if one replica receives an alert, it should communicate it to all other replicas so that they all can be in agreement w.r.t. the state of the alert?
Can you point me to some official documentation of how gossiping in HA Alertmanager works and how should we expect it to work?

Hi! 👋

Yes. I don't know much about VMAlerts, but this is how Prometheus works.
The gossip feature doesn't replicate alerts, it just replicates what is known as the nflog, which keeps track of the most recent notification sent, including a timestamp of when it was sent and which firing and resolved alerts were included, for each alert group in Alertmanager.
You can check out https://github.com/prometheus/alertmanager#high-availability and https://promlabs.com/blog/2023/08/31/high-availability-for-prometheus-and-alertmanager-an-overview.

Hey @grobinson-grafana!! We changed VM Alert config and made sure that each replica of Alertmanager gets alert from upstream.
We tried replicating the issue and captured the logs for analysis. We came across a couple of unexpected events in the logs, which can be causing duplicates.

One of the Alertmanager1(AM1) instance has flushed at 19:44:42.361, but we see another flush at 19:44:57.362 (which is 15s after the initial one).
AM1 logs:

ts=2024-09-16T19:44:42.341Z caller=dispatch.go:164 level=debug component=dispatcher msg="Received alert" alert="High Test Usage[7ac132d][active]"
ts=2024-09-16T19:44:42.341Z caller=dispatch.go:164 level=debug component=dispatcher msg="Received alert" alert="High Test Usage[69b21ca][active]"
ts=2024-09-16T19:44:42.343Z caller=dispatch.go:164 level=debug component=dispatcher msg="Received alert" alert="High Test Usage[7ac132d][active]"
ts=2024-09-16T19:44:42.343Z caller=dispatch.go:164 level=debug component=dispatcher msg="Received alert" alert="High Test Usage[69b21ca][active]"
ts=2024-09-16T19:44:42.361Z caller=dispatch.go:516 level=debug component=dispatcher aggrGroup="{}:{alert_id=\"104\", instance=\"11792\"}" msg=flushing alerts="[High Test Usage[69b21ca][active] High Test Usage[7ac132d][active]]"
ts=2024-09-16T19:44:42.368Z caller=dispatch.go:164 level=debug component=dispatcher msg="Received alert" alert="High Test Usage[69b21ca][active]"
ts=2024-09-16T19:44:42.368Z caller=dispatch.go:164 level=debug component=dispatcher msg="Received alert" alert="High Test Usage[7ac132d][active]"
ts=2024-09-16T19:44:42.904Z caller=nflog.go:533 level=debug component=nflog msg="gossiping new entry" entry="entry:<group_key:\"{}:{alert_id=\\\"104\\\", instance=\\\"11792\\\"}\" receiver:<group_name:\"Mail\" integration:\"webex\" > timestamp:<seconds:1726515882 nanos:870502670 > firing_alerts:16133756477374130202 firing_alerts:2789514587224029741 > expires_at:<seconds:1726602282 nanos:870502670 > "
ts=2024-09-16T19:44:43.704Z caller=nflog.go:533 level=debug component=nflog msg="gossiping new entry" entry="entry:<group_key:\"{}:{alert_id=\\\"104\\\", instance=\\\"11792\\\"}\" receiver:<group_name:\"Mail\" integration:\"email\" > timestamp:<seconds:1726515883 nanos:694582580 > firing_alerts:16133756477374130202 firing_alerts:2789514587224029741 > expires_at:<seconds:1726602283 nanos:694582580 > "
ts=2024-09-16T19:44:57.362Z caller=dispatch.go:516 level=debug component=dispatcher aggrGroup="{}:{alert_id=\"104\", instance=\"11792\"}" msg=flushing alerts="[High Test Usage[69b21ca][active] High Test Usage[7ac132d][active]]"
ts=2024-09-16T19:45:04.066Z caller=cluster.go:341 level=debug component=cluster memberlist="2024/09/16 19:45:04 [DEBUG] memberlist: Initiating push/pull sync with: 01J7Y4HR5395YH2Q09GBW1ME14 <IP_ADDRESS>:9094\n"

Now, subsequent flushes for AM1 are at 19:49:57, 19:54:57 and so on
while flushes for AM2 and AM3 are at 19:49:42, 19:54:42 and so on.
This can cause peer-timeout of 15s to elapse before other peers flush and consequently result in duplicates.

AM3 has flushed a 'resolved' at 19:59:42.364 and sent notification at 19:59:42.760 without waiting for peer-timeout even though other two AM instances are not in sync for the alert state (as per logs)

AM3 logs:
ts=2024-09-16T19:59:42.330Z caller=dispatch.go:164 level=debug component=dispatcher msg="Received alert" alert="High Test Usage[7ac132d][resolved]"
ts=2024-09-16T19:59:42.330Z caller=dispatch.go:164 level=debug component=dispatcher msg="Received alert" alert="High Test Usage[69b21ca][resolved]"
ts=2024-09-16T19:59:42.364Z caller=dispatch.go:164 level=debug component=dispatcher msg="Received alert" alert="High Test Usage[7ac132d][resolved]"
ts=2024-09-16T19:59:42.364Z caller=dispatch.go:164 level=debug component=dispatcher msg="Received alert" alert="High Test Usage[69b21ca][resolved]"
ts=2024-09-16T19:59:42.364Z caller=dispatch.go:516 level=debug component=dispatcher aggrGroup="{}:{alert_id=\"104\", instance=\"11792\"}" msg=flushing alerts="[High Test Usage[69b21ca][resolved] High Test Usage[7ac132d][resolved]]"
ts=2024-09-16T19:59:42.364Z caller=webex.go:75 level=debug integration=webex incident="{}:{alert_id=\"104\", instance=\"11792\"}"
ts=2024-09-16T19:59:42.370Z caller=dispatch.go:164 level=debug component=dispatcher msg="Received alert" alert="High Test Usage[7ac132d][resolved]"
ts=2024-09-16T19:59:42.370Z caller=dispatch.go:164 level=debug component=dispatcher msg="Received alert" alert="High Test Usage[69b21ca][resolved]"
ts=2024-09-16T19:59:42.760Z caller=notify.go:860 level=debug component=dispatcher receiver=Mail integration=webex[0] aggrGroup="{}:{alert_id=\"104\", instance=\"11792\"}" alerts="[High Test Usage[69b21ca][resolved] High Test Usage[7ac132d][resolved]]" msg="Notify success" attempts=1 duration=396.074516ms
ts=2024-09-16T19:59:45.242Z caller=notify.go:860 level=debug component=dispatcher receiver=Mail integration=email[0] aggrGroup="{}:{alert_id=\"104\", instance=\"11792\"}" alerts="[High Test Usage[69b21ca][resolved] High Test Usage[7ac132d][resolved]]" msg="Notify success" attempts=1 duration=2.878230343s
ts=2024-09-16T20:00:04.228Z caller=cluster.go:341 level=debug component=cluster memberlist="2024/09/16 20:00:04 [DEBUG] memberlist: Stream connection from=<IP_ADDRESS>:59320\n"

AM2 logs:
ts=2024-09-16T19:59:42.341Z caller=dispatch.go:516 level=debug component=dispatcher aggrGroup="{}:{alert_id=\"104\", instance=\"11792\"}" msg=flushing alerts="[High Test Usage[69b21ca][active] High Test Usage[7ac132d][active]]"
ts=2024-09-16T19:59:42.341Z caller=dispatch.go:164 level=debug component=dispatcher msg="Received alert" alert="High Test Usage[7ac132d][resolved]"
ts=2024-09-16T19:59:42.341Z caller=dispatch.go:164 level=debug component=dispatcher msg="Received alert" alert="High Test Usage[69b21ca][resolved]"
ts=2024-09-16T19:59:42.416Z caller=dispatch.go:164 level=debug component=dispatcher msg="Received alert" alert="High Test Usage[7ac132d][resolved]"
ts=2024-09-16T19:59:42.416Z caller=dispatch.go:164 level=debug component=dispatcher msg="Received alert" alert="High Test Usage[69b21ca][resolved]"
ts=2024-09-16T19:59:42.417Z caller=dispatch.go:164 level=debug component=dispatcher msg="Received alert" alert="High Test Usage[7ac132d][resolved]"
ts=2024-09-16T19:59:42.417Z caller=dispatch.go:164 level=debug component=dispatcher msg="Received alert" alert="High Test Usage[69b21ca][resolved]"
ts=2024-09-16T19:59:42.904Z caller=nflog.go:533 level=debug component=nflog msg="gossiping new entry" entry="entry:<group_key:\"{}:{alert_id=\\\"104\\\", instance=\\\"11792\\\"}\" receiver:<group_name:\"Mail\" integration:\"webex\" > timestamp:<seconds:1726516782 nanos:760677958 > resolved_alerts:16133756477374130202 resolved_alerts:2789514587224029741 > expires_at:<seconds:1726603182 nanos:760677958 > "

AM1 logs:
ts=2024-09-16T19:59:42.335Z caller=dispatch.go:164 level=debug component=dispatcher msg="Received alert" alert="High Test Usage[7ac132d][resolved]"
ts=2024-09-16T19:59:42.335Z caller=dispatch.go:164 level=debug component=dispatcher msg="Received alert" alert="High Test Usage[69b21ca][resolved]"
ts=2024-09-16T19:59:42.367Z caller=dispatch.go:164 level=debug component=dispatcher msg="Received alert" alert="High Test Usage[7ac132d][resolved]"
ts=2024-09-16T19:59:42.367Z caller=dispatch.go:164 level=debug component=dispatcher msg="Received alert" alert="High Test Usage[69b21ca][resolved]"
ts=2024-09-16T19:59:42.369Z caller=dispatch.go:164 level=debug component=dispatcher msg="Received alert" alert="High Test Usage[7ac132d][resolved]"
ts=2024-09-16T19:59:42.369Z caller=dispatch.go:164 level=debug component=dispatcher msg="Received alert" alert="High Test Usage[69b21ca][resolved]"
ts=2024-09-16T19:59:42.905Z caller=nflog.go:533 level=debug component=nflog msg="gossiping new entry" entry="entry:<group_key:\"{}:{alert_id=\\\"104\\\", instance=\\\"11792\\\"}\" receiver:<group_name:\"Mail\" integration:\"webex\" > timestamp:<seconds:1726516782 nanos:760677958 > resolved_alerts:16133756477374130202 resolved_alerts:2789514587224029741 > expires_at:<seconds:1726603182 nanos:760677958 > "
ts=2024-09-16T19:59:45.267Z caller=nflog.go:533 level=debug component=nflog msg="gossiping new entry" entry="entry:<group_key:\"{}:{alert_id=\\\"104\\\", instance=\\\"11792\\\"}\" receiver:<group_name:\"Mail\" integration:\"email\" > timestamp:<seconds:1726516785 nanos:242879144 > resolved_alerts:16133756477374130202 resolved_alerts:2789514587224029741 > expires_at:<seconds:1726603185 nanos:242879144 > "
ts=2024-09-16T19:59:47.772Z caller=cluster.go:341 level=debug component=cluster memberlist="2024/09/16 19:59:47 [DEBUG] memberlist: Stream connection from=<IP_ADDRESS>:35544\n"
ts=2024-09-16T19:59:57.364Z caller=dispatch.go:516 level=debug component=dispatcher aggrGroup="{}:{alert_id=\"104\", instance=\"11792\"}" msg=flushing alerts="[High Test Usage[69b21ca][resolved] High Test Usage[7ac132d][resolved]]"

Do you suspect something wrong with cluster causing this?

When we say that AM instance waits for peer-timeout time for all other instances to come to an agreement on state of the alert, how exactly does each AM instance decide their state of the alert - is it the last alert state that was flushed or the state of the last alert received by that instance? I think it should be the flush state.

I'm not sure. I thought it could be due to the issue mentioned in #3419, but I don't see a received alert or reload just before the flush.

What position was AM3 in at that time? AM3 could have been at position 0, which means it would be the first to send a notification. You can check the position using the alertmanager_peer_position metric.

To answer the last question:

When we say that AM instance waits for peer-timeout time for all other instances to come to an agreement on state of the alert

This isn't how it works, where did you see that? It doesn't wait for agreement on the state of the alert, it's just a failover timeout. When the timeout expires, it checks if the last notification sent is the same notification that it is about to send, and if so, skips sending a notification.

I'm not sure. I thought it could be due to the issue mentioned in https://github.com/prometheus/alertmanager/pull/3419, but I don't see a received alert or reload just before the flush.

Sure, I'll check the mentioned issue.

It doesn't wait for agreement on the state of the alert, it's just a failover timeout. When the timeout expires, it checks if the last notification sent is the same notification that it is about to send, and if so, skips sending a notification.

Thanks a lot for clarification @grobinson-grafana! I misunderstood the peer-timeout due to which there was a gap in my analysis of logs. Really wish we had a documentation on internals of gossiping. Anyways, Thanks again!
So, I believe, we can conclude that the root cause is a race condition where flushing, in one or more instances of the AM, occurs just milliseconds before they receive a 'resolved' alert, causing a disagreement among the peers of the cluster and consequently duplicate notifications. Also, unfortunately, we have no fix for this.

Hey @grobinson-grafana!
We have changed how we deploy our Alertmanagers. Instead of one deployment with multiple replicas, now we are using 3 separate deployments with 1 replica each. We have also configured cluster.peer and cluster.listen-address so that these 3 separately deployed AMs form a cluster and gossip with each other.
We have tested this set-up quite extensively and haven't received any duplicate notifications. AM Logs also show that race condition did not occur as each AM has received updated alert from atleast one VMAlert before the flush.

What difference do you think it brings technically that we did not hit the issue?
Can this actually help us or is it just that we haven't yet hit the race?
Do you see any side effects on overall functionality of HA AM if we deploy them separately?

Hi there, just checking in to see if there are any updates, fixes or workarounds regarding this issue. :)


Use rounded HIX score for dashboard

Short description

This is a follow up PR for #2760, in which still raw HIX score is used in the dashboard/analytics view.
How to reproduce:

Enable HIX in Augsburg and fill its pages with HIX value by hix_bulk.
Go to Augsburg, find 9 in "Pages with low hix score" in ToDo list and "Overview of the text understandability of the pages".
Add the two pages listed in the Issue #2756
See 10 instead of 9 in "Pages with low hix score" and "Overview of the text understandability of the pages", while both the pages shuold be good enough in the HIX score check.

Proposed changes

Use rounded HIX score

Side effects

Tell me please if you find other points that are to be adjusted too 👀

Resolved issues

Fixes: #

Pull Request Review Guidelines

@JoeyStk
A small test is added 😸

And secondly, I'm not really an expert on caches and loading time, so I'm just going to ask. Do you think this PR could negatively influence the loading times on the dashboard or does the caching equalize this?

Me neither can judge it, thought I don't come up with any alternative 🤔

A small test is added 😸

Thank you. Looks good.

Me neither can judge it, thought I don't come up with any alternative 🤔

An alternative that has been discussed in the past was to do it via AJAX, but I'm not sure if it applies here too. At the moment I don't feel confident enough to approve this PR. I think we should raise this issue in the team call and hopefully we get a clear answer there.

negatively influence the loading times on the dashboard

Maybe I'm missing something, but this just adds one iteration through the already-queried pages, right?


[BUG] Won't save

Acknowledgement of preliminary instructions

[X] I have read the preliminary instructions, and I am certain that my problem has not already been addressed.

What problem did you encounter?
The settings won't save when I click save for some reason

give logs

How can you tell that your settings aren't saving?

When I open the settings app, I put the settings that I want. Then I click save. When I load the BloxTrap client, it has the normal settings.

The only thing that saves is the OOF sound setting

I put the settings that I want.

And which settings are those?

The settings are the old cursor setting and that is all.

I got it. I just went into the same one and saved it. Then went to a different file download and updated it and BOOM! got it.

Bloxstrap doesn't apply any mod changes if Roblox is already running in the background, or if it wasn't even being used in the first place. Sounds like it's now working properly.


Add C# blueprint

Can you please look into the C# blueprint. Thanks

@jackrk I notice there are two pull requests open for this at the moment which indicates a fair level of community interest to add this blueprint.
I understand that a security team needs to ensure that the code is safe and other teams will need to check if the code is consistent with internal standards, and I am more than happy to make any changes required to get the pull request fulfill these requirements.
Is there any possibility we can get an update on how this is going?

Resolved by #12


prevent current editor from showing up first

Requirements

Filling out the template is required. Any pull request that does not include enough information to be reviewed in a timely manner may be closed at the maintainers' discretion.
All new code requires tests to ensure against regressions

Description of the Change
The current open editor can end up being the first result in fuzzy search. This change makes sure it isn't.
I have a project with HTML and JS files named the same but the file extension, e.g. project-marking.html and project-marking.js, and I often want to quickly open the other one using fuzzy finder. However, fuzzy finder puts the .js file first, so if I'm there, open fuzzy finder, type projmar, pressing enter would just take me where I already am.
I would like to open fuzzy finder, type projmar, press enter, and be in the other file that I know matches.
This PR is a quick hack, an RFC really, that implements this change. Every time we filter, it checks that if we have more than one match, the first one shouldn't be the current open buffer – if it is, it switches the first two matches.
Alternate Designs
I suspect that we might be able to cache the current open buffer's path when opening the fuzzy finder, but I don't know enough about the code to quickly guess where would be appropriate.
Also, this kind of sorting decision might be moved to fuzzaldrin, with some kind of value that shouldn't be put first parameter, but I don't have the time right now to investigate.
Benefits
This allows me quicker to change files with fuzzy finder.
Possible Drawbacks
If somebody already has in their muscle memory that they open fuzzy finder, type a query, and do down and enter, this would potentially give them the wrong file.
Applicable Issues
None I could find.

Sorry about the lint, I didn't notice standard.js was in use. The latest travis build failure seems to be something intermittent about the last few tests (not the one I added).

The latest travis build failure seems to be something intermittent about the last few tests (not the one I added).

Yeah, I restarted the build and it's :green_heart: now.

Thanks very much for the contribution.
Upon reviewing this change with the team, we've decided that this poses too many risks with regard to people's established workflows. We can recommend that this could be useful as a community package that is more custom-built for this proposed workflow. Because of this, we're going to close the PR.
Thanks again for your hard work and interest in Atom :+1:

No worries.
🎉 welcome new Atom package: fuzzy-finder-switch-first


Build changes

Closes #91

Add a pyproject.toml
Some README.md changes around venv
Add a PR template for github
Update dependencies with the exception of click

Tested:

deposit still runs
ethstaker_deposit can still be imported as a module
Ran full test suite locally

I did not touch build_configs because I don't fully understand why we have individual spec files and requirements in there. We may not need this? On another project I am building with pyinstaller on all three OS with just the top-level requirements.txt.

It seems like versions of the same packages in build_configs/common/requirements.txt and in the requirements file we have will have to match. I just tried building the project on this branch and it failed at this step:
Run python -m pip install --upgrade pip
  python -m pip install --upgrade pip
  pip install -r build_configs/linux/requirements.txt
  shell: /usr/bin/bash -e {0}
  env:
    pythonLocation: /opt/hostedtoolcache/Python/3.1[2](https://github.com/remyroy/ethstaker-deposit-cli/actions/runs/10563661034/job/29264356613#step:6:2).5/x64
    PKG_CONFIG_PATH: /opt/hostedtoolcache/Python/[3](https://github.com/remyroy/ethstaker-deposit-cli/actions/runs/10563661034/job/29264356613#step:6:3).12.5/x64/lib/pkgconfig
    Python_ROOT_DIR: /opt/hostedtoolcache/Python/3.12.5/x6[4](https://github.com/remyroy/ethstaker-deposit-cli/actions/runs/10563661034/job/29264356613#step:6:4)
    Python2_ROOT_DIR: /opt/hostedtoolcache/Python/3.12.[5](https://github.com/remyroy/ethstaker-deposit-cli/actions/runs/10563661034/job/29264356613#step:6:5)/x64
    Python3_ROOT_DIR: /opt/hostedtoolcache/Python/3.12.5/x[6](https://github.com/remyroy/ethstaker-deposit-cli/actions/runs/10563661034/job/29264356613#step:6:6)4
    LD_LIBRARY_PATH: /opt/hostedtoolcache/Python/3.12.5/x64/lib
    PYTHONHASHSEED: 42
    SHORT_SHA: 1f55[7](https://github.com/remyroy/ethstaker-deposit-cli/actions/runs/10563661034/job/29264356613#step:6:7)b8

Requirement already satisfied: pip in /opt/hostedtoolcache/Python/3.12.5/x64/lib/python3.12/site-packages (24.2)
Collecting cached-property==1.5.2 (from -r build_configs/linux/../common/../../requirements.txt (line 7))
  Downloading cached_property-1.5.2-py2.py3-none-any.whl (7.6 kB)
Collecting click==7.1.2 (from -r build_configs/linux/../common/../../requirements.txt (line 10))
  Downloading click-7.1.2-py2.py3-none-any.whl ([8](https://github.com/remyroy/ethstaker-deposit-cli/actions/runs/10563661034/job/29264356613#step:6:8)2 kB)
Collecting cytoolz==0.12.3 (from -r build_configs/linux/../common/../../requirements.txt (line 13))
  Downloading cytoolz-0.12.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (2.1 MB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 2.1/2.1 MB 1.8 MB/s eta 0:00:00
Collecting eth-hash==0.7.0 (from -r build_configs/linux/../common/../../requirements.txt (line 118))
  Downloading eth_hash-0.7.0-py3-none-any.whl (8.7 kB)
Collecting eth-typing==5.0.0 (from -r build_configs/linux/../common/../../requirements.txt (line 121))
  Downloading eth_typing-5.0.0-py3-none-any.whl (20 kB)
Collecting eth-utils==5.0.0 (from -r build_configs/linux/../common/../../requirements.txt (line 124))
  Downloading eth_utils-5.0.0-py3-none-any.whl (100 kB)
Collecting hexbytes==1.2.1 (from -r build_configs/linux/../common/../../requirements.txt (line 127))
  Downloading hexbytes-1.2.1-py3-none-any.whl (5.2 kB)
Collecting lru-dict==1.3.0 (from -r build_configs/linux/../common/../../requirements.txt (line 130))
  Downloading lru_dict-1.3.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (32 kB)
Collecting py-ecc==7.0.1 (from -r build_configs/linux/../common/../../requirements.txt (line 212))
  Downloading py_ecc-7.0.1-py3-none-any.whl (43 kB)
Collecting pycryptodome==3.20.0 (from -r build_configs/linux/../common/../../requirements.txt (line 215))
  Downloading pycryptodome-3.20.0-cp35-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (2.1 MB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 2.1/2.1 MB 6[9](https://github.com/remyroy/ethstaker-deposit-cli/actions/runs/10563661034/job/29264356613#step:6:9)3.4 kB/s eta 0:00:00
Collecting pyrsistent==0.16.1 (from -r build_configs/linux/../common/../../requirements.txt (line 248))
  Downloading pyrsistent-0.16.1.tar.gz ([10](https://github.com/remyroy/ethstaker-deposit-cli/actions/runs/10563661034/job/29264356613#step:6:10)8 kB)
  Installing build dependencies: started
  Installing build dependencies: finished with status 'done'
  Getting requirements to build wheel: started
  Getting requirements to build wheel: finished with status 'done'
  Preparing metadata (pyproject.toml): started
  Preparing metadata (pyproject.toml): finished with status 'done'
Collecting six==1.16.0 (from -r build_configs/linux/../common/../../requirements.txt (line 250))
  Downloading six-1.16.0-py2.py3-none-any.whl ([11](https://github.com/remyroy/ethstaker-deposit-cli/actions/runs/10563661034/job/29264356613#step:6:11) kB)
Collecting ssz==0.5.0 (from -r build_configs/linux/../common/../../requirements.txt (line 253))
  Downloading ssz-0.5.0-py3-none-any.whl (44 kB)
Collecting toolz==0.[12](https://github.com/remyroy/ethstaker-deposit-cli/actions/runs/10563661034/job/29264356613#step:6:12).1 (from -r build_configs/linux/../common/../../requirements.txt (line 256))
  Downloading toolz-0.12.1-py3-none-any.whl (56 kB)
Collecting typing-extensions==4.12.2 (from -r build_configs/linux/../common/../../requirements.txt (line 259))
  Downloading typing_extensions-4.12.2-py3-none-any.whl (37 kB)
Collecting pyinstaller==6.9.0 (from -r build_configs/linux/../common/requirements.txt (line 5))
  Downloading pyinstaller-6.9.0-py3-none-manylinux20[14](https://github.com/remyroy/ethstaker-deposit-cli/actions/runs/10563661034/job/29264356613#step:6:14)_x86_64.whl (684 kB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 685.0/685.0 kB 361.4 kB/s eta 0:00:00
Collecting cffi==1.16.0 (from -r build_configs/linux/../common/requirements.txt (line 18))
  Downloading cffi-1.16.0-cp312-cp312-manylinux_2_17_x86_64.manylinux20[14](https://github.com/remyroy/ethstaker-deposit-cli/actions/runs/10563661034/job/29264356613#step:6:15)_x86_64.whl (477 kB)
Collecting pycparser==2.21 (from -r build_configs/linux/../common/requirements.txt (line 71))
  Downloading pycparser-2.21-py2.py3-none-any.whl (118 kB)
Collecting altgraph==0.17.4 (from -r build_configs/linux/../common/requirements.txt (line 74))
  Downloading altgraph-0.17.4-py2.py3-none-any.whl (21 kB)
Collecting macholib==1.[16](https://github.com/remyroy/ethstaker-deposit-cli/actions/runs/10563661034/job/29264356613#step:6:17).3 (from -r build_configs/linux/../common/requirements.txt (line 77))
  Downloading macholib-1.16.3-py2.py3-none-any.whl (38 kB)
Collecting pyinstaller-hooks-contrib==2024.7 (from -r build_configs/linux/../common/requirements.txt (line 80))
  Downloading pyinstaller_hooks_contrib-2024.7-py2.py3-none-any.whl (341 kB)
Collecting importlib-metadata==7.0.1 (from -r build_configs/linux/../common/requirements.txt (line 83))
  Downloading importlib_metadata-7.0.1-py3-none-any.whl (23 kB)
Collecting zipp==3.[19](https://github.com/remyroy/ethstaker-deposit-cli/actions/runs/10563661034/job/29264356613#step:6:20).2 (from -r build_configs/linux/../common/requirements.txt (line 86))
  Downloading zipp-3.19.2-py3-none-any.whl (9.0 kB)
ERROR: Cannot install typing-extensions==4.12.2 and typing-extensions==4.9.0 because these package versions have conflicting dependencies.
The conflict is caused by:
    The user requested typing-extensions==4.12.2
    The user requested typing-extensions==4.9.0
To fix this you could try to:
1. loosen the range of package versions you've specified
2. remove package versions to allow pip to attempt to solve the dependency conflict
ERROR: ResolutionImpossible: for help visit https://pip.pypa.io/en/latest/topics/dependency-resolution/#dealing-with-dependency-conflicts
Error: Process completed with exit code 1.

From https://github.com/remyroy/ethstaker-deposit-cli/actions/runs/10563661034/job/29264356613 if you can see it.

There's a larger discussion to be had about the build tools we use, and whether that should be broadly modernized. This PR is not that. It's meant to just bring a pyproject.toml so pip-compile works and we can easily update the requirements.xt - although that does mean we end up duplicating things in requirements_test.txt


Update README.md

Created few more reference-style links, and fixed the path for the others.

 Thank you for your submission, we really appreciate it. Like many open source projects, we ask that you sign our Contributor License Agreement before we can accept your contribution.:x: gbschenkel sign nowYou have signed the CLA already but the status is still pending? Let us recheck it.

Well I just followed the "standard" used, if reference-style links is the problem, is only use the link directly instead.
The current README mostly links are broken, I just tried to fix them, and this is done with this modification.
From what I see, this README was created inside release-notes/ or is just a copy from there, I don't know if not better just right a abstract README with a link to the Release Notes instead, and others stuffs.

@gbschenkel yeah I'm hoping someone in this repo can help understand what the links should be. Maybe it's better to delete them and link to another file that has correct links, so things aren't as duplicated?

This fixes the links so that's better than before 😄
/cc @richlander for thoughts on how the README should be structured.


feat(Accordion): Scrolling for accordion stats

Allows people to scroll horizontally on mobile to see every stats displayed in the accordion. ( RN it is cut off )

I'm going to close this PR for now. If more people request that the Accordion header should scroll, I will look into it again.


♻  table package

[!WARNING]
This pull request is not mergeable via GitHub because a downstack PR is open. Once all requirements are satisfied, merge this PR as a stack on Graphite.
Learn more

#74  👈
#73
main

This stack of pull requests is managed by Graphite. Learn more about stacking.

Join @RTLS and the rest of your teammates on  Graphite


Functional tests needed for f5_sys_iappservice

Functional tests are need for this plugin. These are a combination of happy path tests and negative tests.

Closed by PR #34


#300 Stubbed startTrackPage/stopTrackPage should have correct timestamp

Stubbed startTrackPage/stopTrackPage should have correct timestamp #300
Team:
@juliocarpio4
@GeovannyLopez
@JoseSic
@LuisSic
@mariare19
@pnadalini
@ricardoher12
Engineers in charge:
@oscargarciacolon
@gzepeda

@GeovannyLopez,
Thanks for your contribution.
To ensure that the project team has proper rights to use your work, please complete the Contribution License Agreement at https://cla.microsoft.com.
It will cover your contributions to all Microsoft-managed open source projects.
Thanks,
Microsoft Pull Request Bot

@GeovannyLopez, thanks for signing the contribution license agreement. We will now validate the agreement and then the pull request.
Thanks, Microsoft Pull Request Bot

I have made the suggested corrections.

Hello @KamilSzostak, have you had a chance to check the latest commit?

The age of this PR doesn't exactly reflect well on the health of this project.

Yes, we probably need to redo it. I will ask the team if they can close the PR.

According to the commets we decided to close this pull request.


Extension Managment API commandlets

This one is available in the Node API https://github.com/Microsoft/vsts-node-api/blob/master/api/ExtensionManagementApi.ts and I believe has support going back a few API versions.
The only direct use case for the existing library is that it would allow some self-healing when hitting something like https://github.com/DarqueWarrior/vsteam/blob/6404a26fa7f72845b235989ea18ffcbe8f5c4821/src/serviceendpoints.psm1#L157 where the SonarQube extension is missing, it could Install it to the server/service and install it into the collection.
My personal use case is it makes it easier not to call out to the node cli from our PowerShell scripts :wink:
/cc @pabrams

Are asking that the extension management API be added? We do accept pull requests if you are interested in adding it. Also not the Invoke-VSTeamRequest already in the module lets you call any API in TFS/VSTS.


Pilot names are cutoff/ don't show fully when not hovering or hovering over system

Browser - Google chrome
After upgrading to ver 1.1.4
pilot names online and in-game under the system they are in don't show fully and are cut off a bit

after entering this - I saw this was already entered by https://github.com/exodus4d/pathfinder/issues/309  but i'm seeing this issue as well

:grey_exclamation: Dublicate Issue
Thanks for your contribution. There is already an open Issue about this topic.
Feel free to participate in the discussion and share your thoughts in the comments.
:x: Issue closed

Auto-generated response


calc.random(seed, min, max) function

Description
calc.random(seed, min, max) would be a new function under the Calculate category, that takes three optional numbers and, using the first number as a seed, returns a random number between the remaining two numbers.
To discuss

Default min and max values:

Suggested answer: 0 and 100

The way to get the random numbers
Rust's standard library doesn't contain a RNG. So we need to pull in a dependency to get those numbers.

Suggested answer: fastrand

Should this function be in calc or, should it really be in math?

As the function returns an integer, both min and max would get truncated to be integers.
Seed would be settable.

I have a working implementation for this, I'm just opening this issue for discussion before the PR.
Use Case
Everyone that would need a random number generated in compile-time.

We've brought this up before (adding random number generators to typst), but there's still the question: would this break memoization? How do you deal with this in your implementation?

@PgBiel How would this break memoization? As long as you make it obligatory to provide the seed, the generated numbers would be deterministic and this shouldn't be a problem, or am I missing something?

Tbh my implementation was made totally without knowing that memoization was used. I'm not currently at home, but when I get there I'll be testing this.
Just a question: Should this be memoizable? I feel like the answer is no.

A random function can be created in typst using mutable state, altought is a bit difficult to use because the value of the random variable can only be acceses as a content value, or through a function.
Here's a very simple example
#let s = state("rng", 0)

#let random(min:0, max:100) = {
  s.update(x => x*1103515245+12345)

  let dif = max - min
  s.display((x) => calc.mod(calc.abs(x), dif) + min)
}

#random()
#random()
#random()
#random()
#random()

#let random_f(min:0, max:100, f) = {
    s.update(x => x*1103515245+12345)

    let dif = max - min
    s.display((x) => f(calc.mod(calc.abs(x), dif) + min))
}

#let random_circle() = {
    random_f(min: 0, max:100, (x) => {
          place(
              dx: x*1pt,
              random_f(min: 0, max:100, (y) => {
                  move(
                      dy: y*1pt,
                      circle(radius: 4pt)
                  )
              })
          )
    })
}

#let n = 0
#while n < 100 {
    random_circle()
    n = n+1
}

This give the following results:

It might be possible to implement this internally so that the value of the state can be access directly, making it easier to use.

Maybe using some static values? That would mean pulling a new dependency or having a static value even for documents that don't use random(). Neither are very costly but we should choose.

all functions (internal ones included??) must be memoizable.
I don't think this applies to a function that is literally made to return something different every time it's called.

With my implementation the following code:
#calc.random()
#calc.random()
#calc.random()
#calc.random()
#calc.random()
#calc.random()
#calc.random()

Produces the following output: "34 6 39 0 48 28 5"
If the function uses memoization, the output would be just a group of 34s

@blyxyas This is wrong, just as a counter also changes while the syntax and function call is exactly the same. I think something like a pseudo-random number generator that is necessarily seeded might be a good idea, but I strongly dislike the idea of truly non-deterministic outputs. A compiler should ideally be a pure function that takes some inputs and returns some outputs without any external state (although some exceptions may be allowed for convenience, such as reading files during compilation).

First, I'm not sure why you would want randomness in your document

Not true randomness, but a pseudorandom sequence based on a deterministic seed is useful for such things as generating illustrations or examples. Let's say I'm a teacher, and wanted to generate a whole bunch of problems for my students.
(But that PR isn't the way to do it)

I think the current date from #435 will work as some sort of seed. We might not have #now() for now (which would be even better), but that will work in most cases, probably.

Then maybe returning a Vec of numbers?

Why is the upper limit an optional parameter? I get that a lower limit of 0 is a good default, but the upper limit is different for most use cases:

Percentages are usually 0 to 100
Random element of a list is 0 to length
Scores are 0 to 5 or o to 10

Also, in other languages you often use modulo like random() % 256, which would lead to wildly biased results in typst.
Implementation wise, can random() use a document-wide counter internally, and basically output a hash of the counter value? That's random enough for most uses of RNG, and sophisticated RNGs for eg. cryptography just shouldn't be made in typst.

Then maybe returning a Vec of numbers?

That would be more useful I think.

Since there was the question for use cases raised:
I am a teacher and use randomness in LaTeX to generate exercise sheets with random tasks. I have .tex-files to generate basic arithmetic or geometric problems. Whenever I need a new set of problems, I just recompile the file.
Sometimes we need to generate random passwords for out students, to use for registration at something like a web service. I read the users from a .csv file and generate a password sheet to give out.
So, for my use, a random number generator would be great.

I would be fine with adding a PRNG to the stdlib. What I'd rather not do is ship a way to seed it. One possible way to get a seed is to generate a file with a random number with an external program and read it.

Although a PRNG might also be better deferred to a package on second thought.

May I ask why you are against shipping a way to seed it? I would actually think that the best option here is to force the user to provide a seed, so that documents always remain deterministic. What speaks against that in your opinion?

May I ask why you are against shipping a way to seed it? I would actually think that the best option here is to force the user to provide a seed, so that documents always remain deterministic. What speaks against that in your opinion?

I'm fairly sure what they meant was no way to seed it in a non-deterministic manner.

I would actually think that the best option here is to force the user to provide a seed, so that documents always remain deterministic.

My wording was a bit unclear, but I indeed meant that you have to provide a seed and that there is no way to get a random seed from Typst.

I'm not sure I like this. First, I'm not sure why you would want randomness in your document. And second, in this form, the function does not seem all that useful to me since you basically have to provide one random number (seed) to get one random number. Typically a PRNG turns one seed number into a sequence of random numbers.

Another application is to create different versions of questions for exams. I used to use the LaTeX package pgfmath to create questions with random numbers. While I am trying to do the same thing with Typst, I noticed that a random generator is not there yet. It will be great to have such a function.

I'm not sure I like this. First, I'm not sure why you would want randomness in your document. And second, in this form, the function does not seem all that useful to me since you basically have to provide one random number (seed) to get one random number. Typically a PRNG turns one seed number into a sequence of random numbers.

Another application is to create different versions of questions for exams. I used to use the LaTeX package pgfmath, to create questions with random numbers. While I am trying to do the same thing with Typst, I noticed that a random generator is not there yet. It will be great to have such a function.

FYI. see how jax implements its PRNG in a immutable fashion, I think something similar is acceptable.

If someone really wants PRNG now, you can use https://github.com/Enter-tainer/jogs (Math.random()) or https://github.com/peng1999/typst-pyrunner (from random import randint, seed; seed(0); randint(0, 100)).
jogs outputs float and pyrunner outputs str (convert with float() or int()).
See https://typst.app/docs/packages/.

There's now the suiji package for pseudo-random number generation: https://typst.app/universe/package/suiji

Since this is now well-covered by packages, I'll close this.

Since this is now well-covered by packages, I'll close this.

The only caveat here is performance. For some purposes you need quite a lot of numbers, and for that I believe suiji is fairly slow. Though I guess that could be solved by offloading to WASM.


Enrich registry mirror struct with auth and cert

Add cert and auth info to registrymirror struct and create a registry mirror secret for curated package

/retest

/retest

/approve

/lgtm
/approve

/cherry-pick release-0.14


Add API for whether BB operations may CoW.

Motivation:
From time to time a NIO application holds a ByteBuffer that it may want
to edit. Whether it wants to do that may potentially be contingent on
whether having to do so will cause an allocation, as it may be
preferable to prefer a different operation.
Modifications:

Added API for asking BB if it thinks it'll CoW.

Result:
People can ask the question.

Closing because @douggregor would feel better if we did something else.


Dual GPU on Windows 10: High Usage of the Secondary GPU

Godot version: 3.1-3.2
OS/device including version: Windows 10 (64-bit), Acer Helios 300 (2019), RTX 2060, i7 9750H
Issue description: When I run the editor and especially launch the game from the editor, both of my GPUs becoming active and the activity % is more or less synced. The overall usage depends on the project itself, but Materials Tester Demo (from the official Godot package) is a great example, where % is always the same.
If I launch Godot with right-click and select Intel GPU only, then NVIDIA stays IDLE, but if I launch it with NVIDIA, then Intel GPU isn't IDLE at all: yes, it can be affected by the system and because it's connected to the laptop monitor, but not that much and not that synced. Load starts when I launch the game from the editor, and it ends, when I quit. No other apps do that so much: when I play games or launch other engines on NVIDIA, my Intel GPU stays below 15%.

Just to make sure: It is not making my experience bad, the cooling in my laptop is great, it is just a bit odd in general since no other apps do that. The best guess so far: when the game is running on NVIDIA, the editor switches to Intel to optimize performance. Is this correct?
Steps to reproduce: Launch 3.1-3.2 on a Laptop with Dual Graphics and Windows 10. Use performance mode, so Godot will rely on NVIDIA graphics. Launch the project. Instead, both GPUs will be heavily loaded. If you have a very good GPU, then make sure to turn off VSync in the editor settings, because otherwise it will never be utilized enough on 60 FPS (or, in my case, on 144).
Minimal reproduction project: Materials Tester Demo (from the official Godot package)

The best guess so far: when the game is running on NVIDIA, the editor switches to Intel to optimize performance. Is this correct?

I think both the editor and running project always run on the dedicated GPU. Also, neither of them have the ability to switch GPUs at run-time.

I think both the editor and running project are supposed to always run on the dedicated GPU. Also, neither of them have the ability to switch GPUs at run-time.

Then it seems really odd and I have no more ideas)

Something similar happened to me.
My problem is that I had the FPS (in the project settings) set to 0, so I set them to 60 and then I no longer consumed any CPU / GPU.

My problem is that I had the FPS (in the project settings) set to 0, so I set them to 60 and then I no longer consumed any CPU / GPU.

I want to get as high FPS as possible. And other apps or games, even if they run with 400+ FPS, they don't affect Intel GPU that much.


fn render invariant: functions should not be able to modify resources outside of their current package

When running kpt fn render, a function in a package should only be able to modify and generate resources within the current package. If it tries to, kpt should fail with error.
i.e. fn-render/path-index-ancestor and fn-render/path-index-outofpkg should fail with exit code 1.
cc @frankfarzan @droot @Shell32-Natsu
ref: https://github.com/GoogleContainerTools/kpt/issues/1559

Does this restriction apply to out-place render? @droot

Does this restriction apply to out-place render?

out-of-place render is orthogonal because functions themselves don't write to the filesystem, orchestrator does. Functions can recommend (or transform) the location of a resource by changing path and index annotations. So this issue is more about what transformations are allowed to path and index annotations by functions. Once we define that, orchestrator can enforce that. And Initially being restrictive is good idea and we can evolve the invariant as we learn more about use-cases.


Move the map automatically when wswm process ended.

Get newCenter and pass to the map object as map.center value.

#67
Implemented.


[BUG] -when websocket connect , Error reporting: failed: Error during WebSocket handshake: Unexpected response code: 200

create default project . when websocket connect , Error reporting: failed: Error during WebSocket handshake: Unexpected response code: 200 .
Also, I do not see the function of deploying static files in the document.

@zhou26192619
Did you enable the web socket in the .env file?
For static files, you need to put them in the public folder

public\folder\file.jpg
public\folder\html.index

// access

HTTP://domian.com/folder/file.jpg

@zhou26192619 Did you enable the web socket in the .env file?
For static files, you need to put them in the public folder
public\folder\file.jpg
public\folder\html.index

// access

HTTP://domian.com/folder/file.jpg

thank you .


intermittently hitting YouTubePlayerKit.YouTubePlayer.Error.embeddedVideoPlayingNotAllowed error

What happened?
Hi,
First, thank you for this library. It's amazing.
I am intermittently hitting a embeddedVideoPlayingNotAllowed error. Maybe 1 out of 10 times when trying to load a youtube video.
We use mostly in-house videos but sometimes use youtube videos for our fitness app. They are in a horizontal scrollview.
Code snippets below
player view:
struct YoutubePlayerHelperView: View {

    let youTubePlayer: YouTubePlayer
    var partOfPreview: Bool = false

    var body: some View {
        ZStack {
            YouTubePlayerView(self.youTubePlayer) { state in
                // Overlay ViewBuilder closure to place an overlay View
                // for the current `YouTubePlayer.State`
                switch state {
                case .idle:
                    ProgressView()
                case .ready:
                    EmptyView()
                case .error(let error):
                    Text(verbatim: "YouTube player couldn't be loaded")
                }
            }
            // hack to allow for ScrollView scrolling over video
            Color.red.opacity(0.0)
        }
    }

    static func initializePlayer(urlID: String) -> YouTubePlayer {
        return YouTubePlayer(
            source: .video(id: urlID),
            configuration: .init(
                showControls: false,
                loopEnabled: true
//                useModestBranding: true
            )
        )
    }

    static func getYoutubePlayer(urlID: String) -> YouTubePlayer {
        let youTubePlayer = initializePlayer(urlID: urlID)

        youTubePlayer.mute()
        youTubePlayer.play()

        return youTubePlayer
    }

}

called here:
struct ExerciseMiniVideoPlayer: View {
    ...
    ...
    var body: some View {
        VStack {
                YoutubePlayerHelperView(youTubePlayer: YoutubePlayerHelperView.getYoutubePlayer(urlID: youtubeURLID), partOfPreview: true)

from main view:
       GeometryReader { geometry in
            HStack {
                ScrollViewReader { scrollViewReaderValue in
                    ScrollView(.horizontal) {
                        HStack(spacing: 10) {
                            ForEach(workout.workoutPartsArray { workoutPart in

                                ExerciseMiniVideoPlayer(workoutPart: workoutPart, exerciseSet: ..., exercise:  exerciseID)
                                    .frame(width: (geometry.size.width * 0.9), height: ((geometry.size.width * 9) / 16) * 0.9)
                                    .cornerRadius(10)

here's a screenshot of it in use (when working). you can see the youtube video in bottom left corner.

thanks in advance!
What are the steps to reproduce?
described above
What is the expected behavior?
described above

Hi @lundjordan,
Thanks for your detailed description.
As the embeddedVideoPlayingNotAllowed error (Error-Code: 101) is coming directly from the YouTube Player iFrame JavaScript API there is sadly not much which can be easily fixed or debugged why the API returns this error code.
Normally this error code will be returned when the creator of the video disabled the embedding option.
But from looking at the provided code snippet I would recommend to annotate the YouTubePlayer instance variable with an @StateObject inside your view.
struct YoutubePlayerHelperView: View {

    @StateObject
    var youTubePlayer: YouTubePlayer

    ....

}

Additionally, as you app is showing multiple YouTubePlayerViews please keep in mind that simultaneous playback of multiple YouTube players is not supported (Read more)

Thank you for the prompt reply! 🙏🏼

Normally this error code will be returned when the creator of the video disabled the embedding option.

Interesting, in my case I can rule this out as the same video works most of the time and then once in a while, will failed to load with that error

But from looking at the provided code snippet I would recommend to annotate the YouTubePlayer instance variable with an @StateObject inside your view.

Thanks, I will try that.

Additionally, as you app is showing multiple YouTubePlayerViews please keep in mind that simultaneous playback of multiple YouTube players is not supported

Got it. I would actually be interested in not having the youtube videos autoplay but I have a conundrum. I have the videos in a ScrollView and need the user to be able to scroll horizontally across them all. If I don't autoplay and loopEnabled, I need to enable the user to have showControls access. But when I do that, they can no longer scroll with their finger over the video. With built in AVPlayer, a user can swipe anywhere on the video to initiate a scroll, and tap on the play button to play a video. For YouTubePlayerView I use a hack:
ZStack {
            YouTubePlayerView(self.youTubePlayer) // { state in ... etc

            // hack to allow for ScrollView scrolling over video
            Color.red.opacity(0.0)
 }

this allows me to autoplay the video, set showControls to false, and let the user scroll in ScrollView because they are actually touching a transparent color block overtop of the youtube video.
This might be scope creep of the bug but do you know of a way or support ability to use YoutubePlayer inside a scrollview and be able to scroll when touching inside the video frame? I bet you this would address the error issue as videos would only load/play as needed.
I'll upload an example of how it works right now:
https://github.com/SvenTiigi/YouTubePlayerKit/assets/1648433/f4074258-bc33-4c14-a53e-7ad02ffc5f3d

[...] do you know of a way or support ability to use YoutubePlayer inside a scrollview and be able to scroll when touching inside the video frame?

This is certainly kind a tricky as the underlying view of the YouTubePlayerView is a WKWebView and the displayed UI is therefore just HTML, CSS and JS which is makes it hard to implement something like Hit-Testing to check if a touch in a certain point of area should be redirected to next responder.

I am currently experiencing a simular issue. Not sure if it's the same embeddedVideoPlayingNotAllowed error, but basically the video will fail to load intermittently. My question is: is there a way to reload the video when this happens?
My ideal use case would be to listen to the statePublisher and display a refresh button when this returns an error. But I don't really see a way to act on this and to actually reload the YouTube player. Basically looking for a youTubePlayer.reload() function.

@tyler-fp a dedicated reload function is currently not available but would be a good addition the YouTubePlayerKit 👍
For now you can simply re-apply the current configuration which destroys the underlying JavaScript YouTubePlayer instance and performs a re-setup.
extension YouTubePlayer {

    func reload() {
        self.update(configuration: self.configuration)
    }

}

Ah perfect! Simple enough, thanks @SvenTiigi  👍

@tyler-fp FYI the reload function is now available with the latest release 1.5.3

Hi there,
I started poking this a bit again as some users have complained.
Below is my ugly attempt to reload:
My youtube player view:
struct YoutubePlayerHelperView: View {

    @StateObject var youTubePlayer: YouTubePlayer
    var partOfPreview: Bool = false

    @State private var retryTimes = 0

    var body: some View {
        ZStack {
            YouTubePlayerView(self.youTubePlayer) { state in
                // Overlay ViewBuilder closure to place an overlay View
                // for the current `YouTubePlayer.State`
                switch state {
                case .idle:
                    ProgressView()
                case .ready:
                    EmptyView()
                case .error( _):
                    self.tryReloadingView()
                }
            }
            // hack to allow for ScrollView scrolling over video
            Color.red.opacity(0.0)
        }
    }

    func tryReloadingView() -> some View {
        if retryTimes < 3 {
            self.youTubePlayer.reload()
            self.youTubePlayer.mute()
            self.youTubePlayer.play()
        }
        retryTimes += 1
        return EmptyView()
    }

    static func initializePlayer(urlID: String) -> YouTubePlayer {
        return YouTubePlayer(
            source: .video(id: urlID),
            configuration: .init(
                showControls: false,
                loopEnabled: true
//                useModestBranding: true
            )
        )
    }

    static func getYoutubePlayer(urlID: String) -> YouTubePlayer {
        let youTubePlayer = initializePlayer(urlID: urlID)

        youTubePlayer.mute()
        youTubePlayer.play()

        return youTubePlayer
    }

}

my view init call:
YoutubePlayerHelperView(youTubePlayer: YoutubePlayerHelperView.getYoutubePlayer(urlID: youtubeURLID))

behaviour I get:

if the state never hits case .error, calling YoutubePlayerHelperView(youTubePlayer: YoutubePlayerHelperView.getYoutubePlayer(urlID: youtubeURLID)) will load the video and automatically start it playing it because of getYoutubePlayer() call.

however, if we do hit the intermittent .error case, tryReloadingView() does successfully reload the video and removes the error view ( I instead see the youtube thumbnail ). But it does not automatically start playing. I was thinking about adding a DispatchQueue.main.asyncAfter sleep call inside tryReloadingView in between the reload() and the mute()/play() calls but this all feels like the wrong approach. I need it to autoplay and loop after reload because of the requirement to be able to embed videos inside a scrollview as described in https://github.com/SvenTiigi/YouTubePlayerKit/issues/74#issuecomment-1739826773

Any helps or tips would be appreciated!

I ended up doing:
func tryReloadingView() -> some View {
        if retryTimes < 3 {
            self.youTubePlayer.reload()
            DispatchQueue.main.asyncAfter(deadline: .now() + 2.0) {
                self.youTubePlayer.mute()
                self.youTubePlayer.play()
            }
        }
        retryTimes += 1
        return EmptyView()
    }

which is not pretty but it does work at least. I noticed sleeping for 1 second was not enough. Needed to up it to 2 seconds.

I ended up doing:
func tryReloadingView() -> some View {
        retryTimes += 1
        if retryTimes <= 3 {
            self.youTubePlayer.reload()
            DispatchQueue.main.asyncAfter(deadline: .now() + 2.0) {
                self.youTubePlayer.mute()
                self.youTubePlayer.play()
            }
            return AnyView(EmptyView())
        } else {
            return AnyView(Text(verbatim: "YouTube player couldn't be loaded"))
        }
    }

which is not pretty but it does work at least. I noticed sleeping for 1 second was not enough. Needed to up it to 2 seconds.

Hi @lundjordan,
Based on the code snippets you provided I can give you some tips which might be helpful.

Do not invoke any kind of side effect such as calling the tryReloadingView() function inside the placeholder overlay view builder closure of the YouTubePlayerView. This overlay view builder closure is called an indefinite number of times by the SwiftUI rendering engine. The best place to call a function such as tryReloadingView() is via an onReceive view modifier which listens to the YouTubePlayer.State.

struct YoutubePlayerHelperView: View {

    @StateObject
    var youTubePlayer: YouTubePlayer

    var body: some View {
        YouTubePlayerView(self.youTubePlayer) { state in
            // ...
        }
        .onReceive(self.youTubePlayer.statePublisher) { state in
            if case .error(let error) = state {
                // TODO: Try to reload if necessary
            }
        }
    }

}

Please keep in mind that function calls as reload(), mute() or play() are asynchronous meaning it can take sometime until the operation finished due to the underlying JavaScript communication . It would be better to just call reload() and react to the change of the state of the YouTubePlayer via the statePublisher property to call the mute or play function when the YouTubePlayer is in a ready state.

As the YouTubePlayer instance is marked with the @StateObject property wrapper and you passing the instance from the outside of the view you should be keeping this warning from the developer documentation in mind:

Use caution when doing this. SwiftUI only initializes a state object the first time you call its initializer in a given view. This ensures that the object provides stable storage even as the view’s inputs change. However, it might result in unexpected behavior or unwanted side effects if you explicitly initialize the state object.

Read more

The best place to call a function such as tryReloadingView() is via an onReceive view modifier which listens to the YouTubePlayer.State.

Ah, self.youTubePlayer.statePublisher. That makes sense, I changed it and this works! Thank you 🙏🏼

and thanks for the context with 2. and 3.

Closing this issue due to inactivity.
Feel free to re-open the issue at any time.


3' UTR seqlist

Maybe I'm missing something, but if I understand your tutorial correctly, I need to input the 3' UTR seqlist from my own experiment, is that correct? In that case, could you describe how I obtain this from, e.g., 10X experiments (FASTQ or BAM)?
Thanks!

I encourage you to look at the downsampled 'Tabula Muris' data set to get a feel for how the data set should look.
You need the expression matrix as an R matrix object as input. With gene identifiers as ensenble gene IDs (ENSGxxxxx) or gene symbols. The gene IDs or symbols shold be the rownames of the matrix.
The sequences (for human and mouse) are provided in the software. But you need to either download (from synapse) or produce motif probabilities in sequences as instructed in the tutorial under 'Calculating motif probabilities in sequences'.
The reason for this is that the file (R matrix) is too big to be on github (3-4 gb). It is a matrix containing probabilities for observing motifs in the 3'utr sequences.
If you are working in another organism than mouse or human, you will need to obtain the 3'UTR sequences. In that case, I can try to walk you through the process. Let me know.

So to clarify, you need to estimate gene expression from FASTQ or BAM files prior to using this tool.


chore: bump muta codec derive version

What type of PR is this?
chore
What this PR does / why we need it:

bump muta codec derive version

Which issue(s) this PR fixes:

Fixes #
Special notes for your reviewer:

ping @yejiayu


layers/meta-balena: Update to v2.83.4

Update meta-balena from 2.83.1 to 2.83.4
Changelog-entry: Update meta-balena from v2.83.1 to v2.83.4
Signed-off-by: Alex Gonzalez<EMAIL_ADDRESS>

@resin-jenkins retest this please

Looks like a minor space issue:
ERROR: balena-image-1.0-r0 do_image_docker: The rootfs size 1060864(K) exceeds IMAGE_ROOTFS_MAXSIZE: 1024000(K)
ERROR: Logfile of failure stored in: /work/build/tmp/work/genericx86_64_ext-poky-linux/balena-image/1.0-r0/temp/log.do_image_docker.814664
NOTE: recipe balena-image-1.0-r0: task do_image_docker: Failed
ERROR: Task (/work/build/../layers/meta-balena/meta-balena-common/recipes-core/images/balena-image.bb:do_image_docker) failed with exit code '1'
NOTE: Tasks Summary: Attempted 5083 tasks of which 3945 didn't need to be rerun and 1 failed.

This PR should fix it:
https://github.com/balena-os/meta-balena/pull/2273

@jakogut could you also please make sure we have bigger rootfs partitions on the generic-amd64 DT that will replace the genericx86-64-ext? It's supposed to be big enough to build as many modules and firmware as required.

Still
ERROR: balena-image-1.0-r0 do_image_docker: The rootfs size 1056768(K) exceeds IMAGE_ROOTFS_MAXSIZE: 1024000(K)

Superseded by https://github.com/balena-os/balena-intel/pull/399


OSError: [Errno 2] No such file or directory

Hello, guys, I've tried to run your script and thats what I've got:
MacBook-Pro:console_video oay$ python player.py test.mp4
Traceback (most recent call last):
File "player.py", line 68, in
play(sys.argv[1])
File "player.py", line 20, in play
iv.open(file_path)
File "/Users/OgeL/console_video/pipeffmpeg.py", line 431, in open
stderr=sp.PIPE,
File "/anaconda/lib/python2.7/subprocess.py", line 710, in init
errread, errwrite)
File "/anaconda/lib/python2.7/subprocess.py", line 1335, in _execute_child
raise child_exception
OSError: [Errno 2] No such file or directory
What I am doing wrong?

the script is based on ffmpeg, you should have  ffmpeg installed first
➜  ~  which ffmpeg
/usr/local/bin/ffmpeg


CDC batch of changes

Closes #6151, #9718, #5806
-add limitation that Avro is only available with Kafka
-add callout that cloud storage sink urls must be prepended with experimental- for changefeeds
-mention that core changefeeds can watch multiple tables

This change is

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

v20.1/changefeed-for.md
v20.2/changefeed-for.md
v20.2/create-changefeed.md
v20.2/use-cloud-storage-for-bulk-operations.md
v21.1/changefeed-for.md
v21.1/create-changefeed.md
v21.1/use-cloud-storage-for-bulk-operations.md

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

v20.1/changefeed-for.md
v20.2/changefeed-for.md
v20.2/create-changefeed.md
v20.2/use-cloud-storage-for-bulk-operations.md
v21.1/changefeed-for.md
v21.1/create-changefeed.md
v21.1/use-cloud-storage-for-bulk-operations.md


monitoring: update metrics name

The latest opencensus changes removed the previous "opencensus_" prefix.
I'm taking advantage of that to properly name our views (following what looks like the best practice for prometheus views).
Thanks for catching that!

This change is

stratumn is ok for me. indigo_core or stratumn_indigo_core
@such What do you think?

Reviewed 3 of 3 files at r1.
Review status: all files reviewed at latest revision, all discussions resolved.

Comments from Reviewable

Reviewed 3 of 3 files at r2.
Review status: all files reviewed at latest revision, all discussions resolved.

Comments from Reviewable

Reviewed 3 of 3 files at r2.
Review status: :shipit: all files reviewed at latest revision, all discussions resolved, all commit checks successful.

Comments from Reviewable


Order OVA finder alphabetically

Trello: https://trello.com/c/tB7aFZQB/2981-add-alphabetical-sorting-for-ova-finder
⚠ This repo is Continuously Deployed: make sure you follow the guidance ⚠
Follow these steps if you are doing a Rails upgrade.

@minhngocd I tried deploying the non-deprecated version (https://github.com/alphagov/specialist-publisher/pull/2794) but it didn't work.
I think given none of the other finders use the sort key, and that there are five other live finders using the default_order key, let's just merge this one as-is and come back to it later.


Instant crash on global message search

Reproduce: From the recents list, press the magnifying glass icon (search). Tap the «messages» tab. Crash.

Related to https://github.com/vector-im/vector-android/issues/709

fixed https://github.com/vector-im/vector-android/commit/1e8b21c97d00cb9f15ebafe057ad7f7c7f542e42

Fix confirmed. Thanks.


GH-628: Add dlqPartitions property

Resolves https://github.com/spring-cloud/spring-cloud-stream-binder-kafka/issues/628
Allow users to specify the number of partitions in the dead letter topic.
If the property is set to 1 and the minPartitionCount binder property is 1,
override the default behavior and always publish to partition 0.

Looks great. Merged upstream.


Change type of screenshots from input to textarea

This PR is addressing the following issue #2027
https://github.com/EddieHubCommunity/support/issues/2027

Thanks for the contribution! :tada:


adding twingate repository

Adding twingate repository

@romankor If you follow the directions on the checks tab at the top it will help you correct the DCO issues. All the commits need to be signed.

The Artifact Hub is another place you can list your repos. To do that, you login (or create an account), create an organization, and list your repository. You can link it to a user or organization.

@mattfarina , fixed


Cannot assign .... ComplexQuery::$columns of type array

Hello, my code is as follows. When I make $complex = true, Cannot assign Illuminate\Support\Collection to property Arm092\LivewireDatatables\Livewire\ComplexQuery::$columns of type array
I am getting the error. How can I solve this? In the original repo, $complex = true was working smoothly, but when I switched to your repo, I cannot set $complex = true. I also tried a fresh Laravel installation and encountered the same problem there.
class AverageDatatable extends LivewireDatatable
{
use Enum, Summarize;
public ?string $hideable = 'select';
public bool $exportable = true;
public $complex = true;
public bool $persistComplexQuery = true;
public ?string $afterTableSlot = 'components.selected';

public function builder(): Builder
{
    return Average::query()
        ->leftJoin('advertisers', 'advertisers.id', '=', 'averages.advertiser_id');

}

public function getColumns(): array|Model
{
    return [
        Column::name('advertisers.name')
            ->label(__('Advertiser'))
            ->defaultSort('asc')
            ->searchable('name')
            ->hideable()
            ->filterable(),

        Column::name("quarter_id")
            ->label('Quarter')
            ->hideable()
            ->view('components.datatable.quarter_filter')
            ->filterable(Quarter::toArray()),

        Column::name("quarter_year")
            ->label('Quarter Year')
            ->hideable()
            ->filterable(years()),
    ];

}

}

I've realesed new version, please update and give feedback

now Cannot assign null to property Arm092\LivewireDatatables\Livewire\ComplexQuery::$savedQueries of type array
now there is this problem

try this one, please (new release)

Okay, there is no error at the moment, the page appears, but when I add rules or groups, filtering in the table does not work.

Please, can you try to fix the problems, and make PR? I will review, merge and release it. Just now I don't have time to fix and test all functionalities

Approved and merged your PR, thanks.
Here is new version


Fix unnecessary loki.process config reloads

PR Description
As discussed offline, this is a different implementation of https://github.com/grafana/alloy/pull/1426.
We're addressing only the mutation of configuration that is provided to loki.process, which is a local solution to address too frequent config reloads.
A more global (in the future) solution would ideally be implemented on the framework / runtime level that would prevent updating config when they didn't change. Or making configs truly immutable.
NOTE 1: mutating arguments doesn't always lead to issues, as they are passed by value (struct) to the component and to each newXXXStage function. The problem starts when the arguments contain a slice, map or a pointer to another struct and it gets mutated.
NOTE 2: I also caught a couple of stages not correctly applying their defaults because they were mutating a function-local copy of the configuration only.
Which issue(s) this PR fixes

Notes to the Reviewer
PR Checklist

[x] CHANGELOG.md updated
[ ] Documentation added
[x] Tests updated
[ ] Config converters updated

NOTE 2: I also caught a couple of stages not correctly applying their defaults because they were mutating a function-local copy of the configuration only.

This is partially why I went with a different approach in #1426. I'd also noticed a few cases of mutations and I decided could not guarantee that I can catch every single instance where this happens. I still think it's easier to copy than to do manually inspect the codebase for mutations, but if this will get the bug resolved for now, I'm ok with merging this.

I could not guarantee that I can catch every single instance where this happens.

I agree that we should not rely on human reviews to catch this. And also many other possible errors. That's why I believe the right answer here is to have tests. If there is a validate / default values function, it should be tested. And same goes for most of other code that has any non-trivial logic.


[flutter_tools] alternate the name of the dill file used for hot restart

Description
Context:
https://github.com/flutter/engine/blob/master/fml/platform/win/mapping_win.cc#L73
Fixes https://github.com/flutter/flutter/issues/60910

FYI @aam

@zanderso do you have any concerns about this? from my understanding what we're doing today is technically not safe, though unlikely to crash.

swap sounds good.
For a real fix, yes I think we'd have to stop the main isolate before uploading the new dill and restarting. I can foresee some issues though because the main isolate lifecycle is tied to the service isolate and application lifecycle, so simply using the existing vm_service API is not sufficient.
We'd need a new set of vm_service APIs provided by the engine that essentially split the hot restart process in half, one to take down the main isolate (while keeping everything else alive) and one to resurrect it with the newly uploaded dill. I'm not sure how difficult that would be to do. Fyi @chinmaygarde @jason-simmons


Support for Python 3.10's match operator

Currently the match operator is not supported because of the version of libcst that is in use. https://github.com/facebookexperimental/usort/pull/180
0.4.1 only has support for Python up to 3.8, while 0.4.2 (and up) has support for every other Python version.
Is it likely to be fixed in the near future?

usort only specifies a min version that is the lowest that passes our tests; you're free to upgrade.  Similar to how ufmt advises pinning black and usort, you can also do so for libcst: https://ufmt.omnilib.dev/en/stable/#install
Let me know if I misunderstand the problem -- an example repo would be helpful.

Totally got it! Thanks!