plugin: Deduplicate Relist()s triggered by VM pod start events

Fixes #851, refer there for more context.

This PR adds a new feature to util/watch - the ability to fetch the upper bound on the number of Relists that have taken place so far (approximately), and trigger relisting only if there hasn't been any more.
More symbolically, it adds the ability to fetch a "timestamp"-like token from watch.Store, and say "please relist if you haven't yet, since this timestamp".
This allows us to fix the duplicate Relist()s issue by attaching this token to each pod start event as they come in, meaning that only pod events received after the most recent Relist() started will trigger another one. Quoting one of the commits:

With this change, the amount of required Relist()s are determined not by the number of events, but by the actual time it takes to complete the Relist() (a new one is only necessary if an event came in after the previous one completed - so events are delayed by at most 2x the duration of a single Relist() call, assuming negligible other handling).

I tested this locally and have confirmed that it fixes #851. Details collapsed below:

Testing details

In general, the testing plan was:

Add artificial delay to processing pod start events
Create two VMs at the same time, that don't go through the scheduler (so they won't exist in local state)
After the VM pod start events are queued, delete the VMs
Profit? (jk)

I used this patch to modify the scheduler:
diff --git a/pkg/plugin/plugin.go b/pkg/plugin/plugin.go
index 7c76c50..d07d833 100644
--- a/pkg/plugin/plugin.go
+++ b/pkg/plugin/plugin.go
@@ -133,7 +133,12 @@ func makeAutoscaleEnforcerPlugin(
 	}
 	pwc := podWatchCallbacks{
 		submitStarted: func(logger *zap.Logger, pod *corev1.Pod, vmRelistCount watch.RelistCount) {
-			pushToQueue(logger, func() { p.handleStarted(hlogger, pod, vmRelistCount) })
+			pushToQueue(logger, func() {
+				hlogger.Info("DEBUG: SLEEPING FOR 10 SECONDS", util.PodNameFields(pod))
+				time.Sleep(time.Second * 10)
+				hlogger.Info("DEBUG: DONE SLEEPING", util.PodNameFields(pod))
+				p.handleStarted(hlogger, pod, vmRelistCount)
+			})
 		},
 		submitDeletion: func(logger *zap.Logger, name util.NamespacedName) {
 			pushToQueue(logger, func() { p.handleDeletion(hlogger, name) })

... and this one, to modify vm-deploy.yaml:
diff --git a/vm-deploy.yaml b/vm-deploy.yaml
index e549f6e..bdae573 100644
--- a/vm-deploy.yaml
+++ b/vm-deploy.yaml
@@ -11,7 +11,6 @@ metadata:
     # Set to "true" to continuously migrate the VM (TESTING ONLY)
     autoscaling.neon.tech/testing-only-always-migrate: "false"
 spec:
-  schedulerName: autoscale-scheduler
   enableSSH: true
   guest:
     cpus: { min: 0.25, use: 0.25, max: 1.25 }

I also created a copy of vm-deploy.yaml with a different name, to act as the second VM.
Commands for testing were:
kubectl apply -f vm-deploy.yaml && kubectl apply -f vm-deploy2.yaml
kubectl delete neonvm postgres16-disk-test postgres16-disk-test-2

and this was the scheduler's log output, showing that it relisted only once, even though both VMs were missing:
{"level":"info","ts":1709965015.6497762,"logger":"autoscale-scheduler.vm-watch","caller":"plugin/watch.go:291","msg":"Skipping update for VM because .status.podName is empty","virtualmachine":{"namespace":"default","name":"postgres16-disk-test"}}
{"level":"info","ts":1709965015.7465107,"logger":"autoscale-scheduler.vm-watch","caller":"plugin/watch.go:291","msg":"Skipping update for VM because .status.podName is empty","virtualmachine":{"namespace":"default","name":"postgres16-disk-test-2"}}
{"level":"info","ts":1709965018.1640103,"logger":"autoscale-scheduler.pod-watch","caller":"plugin/watch.go:140","msg":"Received update event for Pod now running","pod":{"namespace":"default","name":"postgres16-disk-test-n6wkf"}}
{"level":"info","ts":1709965018.1640441,"logger":"autoscale-scheduler.handlers","caller":"plugin/plugin.go:137","msg":"DEBUG: SLEEPING FOR 10 SECONDS","virtualmachine":{"namespace":"default","name":"postgres16-disk-test"},"pod":{"namespace":"default","name":"postgres16-disk-test-n6wkf"}}
{"level":"info","ts":1709965018.1794043,"logger":"autoscale-scheduler.pod-watch","caller":"plugin/watch.go:140","msg":"Received update event for Pod now running","pod":{"namespace":"default","name":"postgres16-disk-test-2-2z8j7"}}
{"level":"info","ts":1709965024.2002063,"logger":"autoscale-scheduler.pod-watch","caller":"plugin/watch.go:146","msg":"Received update event for completion of Pod","pod":{"namespace":"default","name":"postgres16-disk-test-n6wkf"}}
{"level":"info","ts":1709965024.2221467,"logger":"autoscale-scheduler.pod-watch","caller":"plugin/watch.go:173","msg":"Received delete event for completed Pod","pod":{"namespace":"default","name":"postgres16-disk-test-n6wkf"}}
{"level":"info","ts":1709965024.2392888,"logger":"autoscale-scheduler.pod-watch","caller":"plugin/watch.go:146","msg":"Received update event for completion of Pod","pod":{"namespace":"default","name":"postgres16-disk-test-2-2z8j7"}}
{"level":"info","ts":1709965024.2548335,"logger":"autoscale-scheduler.pod-watch","caller":"plugin/watch.go:173","msg":"Received delete event for completed Pod","pod":{"namespace":"default","name":"postgres16-disk-test-2-2z8j7"}}
{"level":"info","ts":1709965028.16438,"logger":"autoscale-scheduler.handlers","caller":"plugin/plugin.go:139","msg":"DEBUG: DONE SLEEPING","virtualmachine":{"namespace":"default","name":"postgres16-disk-test"},"pod":{"namespace":"default","name":"postgres16-disk-test-n6wkf"}}
{"level":"info","ts":1709965028.1644406,"logger":"autoscale-scheduler.handlers","caller":"plugin/state.go:587","msg":"Handling Pod start event","action":"Pod started","node":"neonvm-root-worker","virtualmachine":{"namespace":"default","name":"postgres16-disk-test"},"pod":{"namespace":"default","name":"postgres16-disk-test-n6wkf"}}
{"level":"warn","ts":1709965028.1644697,"logger":"autoscale-scheduler.handlers","caller":"plugin/plugin.go:284","msg":"VM is missing from local store. Relisting if it hasn't already been done","action":"Pod started","node":"neonvm-root-worker","virtualmachine":{"namespace":"default","name":"postgres16-disk-test"},"pod":{"namespace":"default","name":"postgres16-disk-test-n6wkf"},"pod":{"namespace":"default","name":"postgres16-disk-test-n6wkf"},"virtualmachine":{"namespace":"default","name":"postgres16-disk-test"}}
{"level":"info","ts":1709965028.1646848,"logger":"autoscale-scheduler.vm-watch.watch","caller":"watch/watch.go:334","msg":"Relisting"}
{"level":"info","ts":1709965028.166872,"logger":"autoscale-scheduler.vm-watch.watch","caller":"watch/watch.go:427","msg":"Relist complete, restarting watcher"}
{"level":"error","ts":1709965028.1670778,"logger":"autoscale-scheduler.handlers","caller":"plugin/state.go:617","msg":"Error getting VM info for Pod","action":"Pod started","node":"neonvm-root-worker","virtualmachine":{"namespace":"default","name":"postgres16-disk-test"},"pod":{"namespace":"default","name":"postgres16-disk-test-n6wkf"},"error":"Could not find VM for pod, even after relist","stacktrace":"github.com/neondatabase/autoscaling/pkg/plugin.(*AutoscaleEnforcer).reserveResources\n\t/workspace/pkg/plugin/state.go:617\ngithub.com/neondatabase/autoscaling/pkg/plugin.(*AutoscaleEnforcer).handleStarted\n\t/workspace/pkg/plugin/state.go:589\ngithub.com/neondatabase/autoscaling/pkg/plugin.makeAutoscaleEnforcerPlugin.func3.1\n\t/workspace/pkg/plugin/plugin.go:140\ngithub.com/neondatabase/autoscaling/pkg/plugin.makeAutoscaleEnforcerPlugin.func11\n\t/workspace/pkg/plugin/plugin.go:225"}
{"level":"info","ts":1709965028.167148,"logger":"autoscale-scheduler.handlers","caller":"plugin/plugin.go:137","msg":"DEBUG: SLEEPING FOR 10 SECONDS","virtualmachine":{"namespace":"default","name":"postgres16-disk-test-2"},"pod":{"namespace":"default","name":"postgres16-disk-test-2-2z8j7"}}
{"level":"info","ts":1709965038.1678114,"logger":"autoscale-scheduler.handlers","caller":"plugin/plugin.go:139","msg":"DEBUG: DONE SLEEPING","virtualmachine":{"namespace":"default","name":"postgres16-disk-test-2"},"pod":{"namespace":"default","name":"postgres16-disk-test-2-2z8j7"}}
{"level":"info","ts":1709965038.1678467,"logger":"autoscale-scheduler.handlers","caller":"plugin/state.go:587","msg":"Handling Pod start event","action":"Pod started","node":"neonvm-root-worker","virtualmachine":{"namespace":"default","name":"postgres16-disk-test-2"},"pod":{"namespace":"default","name":"postgres16-disk-test-2-2z8j7"}}
{"level":"warn","ts":1709965038.1678603,"logger":"autoscale-scheduler.handlers","caller":"plugin/plugin.go:284","msg":"VM is missing from local store. Relisting if it hasn't already been done","action":"Pod started","node":"neonvm-root-worker","virtualmachine":{"namespace":"default","name":"postgres16-disk-test-2"},"pod":{"namespace":"default","name":"postgres16-disk-test-2-2z8j7"},"pod":{"namespace":"default","name":"postgres16-disk-test-2-2z8j7"},"virtualmachine":{"namespace":"default","name":"postgres16-disk-test-2"}}
{"level":"error","ts":1709965038.167872,"logger":"autoscale-scheduler.handlers","caller":"plugin/state.go:617","msg":"Error getting VM info for Pod","action":"Pod started","node":"neonvm-root-worker","virtualmachine":{"namespace":"default","name":"postgres16-disk-test-2"},"pod":{"namespace":"default","name":"postgres16-disk-test-2-2z8j7"},"error":"Could not find VM for pod, even after relist","stacktrace":"github.com/neondatabase/autoscaling/pkg/plugin.(*AutoscaleEnforcer).reserveResources\n\t/workspace/pkg/plugin/state.go:617\ngithub.com/neondatabase/autoscaling/pkg/plugin.(*AutoscaleEnforcer).handleStarted\n\t/workspace/pkg/plugin/state.go:589\ngithub.com/neondatabase/autoscaling/pkg/plugin.makeAutoscaleEnforcerPlugin.func3.1\n\t/workspace/pkg/plugin/plugin.go:140\ngithub.com/neondatabase/autoscaling/pkg/plugin.makeAutoscaleEnforcerPlugin.func11\n\t/workspace/pkg/plugin/plugin.go:225"}
{"level":"info","ts":1709965038.1678982,"logger":"autoscale-scheduler.handlers","caller":"plugin/state.go:767","msg":"Handling deletion of VM pod","action":"VM deletion","pod":{"namespace":"default","name":"postgres16-disk-test-n6wkf"}}
{"level":"warn","ts":1709965038.1679075,"logger":"autoscale-scheduler.handlers","caller":"plugin/state.go:796","msg":"Cannot find Pod in global pods map","action":"VM deletion","pod":{"namespace":"default","name":"postgres16-disk-test-n6wkf"}}
{"level":"info","ts":1709965038.167914,"logger":"autoscale-scheduler.handlers","caller":"plugin/state.go:771","msg":"Deleted  Pod","action":"VM deletion","pod":{"namespace":"default","name":"postgres16-disk-test-n6wkf"},"migrating":false,"verdict":{"cpu":"","mem":""}}
{"level":"info","ts":1709965038.1679213,"logger":"autoscale-scheduler.handlers","caller":"plugin/state.go:767","msg":"Handling deletion of VM pod","action":"VM deletion","pod":{"namespace":"default","name":"postgres16-disk-test-2-2z8j7"}}
{"level":"warn","ts":1709965038.1679294,"logger":"autoscale-scheduler.handlers","caller":"plugin/state.go:796","msg":"Cannot find Pod in global pods map","action":"VM deletion","pod":{"namespace":"default","name":"postgres16-disk-test-2-2z8j7"}}
{"level":"info","ts":1709965038.1679342,"logger":"autoscale-scheduler.handlers","caller":"plugin/state.go:771","msg":"Deleted  Pod","action":"VM deletion","pod":{"namespace":"default","name":"postgres16-disk-test-2-2z8j7"},"migrating":false,"verdict":{"cpu":"","mem":""}}

NB: I intend to merge this PR via "rebase and merge" to keep the separate commits.
Notes for reviewers: Probably easiest to review each commit one by one. Happy to receive suggestions for alternate naming — not a huge fan of RelistCount; ideally it'd make the implications a little more clear, idk.
This PR also ended up much larger than I thought it would, but I think about as complex as @shayanh expected :sweat_smile:
Also, I'll probably build locally & deploy to staging for testing, so we can do a hotfix early next week.

Thanks for opening this PR! I looked over the changes and I need to spent more time to understand the changes better.
Our watch and relist logic is already complex and these changes makes it even more complicated. We should be careful about complexity here.

I think this actually may not be necessary; there's other, simpler ways around the issue. Will open an issue when I get a chance.

Converted to draft because we'll probably bypass via #863.

Resolved via #863


Softmax parameter sweep

Adding config files to sweep parameters for SoftMax variations.

Looks like I might have removed the dim in the last softmax pass, will try to correct after merging with another pr to fix the two tests above.


(#1145) Support interactive edit for consumers

Here we add the --interactive flag to the consumer edit action. This behaves the same as stream interactive edit.

not bad, my weird yaml marshal thing seems to be generic enough :)


Incorrect type inferred after instanceof/Array.isArray checks?

I'm using<EMAIL_ADDRESS>and I think below an incorrect type is being inferred for the default case in the if statement.
/* @flow */

import _ from 'lodash';

declare function encodeURIComponent(uriComponent: string | number) : string;

type NonNullJSONType = {[key: string]: NonNullJSONType}| Array<NonNullJSONType> | string | number;

/**
* Formats a facebook querystring recursively:
* - Arrays are formatted as comma-delimited values.
* - Object keys and values are formatted as k1=v1&k2=v2
* - Scalar values are encoded with encodeURIComponent
*/
export default function facebookQs(v: NonNullJSONType) : string {
  if (Array.isArray(v)) {
    return _(v).map(facebookQs).join(',');
  } else if (v instanceof Object) {
    return _(v).toPairs().map(([k,v]) => `${k}=${facebookQs(v)}`).join('&');
  } else {
    return encodeURIComponent(v);
  }
}

Running a flow check on this, I'm given the following errors:
src/util/facebookQs.js:19
 19:     return encodeURIComponent(v);
                                   ^ object type. This type is incompatible with
  5: declare function encodeURIComponent(uriComponent: string | number) : string;
                                                       ^^^^^^^^^^^^^^^ union: string | number
  Member 1:
    5: declare function encodeURIComponent(uriComponent: string | number) : string;
                                                         ^^^^^^ string
  Error:
   19:     return encodeURIComponent(v);
                                     ^ object type. This type is incompatible with
    5: declare function encodeURIComponent(uriComponent: string | number) : string;
                                                         ^^^^^^ string
  Member 2:
    5: declare function encodeURIComponent(uriComponent: string | number) : string;
                                                                  ^^^^^^ number
  Error:
   19:     return encodeURIComponent(v);
                                     ^ object type. This type is incompatible with
    5: declare function encodeURIComponent(uriComponent: string | number) : string;
                                                                  ^^^^^^ number

In the final clause of the if statement, shouldn't v be deduced as string | number? As a different issue I also had to redeclare encodeURIComponent since it should be able to take a number as an input.

Seems like a duplicate of https://github.com/facebook/flow/issues/2132

Thanks for that, definitely is a duplicate. If anyone reads this: typeof v === 'object' is a workaround.

Merging with #2132


Introducing Task

Introduce Task protocol, that can be fed into Puma
Use swift 5.1 function builder syntax
Add initial README
Support build, test, bump version, archive and export archive tasks

🎉


Win 10 Open with... support

Feature/enhancement description:

I am double clicking on a .lorien file in windows explorer. It opens  the "open with" dialog and I select lorien.exe.
When I try to open the .lorien file it should open the file in lorien. It instead opens a new untitled file in a new window of lorien.
I am running windows 10 pro 21h1
The program should be able to open a supported file by selecting the lorien.exe in the "open with..." dialog.

Good idea! I did some research and it's possible to do that. But unfortunally it's always going to open a new instance of Lorien and it's currently not possible to open the file in a new tab if Lorien is already running (would probably require some Windows specifc stuff or inter process communication...not sure).
It's still better than nothing, so i'm going to implement it. I'm also going to add the ability to drag and drop files from the Windows Explorer into the running program to open them.


connection refused

iwrpg.vectordungeon.com not reachable

Hey @fireworx
This should be resolved now, after you update to v4.0


Ieee 754 floating point -> Just a gentle question: Is there any plan to integrate the floating-point operations from the VexiiRiscv project into the SpinalHDL library?

Hello!
I’ve noticed that the floating-point operation core/plugin in VexRiscv, especially the commonly used floating-point adder and multiplier, seems quite stable now. Are there any plans to integrate them into SpinalHDL?
I see that SpinalHDL/lib/src/main/scala/spinal/lib/experimental/math/Floating.scala hasn’t been updated for a long time.
My abilities are limited, and it’s somewhat challenging for me to port the floating-point multiplier and adder into the SpinalHDL library. I spent some time trying but didn’t succeed (I also didn’t fully understand it; it seems to require some modifications), so I would like to hear your opinion. What do you think?

Hi
The Vexii/Nax FPU implementation isn't using the same format than lib/experimental/math/Floating.scala, instead of trying to fit more information in the exponent / mantisa, it has a "proper" enum to record normal/subnormal/zero/infinity/nan modes.
There is no realy a plan to merge it back to spinal lib currently. but i think merging the floating point type would be ok in a first time.
The main reason why not merging the other stuff, is that it would require a real heavy usage in a non cpu related project ("eat your own dog food" concept), and i don't feel like i would use it enough to get something of a proper quality.


UnicodeDecodeError on Import

Getting this error during import, running Python 3.6.3:
File "myproject\myfile.py", line 6, in <module>
    from date_extractor import extract_dates
  File "myproject\venv\lib\site-packages\date_extractor\__init__.py", line 6, in <module>
    from . import enumerations
  File "myproject\venv\lib\site-packages\date_extractor\enumerations.py", line 83, in <module>
    lines = f.read().split("\n")
  File "myproject\venv\lib\encodings\cp1252.py", line 23, in decode
    return codecs.charmap_decode(input,self.errors,decoding_table)[0]
UnicodeDecodeError: 'charmap' codec can't decode byte 0x81 in position 129: character maps to <undefined>

Works fine on another machine running 3.5.?. Any clues?

Thanks for catching that! I might have to pass in the encoding when opening the file for newer versions of Python.  I'll take a deeper look as soon as I can. Expect a fix within 24hrs.

This should be fixed now.  It would be a great help if you could check and let me know! Thanks and have a good weekend.

Working now!

Great. I'll close this issue, but feel free to open another issue if you find another bug!


Audiobook Playback Position

When playing an mp3 file of an audiobook using Jellybook 1.3.0, the playback position isn't saved. I would have tried with an m4b file, but I recieved a failed to download when the Downloader reached 100%.

I will look into it

Thank you.

Im using Jellybook 1.3.2 and tried listening to a few mp3 based audiobooks and if I exit the app then come back in the position is not remembered.


Stop using packDomainName in IsDomainName

I'm not sure if this is worth doing, but @miekg mentioned it in https://github.com/miekg/dns/pull/818#issuecomment-442355376. IsDomainName is documented as being incredibly liberal, so it may be possible to make it simpler at the expense of strictness.

Codecov Report

Merging #873 into master will increase coverage by 0.04%.
The diff coverage is 85.71%.

@@            Coverage Diff            @@
##           master    #873      +/-   ##
=========================================
+ Coverage   57.25%   57.3%   +0.04%
=========================================
  Files          41      41
  Lines       10534   10560      +26
=========================================
+ Hits         6031    6051      +20
- Misses       3422    3424       +2
- Partials     1081    1085       +4

Impacted Files
Coverage Δ

zmsg.go
47.86% <100%> (ø)
:arrow_up:

msg_helpers.go
56.93% <100%> (ø)
:arrow_up:

msg.go
78.39% <65%> (-0.33%)
:arrow_down:

defaults.go
69.39% <83.78%> (+3.18%)
:arrow_up:

Continue to review full report at Codecov.

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

Think this will be a very welcome change. Not allocating a buffer here should a (huge?) win.

I don't know if this will be a huge win performance wise as that buffer is only allocated when the name has escape sequences since #818. There will be a performance improvement when the name does have escape sequences though.


Bi-direction subscription

Description
Bi-directional subscription.
Issue reference
We strive to have all PR being opened based on an issue, where the problem or feature have been discussed prior to implementation.
Please reference the issue this PR will close: https://github.com/dapr/java-sdk/issues/1072
Checklist
Please make sure you've completed the relevant tasks for this PR, out of the following list:

[ ] Code compiles correctly
[ ] Created/updated tests
[ ] Extended the documentation

@artursouza @salaboy and @cicoyle my Dapr-fu is not that great yet, but for the streaming subscription, after enabling detailed logs I have gotten this stack trace:
time="2024-09-27T17:17:38.233931+03:00" level=info msg="Subscribing to pubsub 'messagebus' topic 'stream-topic'" app_id=pubsubstreamit instance=ciocanu.corp.adobe.com scope=dapr.runtime.pubsub.streamer type=log ver=1.14.2
time="2024-09-27T17:17:38.237124+03:00" level=debug msg="Processing Redis message<PHONE_NUMBER>401-0" app_id=pubsubstreamit component="messagebus (pubsub.redis/v1)" instance=ciocanu.corp.adobe.com scope=dapr.contrib type=log ver=1.14.2
time="2024-09-27T17:17:38.237173+03:00" level=debug msg="Processing Redis message<PHONE_NUMBER>393-0" app_id=pubsubstreamit component="messagebus (pubsub.redis/v1)" instance=ciocanu.corp.adobe.com scope=dapr.contrib type=log ver=1.14.2
time="2024-09-27T17:17:38.237235+03:00" level=debug msg="Processing Redis message<PHONE_NUMBER>396-0" app_id=pubsubstreamit component="messagebus (pubsub.redis/v1)" instance=ciocanu.corp.adobe.com scope=dapr.contrib type=log ver=1.14.2
time="2024-09-27T17:17:38.237322+03:00" level=debug msg="Processing Redis message<PHONE_NUMBER>418-0" app_id=pubsubstreamit component="messagebus (pubsub.redis/v1)" instance=ciocanu.corp.adobe.com scope=dapr.contrib type=log ver=1.14.2
time="2024-09-27T17:17:38.237199+03:00" level=debug msg="Processing Redis message<PHONE_NUMBER>412-0" app_id=pubsubstreamit component="messagebus (pubsub.redis/v1)" instance=ciocanu.corp.adobe.com scope=dapr.contrib type=log ver=1.14.2
time="2024-09-27T17:17:38.237446+03:00" level=debug msg="Processing Redis message<PHONE_NUMBER>399-0" app_id=pubsubstreamit component="messagebus (pubsub.redis/v1)" instance=ciocanu.corp.adobe.com scope=dapr.contrib type=log ver=1.14.2
time="2024-09-27T17:17:38.237241+03:00" level=debug msg="Processing Redis message<PHONE_NUMBER>415-0" app_id=pubsubstreamit component="messagebus (pubsub.redis/v1)" instance=ciocanu.corp.adobe.com scope=dapr.contrib type=log ver=1.14.2
time="2024-09-27T17:17:38.237151+03:00" level=debug msg="Processing Redis message<PHONE_NUMBER>406-0" app_id=pubsubstreamit component="messagebus (pubsub.redis/v1)" instance=ciocanu.corp.adobe.com scope=dapr.contrib type=log ver=1.14.2
time="2024-09-27T17:17:38.237142+03:00" level=debug msg="Processing Redis message<PHONE_NUMBER>409-0" app_id=pubsubstreamit component="messagebus (pubsub.redis/v1)" instance=ciocanu.corp.adobe.com scope=dapr.contrib type=log ver=1.14.2
time="2024-09-27T17:17:38.237216+03:00" level=debug msg="Processing Redis message<PHONE_NUMBER>381-0" app_id=pubsubstreamit component="messagebus (pubsub.redis/v1)" instance=ciocanu.corp.adobe.com scope=dapr.contrib type=log ver=1.14.2
17:17:38.236 [grpc-default-executor-1] INFO  foo - Received:
time="2024-09-27T17:17:38.250127+03:00" level=info msg="Unsubscribed from pubsub 'messagebus' topic 'stream-topic'" app_id=pubsubstreamit instance=ciocanu.corp.adobe.com scope=dapr.runtime.pubsub.streamer type=log ver=1.14.2
17:17:38.249 [grpc-default-executor-1] ERROR foo - Received error:
io.grpc.StatusRuntimeException: CANCELLED: Failed to read message.
	at io.grpc.Status.asRuntimeException(Status.java:533)
	at io.grpc.stub.ClientCalls$StreamObserverToCallListenerAdapter.onClose(ClientCalls.java:481)
	at io.grpc.internal.DelayedClientCall$DelayedListener$3.run(DelayedClientCall.java:489)
	at io.grpc.internal.DelayedClientCall$DelayedListener.delayOrExecute(DelayedClientCall.java:453)
	at io.grpc.internal.DelayedClientCall$DelayedListener.onClose(DelayedClientCall.java:486)
	at io.grpc.internal.ClientCallImpl.closeObserver(ClientCallImpl.java:564)
	at io.grpc.internal.ClientCallImpl.access$100(ClientCallImpl.java:72)
	at io.grpc.internal.ClientCallImpl$ClientStreamListenerImpl$1StreamClosed.runInternal(ClientCallImpl.java:729)
	at io.grpc.internal.ClientCallImpl$ClientStreamListenerImpl$1StreamClosed.runInContext(ClientCallImpl.java:710)
	at io.grpc.internal.ContextRunnable.run(ContextRunnable.java:37)
	at io.grpc.internal.SerializingExecutor.run(SerializingExecutor.java:133)
	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)
	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
	at java.base/java.lang.Thread.run(Thread.java:840)
Caused by: io.grpc.StatusRuntimeException: INTERNAL: Invalid protobuf byte sequence
	at io.grpc.Status.asRuntimeException(Status.java:525)
	at io.grpc.protobuf.lite.ProtoLiteUtils$MessageMarshaller.parse(ProtoLiteUtils.java:240)
	at io.grpc.protobuf.lite.ProtoLiteUtils$MessageMarshaller.parse(ProtoLiteUtils.java:134)
	at io.grpc.MethodDescriptor.parseResponse(MethodDescriptor.java:284)
	at io.grpc.internal.ClientCallImpl$ClientStreamListenerImpl$1MessagesAvailable.runInternal(ClientCallImpl.java:657)
	at io.grpc.internal.ClientCallImpl$ClientStreamListenerImpl$1MessagesAvailable.runInContext(ClientCallImpl.java:644)
	... 5 common frames omitted
Caused by: com.google.protobuf.InvalidProtocolBufferException: Protocol message had invalid UTF-8.
	at com.google.protobuf.InvalidProtocolBufferException.invalidUtf8(InvalidProtocolBufferException.java:149)
	at com.google.protobuf.Utf8$UnsafeProcessor.decodeUtf8(Utf8.java:1365)
	at com.google.protobuf.Utf8.decodeUtf8(Utf8.java:318)
	at com.google.protobuf.CodedInputStream$ArrayDecoder.readStringRequireUtf8(CodedInputStream.java:788)
	at io.dapr.v1.DaprAppCallbackProtos$TopicEventRequest.<init>(DaprAppCallbackProtos.java:2278)
	at io.dapr.v1.DaprAppCallbackProtos$TopicEventRequest$1.parsePartialFrom(DaprAppCallbackProtos.java:4315)
	at io.dapr.v1.DaprAppCallbackProtos$TopicEventRequest$1.parsePartialFrom(DaprAppCallbackProtos.java:4309)
	at com.google.protobuf.AbstractParser.parseFrom(AbstractParser.java:63)
	at com.google.protobuf.AbstractParser.parseFrom(AbstractParser.java:25)
	at io.grpc.protobuf.lite.ProtoLiteUtils$MessageMarshaller.parseFrom(ProtoLiteUtils.java:245)
	at io.grpc.protobuf.lite.ProtoLiteUtils$MessageMarshaller.parse(ProtoLiteUtils.java:237)
	... 9 common frames omitted
Stopping dapr application ...

NOTE: Here we have both Dapr sidecar logs and PubSubStreamIT test logs, I am not entirely sure why the ArrayDecoder fails, but I think it is a start and it is clear why the subscription is cancelled immediately.

Hmm interesting "Protocol message had invalid UTF-8" so it expects utf-8 but it's not getting that?
Also, we have 1.14.4 by now, it might be worth upgrading to that.

@artursouza I have finally figured out what is the issue. Currently in Java SDK we use the following proto files: https://raw.githubusercontent.com/dapr/dapr/v1.14.0-rc.2/dapr/proto. While in Dapr 1.14.+ runtime we use these: https://raw.githubusercontent.com/dapr/dapr/v1.14.{patch-version}/dapr/proto. Once I have used the protos for the latest Dapr release, I was able to consume messages in a streaming fashion using the PubSubStreamIT integration tests.
Here are the differences:
For v1.14.0-rc.2 we have:
rpc SubscribeTopicEventsAlpha1(stream SubscribeTopicEventsRequestAlpha1) returns (stream TopicEventRequest) {}

For v1.14.+ we have:
rpc SubscribeTopicEventsAlpha1(stream SubscribeTopicEventsRequestAlpha1) returns (stream SubscribeTopicEventsResponseAlpha1) {}

As we can see the released version has a completely different type for streaming the response. This explains the deserialization exception that I have run into, since Dapr was returning SubscribeTopicEventsResponseAlpha1, but on the Java side we wanted to deserialize it into TopicEventRequest.
Having all of the above, the question is what should be the value that we use in the parent POM for <dapr.proto.baseurl> do we use the latest Dapr release or something else.
CC: @cicoyle @salaboy

@artursouza I have finally figured out what is the issue. Currently in Java SDK we use the following proto files: https://raw.githubusercontent.com/dapr/dapr/v1.14.0-rc.2/dapr/proto. While in Dapr 1.14.+ runtime we use these: https://raw.githubusercontent.com/dapr/dapr/v1.14.{patch-version}/dapr/proto. Once I have used the protos for the latest Dapr release, I was able to consume messages in a streaming fashion using the PubSubStreamIT integration tests.
Here are the differences:
For v1.14.0-rc.2 we have:
rpc SubscribeTopicEventsAlpha1(stream SubscribeTopicEventsRequestAlpha1) returns (stream TopicEventRequest) {}

For v1.14.+ we have:
rpc SubscribeTopicEventsAlpha1(stream SubscribeTopicEventsRequestAlpha1) returns (stream SubscribeTopicEventsResponseAlpha1) {}

As we can see the released version has a completely different type for streaming the response. This explains the deserialization exception that I have run into, since Dapr was returning SubscribeTopicEventsResponseAlpha1, but on the Java side we wanted to deserialize it into TopicEventRequest.
Having all of the above, the question is what should be the value that we use in the parent POM for <dapr.proto.baseurl> do we use the latest Dapr release or something else.
CC: @cicoyle @salaboy

Correct. We should issue a patch release for the 1.12 Java SDK release. Let me cut a PR now.

@artursouza I was reviewing your PR and as far as I can see you adopted a callback approach via SubscriptionListener. I am wondering if using something like a Flux API is a more suitable approach:
<T> Flux<T> subscribeToEvents(String pubsubName, String topic, TypeRef<T> type);

We already use Project Reactor and most of the DaprClient methods return Mono<T>. I think using Flux<T> for asynchronous streams is more idiomatic and aligned with Project Reactor. If necessary client can use subscribeOn on the Flux to process message in a separate thread pool, if necessary.
The implementation that I am proposing should look something like this:
public <T> Flux<T> subscribeToEvents(String pubsubName, String topic, TypeRef<T> type) throws InterruptedException {
    return Flux.create(emitter -> {
      StreamObserver<DaprAppCallbackProtos.TopicEventRequest> responseObserver = new StreamObserver<>() {
        @Override
        public void onNext(...) {
          emitter.next(...);
        }

        @Override
        public void onError(Throwable throwable) {
          emitter.error(throwable);
        }

        @Override
        public void onCompleted() {
          emitter.complete();
        }
      };

      DaprProtos.SubscribeTopicEventsInitialRequestAlpha1 initialRequest =
          DaprProtos.SubscribeTopicEventsInitialRequestAlpha1.newBuilder()
              .setTopic(topic)
              .setPubsubName(pubsubName)
              .build();
      DaprProtos.SubscribeTopicEventsRequestAlpha1 request =
          DaprProtos.SubscribeTopicEventsRequestAlpha1.newBuilder()
              .setInitialRequest(initialRequest)
              .build();

      var requestObserver = this.asyncStub.subscribeTopicEventsAlpha1(responseObserver);

      requestObserver.onNext(this.request);
    });
  }

Please take a look and let me know your thoughts.
CC: @cicoyle @salaboy

@artursouza I was reviewing your PR and as far as I can see you adopted a callback approach via SubscriptionListener. I am wondering if using something like a Flux API is a more suitable approach:
<T> Flux<T> subscribeToEvents(String pubsubName, String topic, TypeRef<T> type);

We already use Project Reactor and most of the DaprClient methods return Mono<T>. I think using Flux<T> for asynchronous streams is more idiomatic and aligned with Project Reactor. If necessary client can use subscribeOn on the Flux to process message in a separate thread pool, if necessary.
The implementation that I am proposing should look something like this:
public <T> Flux<T> subscribeToEvents(String pubsubName, String topic, TypeRef<T> type) throws InterruptedException {
    return Flux.create(emitter -> {
      StreamObserver<DaprAppCallbackProtos.TopicEventRequest> responseObserver = new StreamObserver<>() {
        @Override
        public void onNext(...) {
          emitter.next(...);
        }

        @Override
        public void onError(Throwable throwable) {
          emitter.error(throwable);
        }

        @Override
        public void onCompleted() {
          emitter.complete();
        }
      };

      DaprProtos.SubscribeTopicEventsInitialRequestAlpha1 initialRequest =
          DaprProtos.SubscribeTopicEventsInitialRequestAlpha1.newBuilder()
              .setTopic(topic)
              .setPubsubName(pubsubName)
              .build();
      DaprProtos.SubscribeTopicEventsRequestAlpha1 request =
          DaprProtos.SubscribeTopicEventsRequestAlpha1.newBuilder()
              .setInitialRequest(initialRequest)
              .build();

      var requestObserver = this.asyncStub.subscribeTopicEventsAlpha1(responseObserver);

      requestObserver.onNext(this.request);
    });
  }

Please take a look and let me know your thoughts.
CC: @cicoyle @salaboy

I agree 100%. Although I am not a fan of project Reactor, I agree with the consistency. Let me give this a shot.

var requestObserver = this.asyncStub.subscribeTopicEventsAlpha1(responseObserver);
  requestObserver.onNext(this.request);

I am trying this. The challenge for this is how to process the ack/retry/drop response from the client code. Any suggestions?

I made a small change to make the subscription receive the status as a Mono in the listener, so it can be done async on the client side. I am happy to try another API. Remember that this is in the Preview interface, so we can change.


Add human-friendly api.Request printer

Produces output:
$ sti build --loglevel=2 -e "FOO=BAR,TEST=BAR" foo bar test

Base Image:		bar
Source:			foo
Output Image Tag:	test
Environment:		FOO=BAR,TEST=BAR
Incremental Build:	disabled
Remove Old Build:	disabled
Force Pull:		enabled
Quiet:			disabled
Layered Build:		disabled
Docker Endpoint:	unix:///var/run/docker.sock
Docker Pull Config:	/home/mfojtik/.dockercfg
Docker Pull User:	mfojtik

(the fields are actually aligned, GH messed this up)

Two small nits, but LGTM.

agree w/ @soltysh's comments and otherwise lgtm.

Thanks guys, all comments fixed. [merge]


Reduce desktop app size

Details

electron-builder uses package.json to determine what node_modules needs to be packed inside the app (dependencies)
Our root package contains many dependencies irrelevant to desktop (e.g. ios/android stuff) an existing pattern dealing with this is to create a 2nd package.json only for Electron (native) dependencies: https://www.electron.build/tutorials/two-package-structure. So this is what we decided to do here.
The webpack configuration is updated so that we don't use a dist folder external to desktop
We're also using webpack to bundle main.js (config inspired by https://github.com/electron-react-boilerplate/electron-react-boilerplate).
It helps us by:

injecting .env to webpack and main.js
we don't have to keep the files list upto date each time we import something from ../src

Added some notes in desktop/README
Excluded package-lock changes to have less PR changes

[x] ⚠Todo: run npm install once this get reviewed

Fixed Issues

$ https://github.com/Expensify/App/issues/6927
Tests

Run npm install before you start

[ ] Verify running locally npm run desktop still works (with/without .env file)
[ ] Verify the build scripts work to build local version. Running build-desktop and build-desktop-staging should not publish unless the --publish flag is used
[ ] Verify the build scripts would work in GH actions by trying them with the --publish flag.npm run build-desktop-staging -- --publish always

Since the webpack configs for web were modified we should check those as well

[ ] Verify npm run web still works
[ ] Verify npm run build builds the production web bundle
[ ] Verify npm run build-staging builds the staging web bundle

iOS and Android should be unaffected
QA Steps

For each env do the following:

[ ] Download the Desktop app .dmg  and verify the size is close to 90 Mb instead of 334Mb
[ ] Install the app and verify that the installed size is close to 215Mb instead of 856Mb
staging app: https://staging.new.expensify.com/NewExpensify.dmg
prod app: https://new.expensify.com/NewExpensify.dmg

https://user-images.githubusercontent.com/12156624/154254343-116031ad-9602-4597-b296-7b68fa6834b9.mp4
Tested On

[x] Web
[x] Mobile Web
[x] Desktop
[x] iOS
[x] Android

Screenshots

Web

Mobile Web

Desktop

DEV

STAGING

PROD

iOS

Android

Excluded package-lock changes to have less PR changes

[ ] Todo: run npm install once this get reviewed

I would like to review this once it's ready. A couple other suggestions that might be worth investigating to reduce bundle size:

https://www.npmjs.com/package/babel-plugin-transform-imports
https://github.com/oliviertassinari/babel-plugin-transform-react-remove-prop-types

A couple other suggestions that might be worth investigating to reduce bundle size:

App bundling enhancements would only reduce the app.js script size - 5.9Mb at the moment

Even entirely removing app.js would only make App ~5Mb smaller, while the dmg would shrink by upto 1.5Mb
We would gain more by excluding source maps - 16.7Mb for app and 2.3Mb for pdf worker, though it would again make the installer just 5Mb smaller
(Source maps could be useful to someone debugging the prod app though)

This PR focuses on a lot bigger scale (not directly related to webpack bundling, but how electron-builder works)

getting installer from 326 down to 90Mb
installed size from 812 down to 210Mb

Babel enhancements are still worth for making the web app load faster (over internet), but don't bring much for the Desktop app

Note sure if I should flag this PR as [NO QA]

Note sure if I should flag this PR as [NO QA]

Seems like we could add some simple QA steps like:

Download the desktop app from https://staging.new.expensify.com/NewExpensify.dmg and verify that the dmg size is close to X MB instead of Y MB
Install the app and verify that the installed size is close to X MD instead of Y
Download the desktop app from https://new.expensify.com/NewExpensify.dmg and verify that the dmg size is close to X MB instead of Y MB
Install the app and verify that the installed size is close to X MD instead of Y

Other than that, we'll just have to monitor deploys and make sure this doesn't break anything.

we don't have to keep the files list upto date each time we import something from ../src

Nice, this will be a great change. I always forget that 😅

Tested this and it seems to work and result in a bundle size of about 200MB instead of like 850MB 👍

Removing myself as a reviewer from this PR as: 1) I don't have much context in this area, and 2) I've got a bunch of other PRs to review and daily issues to tackle.

Looking good (and sorry for the slow feedback loop). Just a few minor questions and suggestions.

✔ Ready for Review

conflicts :(

✔ Conflict resolved
It was only due to CONST/index.js becoming CONST.js again and there was no conflict in merging the actual content. Even the approving reviews are still valid

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

🚀 Deployed to staging by @roryabraham in version: 1.1.41-0 🚀

platform
result

🤖 android 🤖
success ✅

🖥 desktop 🖥
success ✅

🍎 iOS 🍎
success ✅

🕸 web 🕸
failure ❌

That's something I forgot to test, I'll try it and get back to you

Yes definitely broke storybook with the changes to webpack.common.js but can make it work again

🚀 Deployed to staging by @roryabraham in version: 1.1.41-0 🚀

platform
result

🤖 android 🤖
failure ❌

🖥 desktop 🖥
success ✅

🍎 iOS 🍎
failure ❌

🕸 web 🕸
failure ❌

🚀 Deployed to production by @francoisl in version: 1.1.41-6 🚀

platform
result

🤖 android 🤖
success ✅

🖥 desktop 🖥
success ✅

🍎 iOS 🍎
success ✅

🕸 web 🕸
success ✅


Consider migrating to uswds-compile

Hello! I noticed today uswds-gulp will be deprecated at some point and uswds-compile is the new library now being actively maintained.
Issue: https://github.com/uswds/uswds-gulp/issues/60

Thanks for flagging this @kleinschmidtj! Makes sense to migrate. Does this help the import issue in any way? https://github.com/newjersey/njwds/issues/26


Crash: selecting text inside article crashes app

Bug report
Describe the bug
When reading an article if the user long presses on a word to highlight the text the app crashes. Only verified on iOS.
To Reproduce
Steps to reproduce the behavior:

Launch app on iOS
Tap All Unread
Tap first unread article
Inside article press and hold on any word to attempt to highlight

Expected behavior
Expected to be able to highlight word for copy/paste or definition actions
Actual behaviour
App crashed
Device

Device: iPhone 12 Pro
OS: iOS 14
Build: NetNewsWire 5.0.5(56)

Does this happen every time or was it a one time event?

Is this still a bug?


NFS optimized strategy

I want to try this library out and noticed there isn't a strategy optimized for NFS type storage.  Would you accept a PR that adds this strategy?

The basic difference is the access speed.  The filesystem storage recomputes the hash (https://github.com/antonagestam/collectfast/blob/master/collectfast/strategies/filesystem.py#L9) for remote files.  It would be better to add an additional file that contains the hash on upload.  Then the remote storage hash can just return the contents of the hash file

@thenewguy I'd definitely consider adding a strategy for NFS and I'll happy review pull requests if your willing to work on it.
I'd be hesitant to a solution that adds an extra file though, and would much prefer it the strategy could instead populate the cache the way you suggest.


Power BI Monitoring - issues with Graph API

Hi RuiRomano,
I've implemented the solution and managed to get most of it working, however I'm have issue retrieving Licence and User data from the Graph API.
Therefore the Licence and User tab has no data within the Power BI report.
Please could you help with this issue.. I believe it might be some kind of authorisation, as the rest of the report works
Any guidance will be much appreciated.

@dbhupla try manually running the graphtimer function in the function app using the code area > test/run. This should run and populate the data to blob. Then refresh the report.

Hi @RuiRomano ,
we are facing the same problem - GraphTimer function returns with a 403 error
2022-09-14T08:50:09Z   [Information]   INFORMATION: Getting OAuth token
2022-09-14T08:50:09Z   [Information]   INFORMATION: Calling Graph API: 'https://graph.microsoft.com/beta/users?$select=id,displayName,assignedLicenses,UserPrincipalName'
2022-09-14T08:50:09Z   [Information]   INFORMATION: Ellapsed: 0.4134205s
2022-09-14T08:50:11Z   [Information]   OUTPUT:
2022-09-14T08:50:11Z   [Information]   OUTPUT:    HistoryId: 1
2022-09-14T08:50:11Z   [Information]   OUTPUT:
2022-09-14T08:50:11Z   [Information]   OUTPUT: [32;1mMessage        : [0mResponse status code does not indicate success: 403 (Forbidden).
2022-09-14T08:50:11Z   [Information]   OUTPUT: [32;1mStackTrace     : [0m   at System.Management.Automation.MshCommandRuntime.ThrowTerminatingError(ErrorRecord errorRecord)
2022-09-14T08:50:11Z   [Information]   OUTPUT: [32;1mException      : [0mMicrosoft.PowerShell.Commands.HttpResponseException
2022-09-14T08:50:11Z   [Information]   OUTPUT: [32;1mInvocationInfo : [0m{Invoke-RestMethod}
2022-09-14T08:50:11Z   [Information]   OUTPUT: [32;1mLine           : [0m        $result = Invoke-RestMethod -Method Get -Uri $url -Headers $headers
2022-09-14T08:50:11Z   [Information]   OUTPUT: [32;1m                 [0m
2022-09-14T08:50:11Z   [Information]   OUTPUT: [32;1mPosition       : [0mAt C:\home\site\wwwroot\Scripts\Fetch - Graph.ps1:61 char:19
2022-09-14T08:50:11Z   [Information]   OUTPUT: [32;1m                 [0m+ …   $result = Invoke-RestMethod -Method Get -Uri $url -Headers $headers …
2022-09-14T08:50:11Z   [Information]   OUTPUT: [32;1m                 [0m+               ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2022-09-14T08:50:11Z   [Information]   OUTPUT: [32;1mHistoryId      : [0m1
2022-09-14T08:50:11Z   [Information]   OUTPUT:
2022-09-14T08:50:11Z   [Error]   EXCEPTION: Response status code does not indicate success: 403 (Forbidden).

Please ensure you granted API Application level permissions on "Microsoft Graph" API with Administrator grant to get the license & user info data. I updated the docs with new screenshot.


nixos/parsoid: fix service by reinstating nodePackages.parsoid

Fixes services.parsoid (MediaWiki VisualEditor backend) which does not work at least since 2b8cde0ce25b4f35fce23c9ad388b3726d285d0b. Also enables systemd sandboxing, namely DynamicUser which fixes #55370.
Motivation for this change
The nixos/parsoid module is currently broken because it referes to nonexistent package:
error: attribute 'parsoid-git://github.com/abbradar/parsoid#stable' missing, at /nix/store/kyf94wnik8sx13csarz8cjajgw1jaswb-source/nixos/modules/services/misc/parsoid.nix:9:13

Things done

[x] Tested using sandboxing (nix.useSandbox on NixOS, or option sandbox in nix.conf on non-NixOS linux)
Built on platform(s)

[x] NixOS
[ ] macOS
[ ] other Linux distributions

[ ] Tested via one or more NixOS test(s) if existing and applicable for the change (look inside nixos/tests)
[ ] Tested compilation of all pkgs that depend on this change using nix-shell -p nixpkgs-review --run "nixpkgs-review wip"
[x] Tested execution of all binary files (usually in ./result/bin/)
[ ] Determined the impact on package closure size (by running nix path-info -S before and after)
[ ] Ensured that relevant documentation is up to date
[x] Fits CONTRIBUTING.md.

cc @abbradar @aanderse @Mic92

That might be a good candidate for backporting... However its a bit tricky because the node-package set needs to be regenerated for 20.03.


Exporting constructors

The current way to export a constructor:
foreign export java "<init>" someMethod1 :: Int -> Int -> Java ExportClass ()

assuming a constructor signature of ExportClass(int a, int b).
But that leaks info about JVM internal representation. It should be:
foreign export java "@new" someMethod1 :: Int -> Int -> Java ExportClass ()

Constructors should be lightweight and that's impossible if you try to invoke the Eta RTS in a constructor. Hence, we will forbid exporting constructors.


[doc] On this page navigation links are broken - headings are hidden under Navbar

If you click on a link in on this page navigation, the referred link is hidden under the Navbar.
We need to set offset.

@crdo Could you find a minute to fix this?
The solution should be something like this (with a media query added to avoid offsetting the content when the navbar isn't shown):
html {
    scroll-padding-top: 70px; /* height of sticky header, to prevent the header from hiding content when jumping to it */
}


⚠ ClamAV has degraded performance

In 93d4ab4, ClamAV (https://spamassassin.apache.org/) experienced degraded performance:

HTTP code: 200
Response time: 51 ms

Resolved: ClamAV performance has improved in 60e98bc.


wrong composing / emoji popup position when TextField warpped in Transform having scale !=1.0 on macOS

Steps to Reproduce

Execute flutter run on the code sample
type using CJK input method, or press ctrl+cmd+space to open emoji panel

Expected results:
composing / emoji popup next to caret
Actual results:

composing popup at bottom left
emoji panel popup at center of screen

Code sample
import 'package:flutter/material.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    Matrix4 matrix4 = Matrix4.identity();
    matrix4.scale(2.0);
    // matrix4.translate(-110.0, 0.0);
    return MaterialApp(
      title: 'Emojis & Symbols Panel Positioning',
      home: Scaffold(
        appBar: AppBar(
          title: const Text('Example'),
        ),
        body: Center(
          child: Transform(
            transform: matrix4,
            child: const SizedBox(
              width: 100,
              height: 100,
              child: TextField(),
            ),
          ),
        ),
      ),
    );
  }
}

flutter doctor -v
[✓] Flutter (Channel beta, 3.3.0-0.5.pre, on macOS 12.4 21F79 darwin-arm, locale zh-Hans-CN)
    • Flutter version 3.3.0-0.5.pre on channel beta at /Users/likang/SDKs/flutter
    • Upstream repository https://github.com/flutter/flutter.git
    • Framework revision 096162697a (2 weeks ago), 2022-08-22 15:34:14 -0700
    • Engine revision ad3d868e0d
    • Dart version 2.18.0 (build 2.18.0-271.7.beta)
    • DevTools version 2.15.0

[✓] Android toolchain - develop for Android devices (Android SDK version 33.0.0)
    • Android SDK at /Users/likang/SDKs/Android/sdk
    • Platform android-33, build-tools 33.0.0
    • Java binary at: /Applications/Android Studio.app/Contents/jre/Contents/Home/bin/java
    • Java version OpenJDK Runtime Environment (build 11.0.12+0-b1504.28-7817840)
    • All Android licenses accepted.

[✓] Xcode - develop for iOS and macOS (Xcode 13.4.1)
    • Xcode at /Applications/Xcode.app/Contents/Developer
    • Build 13F100
    • CocoaPods version 1.11.3

[✓] Android Studio (version 2021.2)
    • Android Studio at /Applications/Android Studio.app/Contents
    • Flutter plugin can be installed from:
      🔨 https://plugins.jetbrains.com/plugin/9212-flutter
    • Dart plugin can be installed from:
      🔨 https://plugins.jetbrains.com/plugin/6351-dart
    • Java version OpenJDK Runtime Environment (build 11.0.12+0-b1504.28-7817840)

[✓] Connected device (1 available)
    • macOS (desktop) • macos • darwin-arm64 • macOS 12.4 21F79 darwin-arm

https://user-images.githubusercontent.com/850711/188605193-512fb66b-3004-44a8-a5eb-827c2d474131.mov

I can reproduce this issue. I used the English keyboard and it was reproducible as well.
Reproducible on

Stable (3.3.0)
Master (3.4.0-19.0.pre.86)

Info

Video
https://user-images.githubusercontent.com/50555895/188705287-a4b724d6-ace1-4b23-8f28-58382e3f4332.mov

Code Sample
import 'package:flutter/material.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    Matrix4 matrix4 = Matrix4.identity();
    matrix4.scale(2.0);
    // matrix4.translate(-110.0, 0.0);
    return MaterialApp(
      title: 'Emojis & Symbols Panel Positioning',
      home: Scaffold(
        appBar: AppBar(
          title: const Text('Example'),
        ),
        body: Center(
          child: Transform(
            transform: matrix4,
            child: const SizedBox(
              width: 100,
              height: 100,
              child: TextField(),
            ),
          ),
        ),
      ),
    );
  }
}

Flutter Doctor
flutter doctor -v (Stable)
[✓] Flutter (Channel stable, 3.3.0, on macOS 12.5.1 21G83 darwin-arm, locale en-US)
    • Flutter version 3.3.0 on channel stable at /Users/nabeelparkar/fvm/versions/stable
    • Upstream repository https://github.com/flutter/flutter.git
    • Framework revision ffccd96b62 (7 days ago), 2022-08-29 17:28:57 -0700
    • Engine revision 5e9e0e0aa8
    • Dart version 2.18.0
    • DevTools version 2.15.0

[✓] Android toolchain - develop for Android devices (Android SDK version 33.0.0)
    • Android SDK at /Users/nabeelparkar/Library/Android/sdk/
    • Platform android-33, build-tools 33.0.0
    • ANDROID_SDK_ROOT = /Users/nabeelparkar/Library/Android/sdk/
    • Java binary at: /Applications/Android Studio.app/Contents/jre/Contents/Home/bin/java
    • Java version OpenJDK Runtime Environment (build 11.0.12+0-b1504.28-7817840)
    • All Android licenses accepted.

[✓] Xcode - develop for iOS and macOS (Xcode 13.4.1)
    • Xcode at /Applications/Xcode.app/Contents/Developer
    • Build 13F100
    • CocoaPods version 1.11.3

[✓] Chrome - develop for the web
    • CHROME_EXECUTABLE = /Applications/Brave Browser.app/Contents/MacOS/Brave Browser

[✓] Android Studio (version 2021.2)
    • Android Studio at /Applications/Android Studio.app/Contents
    • Flutter plugin can be installed from:
      🔨 https://plugins.jetbrains.com/plugin/9212-flutter
    • Dart plugin can be installed from:
      🔨 https://plugins.jetbrains.com/plugin/6351-dart
    • Java version OpenJDK Runtime Environment (build 11.0.12+0-b1504.28-7817840)

[✓] IntelliJ IDEA Ultimate Edition (version 2022.1.3)
    • IntelliJ at /Applications/IntelliJ IDEA.app
    • Flutter plugin version 69.0.4
    • Dart plugin version 221.5921.27

[✓] VS Code (version 1.69.2)
    • VS Code at /Applications/Visual Studio Code.app/Contents
    • Flutter extension version 3.44.0

[✓] Connected device (2 available)
    • macOS (desktop) • macos  • darwin-arm64   • macOS 12.5.1 21G83 darwin-arm
    • Chrome (web)    • chrome • web-javascript • Brave Browser <IP_ADDRESS>

[✓] HTTP Host Availability
    • All required HTTP hosts are available

• No issues found!

flutter doctor -v (Master)
[✓] Flutter (Channel master, 3.4.0-19.0.pre.86, on macOS 12.5.1 21G83 darwin-arm64, locale en-US)
    • Flutter version 3.4.0-19.0.pre.86 on channel master at /Users/nabeelparkar/fvm/versions/master
    • Upstream repository https://github.com/flutter/flutter.git
    • Framework revision a04e6b7618 (2 hours ago), 2022-09-06 02:08:10 -0400
    • Engine revision 623b80157c
    • Dart version 2.19.0 (build 2.19.0-171.0.dev)
    • DevTools version 2.17.0

[✓] Android toolchain - develop for Android devices (Android SDK version 33.0.0)
    • Android SDK at /Users/nabeelparkar/Library/Android/sdk/
    • Platform android-33, build-tools 33.0.0
    • ANDROID_SDK_ROOT = /Users/nabeelparkar/Library/Android/sdk/
    • Java binary at: /Applications/Android Studio.app/Contents/jre/Contents/Home/bin/java
    • Java version OpenJDK Runtime Environment (build 11.0.12+0-b1504.28-7817840)
    • All Android licenses accepted.

[✓] Xcode - develop for iOS and macOS (Xcode 13.4.1)
    • Xcode at /Applications/Xcode.app/Contents/Developer
    • Build 13F100
    • CocoaPods version 1.11.3

[✓] Chrome - develop for the web
    • CHROME_EXECUTABLE = /Applications/Brave Browser.app/Contents/MacOS/Brave Browser

[✓] Android Studio (version 2021.2)
    • Android Studio at /Applications/Android Studio.app/Contents
    • Flutter plugin can be installed from:
      🔨 https://plugins.jetbrains.com/plugin/9212-flutter
    • Dart plugin can be installed from:
      🔨 https://plugins.jetbrains.com/plugin/6351-dart
    • Java version OpenJDK Runtime Environment (build 11.0.12+0-b1504.28-7817840)

[✓] IntelliJ IDEA Ultimate Edition (version 2022.1.3)
    • IntelliJ at /Applications/IntelliJ IDEA.app
    • Flutter plugin version 69.0.4
    • Dart plugin version 221.5921.27

[✓] VS Code (version 1.69.2)
    • VS Code at /Applications/Visual Studio Code.app/Contents
    • Flutter extension version 3.44.0

[✓] Connected device (2 available)
    • macOS (desktop) • macos  • darwin-arm64   • macOS 12.5.1 21G83 darwin-arm64
    • Chrome (web)    • chrome • web-javascript • Brave Browser <IP_ADDRESS>

[✓] HTTP Host Availability
    • All required HTTP hosts are available

• No issues found!

The behavior is for the popup to stay within the window bounds and not overflow. cc @justinmc @LongCatIsLooong might know more about the intended behavior.

Closing in favor of https://github.com/flutter/flutter/issues/110010


[VL] Daily Update Velox Version (2024_07_06)

Upstream Velox's New Commits:
b9268a611 by hengjiang.ly, Enable prefixsort in OrderBy and TableWrite (9541)
0201d9a05 by generatedunixname89002005232357, Revert D59292285 (10404)
66aeca405 by yingsu00, Fix Iceberg read when positional delete files are unaligned (10261)
8d5e31717 by Daniel Hunte, Ongoing clean up of DateTimeStampFunctionsTest.cpp (10392)

Close it as merged 2024_07_08 directly.


[red-knot] revert change to emit fewer division by zero errors

This reverts https://github.com/astral-sh/ruff/pull/13799, which I've realized was not right after a bit more thought.
In general, a type checker does emit diagnostics when it can detect something that will definitely be a problem for some inhabitants of a type, but not others. For example, x.foo if x is typed as object is a type error, even though some inhabitants of the type object will have a foo attribute! The correct fix is to make your type annotations more precise, so that x is assigned a type which definitely has the foo attribute.
There may be some question about whether divide-by-zero should be considered a type error at all, but I think it is a reasonable error for a type-checker to emit, and if we will emit it, I think it should follow the same logic as above. Dividing an inhabitant of the type int by zero may not emit an error, if the inhabitant is an instance of a subclass of builtins.int that overrides division. But it may emit an error (more likely it will). If you don't want the diagnostic, you should clarify your type annotations to require an instance of your safe subclass.

The correct fix is to make your type annotations more precise, so that x is assigned a type which definitely has the foo attribute.

Hmm, this doesn't really apply for the "divide-by-zero" case though, right? There's no way to annotate an int subclass to indicate to the type checker that __truediv__ never raises ZeroDivisionError

Hmm, this doesn't really apply for the "divide-by-zero" case though, right? There's no way to annotate an int subclass to indicate to the type checker that __truediv__ never raises ZeroDivisionError

No, you're right, it doesn't apply precisely, because this isn't expressible in type annotations. But it can still sort of apply, if we just generally decide not to emit the error on subtypes of int and float (which was the previous behavior.)
The other issue here is that really if we followed the above logic fully, we'd emit a divide-by-zero warning on every int / int, because zero is an inhabitant of int, so it might raise the error. But this is impractical, because most of the time it won't be zero, and there isn't a "nonzero integer" type available in the Python type system.
So if we go back to the previous behavior, we're really making a pragmatic decision about what is more likely, so we can emit a diagnostic that's really outside the type system. We're saying that "usually" something typed as int is an int, and if it's a custom subclass you can reasonably type it as your custom subclass instead, and then we'll just not emit this diagnostic. And usually an integer is not zero, so we won't emit this diagnostic unless we know the divisor is zero for sure.
If we are going to emit divide-by-zero diagnostics at all, I still think that's the right pragmatic tradeoff. But I'm also not sure how useful that is -- if you are dividing by a literal zero, it'll always fail at runtime, and it's likely pretty obvious in the source code as well, so how useful is this diagnostic, really? So all this discussion is also just making me feel tempted to rip out this diagnostic entirely, and just say this is outside the type system. Which I think is the pedantically correct thing to do.

But I'm also not sure how useful that is -- if you are dividing by a literal zero, it'll always fail at runtime

Right... but it could be in a branch rarely taken. To invent a silly scenario, it might be a branch that's only taken if the date indicates it's a leap year or whatever. You might accidentally leave in a 1/0 you added while debugging, then get really annoyed when three years later your code crashes because you left it in. (More fool you for having bad test coverage, I guess, but it would be cool if we could catch that!)
So, I guess you have persuaded me that this revert is a good idea, and that the behaviour we had yesterday was a useful one: in situations where the type is inferred as being an int, (and not some subclass of int), we emit the diagnostic; but if we infer it as being an instance of any subclass of int, we do not.
(FWIW, an argument in favour of your position is that neither mypy nor pyright complains about 1 / 0.)

(And I think you are correct that, pedantically, this is outside the type system!)

I suppose in principle you can use overloads to annotate something like this:
@overload
def __truediv__(self, divisor: Literal[0]) -> NoReturn: ...
@overload
def __truediv__(self, divisor: int) -> float: ...

But this still wouldn't give a clear diagnostic.

I would still lean toward "it's not worth emitting this as a diagnostic at all." But I've updated the PR to implement (and explain and test) what I think the best / most pragmatic version of the diagnostic is.


Can't generate test coverage on windows.

Hi,
I'm trying to generate the test coverage on my windows machine, but every time I run gulp coverage I get the error:
Test failed: Error: connect ECONNREFUSED
    at exports._errnoException (util.js:746:11)
    at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1010:19)

The tests run Ok, but it doesn't generate the coverage report.

Fixed by #56


Is it possible to accumulate gradients over multiple batches?

Due to the limit of GPU memory, I can not use a large mini-batch size when training a deep network like ResNet or Inception-v3. But I noticed that there is a solution in caffe that use the parameter 'iter_size' to accumulate gradients over multiple batches(i.e. accumulate gradients 10 times and then update the weights). So, is there a similar parameter setting in mxnet? If not, will it be easy to implement it myself?

i think there is no iter like in caffe.
but you can try https://github.com/dmlc/mxnet-memonger

@tornadomeet , thanks for your reply but the memory cost is actually the same for my training code after using the "memonger" like
net = mx.sym.load(net_json)
net = train.search_plan(net, data=(batch_size, 3, height, width))

model = mx.FeedForward(net_planned, ...)
model.fit(...)

Moreover, I think the "memonger" is still far from what I really need(i.e. to reduce the memory to only 1/10 or 1/20). If the iter_size is not implemented yet in mxnet, I should manage to do it myself.

the committer of memonger say it can training resnet-1000 on imanget using batchsize=32 on a single gpu(<8G memory), but i'm not sure whether it can train incpetion-v3 of 10X batch size. you can hack into it.

@tornadomeet , it seems that my previous result is not good because I did not set attribute mirror_stage='True' in Inception-v3 properly. I tried the ResNet-50 just now exactly as the example code and found the GPU memory dropped from 5555MiB to 2861MiB(batch-size=40). Thus, I should be able to change batch-size double in my GTX 1080 now.
But from my own perspective, iter_size in caffe could still be a more natural way to balance the GPU memory limit and mini-batch size. We can easily reduce 90% GPU memory just by setting iter_size to 10. We don't need to think about which layers could possibly be the places that need to bookkeep computations. And what's more, accumulating gradients over multiple batches is also much easier to implement.

yes, but be careful with 'iter', 'iter' may bring worse result when using bn layer.

@tornadomeet , do you mean the mean and variance computed from N different mini-batch data(iter_size=N) will lead to different results comparing with the values from a single N*batch_size batch data?

yes

I also want to use 'iter_size' to accumulate gradients over multiple batches. Caffe has a special parameter 'iter_size' to accumulate. Pytorch also can realize the function by  not zeroing the grad to keep accumulating the gradient in. How to  realize in mxnet? @tqchen

It is possible with low level api, bind gradient with add_to req, and no zeroing the gradient over iterations

@tqchen You mean just change grad_req to 'add', and update every iter_size iterations. The gradients will auto zeroing every update(). like this:
mod.bind(data_shapes=.., label_shapes=.., grad_req='add')
mod.init_params(..)
mod.init_optimizer(..)
for epoch in range(total_epochs):
cnt = 0
for batch in train_iter:
cnt += 1
mod.forward_backward(batch)  # compute predictions
if cnt % iter_size == 0:    # every iter_size iterations
mod.update()  # update parameters

I am not sure if mod.update will zeros the gradient, so maybe gradient zero need to be done manually

Oh. How to manually zero the gradient after each update, is there a simple example?

@githubfragments I'm also interested in this feature. Could you share with us if you have been able to do this? Thanks!

Sorry, I didn't keep working this out.@realwecan

Do you figure out how to implement accumulate gradients over multiple batches? @realwecan @nicklhy

This issue is closed due to lack of activity in the last 90 days. Feel free to ping me to reopen if this is still an active issue. Thanks!


Instagram Icon

Hello,
i don't find the instagram icon , perhaps facebook ,twitter ,google are presents
Best Regards

Up

There's a linkedIn icon, but no instagram. Confirmed: eva design is for old people.
All joking aside, can we help? There are plenty of existing icons out there so it shouldn't be too hard to add an icon, right?

We also need a slack icon.

True. So far this has been my best Icon pack. Would love to see some core icons  :)

There's a linkedIn icon, but no instagram. Confirmed: eva design is for old people.
All joking aside, can we help? There are plenty of existing icons out there so it shouldn't be too hard to add an icon, right?

If we manage to make the project run locally we can fork and manage it.

still not available ? 👎

I just register custom icons now. I stopped using eva-icons and it gives more freedom. Designing and adding icons is a lot of work, so your best bet is to use a different icon library or adding your own adapter with your own/third party icons.

This project is abandoned 👍


Feature Request : Reverse Geo-Coder Multiple URL/Server

Dear All,
I have noticed with 1000's of devices, the number of hits to the reverse geo-coder service providers URL / web-service can be 100+ hits per second.
This causes two issues, one usage limit related blockage by provider.
And In case of own reverse-codding system, the queries and frequency of hits can increase the system load to a very high level.
Is it possible to add a feature, where users can define multiple URL/Server IP or Domain to be queried for maybe based on a certain logic to equally distribute the number of queries...to a server?

Standard load balancer should be able to do it. I don't see any point of having this functionality in Traccar itself.


reflect.Value.Set using unaddressable value

What version of Go are you using (go version)?
go version go1.7.4 linux/amd64
Which database and its version are you using?
mysql
What did you do?
use find with slice
Please provide a complete runnable program to reproduce your issue.
package main

import (
	"github.com/jinzhu/gorm'
)

var db *gorm.DB

func init() {
	var err error
	//db, err = gorm.Open("sqlite3", "test.db")
	// Please use below username, password as your database's account for the script.
	// db, err = gorm.Open("postgres", "user=gorm dbname=gorm sslmode=disable")
	db, err = gorm.Open("mysql", "gorm:gorm@/dbname?charset=utf8&parseTime=True")
	// db, err = gorm.Open("mssql", "sqlserver://gorm:LoremIpsum86@localhost:1433?database=gorm")
	if err != nil {
		panic(err)
	}
	db.LogMode(true)
}

func main() {
       init()
	type User struct {
          username string `gorm:"not null;unique"`
	  password string `gorm:"not null;unique"`
        }
        db.Find([]model.User)

}

sorry it was connection issue


add availability configuration

Signed-off-by: Cameron Wall<EMAIL_ADDRESS>issue: https://github.com/stolostron/backlog/issues/16981

/lgtm


#663 ensuring the inspect command uses the unit label if available

Satisfies issue #663

@nimshi89 can you take another look at the code smells? It's picked up some relevant stuff.


WIP: add command-line tool admiralctl and implement the migrate subcommand

Summary
KubeAdmiral is a multi-cluster management system for Kubernetes, developed from Kubernetes Federation v2. However, it currently lacks a command-line tool to simplify user operations. Therefore, this proposal aims to set up the code framework for the KubeAdmiral command-line tool: admiralctl, and to implement the subcommand to import resources from existing clusters into the federation.
Motivation
By developing admiralctl, we can greatly simplify user operations and enhance the overall usability of KubeAdmiral.
Goals
We need to achieve the following goals:

Using mainstream command-line tool frameworks ensures that while the command-line tool is user-friendly, the code remains easy to maintain.
Implement the subcommand to import resources from existing clusters into the federation.
Adequate unit tests and detailed usage documentation.

Non-Goals/Future Work

Implementation of more subcommands like admiralctl join, admiralctl unjoin, and so on.

Proposal
Command line tool framework selection
For the command line tool framework selection, after research, the cobra framework was finally selected for the following reasons:

Clean design: cobra provides a clear structure for managing commands, subcommands, flags, and arguments, making building complex CLI tools intuitive and simple.
Built-in help commands: Without writing any additional code, cobra automatically generates -h or --help flags for your application, displaying help information about commands.
Powerful flag parsing: Integration with the pflag library provides more powerful flag parsing than flag in the Go standard library.
Extensibility: you can easily add or modify commands, making the program very extensible for future development.
Automatic Documentation Generation: cobra can automatically generate documentation for your CLI in Markdown, man, or other formats, which is useful for keeping documentation and code synchronized.
Persistent flags: provides a way to define flags for a particular command and allow subcommands to inherit those flags, which can be very useful in certain situations.
Adopted by several large projects: kubectl, kubeadm, and many other well-known projects use cobra, which validates its stability and reliability in production environments.
Community support: Due to its popularity in the Go community, there are tons of examples, tutorials, and other resources available, which greatly lowers the barrier to learning.

Admiralctl migrate subcommand implementation

Get the information about the legacy workload to be migrated.
create the corresponding workload on the control plane.
if AutoCreatePolicy is true, create a PropagationPolicy or ClusterPropagationPolicy and bind the policy to the corresponding workload on the control plane (by labeling).

Command design
./admiralctl --help
admiralctl controls a Kubernetes Cluster Federation.

Advanced Commands:
  migrate       migrate resources from legacy clusters to Kubeadmiral control plane

Other Commands:
  completion    Generate the autocompletion script for the specified shell

Usage:
  admiralctl [flags] [options]

Use "admiralctl <command> --help" for more information about a given command.
Use "admiralctl options" for a list of global command-line options (applies to all commands).

./admiralctl migrate --help
migrate resources from legacy clusters to Kubeadmiral control plane. Requires
the cluster has been joined or registered.

 If the resource already exists in Kubeadmiral control plane, please edit
PropagationPolicy and OverridePolicy to propagate it.

Examples:
  # migrate deployment(default/nginx) from cluster1 to Kubeadmiral
  admiralctl migrate deployment nginx -n default -C cluster1 --cluster-kubeconfig=<CLUSTER_KUBECONFIG_PATH>

  # migrate deployment(default/nginx) with gvk from cluster1 to Kubeadmiral
  admiralctl migrate deployment.v1.apps nginx -n default -C cluster1 --cluster-kubeconfig=<CLUSTER_KUBECONFIG_PATH>

  # Dumps the artifacts but does not deploy them to Kubeadmiral, same as 'dry run'
  admiralctl migrate deployment nginx -n default -C cluster1 --cluster-kubeconfig=<CLUSTER_KUBECONFIG_PATH> -o yaml|json

  # migrate secret(default/default-token) from cluster1 to Kubeadmiral
  admiralctl migrate secret default-token -n default -C cluster1 --cluster-kubeconfig=<CLUSTER_KUBECONFIG_PATH>

  # Support to use '--cluster-kubeconfig' and '--cluster-context' to specify the configuration of member cluster
  admiralctl migrate deployment nginx -n default -C cluster1 --cluster-kubeconfig=<CLUSTER_KUBECONFIG_PATH> --cluster-context=<CLUSTER_CONTEXT>

Options:
    --auto-create-policy=true:
        Automatically create a PropagationPolicy for namespace-scoped resources or create a ClusterPropagationPolicy
        for cluster-scoped resources.

    -C, --cluster='':
        the name of legacy cluster (eg -C=member1)

    --cluster-context='':
        Context name of legacy cluster in kubeconfig. Only works when there are multiple contexts in the kubeconfig.

    --cluster-kubeconfig='':
        Path of the legacy cluster's kubeconfig.

    --dry-run=false:
        Run the command in dry-run mode, without making any server requests.

    --kubeadmiral-context='':
        The name of the kubeconfig context to use

    --kubeconfig='':
        Path to the kubeconfig file to use for CLI requests.

    -n, --namespace='':
        If present, the namespace scope for this CLI request.

    -o, --output='':
        Output format. One of: json|yaml

    --policy-name='':
        The name of the PropagationPolicy(or ClusterPropagationPolicy) that is automatically created after migration.
        If not specified, the name will be the resource name with a hash suffix that is generated by resource
        metadata.

    --scheduling-mode='Duplicate':
        determines the mode used by the scheduler when scheduling federated objects, One of: Duplicate|Divide, default is Duplicate.

Usage:
  admiralctl migrate <RESOURCE_TYPE> <RESOURCE_NAME> -n <NAME_SPACE> -C <CLUSTER_NAME> --cluster-kubeconfig=<CLUSTER_KUBECONFIG_PATH> [options]

Use "admiralctl options" for a list of global command-line options (applies to all commands).

@mrlihanbo PTAL, incidentally, maybe I should revamp the build-related scripts to build admiralctl in this PR by the way?


How to speech and not speech the punctuation?

Hi,
Why the punctuation is not speech by default? Is there method can be used for set the TTS to speech and not speech the punctuation?
For example, the '(', ')', ',', '-', '.', '/', etc. are all can't speech in German TTS.
How to fix this problem?

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

ID: 0d584af5-1efc-1150-d7fe-70a78d84c147
Version Independent ID: 0e8070e4-173d-4dec-a4be-b0beedc23190
Content: SpeechSynthesizerOptions.PunctuationSilence Property (Windows.Media.SpeechSynthesis) - Windows UWP applications
Content Source: https://cpubwin.visualstudio.com/DefaultCollection/windows-uwp/_git/winrt-api-build?path=%2fwinrt-api-build%2fwindows.media.speechsynthesis.speechsynthesizeroptions.yml&version=GBlive&_a=contents
Product: uwp
Git Login: drewbatgit
Microsoft Alias: drewbat

Thanks for taking the time to let us know about this and we sincerely apologize for the delayed response. Due to the sheer volume of feedback in our repo, we are currently prioritizing new Issues. If you believe your feedback is still actionable, let us know either directly in this thread or by filing a new Issue and we’ll work to incorporate the suggestions into the documentation.
Though the scope of our feedback channel here on GitHub covers specific documentation fixes, I can help redirect you to the right support channel to get an answer to your question. The community of experts and Microsoft Engineers over at Microsoft Q&A offer timely answers to a multitude of technical questions surrounding windows-uwp.
If you do create a thread over at Microsoft Q&A, it would be fantastic if you could share that link here so I can track the progress and potentially incorporate the technical details into our documentation. Though I'm marking this Issue as closed now, please treat this thread as an open thread for follow-ups. Thanks!


Upgrade to Vega-Lite 5

Vega-Lite has come out with a new major version in February.
This library should be updated to use the latest version.
There are not that many breaking changes it seems
https://github.com/vega/vega-lite/releases/tag/v5.0.0

Yes. I've been working on this over the last couple of months – see this repo's change doc for details. While the breaking changes are relatively small, there is a major change in the selection model used by Vega-Lite and the introduction of parameters and expressions to almost all properties. This has required some major refactoring behind the API.
I expect to release the new version supporting Vega-Lite 5 in the next week or so.


Tye CLI on M1 Mac?

I'm not sure if it's just my M1 Mac (with a bunch of v5 and v6 (preview) versions of .NET Core installed), but tye doesn't run on the command line:
% tye
Failed to load /usr/local/share/dotnet/host/fxr/6.0.0-preview.3.21201.4/libhostfxr.dylib, error: dlopen(/usr/local/share/dotnet/host/fxr/6.0.0-preview.3.21201.4/libhostfxr.dylib, 1): no suitable image found.  Did find:
        /usr/local/share/dotnet/host/fxr/6.0.0-preview.3.21201.4/libhostfxr.dylib: mach-o, but wrong architecture
        /usr/local/share/dotnet/host/fxr/6.0.0-preview.3.21201.4/libhostfxr.dylib: mach-o, but wrong architecture
The library libhostfxr.dylib was found, but loading it from /usr/local/share/dotnet/host/fxr/6.0.0-preview.3.21201.4/libhostfxr.dylib failed
  - Installing .NET prerequisites might help resolve this problem.
     https://go.microsoft.com/fwlink/?linkid=2063366

% dotnet --list-sdks
3.1.406 [/usr/local/share/dotnet/sdk]
3.1.407 [/usr/local/share/dotnet/sdk]
5.0.103 [/usr/local/share/dotnet/sdk]
5.0.201 [/usr/local/share/dotnet/sdk]
5.0.202 [/usr/local/share/dotnet/sdk]
6.0.100-preview.1.21103.13 [/usr/local/share/dotnet/sdk]
6.0.100-preview.2.21155.3 [/usr/local/share/dotnet/sdk]
6.0.100-preview.3.21202.5 [/usr/local/share/dotnet/sdk]

I also experience problems on M1 Mac.
I install the latest CI-build of Tye, but when entering the command it cannot be found.
I have reinstalled it but no luck.
I have had .NET 6 Preview 3 installed bu removed it since it did not work next to .NET5 and below.
robert@Roberts-MBP-2 tools % dotnet --list-sdks
3.0.103 [/usr/local/share/dotnet/sdk]
3.1.408 [/usr/local/share/dotnet/sdk]
5.0.202 [/usr/local/share/dotnet/sdk]

robert@Roberts-MBP-2 tools % ls -la
total 520
drwxr-xr-x   5 robert  staff     160 May  6 09:12 .
drwxr-xr-x  19 robert  staff     608 May  5 15:06 ..
drwxr-xr-x   5 robert  staff     160 May  6 09:12 .store
-rwxr--r--   1 robert  staff  165976 Feb 11 18:44 dotnet-format
-rwxr-xr-x   1 robert  staff   95244 May  6 09:12 tye


Video Player

Commit adds the Video Player plugin.
Note to devs: Don't close this pull, I'm working on this branch again... thanks.

lookin good

could we merge the whole branch, rather than just the application json?

Probs going to work on it for the next couple of days

merged