Datasets

Changes
This pull will add the functionality outlined in this feature request
Checklist

[ ] Lint and unit tests work locally with my changes
[ ] I have added tests that prove my fix is effective or that my feature works
[ ] I have added necessary documentation
[ ] Any dependent changes have been merged and published in downstream modules

Further comments
I have decided to replace the TensorFlow records with h5 files. I have changed how they are referenced slightly so that there is only one h5 file that needs to be opened for a dataset instead of an h5 file for each class. Other than this the dataset conversion works pretty much the same. My plan moving forward is to implement the Meta-Dataset sampler code that creates the episodes into what torchmetal calls a splitter.

Issues
commit: fb4b92e
Transforms
Target Transforms that require num_classes can not be used with metadata's sampler as num_classes is variable and the same transform object is shared across all datasets being sampled from. Furthermore the splitter transform, which decides image indices for a class which is split into support and query, is also shared. Although I have not verified if it will, it is likely to cause concurrency issues if multiple workers sample tasks together. I suggest simply modifying transforms to be more functional to solve this issue
NOTE: Some of the utils functions in the transforms folder exist in the original dataset objects code.
Sampler
The config for metadata's sampler is hardcoded right now. A way to pass in the settings needs to be implemented. Also the RNG is global hardcoded in the sampler.py and should be seeded. The metadata split object(enum) for the sampler should be linked somehow to torchmeta's meta_split in the datasets, right now it is also hardcoded in the sampler.
Prospected
There are errors on target shape using example code below. This could be resulting from the target transform issue above or something I missed in the dataloader/collate_function code. Most likely the lack of target transform as I think that is the only thing missing from the original example provided. Also the input shape is wrong for batch size.
`
from torchvision import transforms
from torchmetal.datasets import Omniglot
from torchmetal.datasets.helpers import omniglot
from torchmetal.transforms import ClassSplitter
from torchmetal.utils.data import BatchMetaDataLoader, MetaDataSampler

transform_split = ClassSplitter(variable_class_split=True)
transform_tens = transforms.Compose([transforms.ToTensor()])

dataset = Omniglot("data", num_classes_per_task=5, use_vinyals_split=False,
                meta_dataset=True, transform=transform_tens,
                dataset_transform=transform_split, download=True)

sampler = MetaDataSampler(dataset)

dataloader = BatchMetaDataLoader(dataset, shuffle=False, batch_size=16, num_workers=4,
                                sampler=sampler)

for batch in dataloader:
    train_inputs, train_targets = batch["train"]
    print('Train inputs shape: {0}'.format(train_inputs.shape))
    print('Train targets shape: {0}'.format(train_targets.shape))

    test_inputs, test_targets = batch["test"]
    print('Test inputs shape: {0}'.format(test_inputs.shape))
    print('Test targets shape: {0}'.format(test_targets.shape))

`


Part of corrupted page/referer querystring can end up in fragment

If a URL querystring is corrupted (read: contains unescaped URLs itself), then part of this can end up in the _urlfragment field of the output.
Not a big issue, but a little messy.
See Alex's email to himself, "Snowplow issue 337" for an example row from a client.

Migrated to https://github.com/snowplow/enrich/issues/233


Message loss with pub/sub

Following example sends 1000 messages, and roughly 100 messages seems lost on the sub side.
use nng::options::protocol::pubsub::Subscribe;
use nng::options::Options;
use nng::{Protocol, Result, Socket};
use std::time::Duration;
use std::thread;

const ADDRESS: &'static str = "inproc://nng/example";

fn subscribe() {
    let client = Socket::new(Protocol::Sub0).unwrap();
    client.dial(ADDRESS).unwrap();
    client.set_opt::<Subscribe>(vec![]);

    let mut cnt = 0_usize;
    loop {
        let msg = client.recv().unwrap();
        println!("recv: {:?}", (cnt, String::from_utf8(msg.to_vec())));
        cnt += 1;
    }
}

fn publish() {
    // Set up the server and listen for connections on the specified address.
    let server = Socket::new(Protocol::Pub0).unwrap();
    server.listen(ADDRESS).unwrap();

    // NOTE: sub sometimes panics with `Connectoin Refused` without this sleep
    thread::sleep(Duration::from_secs(2));

    for i in 0..1000 {
        // NOTE: lots of message lost when sending too fast
        // thread::sleep(Duration::from_micros(1000));
        server.send(i.to_string().as_bytes()).unwrap();
    }
}

fn main() {
    let p = thread::Builder::new()
        .name("pub".to_string())
        .spawn(publish)
        .unwrap();

    // NOTE: sub sometimes panics with `Connectoin Refused` without this sleep
    thread::sleep(Duration::from_secs(1));

    let s = thread::Builder::new()
        .name("sub".to_string())
        .spawn(subscribe)
        .unwrap();

    p.join();
    s.join();
}

Sleeps between send alleviate the message loss.
And also the sub side sometimes panics on an Err value: ConnectionRefused if I don't put some sleep codes here and there as in the above example.

And also the sub side sometimes panics on an Err value: ConnectionRefused if I don't put some sleep codes here and there as in the above example.

You have a race condition between the publisher side binding the address and the subscriber side connecting to it. Inserting the sleep like you have done will usually solve the problem, but it would be better to either build the two on the same thread and then pass them off or to use some kind of actual synchronization.
Alternatively, you could have the subscriber side dial asynchronously (Socket::dial_async), but you will lose the ability to be sure that the dial actually succeeded.

roughly 100 messages seems lost on the sub side

The PUBSUB protocol is a best-effort protocol and losing messages is a definite probability - arguably a feature. There are two places where you might be losing the messages:

If you are outpacing the publisher's ability to handle the messages.
The subscriber's ability to handle the messages.

For the first one, the subscriber maintains a small queue (16 by default, SendBufferSize) of messages that need to be sent. When you call Socket::send, all you are doing is adding the message to this queue and a worker thread will come and complete the actual IO process of sending the message. If you are adding things to this queue faster than the worker threads can send them out, you will start to lose messages.
For the second, the subscriber also has a queue of messages that have been received by the socket but not Socket::recv by the user. It has a capacity that defaults to 128 but can be changed with RecvBufferSize. If the publisher is outpacing the subscriber, you will start to lose messages here.
In general, you can't count on PUBSUB to reliably deliver messages but knowing the rate at which you are publishing and subscribing and adjusting the buffers accordingly can make it pretty close. If you absolutely need reliable delivery, your two options are to use the REQREP protocol (which guarantees delivery) or to implement your own logic on top of PUBSUB where the subscriber can request messages that it missed.

For the record, none of what I wrote above is Rust specific. These are properties of the base NNG library.

On my system, the following code would reliably deliver all messages. Going from a 64μs wait between messages to a 32μs caused message to start being dropped.
use nng::options::protocol::pubsub::Subscribe;
use nng::options::Options;
use nng::{Protocol, Result, Socket};
use std::time::Duration;
use std::thread;

const ADDRESS: &'static str = "inproc://nng/example";

fn subscribe(client: Socket) {

    for cnt in 0..1000 {
        let msg = client.recv().unwrap();
        println!("recv: {:?}", (cnt, String::from_utf8(msg.to_vec())));
    }
}

fn publish(server: Socket) {
    for i in 0..1000 {
        server.send(i.to_string().as_bytes()).unwrap();
        thread::sleep(Duration::from_micros(64));
    }
}

fn main() {
    // Set up the server and listen for connections on the specified address.
    let server = Socket::new(Protocol::Pub0).unwrap();
    server.listen(ADDRESS).unwrap();

    let client = Socket::new(Protocol::Sub0).unwrap();
    client.dial(ADDRESS).unwrap();
    client.set_opt::<Subscribe>(vec![]);

    let p = thread::Builder::new()
        .name("pub".to_string())
        .spawn(move || publish(server))
        .unwrap();

    let s = thread::Builder::new()
        .name("sub".to_string())
        .spawn(move || subscribe(client))
        .unwrap();

    p.join();
    s.join();
}

Again, if you do need reliable delivery you should look at either REPREQ or building something on top of PUBSUB to request missing messages.

About the race condition, what resources are being contended for (thus should be put under protection)? Would multiple subscribers (multi-threaded) connecting to an already established publisher cause a race condition?

It's not really a "contention" kind of race condition. The race is between the publisher thread binding the address and the subscriber thread connecting to it - the bind has to happen first otherwise the connect will fail, and the code you posted left that up to chance/the scheduler.
Once the address is bound (i.e., the publisher is already established), there is no race condition.

About message discarding, there seems no effect by adjusting  SendBufferSize and  RecvBufferSize(or I just did in the wrong way?).
use nng::options::protocol::pubsub::Subscribe;
use nng::options::Options;
use nng::options::{RecvBufferSize, SendBufferSize};
use nng::{Protocol, Result, Socket};
use std::thread;
use std::time::Duration;

const ADDRESS: &'static str = "inproc://nng/example";

fn subscribe(client: Socket) {
    for cnt in 0..1000 {
        let msg = client.recv().unwrap();
        println!("recv: {:?}", (cnt, String::from_utf8(msg.to_vec())));
    }
}

fn publish(server: Socket) {
    for i in 0..5 {
        server.send(i.to_string().as_bytes()).unwrap();
        //thread::sleep(Duration::from_micros(64));
    }
}

fn main() {
    // Set up the server and listen for connections on the specified address.
    let server = Socket::new(Protocol::Pub0).unwrap();
    // Set max buffer size
    server.set_opt::<SendBufferSize>(i32::max_value());
    server.listen(ADDRESS).unwrap();

    let client = Socket::new(Protocol::Sub0).unwrap();
    // Set max buffer size
    client.set_opt::<RecvBufferSize>(i32::max_value());
    client.dial(ADDRESS).unwrap();
    client.set_opt::<Subscribe>(vec![]);

    let p = thread::Builder::new()
        .name("pub".to_string())
        .spawn(move || publish(server))
        .unwrap();

    let s = thread::Builder::new()
        .name("sub".to_string())
        .spawn(move || subscribe(client))
        .unwrap();

    p.join();
    s.join();
}

And it's worth noting that only 5 small messages were sent, which should make it quite hard to exceed  the buffer size, but still, the subscriber failed to receive all the messages.
Putting short sleeps between send does the trick, but it doesn't feel right...

FYI, I also test the same use with zmq, and it works reliably and as expected( including the  use of RCVBUF/RCVHWM/... options).
use zmq;
use std::thread;
use std::time::Duration;

const ADDRESS: &'static str = "inproc://nng/example";

fn subscribe(client: zmq::Socket) {
    let mut msg = zmq::Message::new();
    for cnt in 0..10000 {
        client.recv(&mut msg, 0).unwrap();
        println!("recv: {:?}", (cnt, String::from_utf8(msg.to_vec())));
    }
}

fn publish(server: zmq::Socket) {
    for i in 0..1000 {
        server.send(i.to_string().as_bytes(), 0).unwrap();
        //thread::sleep(Duration::from_micros(10));
    }
}

fn main() {
    let ctx = zmq::Context::new();
    let server = ctx.socket(zmq::PUB).unwrap();

    server.bind(ADDRESS);

    let client = ctx.socket(zmq::SUB).unwrap();

    // increase buffer size in case of heavy workload
    // client.set_rcvbuf(i32::max_value());
    // client.set_rcvhwm(i32::max_value());

    client.connect(ADDRESS);
    client.set_subscribe(b"");

    let p = thread::Builder::new()
        .name("pub".to_string())
        .spawn(move || publish(server))
        .unwrap();

    let s = thread::Builder::new()
        .name("sub".to_string())
        .spawn(move || subscribe(client))
        .unwrap();

    p.join();
    s.join();
}

About message discarding, there seems no effect by adjusting SendBufferSize and RecvBufferSize(or I just did in the wrong way?).

You did it the wrong way. If you look at the documentation for those two, it says that the max value is 8192 and if you look at the return value you should see that trying to set it to i32::max_value() caused an error.

Putting short sleeps between send does the trick, but it doesn't feel right...

I agree, it doesn't feel right. However, it does make things more realistic - the vast majority of programs will not be able to blast messages through the socket without any kind of processing. If they were able to do so, then it would make way more sense to implement that same code on the subscriber than it would to be sending easy-to-calculate messages across the wire.

I also test the same use with zmq...

If ZeroMQ does the job for you, then by all means use it. Both ZMQ and Nanomsg/NNG are widely used and I'm not here to proselytize one or the other. I will say that I made my decision to use NNG based on three things:

I make heavy use of REQREP sockets and ZeroMQ REQREP sockets are fundamentally broken.
ZeroMQ sockets are not thread-safe whereas NNG sockets are.
I found NNG both easier to use and easier to understand the inner workings.

...and it works reliably and as expected.

I would bet money (a small amount) that it's simply because ZMQ sockets are inherently single threaded and don't depend on helper threads to manage the work. But use whatever works for you.

I have no intension coparing this two at all, and I actually feel the same sense you made about nng's rep/req over that of zmq.
The zmq demo is here only to suggest that the result in the nng case might be problematic, as I tried pass in valid values for SendBufferSize/RecvBufferSize, and still no effect.
In fact, the buffer size should not matter since only a few super tiny messages are involved. So there might be some other factor other than buffer size causing nng to discard messages.
There is a discussion under the nng project, wondering if it's relevant.

While I am glad to answer NNG related questions here, this is just a safe wrapper around the core NNG library. Any issues like this will probably be better served in the actual NNG repository.

Closing this due to inactivity. Feel free to reopen if you feel it still needs discussing.


Multiline cmd and entrypoint handling

Hello!
I noticed that oci_image seems to struggle when it's given a multiline cmd or entrypoint input. When an array containing a multiline input is provided, eg
[
  "/bin/bash",
  "-c",
  """
  echo hello
  echo goodbye
  """
]

oci_image will truncate the input on the newline while providing it to crane, either causing the mutation to fail, or the command/entrypoint to render inaccurately.
crane expects that the cmd or entrypoint is delivered as a CSV, following (rfc4180)[https://www.rfc-editor.org/rfc/rfc4180#section-2], and the newlines in cmd or entrypoint can be presented within a quoted entry.
It looks like the current script would interpret each newline in the cmd or entrypoint file as a separate --cmd entry for the mutate command. https://github.com/bazel-contrib/rules_oci/blob/main/oci/private/image.sh#L105
My understanding is that crate only expects a single cmd or entrypoint, is there a reason we handle it in this read loop?
I'd imagine we instead want to:

Cat the contents of the entrypoint and cmd file as the inputs to the corresponding --cmd or --entrypoint
When gathering the cmd/entrypoint lines for the file, ensure that we quote them, and escape all double quotes according the above rfc ("").

Happy for any thoughts here, would love to understand if I'm offbase, or there's another way to do this.

Ah, seeing this is directly referenced as a consequence here https://github.com/bazel-contrib/rules_oci/pull/297#issuecomment-1708249851
Apologies if this is answered elsewhere, but is there a reason newline delimited was the decision over comma delimited?
I threw together a quick diff with what changes I think would be necessary here https://github.com/bazel-contrib/rules_oci/compare/main...alexnovak:rules_oci:main - but it fails the location_expansion test because of this convention.

but is there a reason newline delimited was the decision over comma delimited?

i don't think so, any character would have the same consequences, as we no longer use crane.  i suggest we fix this in 2.x and leave 1.x the way it is.

Sounds fine by me! I'll double check how things work on the 2.0 branch and submit a PR

fixed by https://github.com/bazel-contrib/rules_oci/pull/663


Support for generating auto-structs within a custom namespace

This makes it possible
module Entities
  class User < ROM::Struct
    def name
      [first_name, last_name].join('  ')
    end
  end
end

class UserRepo < ROM::Repository[:users]
  struct_namespace Entities
end

user = UserRepo.new(rom).users.by_pk(1).one!
user.name # => "John Doe"
user.class.name # => "Entities::User"
user.class == Entities::User # => false
user.class.superclass == Entities::User # => true

@solnic what do you think about this? This works like a charm, however, auto-generated classes will share the same name but won't be actually the same class. This can lead to confusion and must be covered in the docs. And it also looks like that naming hack doesn't work on MRI <= 2.3, we have to go with the previous code on old rubies.

see https://github.com/dry-rb/dry-core/pull/13

issues with old rubies have been fixed 🎉

however, auto-generated classes will share the same name but won't be actually the same class

This is not a problem, in fact I wanted to make it work like that anyway.

Implementation looks good to me. I wonder how this works when you load a Entities::User instance, which has methods relying on some attributes, but these attributes are not present due to custom projections. As I understand, this would result in a no-method error, since auto-structs inherits from your own classes but their attributes may vary, right?

@solnic precisely, we could add method_missing for that with something like "No method named :foo (not loaded attribute?)"

Yeah a more customized error would be nice

@solnic I updated the PR with docs and a nicer message and successfully run this in production. I think this can go in 1.4 without issues


how to draw arrows

i just want to use canvas to draw arrows...but i can not find the api。。。so..how to do this..

Hi @foxFallingSkies, check out the docs regarding edges, namely the arrows property.

Hi @foxFallingSkies, check out the docs regarding edges, namely the arrows property.

thank you...
i know why i can not draw arrows
just because i install all vis...
when i just install vis-network,i can draw


Inspiration

I thought to share this neat project: http://makepad.nl/
It is written in Rust, and compiled to WebAssembly. But the neat part is it ultimately renders all the UI (tree view, scrollable views, editable text, etc) with WebGL.

The scrolling, text selection features and menu animations are all amazing.

I was super impressed with their clever dynamic textarea input trick.


Returning proper status code from selenium suite

Similar change applied to all ways the testsuite can be run. Tested against jenkins2.


Fix download condition

Previously download was only triggered by a certain task name which
no longer exists.
Fixes #89

Current coverage is 79.71% (diff: 100%)

Merging #90 into master will not change coverage

@@             master        #90   diff @@
==========================================
  Files            36         36
  Lines          1198       1198
  Methods           0          0
  Messages          0          0
  Branches          0          0
==========================================
  Hits            955        955
  Misses          243        243
  Partials          0          0

Powered by Codecov. Last update 1482241...1ff8065

I don't understand this PR. I don't see any other tasks that start with 'BlobUploadTask'.

Full context is in #89. Basically a previous commit added some additional text to the task names, which means string equality doesn't work as a condition.

Ok, I see. LGTM


ci: Add CI job to validate commits against conventional commits standard

Three questions:

What does this do?
Have we decided to use conventional commits in this repo, at this point in time?
Are we sure we want to validate every commit? Does this do so? Is there a way to opt out of commit validation?

My vague understanding is that "conventional commits" allows for unconventional commits, in that they are simply ignored. Perhaps we want to maintain the possibility of including an unconventional commit, but we want to make the developer specifically ask for that.

Another question, which is sort of a personal request: is there a clear set of tools we could suggest (ie. in the README) that will enable developers to satisfy the validation, without a lot of mental overhead?
I don't think we need to put a lot of effort into this, but eg. maybe there is a VS-Code extension we can recommend.

@snario I think this would be useful in statechannels/the-graph. My understanding is we've decided to do conventional commits there and will later decide whether to do it in the monorepo.

This alternative seems to me to have clearer documentation: https://github.com/wagoid/commitlint-github-action. The default config checks for things listed here: https://github.com/conventional-changelog/commitlint/tree/master/%40commitlint/config-conventional
I'm not sure about a VSCode extension, but there is at least an npm package command line tool https://commitlint.js.org/#/ which we could even choose to run in a precommit hook.

There's also this tool  http://commitizen.github.io/cz-cli/ to author compliant commits with prompts.


BTS-1546: Fix buffer overflow in crashdump

Scope Purpose
This fixes a buffer overflow in the crash dumper, which was observed in
the wild and prevented us from getting stack traces at all.

I am totally fine with refactoring this more. This all started because I got a core dump from Willi today and found that the stack frame in the crashing thread had been overwritten by the buffer overflow. I first tried to do a very small fix of only a few lines which would have caught the actual issue at hand. But then reviewers - rightfully - wanted to protect once and for all, so I did the necessary changes to protect us in all places where this critical function was used.
I agree that it is now not very tidy. The fundamental problem here is that we want to avoid memory allocations on the heap when we are in the crash handling situation. Therefore we need a special solution and cannot work with the usual approaches.
Jan has agreed to look into this and implement a small special purpose class to handle all this more cleanly. So let's try this next.

@markuspf @mpoeter : I created a small buffer utility class and made the CrashHandler use it now.
The buffer utility class is protected against buffer overflows and has a separate unit test.
Please re-review.


stats: Configurable Histogram Buckets

Title: Request: Make statistics histogram buckets configurable
Description:
Histogram buckets are currently hardcoded to cover a wide range of values (https://github.com/envoyproxy/envoy/blob/master/source/common/stats/histogram_impl.cc#L34)
Many users will benefit from customising the buckets to match their data/use case.
For example, the current buckets include a 10-30 second bucket. If the majority of an applications values fall in this bucket, the user would probably want increased resolution by having the boundaries be 10, 15, 20, 25, 30, for example.
In his implementation of histograms for Prometheus, @suhailpatel mentioned wanting to make this configurable: https://github.com/envoyproxy/envoy/pull/5601#discussion_r248099062

I would like to implement this feature, but it will be my first contribution to envoy, so maybe do you have a suggestion how should I do it? How should it be configurable?

@ramaraochavali @postwait any thoughts on config for this?

I felt like stats should be supporting summary type of metrics with configurable quantiles. because our problem with the hard coded buckets is that we couldn't properly track 95% percentile and 99% percentile.
making buckets configurable does solve our problem as then we can configure the buckets in such a way that 95% and 99% can be computable, currently even though 95% & 99% are different, because the buckets are spaced out very far, both the values look the same.
currently we are using statsd for this usecase to get proper 95 & 99 percentile

@postwait
can you please explain a bit more on the output transform and problems in choosing the bins for recording latencies

The "problem with choosing bins" is that Prometheus treats bins as separate series and apparently has limitations around cardinality there.  Envoy uses circllhist which tracks the data in a sparse set of ~43k bins.  The only reason transformation is "required" is to reduce that set of bins down to something Prometheus can cope with.  This transformation is trivial as you can just take the set of proposed Prometheus bin boundaries and ask the circllhist for a count_below on each.
The internal histogram implementation has very strong guarantees around the accuracy of quantile calculations.  However, Prometheus in its recommended configuration should never be used to calculate quantiles as they are wildly inaccurate due to poor bucketing choices.
There's no "good solution" here.  We could expose the quantiles to Prometheus, but then as you navigate around the time series, there would be no way to do the math on them (you can combine quantile calculations).  This is the same reason that exposing quantiles from statsd is a "very bad" practice.
Exposing the native histogram is the only way to allow for accurate quantile calculations, but Prometheus doesn't support this.
If you have a time series that is very important to calculate these things on and are stuck using Prometheus, you could expose a sufficient subset of the buckets to prom (likely < 1000 for a given series) and then Prometheus could more accurately calculate quantiles.

hi,
@postwait any idea how to do that?
I also look for configurable histogram buckets:
to have histogram buckets from:
0.5, 1, 5, 10, 25...
to
0.5, 1, 5, 10, 15, 20, 25...

 Upside is that with the bins you describe, you'll have 100% accuracy.

@postwait im not sure what you mean, could you show how?

@postwait any info?

You need to get the histogram out of envoy.  The move to openmetrics makes this harder.  I would expose the internal histogram over protobuf via the gRPC endpoint and then process it in the client.  I don't believe this has been implemented in Envoy yet.
You want 20ms, but tomorrow want 19ms... so if you get the full histogram out you can remove all that complication from Envoy just let the observer worry about it.
The internal histogram has about 43k possible bins, but they are almost always very sparse.  So ideally you just expose them all.  The problem is that the OpenMetrics approach to this is very inefficient.

@postwait ok thanks for the info. how can I get the internal histogram and how can I process it - do you mean in grafana?

hi,
@postwait any idea how to do the following with the current envoy?
I also look for configurable histogram buckets:
to change the histogram buckets from:
0.5, 1, 5, 10, 25...
to
0.5, 1, 5, 10, 15, 20, 25... ... I need buckets for 15 and 20ms...
@eightnoteight how did you end up getting P95 and P99?

ended up using the statsd exporter to customise the buckets, but later that has very little to none benefit with customising the buckets. still figuring out on proper use-case for customising the buckets, what was your exact use-case to have that extra 15 & 20 ms buckets ?

I'm hoping to fix this sometime in the next month or so.
My initial idea for how to configure it is to allow specifying a repeated message similar to the following in the bootstrap stats_config:
message HistogramBuckets {
    string regex;
    repeated double buckets;
}

@ggreenway why did you close it?


Shift + Tab doesn't work on a right side of line

Godot version
09b0293
System information
W10
Issue description
If you have caret at the right side of line, e.g like this:

you can't use Shift + Tab to decrease indentation.
Steps to reproduce

Add indented text
Try Shift-Tabbing it when caret is at the end of line

Minimal reproduction project
No response

cc @Paulb23 ?

Duplicate of https://github.com/godotengine/godot/issues/50279.


Minor type and styles updates

minor style changes with:

lighter borders
map updates (in mapbox)
text changes (align app text with map studio)

Thanks @LanesGood! I tested this locally on Chrome on a 4k screen. The font weights appear lighter than what you have in the screenshot above. I found them difficult to read, especially the co2 per person. Is this expected?

@wrynearson can you clear your cache and try again?

@LanesGood, were you ever able to figure this issue out?


Cap execution of docker image fetch

When docker image fetching is stalled, mesos correctly timeout (thanks
to executor_registration_timeout) however container destroy simply waits
for the image provisioning to finish. This leads to task being "staged"
forover (until mesos agent restart or curl being killed).
While it might be difficult to timeout on mesos side, we can simply
leverage curl timeout to have provisioning being eventually interrupted.
This is not fully robust and poorly configurable (I've leveraged the
stall timeout option instead of of the executor_registration_timeout to
avoid passing references to this option in all places). But it should be
sufficient.
Change-Id: Ic301450b71a82f13ec15bf40d603bf754ae6fc9a
Reference: https://confluence.criteois.com/x/jakyJQ

@Mergifyio refresh

@Mergifyio refresh

Commit messages are not eternal

I'd expect commit messages to be preserved, this is the really the main reason why we write them.
About the 5 seconds, it is purely empirical:

stall timeout is 60s (on our infra at least)
5 minutes is the registration_timeout

Commit messages are not eternal

I'd expect commit messages to be preserved, this is the really the main reason why we write them.
About the 5 seconds, it is purely empirical:

stall timeout is 60s (on our infra at least)
5 minutes is the registration_timeout

updated (we just lost 2h of pre-submit :( )

updated (we just lost 2h of pre-submit :( )

If it was passing when I wrote you can just push this commit on the destination branch as you only edited a comment, results won't change.

If it was passing when I wrote you can just push this commit on the destination branch as you only edited a comment, results won't change.


Ogg video file fails to import with ERR_FILE_CORRUPT

Godot version
v3.4.2.stable.official [45eaa2daf]
System information
Linux (Manjaro), GLES3
Issue description
Several video files (all captured by SimpleScreenRecorder) fail to import in Godot. Manual reimports lead to the same error. Those video files are working fine in SMPlayer, QtAV and VLC.
<> file simplescreenrecorder-2022-01-18_11.13.58.ogg
simplescreenrecorder-2022-01-18_11.13.58.ogg: Ogg data, Theora video
<> ffprobe simplescreenrecorder-2022-01-18_11.13.58.ogg
ffprobe version n4.4.1 Copyright (c) 2007-2021 the FFmpeg developers
  built with gcc 11.1.0 (GCC)
  configuration: --prefix=/usr --disable-debug --disable-static --disable-stripping --enable-amf --enable-avisynth --enable-cuda-llvm --enable-lto --enable-fontconfig --enable-gmp --enable-gnutls --enable-gpl --enable-ladspa --enable-libaom --enable-libass --enable-libbluray --enable-libdav1d --enable-libdrm --enable-libfreetype --enable-libfribidi --enable-libgsm --enable-libiec61883 --enable-libjack --enable-libmfx --enable-libmodplug --enable-libmp3lame --enable-libopencore_amrnb --enable-libopencore_amrwb --enable-libopenjpeg --enable-libopus --enable-libpulse --enable-librav1e --enable-librsvg --enable-libsoxr --enable-libspeex --enable-libsrt --enable-libssh --enable-libsvtav1 --enable-libtheora --enable-libv4l2 --enable-libvidstab --enable-libvmaf --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxcb --enable-libxml2 --enable-libxvid --enable-libzimg --enable-nvdec --enable-nvenc --enable-shared --enable-version3
  libavutil      56. 70.100 / 56. 70.100
  libavcodec     58.134.100 / 58.134.100
  libavformat    58. 76.100 / 58. 76.100
  libavdevice    58. 13.100 / 58. 13.100
  libavfilter     7.110.100 /  7.110.100
  libswscale      5.  9.100 /  5.  9.100
  libswresample   3.  9.100 /  3.  9.100
  libpostproc    55.  9.100 / 55.  9.100
Input #0, ogg, from 'simplescreenrecorder-2022-01-18_11.13.58.ogg':
  Duration: 00:00:04.54, start: 0.000000, bitrate: 81 kb/s
  Stream #0:0: Video: theora, yuv420p, 550x500 [SAR 1:1 DAR 11:10], 24 tbr, 24 tbn, 24 tbc
    Metadata:
      encoder         : Lavf58.76.100

Steps to reproduce

Create new project
Copy ogg file from simplescreenrecorder-2022-01-18_11.13.58.zip (decompress zip first) to project directory
See red cross in FileSystem dock and error in Output tab:

 modules/stb_vorbis/audio_stream_ogg_vorbis.cpp:189 - Condition "ogg_stream == nullptr" is true.
 modules/stb_vorbis/resource_importer_ogg_vorbis.cpp:94 - Condition "!ogg_stream->get_data().size()" is true. Returned: ERR_FILE_CORRUPT
 editor/editor_file_system.cpp:1755 - Error importing 'res://simplescreenrecorder-2022-01-18_11.13.58.ogg'.

Minimal reproduction project
No response

That's because Godot recognizes files only by extension. Change it to .ogv instead.

Indeed, and this is documented already:
https://docs.godotengine.org/en/stable/classes/class_videostreamtheora.html

Note: While Ogg Theora videos can also have an .ogg extension, you will have to rename the extension to .ogv to use those videos within Godot.

And how a user is supposed to know that Godot doesn't support ogg, but does ogv? Only thing I see is the error message (without a link to docs) which just says it's corrupted which is untrue, the ogg and the video inside is perfectly fine and seems to be according to the standard. ogg supports audio and/or video (wiki):

The Ogg container format can multiplex a number of independent streams for audio, video, text (such as subtitles), and metadata.

Godot should ideally support ogg, or at least say it doesn't support ogg with video, not just say the file is corrupted. Now it's a UX mess.

It says it's corrupted because .ogg is the most common extension for OGG Vorbis audio files, and since Godot only detects file types based on their extension, and .ogg file is handled as an OGG Vorbis file. Yours is not an OGG Vorbis file and thus can't be decoded by the OGG Vorbis importer.
Changing that would require very significant work to implement file type detection by actually parsing each file. That's a quite difficult to implement and here the workaround is clearly documented.
I can make the error message clearer about the parsed data not being a valid OGG Vorbis file though, that should maybe help understand the fact that it's being loaded by the wrong loader.

Fixed by #56903.


Fix the user Profile shifting  issue in Meshery UI

fix[UI]: Change props in Popper and component and add zIndex
Set the disablePortal to False, since it kept the tooltip inside the
outer div, because of which, Safari increased the width of the div
whenever the tooltip was rendered. Also, set zIndex to 10000 to bring it
above the navigation bar. Set keepMounted prop to True.
Resolves Issue #2888
Signed-off-by: suod-NithishKarthik<EMAIL_ADDRESS>Description
This PR fixes #2888
Notes for Reviewers
Signed commits

[x] Yes, I signed my commits.

Thank you, @sudo-NithishKarthik 😃 Looking good to me.

Awesome. Yay, @sudo-NithishKarthik 🎈


[Bug] The botton-to-top arrow overlaps with the chatbot.

Description
The bottom-to-top arrow overlaps with the chatbot.
Tasks:
I'm a GSSOC'24 contributor
Screenshots

Checklist

[X] I have checked the existing issues.
[X] I follow Contributing Guidelines of this project.
[ ] I am a IWOC'24 contributor.
[ ] I am a JWOC'24 contributor.
[ ] I am a SWOC'24 contributor.

Code of Conduct

[X] I agree to follow this project's "Code of Conduct".

Assign me this issue.

Issue is already opened for this before, pls create new issue or you can comment there if you want to work @karishmaaa101


Add support for reauire paths to be relative to base folder

Allows to write your requires as http://stackoverflow.com/questions/30040534/local-require-paths-for-react-native/35819147#35819147

Each commit solves a problem I faced recently. The 1st one solves:
image: require('myapp/App/assets/awesomeImage.jpg')

The second one solves:
import styles from './Foo.styles'

When you have ./Foo.styles.ios.js and ./Foo.styles.android.js


Positioning issues with Inputs when the keyboard changes of type

In an input when the keyboard changes size there is an issue where it is not handled well.
See:
https://github.com/user-attachments/assets/d4d5e69f-a958-4c2a-8c79-a410d741cd9e

I found a solution, i edited the mjs version and edited the onvisualviewportchange function to this and now it works flawlessly.
    React.useEffect(() => {
        function onVisualViewportChange() {
            if (!drawerRef.current || !repositionInputs) return;

            const focusedElement = document.activeElement;
            // If the focused element is an input OR we've detected the keyboard is open,
            // then proceed to measure and possibly reposition the drawer
            if (isInput(focusedElement) || keyboardIsOpen.current) {
                const visualViewportHeight = window.visualViewport?.height || 0;
                const totalHeight = window.innerHeight;
                const drawerHeight = drawerRef.current.getBoundingClientRect().height || 0;

                // This is the "keyboard height" difference
                let diffFromInitial = totalHeight - visualViewportHeight;

                // If we have snapPoints, adjust diffFromInitial accordingly
                if (snapPoints && snapPoints.length > 0 && snapPointsOffset && activeSnapPointIndex !== undefined) {
                    const activeSnapPointHeight = snapPointsOffset[activeSnapPointIndex] || 0;
                    diffFromInitial += activeSnapPointHeight;
                }

                // We treat a non-negligible diff as "keyboard open"
                // (for example, anything more than ~60px might indicate a fully opened keyboard,
                // but if we want to capture *any* keyboard shift, we can lower this threshold.)
                const KEYBOARD_OPEN_THRESHOLD = 20;
                keyboardIsOpen.current = diffFromInitial > KEYBOARD_OPEN_THRESHOLD;

                // Store the updated diff
                previousDiffFromInitial.current = diffFromInitial;

                // If we haven’t stored the initial drawer height yet, store it
                if (!initialDrawerHeight.current) {
                    initialDrawerHeight.current = drawerHeight;
                }

                const offsetFromTop = drawerRef.current.getBoundingClientRect().top;
                const isTallEnough = drawerHeight > totalHeight * 0.8;

                // Check if the drawer should be “shrunk” or repositioned
                // whenever the keyboard is open or the drawer is taller than the viewport
                if (drawerHeight > visualViewportHeight || keyboardIsOpen.current) {
                    const currentHeight = drawerRef.current.getBoundingClientRect().height;
                    let newDrawerHeight = currentHeight;

                    // If the drawer is taller than the visible viewport, shrink it
                    if (currentHeight > visualViewportHeight) {
                        // Use either a top offset-based calculation if tall enough,
                        // or a constant offset if not.
                        newDrawerHeight = visualViewportHeight - (isTallEnough ? offsetFromTop : WINDOW_TOP_OFFSET);
                    }

                    if (fixed) {
                        // “fixed” logic: only change the height, so the user can scroll inside
                        // the drawer if needed.
                        drawerRef.current.style.height = `${currentHeight - Math.max(diffFromInitial, 0)}px`;
                    } else {
                        // “absolute/relative” logic: set the drawer height so it remains
                        // fully within the viewport. We also ensure the drawer can’t become
                        // smaller than (viewport height - offsetFromTop)
                        drawerRef.current.style.height = `${Math.max(newDrawerHeight, visualViewportHeight - offsetFromTop)}px`;
                    }
                }
                // If the keyboard is closed and we’re not Firefox Mobile, reset back
                // to original height
                else if (!isMobileFirefox()) {
                    drawerRef.current.style.height = `${initialDrawerHeight.current}px`;
                }

                // Update bottom offset
                if (snapPoints && snapPoints.length > 0 && !keyboardIsOpen.current) {
                    // If the keyboard is closed, align the drawer bottom to 0
                    drawerRef.current.style.bottom = `0px`;
                } else {
                    // If the keyboard is open, push the bottom up by diffFromInitial
                    // but never let it go negative
                    drawerRef.current.style.bottom = `${Math.max(diffFromInitial, 0)}px`;
                }
            }
        }

        // Attach the event listener
        window.visualViewport?.addEventListener('resize', onVisualViewportChange);

        return () => {
            // Cleanup
            window.visualViewport?.removeEventListener('resize', onVisualViewportChange);
        };
    }, [
        activeSnapPointIndex,
        snapPoints,
        snapPointsOffset,
        repositionInputs,
        fixed
    ]);

@Fefedu973 Since the contents of that useEffect look different to the version i have, it looks like all you've changed is the threshold to detect if the keyboard is open?
                if (Math.abs(previousDiffFromInitial.current - diffFromInitial) > 60) {
                    keyboardIsOpen.current = !keyboardIsOpen.current;
                }

vs
                if (Math.abs(previousDiffFromInitial.current - diffFromInitial) > 20) {
                    keyboardIsOpen.current = !keyboardIsOpen.current;
                }

It might have been better to provide a yarn/pnpm patch for your changes that we can just drop into our projects

on android firefix: my solution was to anchor an element to all edges of the screen then flex align the drawercontent to the edges/corners I want:

import cn from 'classnames';
import tv from 'tailwind-variants';

const DrawerFrameStyles = tv({
  base: ['bg-background-base shadow-lg', 'max-w-full ', 'flex flex-col'],
  variants: {
    tone: {
      primary: ['text-text-base bg-background-overlay'],
    },
    rounded: { true: ['rounded-t-[10px] rounded-b-[10px]'] },
    size: {
      sm: ['w-full md:w-[320px]'],
      md: ['w-full md:w-[480px]'],
      lg: ['w-full md:w-[640px]'],
      xl: ['w-full md:w-[800px]'],
    },
  },
  defaultVariants: {
    size: 'md',
    tone: 'primary',
    rounded: true,
  },
});

const DrawerFrame = ({
  className,
  ...props
}: React.HTMLAttributes<HTMLDivElement> &
  VariantProps<typeof DrawerFrameStyles>) => {
  const styles = DrawerFrameStyles(props);
  return (
    <div
      className={cn(styles, className)}
      {...props}
    />
  );
};
DrawerFrame.displayName = 'DrawerFrame';
const DrawerAnchorStyles = tv({
  base: 'drawer-anchored top-0 bottom-0 left-0 right-0 flex flex-col max-h-screen',
  variants: {
    anchor: {
      bottomleft: ['justify-end items-start'],
      bottomright: ['justify-end items-end'],
      bottom: ['justify-end items-center'],
      topleft: ['justify-start items-start'],
      topright: ['justify-start items-end'],
      top: ['justify-start items-center'],
      left: ['justify-center items-start'],
      right: ['justify-center items-end'],
    },
  },
  defaultVariants: {
    anchor: 'bottomright',
  },
});
const DrawerContent = forwardRef<
  React.ElementRef<typeof DrawerPrimitive.Content>,
  React.ComponentPropsWithoutRef<typeof DrawerPrimitive.Content> &
    VariantProps<typeof DrawerFrameStyles> &
    VariantProps<typeof DrawerAnchorStyles>
>(({ className, children, anchor, tone, rounded, size, ...props }, ref) => {
  const styles = DrawerAnchorStyles({ anchor });

  return (
    <DrawerPortal>
      <DrawerOverlay />
      <Box className={cn('fixed z-50 ', styles, className)}>
        <DrawerPrimitive.Content
          ref={ref}
          {...props}
        >
          <DrawerFrame
            tone={tone}
            rounded={rounded}
            size={size}
            className={cn('overflow-y-auto max-h-screen', className)}
            {...props}
          >
            <DrawerHandle
              edge={(anchor.startsWith('bottom') && 'top') || 'bottom'}
            />

            {children}
          </DrawerFrame>
        </DrawerPrimitive.Content>
      </Box>
    </DrawerPortal>
  );
});
DrawerContent.displayName = 'DrawerContent';

Now when focused, inputs are correctly moved into the screen, and when blurred the drawer correctly repositions. Additionally, drawers whose content is too tall for the screen can be scrolled to.


OU-158: Add bulk expire for silences

Adds the ability to bulk expire silences from the silences list page.
Adds a checkbox per row to the silences list for selecting silences as well as a checkbox for selecting / unselecting all of the silences.
If the list is currently filtered, the select all checkbox only selects the currently displayed silences, but unselecting all also unselects any silences that are currently hidden.

/lgtm


Python 2.7 support

WiP, related fabric/patchwork/pull/46

I have temporarily changed the target branch in hopea to have the CI run, but no luck

@LecrisUT Ok; FYI - it should be mergable as is. I'm testing it across my projects as we speak


feat: new infra

This change is

Codecov Report
Attention: Patch coverage is 80.00000% with 4 lines in your changes are missing coverage. Please review.

Project coverage is 46.52%. Comparing base (0fd1c00) to head (5bfe842).
Report is 1 commits behind head on main.

Files
Patch %
Lines

crates/mempool_infra/src/component_server.rs
70.00%
1 Missing and 2 partials :warning:

crates/mempool_infra/src/component_client.rs
90.00%
0 Missing and 1 partial :warning:

Additional details and impacted files
@@            Coverage Diff             @@
##             main     #136      +/-   ##
==========================================
+ Coverage   45.40%   46.52%   +1.11%
==========================================
  Files          17       19       +2
  Lines         599      619      +20
  Branches      599      619      +20
==========================================
+ Hits          272      288      +16
- Misses        316      317       +1
- Partials       11       14       +3

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


Broken autoimport of module without index reexport

Demo: https://github.com/zerkalica/ts-references-autoimport-bug/tree/no-autoimport-wo-index
TypeScript Version: 4.0.2
VSCode Version: 1.49.2
OS: Ubuntu 20.04.1 LTS
Example 1
Package 'b' depends on 'a', but 'a' has no index.ts and types in package.json.
Steps to reproduce

clone, switch to no-autoimport-wo-index, yarn install
Open lib/b/b.ts in vscode, type someA
Expected: autoimport suggest import { someA } from '@some/lib-a/a', actual: no autoimport

Example 2
Package 'd' depends only on 'c', 'c' depends on 'a', but 'a' has no index.ts and types in package.json.
Steps to reproduce

clone, switch to no-autoimport-wo-index, yarn install
Open lib/d/d.ts in vscode, type someA
Expected: no someA in autoimport, actual: autoimport suggests broken import { someA } from '../a/a'

The former example would be solved by an idea I have on my to-do list to explore: adding the targets of project references to the auto-import provider. This should not be a general behavior for packages in node_modules, because searching directories is expensive. But if the package is in fact a referenced project, we already know what files are included, so we could add them to the auto-import provider if they’re not yet imported by the main program.
The latter example appears to be a repeat of #40911.


[AT][CIPDNS][docs] Wrong CIPDNS format on query

https://github.com/espressif/esp-at/blob/master/docs/ESP_AT_Commands_Set.md#426-atcipdns--configures-domain-name-system
Docs says on query, this is response: +CIPDNS:<enable>[,<"DNS IP1">,<"DNS IP2">,<"DNS IP3">].
Reality:
AT+CIPDNS?
+CIPDNS:<IP_ADDRESS>
+CIPDNS:<IP_ADDRESS>
OK

Please give the AT version by AT+GMR.

Esp32 1.2 from espressif website.
Its very unclear how to compile this under windows by myself.

@MaJerle
Thank you for your information and we will fix it as soon as possible

Has updated.

I expected the reference to change, not the implementation which was the same as on esp8266

Currently response is +CIPDNS:<enable>[,<"DNS IP1">,<"DNS IP2">,<"DNS IP3">]


Expose API port in AgentInfo and ControllerInfo

Currently, there are three ways to retrieve the port of the APIServer of an Antrea component, but they are not straightforward IMO.
ConfigMap: we need to parse and iterate it
Pod spec: we need to iterate containers and their ports
Service spec: it only works for controller port querying
This CL exposes the component API port to CRDs and makes the API port querying much easier.

/test-all

What's this used for? I think there are multiple ways to know the api ports, via configmap, via pod spec, via service spec.

What's this used for? I think there are multiple ways to know the api ports, via configmap, via pod spec, via service spec.

It is a snip from the bundle implementation.
Yes, all these ways you mentioned work, but they are not straightforward IMO.
ConfigMap: we need to parse and iterate it
Pod spec: we need to iterate containers and their ports
Service spec: it only works for controller port querying

/test-all

/test-all

/test-conformance

/test-conformance

@jianjuns @antoninbas could you share your opinions on adding this field to systeminformation CRD?
@weiqiangt I meant also adding the purpose of adding this field to PR description (justify why it's needed, not only why we cannot get it via other approaches) as this is an API change.

@jianjuns @antoninbas could you share your opinions on adding this field to systeminformation CRD?

I saw the discussion here. Do not really have a strong opinion. On one hand I feel no harm to add the information and it might be more convenient for some users; on the other hand I understand the argument it is duplicated information.

I feel the same way as Jianjun. I don't think there is any harm in adding this to the info structs. I can understand the rationale. If some non-default port is being used, it can be useful to be able to visualize the port value in Octant, in order to know which parameters to use for antctl to connect to the agent apiserver. We already include the OVS bridge name, which I think is also in the ConfigMap already?

LGTM since @jianjuns @antoninbas are fine with it

Thanks, folks. Merging it.


Warning about multiple invocations to orchest.output overriding old outputs

Even though this behavior is in the contract of the orchest.output(...) behavior, it would be good to warn users when they invoke output multiple times that the old output is overridden. As the use case for legitimately calling orchest.output(...) multiple times in a single step, knowing it overrides the previous output, is quite esoteric and probably not what the user intended.
In the future we might reconsider the orchest.output(...) override behavior, instead allowing some sort of accumulation of outputs during the execution of a script.

Note: would be nice to have 'rich output' in the Notebook for the warnings using something like logger.warning (make sure we handle adding a StreamingHandler to connect to the stderr stream of the Notebook).

Determining whether orchest.output has been called before might introduce unexpected behavior when falling back to outputting to disk. Since disk state is not ephemeral we would need to check the metadata for the timestamp on which the data was written, but this does not have to provide any guarantee whether the data was not outputted during the same session.
So then the question becomes whether we want to treat memory and disk passing differently for this case (which might be strange as they are both invoked through the orchest.output). Another possibility would be to clean the disk state when shutting down a session (similarly to what happens with the memory-server) so that for both the memory and disk passing it can be checked whether data already exists. But this is a big step back in my opinion.

I agree, let’s not do this for now. Doesn’t seem necessary.


TLS support

without TLS support made the high performance useless.

I remove TLS support and http websocket handshake
I think we should create a separate crate instead, which provides this functionality.

I think, @0xCuteSocks what the author of this crate is trying to say is:
Usually websockets sit ontop of http which sit on top of some TLS enabled transport be it TCP with SSL or QUIC.
The stack looks like
WS -> HTTP -> SSL -> TCP
This library seems to implement the WS part of that stack. However there are 0 examples of it working with any of the most commonly used HTTP libraries in Rust, which essentially renders this crate useless.

It seems that, this crate does exactly that https://github.com/denoland/fastwebsockets as well. But also provides some examples on how to implement http upgrades.

There should not be any issues if you are using a http library or framework.
But for others, All missing pieces are already written, The example directory contains the protocol handshake related code. And you can use tokio-rustls for transport layer security.


Implement and Test VirtualJointKinSensor in ICub wearable device

Following the addition of VirtualJointKinSensor #31 in this issue, we track the details related to the implementation of the sensor in ICub wearable device. With this implementation, ICub wearable device will connect to the robot control boards and stream the joint quantities (position velocity acceleration) as wearable data.
This implementation is done in https://github.com/robotology-playground/wearables/pull/25/commits/dae66873130b8623132ff2550117422c9e03311f and the data from the robot seems to be parsed correctly as wearable data from the producer side.

Soon I will test this on the consumer side through IWearRemapper and see if the wearable data is read correctly.
@diegoferigo @lrapetti @DanielePucci

The ICub wearable device is sometimes failing to run correctly and throwing the error from IWearWrapper
[ERROR]IWearWrapper : The status of the IWear interface is not Ok 0 )
Upon preliminary investigation, this error output is during the call to the ICub wearable device getStatus methods. I added a bit of debugging code and notice some of the joint sensors are throwing this error when sensor status Ok check fails. Also, different sensors are failing at different runs. This is quite fishy because during the joint sensor initialization, I am setting the sensor status to Ok here through the setStatus method. So, I would expect the sensor status to be maintained correctly to Ok as the status is not updated anywhere else in the ICub device.
One wild bug that may be happening is, that IWearWrapper is called well before the initialization of all the joints (as there are multiple control boards). So, I changed the config file to have only the head control board (that has only 3 joints), but still the same problem exists. :confused:
@diegoferigo let me know if you can think of something. Thanks.

I did more debugging and discovered that the first joint sensor status setting is failing at times this is probably dude the failure to call correct encoder interfaces. So, I updated the interface pointer handling in joint sensor constructor https://github.com/robotology-playground/wearables/pull/25/commits/e69b83a3dd1d2f8c762e633ad9fd8020a70fe26c and now ICub wearable device is running without any errors from IWearRemapper due to sensor status failures.

@Yeshasvitvs As discussed f2f, please move the code that can fail from the constructor to a separated method, and call it after the objects are contructed, handling possible errors. Also, check the return value of the yarp interfaces.

@diegoferigo I ran into a tricky situation!
When the new sensors are added and implemented in wearables library, the virtual methods are added to all the devices like Wrapper, Remapper, FTShoes, XsensSuit. Then while building all the devices are built correctly, and xsens suit device is built only if the driver is present. https://github.com/robotology-playground/wearables/blob/1857545b5c500dfac9a57355cb12894c366c516e/devices/CMakeLists.txt#L8
Now, the tricky part is, when I run wrapper and remapper, they expect some kinda update from the newly added sensor type as they are build with the new sensor implementation. But as the xsens suit device is not built, it will not give any update on this sensors I think. So, the wrapper is kinda stuck in waiting for first data during the device getStatus call. I need to double check this behaviour with online data tomorrow, but this is the behaviour I notice when I am trying to run the HDE with remapper called on the Xsens  wearable data streamed through yarpdataplayer.
CC @lrapetti

I didn't fully understood the problem @Yeshasvitvs. Is your recording fresh from yesterday?

No the recording is an old one without the ‘()’ for the newly added sensor. Is there a way to control the type of sensors to be handled by wrapper and remapped ?

This is what I suspected. I fear that the thrift message must be complete at the moment, even if I marked them as optional. Though, this behavior has never been tested. I am not even sure that having an optional field means the possibility of not having the () (how would thrift understand it? There is no label for the fields as far as I remember).

I think the catch is inside the wrapper and remapper. Inside the wrapper run() we are calling all the sensors. If a wearable device doesn't have a sensor implemented, then that sensor data place holder in the wearable message is plain (). So, to have control over a sensor presence in a wearable device, we can add that as an optional parameter from the configuration file of the wrapper. What do you think? @diegoferigo
I know this is a bit of unnecessary control over the sensors but I think it will be a good option for future wearable devices that may depend on some sdk to be necessary to build a particular wearable device.

to have control over a sensor presence in a wearable device, we can add that as an optional parameter from the configuration file of the wrapper. What do you think?

This would be an overkill and unnecessarily complicated. I am pretty sure that somehow this can be sorted out in the thrift level, but I did not have enough thrift hands-on to point you to the right solution.
The problem is still not 100% clear to be honest. If I understood, this happens only if produces (e.g. XsensSuit coupled with IWearWrapper) and consumer (e.g. IWearRemapper) are not compiled with the same thrift file, is this right? If this is true, and if both ends use the same generated class, this problem would not be present.

The problem is still not 100% clear to be honest

Addition of new sensors like the joint sensor needs an implementation of the sensor virtual methods in the wearable devices. The wrapper and remapper devices consider all the sensors present in the wearables library. So, when we attach a wearable device like the XsensSuit or ICub to the wrapper, the wrapper expects all the sensors virtual methods to be handled in the wearable device. The first problem is that, when running HDE with a wearables offline data (which does not have an additional place holder for the newly added joint sensor), So, the remapper present in the HDE config file that is reading /Xsens/WearableData port (from yarpdataplayer) is displaying

This message is displayed when the attached iWear interface getStatus() method is called. If I am not mistake, this call goes to the IWearRemapper getStatus(), where pImpl->firstRun is checked. I believe it is getting stuck here with remapper status as WaitingForFirstRead @diegoferigo

Addition of new sensors like the joint sensor needs an implementation of the sensor virtual methods in the wearable devices.

when we attach a wearable device like the XsensSuit or ICub to the wrapper, the wrapper expects all the sensors virtual methods to be handled in the wearable device.

This is not the current situation. All our wearable devices (XsensSuit, FTShoes, ...) miss some sensors, and the logic is to add dummy inlined definition is their header (see here)

The wrapper and remapper devices consider all the sensors present in the wearables library.

They try to read all the sensors, but if the wearable device does not provide any sensor reading for a given type, the thrift map entry of the WearableData struct is empty.

The first problem is that, when running HDE with a wearables offline data (which does not have an additional place holder for the newly added joint sensor)

As I wrote above, you cannot assume that recordings serialized with an old thrift can be read also after you edited the thrift. This can be done only by telling thrift that some data is optional, and despite I assume there is a way to do it in thrift, how to do it has yet to be investigated.
In short, if you change the serialization, old recordings are no longer valid. I suspect that you get that message in HumanStateProvider because the callback on inputs ports of the remapper (the read the WearableData thrift) are never called, since they expect a message with a new field (the new sensors) and you are streaming an offline recorded data that does not match the expected type. This causes the message to be discarded, and the onRead callback is never called.

The callback onRead() of the wearable data buffered port is never called.

In short, if you change the serialization, old recordings are no longer valid. I suspect that you get that message in HumanStateProvider because the callback on inputs ports of the remapper (the read the WearableData thrift) are never called, since they expect a message with a new field (the new sensors) and you are streaming an offline recorded data that does not match the expected type. This causes the message to be discarded, and the onRead callback is never called.

Yeah, that makes sense!

I tested the ICub wearable device with VirtualJointKinSensor using both the robot in gazebo simulation and also on the real robot. The device is working correctly and the joint data (position, velocity, and acceleration) from the robot are correctly sent as a wearable data.


not able to set custom routes

Hello
i am trying to setup custom routes for POST /posts
{
  "/api/*": "/$1",
  "/posts/": "/mypath/test"
}

submit POST requests to endpoint http://localhost:3000/mypath/test return 404 error code

Hi @tremkonzah . Have you tried posting to http://localhost:3000/api/posts/ instead?

What does your db.json file look like?
You define the custom route on the left side, and define the resource on the right side. I don't think you are allowed to define a resource with multiple levels like "/mypath/test".

@joeruhl thank you


July Release Search SDK Code Changes

This PR is for the July release of the search-documents SDK. Basically, this PR does 2 things:

Regenerate SDK based on latest swaggers (and update the custom layer as required)
Add TokenCredential to the constructor.

Updating the SDK to latest version of generator has been moved to next release.
@xirzec Please review and approve the PR.

/check-enforcer override


Update tracking link

What?
Adjusting the shape of the tracking attribute so once slimmer merges layout_footer with the public_layout it gets combined correctly.
Why?
Failing e2e tests on this PR revealed an issue related duplicate: data-track-category on the same node.  It appears as slimmer tries to merge the footer gem with the public layout gem it doesn't combine the two duplicate attributes correctly into one, resulting in a duplication and then an e2e error.
Visual Changes
No visual changes.
Anything else?
Maintains tracking attribute when used as stand alone as to not impact other uses
Related file: within public_layout
Replicating the e2e issue locally to debug involved:

using the local gem within static
using the local version of static and running w/ ./startup.sh
then RACK_ENV=development ./startup.sh --live within frontend

@injms can you hit merge when free as i don't have the power auth


Typing in filter fields not working

When typing in the text fields in filters the input value doesn't change and the typed latter is sent every time to onFilterChange function.

Expected Behavior

User can type a word.
Current Behavior

The filed don't respond to typing or respond with a bugyy behavior.

Your Environment

Tech
Version

Material-UI
3.9.0

MUI-datatables
2.5.1

React
16

browser
Chrome

I'm going to need a codesandbox example of this not working. Firstly, it looks like your material ui version is too high. But secondly, go ahead and run the library examples of using filters. You will see that those, as well as the tests, are running fine. That means there's likely something very specific you're doing that's breaking it, and without knowing what that is, it's impossible to fix.


Improve gradients

Earlier, the loss and gradients were computed as the sum of likelihood  terms over samples. This created a dependency of gradient magnitude and convergence rate on n_samples. I've fixed these now to be more similar to sklearn

Changes Unknown when pulling e45ba51b806b3e1470c97436cd9c32ca3a08475e on improve-gradients into ** on master**.

I'm still not satisfied with it. Three parameters still need to be balanced: learning_rate', max_iter, and tol.
But the core algorithms work and they can now be benchmarked against sklearn with the same values of lambda resulting in the same level of regularization in both pyglmnet and sklearn


Suggestion: Secrets management for k8s

Possibly put an example for k8s in the secrets management section.

This seems like a duplicate issue #231 so closing


Add more unit tests

Look at adding some more tests using the idea api to test completions, intention etc.

Nice work @devclaus 👍😉

Now its likely you @fharms that is behind on unit tests ;)

Damn it :-)
Well I gonna change that with the Annotator feature

Touchdown and the crowd goes wild. With this PR #127 @davsclaus I'm back

TODO: add unit test for preference

Not sure its easy to add doc test with smart completion where you simulate pressing ctrl + j, I dont know how to do that.

Ah found a little way so adding some tests now

Closing this since it is not relevant any more. The current level is sufficient and it's mandatory to add new test case for bug fix and new features


aerender SYNTAX ERROR: Illegal argument flag: -r

aerender SYNTAX ERROR: Illegal argument flag: -r
How to solve this problem

Hello,
Seems like the nexrender didn't properly install the command line patch, that enables -r argument.
Are you sure it was properly set up?
What are your system and AE version?

thanks,


feat(jsx/streaming): Support nested Suspense.

Fixes #1658
Author should do the followings, if applicable

[x] Add tests
[x] Run tests
[x] yarn denoify to generate files for Deno

Cool! Works well.
https://github.com/honojs/hono/assets/10682/bfea1839-54f4-4855-81f8-8b3d029517b2
Thank you for your ultrafast implementation.


Artillery Benchmark for SocketIO

benchmarking feature added. Run npm test to benchmark.
when run, artillery sends [1,2,3].map(&:to_s) 100 times to the SocketIO server and records the latency until the first output is received on the client-side.
misc/benchmark contains logs that I previously ran

Just reviewed your commits and everything looks good to me! I'm good with merging this PR.


default time component

Hello,
In the case of a date range picker (no time picker visible), if the user enters:
start date: 2016-04-15
end date: 2016-04-15
The user implicitly expects the time component to default to:
start date: 2016-04-15 00:00:00
end date: 2016-04-15 23:59:59
The "time components" in this case for the start and end dates are 00:00:00 and 23:59:59, respectively.
What's the best way to make this happen with angular-bootstrap-datetimepicker?
Thanks.

Sorry, there is no way to have the date or time be anything other than exactly what the user selected.
Perhaps the backend systems can interpret the data consistent with the user expectations.


Build performance charts on Jenkins

Reviewer checklist

[ ] Test coverage: stack test --coverage
[ ] Public API documentation: stack haddock

This is not possible.


Provide a way to run custom init sh script inside localstack container in dev and test mode

As a followup for the ticket https://github.com/quarkiverse/quarkus-amazon-services/issues/173
would be nice to have an option to automatically run custom "sh" script inside localstack container after startup for dev and test modes.
This could be used to create dynamodb tables, populate some initial data or do whatever else common operations to prepare localstack infrastructure for dev-mode.

Localstack out of the box provides a possibility to execute custom init scripts from /docker-entrypoint-initaws.d folder. The implementation looks easy:
new optional config property quarkus.aws.devservices.localstack.init-scripts-folder
and in io.quarkus.amazon.common.deployment.DevServicesLocalStackProcessor#startLocalStack something like that:
if (localStackDevServicesBuildTimeConfig.initScriptsFolder.isPresent()) {
   container.withFileSystemBind(localStackDevServicesBuildTimeConfig.initScriptsFolder.get(), "/docker-entrypoint-initaws.d");
}

To enforce localstack to wait for script completion probably additional prop is required:
quarkus.aws.devservices.localstack.init-completion-msg=init completed
if (localStackDevServicesBuildTimeConfig.initCompletionMsg.isPresent()) {
   container.waitingFor(Wait.forLogMessage(".*" + localStackDevServicesBuildTimeConfig.initCompletionMsg + ".*\\n", 1));
}

I'll try to create a PR for it.


Drawer with snap points do not open when initial snap point isn't 0

Codesandbox:
https://codesandbox.io/p/sandbox/drawer-snap-points-forked-hh78xy
I came to point where snapToPoint is called with drawerRef.current as undefined.
In provided sandbox there is commented out useEffect that triggers forced re-render.
Adding drawerRef.current as dependency instead of drawerRef is fixing but any useRef value as dependency is kinda anti-pattern.

Fixed by @KajSzy


dtiplayground to 0.5.8b6 ImportError Report module - PDF creation

Dear maintainers, thank you for resolving my previous issue. I am now on the newer version of dtiplayground as you suggested, and it runs. However, I get this error while running a protocol containing 1) slice check 2) interlace check 3) eddy correction 4) qc report generation. For what I can understand ,the run finishes and produces the files. I cannot determine the gravity of this issue.
This happens after eddymotion.
'[2024-03-14-22-00-10]	Source Image (Previous output) loaded from memory (object id):<PHONE_NUMBER>60672
[2024-03-14-22-00-10]	[DTIPlaygroundModule.initialize] Processed time : 0.12s
[2024-03-14-22-00-10]	[DTIPlaygroundModule.run] begins ...
[2024-03-14-22-00-18]	Exception occurred in runPipeline cannot import name 'ShowBoundaryValue' from 'reportlab.platypus.frames' (/home/rampininia94/anaconda3/envs/dtienv-py310/lib/python3.10/site-packages/reportlab/platypus/frames.py)
[2024-03-14-22-00-18]	Traceback (most recent call last):
[2024-03-14-22-00-18]	  File "/home/rampininia94/anaconda3/envs/dtienv-py310/lib/python3.10/site-packages/dtiplayground/dmri/common/pipeline.py", line 460, in runPipeline
[2024-03-14-22-00-18]	    outres=m.run(opts,global_vars=self.global_variables)
[2024-03-14-22-00-18]	  File "/home/rampininia94/anaconda3/envs/dtienv-py310/lib/python3.10/site-packages/dtiplayground/dmri/common/init.py", line 83, in wrapper
[2024-03-14-22-00-18]	    res=func(*args,**kwargs)
[2024-03-14-22-00-18]	  File "/home/rampininia94/anaconda3/envs/dtienv-py310/lib/python3.10/site-packages/dtiplayground/dmri/common/module.py", line 416, in run
[2024-03-14-22-00-18]	    res=self.process(*args,**kwargs) ## main computation for user implementation
[2024-03-14-22-00-18]	  File "/home/rampininia94/anaconda3/envs/dtienv-py310/lib/python3.10/site-packages/dtiplayground/dmri/preprocessing/modules/QC_Report/QC_Report.py", line 43, in process
[2024-03-14-22-00-18]	    from xhtml2pdf import pisa
[2024-03-14-22-00-18]	  File "/home/rampininia94/anaconda3/envs/dtienv-py310/lib/python3.10/site-packages/xhtml2pdf/pisa.py", line 26, in
[2024-03-14-22-00-18]	    from xhtml2pdf.document import pisaDocument
[2024-03-14-22-00-18]	  File "/home/rampininia94/anaconda3/envs/dtienv-py310/lib/python3.10/site-packages/xhtml2pdf/document.py", line 26, in
[2024-03-14-22-00-18]	    from xhtml2pdf.context import pisaContext
[2024-03-14-22-00-18]	  File "/home/rampininia94/anaconda3/envs/dtienv-py310/lib/python3.10/site-packages/xhtml2pdf/context.py", line 30, in
[2024-03-14-22-00-18]	    from reportlab.platypus.frames import Frame, ShowBoundaryValue
[2024-03-14-22-00-18]	ImportError: cannot import name 'ShowBoundaryValue' from 'reportlab.platypus.frames' (/home/rampininia94/anaconda3/envs/dtienv-py310/lib/python3.10/site-packages/reportlab/platypus/frames.py)'

It looks like this happened during the report creation, likely as it tries to create the pdf. Did you enable the pdf-option in the report module? We have been having issues with the pdf creation and this might be related to that. Can you disable the pdf option and try again?

the module uses xhtml2pdf for pdf report creation, which in turn uses reportlab and the newest version of reportlab breaks xhtml2pdf (currently a known issue). If pdf creation is needed, moving to an earlier version of reportlab might fix the problem.

Hello, thanks again! Title: fixed.
Run without pdf creation: performed and finished without error, from GUI and from terminal.
Good luck for the fix :)

We were trying to recreate this error with the newest distribution, and were unable to do so.  The pdf reporting seems to work without error now. My guess this is due to new versions of xhtml2pdf and reportlab. Please recreate the error on your end, or we can close this ussye


Column numbers

Scss-lint outputs the line number of the warning, but the column number would be helpful as well.  One edge case that happens to apply to me is using vim syntastic without a gutter.  With eslint and rubocop, column names are supported so syntastic is able to highlight the error/warning in the code itself.  This is not an option with scss-lint and may be considered a missing feature by some who prefer to see linter output in the code itself.  Examples:
Eslint: error shows in gutter and on line/column

Scss-lint: warning shows in gutter only; no column given
but I don't like the gutter :(

Context: here's the debug output of scss-lint via vim syntastic:
"test.scss" 4L, 36C
syntastic: 0.094294: &shell = '/bin/bash', &shellcmdflag = '-c', &shellpipe = '2>&1| tee
', &shellquote = '', &shellredir = '>%s 2>&1', &shellslash = 0, &shelltemp = 1, &shellxq
uote = '', &shellxescape = ''
syntastic: 0.094689: UpdateErrors (auto): default checkers
syntastic: 0.094967: CacheErrors: default checkers
syntastic: 0.095541: g:syntastic_aggregate_errors = 0
syntastic: 0.095701: getcwd() = '/Users/jeffreyauriemma/personal/game-of-life-n'
syntastic: 0.617293: CacheErrors: Invoking checker: scss/scss_lint
syntastic: 0.617819: SyntasticMake: called with options: {'errorformat': '%f:%l [%t] %m'
, 'makeprg': 'scss-lint test.scss', 'returns': [0, 1, 2, 65, 66]}
syntastic: 0.975939: checker output: ['test.scss:2 [W] PropertySpelling: Unknown propert
y silly-error', '']
syntastic: 0.976459: raw loclist: [{'lnum': 2, 'bufnr': 1, 'col': 0, 'valid': 1, 'vcol':
 0, 'nr': -1, 'type': 'W', 'pattern': '', 'text': 'PropertySpelling: Unknown property si
lly-error'}, {'lnum': 0, 'bufnr': 0, 'col': 0, 'valid': 0, 'vcol': 0, 'nr': -1, 'type':
'', 'pattern': '', 'text': ''}]
syntastic: 0.976817: getLocList: checker scss/scss_lint returned 1
syntastic: 0.976966: scss/scss_lint raw: [{'lnum': 2, 'bufnr': 1, 'col': 0, 'valid': 1,
'vcol': 0, 'nr': -1, 'type': 'W', 'pattern': '', 'subtype': 'Style', 'text': 'PropertySp
elling: Unknown property silly-error'}, {'lnum': 0, 'bufnr': 0, 'col': 0, 'valid': 0, 'v
col': 0, 'nr': -1, 'type': '', 'pattern': '', 'subtype': 'Style', 'text': ''}]
syntastic: 0.977243: quiet_messages filter: {}
syntastic: 0.977782: aggregated: {'_sorted': 0, '_name': 'scss_lint (scss)', '_owner': 1
, '_columns': 1, '_rawLoclist': [{'lnum': 2, 'bufnr': 1, 'col': 0, 'valid': 1, 'vcol': 0
, 'nr': -1, 'type': 'W', 'pattern': '', 'subtype': 'Style', 'text': 'PropertySpelling: U
nknown property silly-error'}]}

Since column data is being collected, I wonder if this could be solved by simply formatting the output differently.  I realize this may be a syntastic issue and not an scss-lint one, so any context would be helpful.
Any thoughts on this?  Thanks so much for a wonderful tool!

I'm thinking it's more of a Syntastic issue. Using the scss-linter in Atom I do get the column as well as the line.

@abea thanks - opened https://github.com/scrooloose/syntastic/issues/1660 in syntastic in case any other vim users see the same problem.

I think the Atom plugin must use the JSON formatter, which includes the column information. The Default formatter, which the syntastic syntax checker uses, seems to not include the column number. Probably the best thing to do would be to include the column number in the Default formatter, and then update the syntastic checker to expect that format.
@sds what do you think?

Syntastic added support for reading the JSON output of scss-lint in https://github.com/scrooloose/syntastic/commit/2db6f539d081baac7570186a96e7d9621893156c, so this is no longer a problem.


Subscript-crop Raster or Vector by bracket call [], consistency and bug fixes

Summary
This PR updates the get_geoprojected_bounds function, moving its core to projtools to make it consistent and accessible for both Raster and Vector classes.
Then, it adds the same options in Vector.crop() than for Raster.crop() (= passing another Raster, Vector or a list of bounds).
Finally, it implements the __getitem__ (= []) method for Raster and Vector, which calls their underlying crop functionality (= subsetting), as suggested previously by @erikmannerfelt.
rst = Raster(fn_rst)
vec = Vector(fn_vec)

# Get only Raster on extent of Vector
rst = rst[vec]

Other than that, several bug fixes and test additions.
Discussion on the __getitem__ implementation
Several things:

We could add the option of provides slice objects, which would then be used on self.data for Raster (subsetting np.MaskedArray in 2D) and self.ds on Vector (subsetting gpd.GeoDataFrame in 1D).
We could, by default, reproject instead of crop when it is Raster[Raster] (only one where it makes sense)? The resampling algorithm could be passed as second argument Raster[Raster, "bilinear"].

Related issues and more details
This PR:

Resolves #276,
Resolves #268,
Resolves #262,
Resolves #213,
Resolves #333.

Also it:

Removes the dependency of projtools.py on raster.py and geovector.py,
Moves the core of the get_geoprojected_bounds function in Raster to projtools.py,
Adds get_geoprojected_bounds as a method for the Vector class,
Mirrors the crop functionality of the Raster class for Vector objects (can provide any type of geometry: bounds, Raster, Vector),
Adds more test for Raster.polygonize(),
Solves a new bug with checking void in intersection triggered by package updates.

Thanks a lot! All updated, merging :smile:


Remove #filePath when used in an assertion

See title

Codecov Report

Merging #355 (51bc18c) into main (6e993d5) will decrease coverage by 0.08%.
The diff coverage is n/a.

Additional details and impacted files
@@            Coverage Diff             @@
##             main     #355      +/-   ##
==========================================
- Coverage   41.19%   41.12%   -0.08%
==========================================
  Files         117      117
  Lines        9658     9654       -4
==========================================
- Hits         3979     3970       -9
- Misses       5679     5684       +5

Impacted Files
Coverage Δ

...ces/PostgresNIO/Deprecated/PostgresData+UInt.swift
0.00% <ø> (ø)

... and 10 files with indirect coverage changes


Add unicode support to the updated clap dependency

As mentioned by @MichalGniadek in https://github.com/MichalGniadek/klask/pull/36, clap was not correctly processing non-ascii unicode characters as field names after 3.0.0, which was blocking the update.
This happened the crate that they use for case conversion (heck) does not support unicode by default, as they hide it behind a feature. This commit just enables that feature for the version of heck that clap uses to make unicode characters work after the update.
Example:
#[derive(Debug, Parser)]
#[clap(name = "App name")]
/// Help is displayed at the top
pub struct Showcase {
    # [clap(long, value_hint = ValueHint::AnyPath)]
    çæß: PathBuf,
    /// Argument help is displayed as tooltips
    required_field: String,
    #[clap(long)]
    optional_field: Option<String>,
    #[clap(long, default_value = "default value")]
    field_with_default: String,
    #[clap(long)]
    flag: bool,
    #[clap(short, parse(from_occurrences))]
    count_occurrences_as_a_nice_counter: i32,
    #[clap(subcommand)]
    subcommand: Subcommand,
}

Very nice! I hope this can go in upstream klask.


Misunderstanding of Receiver Assignment Propagation in MigrateLegacy

Issue Body:
I've identified a potential misunderstanding regarding how receiver assignments within a method affect the caller's instance, particularly in the context of the MigrateLegacymethod in package.go. This misunderstanding revolves around the expectation that reassigning the method receiver (e.g., pp = pp.AddSBOMs()) would propagate back to the caller, which is not aligned with Go's behavior regarding method receivers.
https://github.com/defenseunicorns/zarf/blob/4d8b8339c010c9c82385cd6748ded9c4048a2b57/src/pkg/layout/package.go#L79-L89
File:
package.go
Function:
MigrateLegacy
Detailed Explanation:
In Go, when a method receiver is reassigned within the method, this reassignment does not affect the caller's instance. This behavior can be illustrated with a simple example:
package main

import "fmt"

type MyStruct struct {
    Value int
}

// Method with a pointer receiver
func (m *MyStruct) PointerReceiverMethod() {
    // This modification affects the original.
    m.Value = 10

    // This reassignment does NOT affect the original pointer.
    m = &MyStruct{Value: 20}
}

// Method with a value receiver
func (m MyStruct) ValueReceiverMethod() {
    // This modification only affects the copy within this method.
    m.Value = 30
}

func main() {
    original := &MyStruct{Value: 0}
    original.PointerReceiverMethod()
    fmt.Println(original.Value) // Outputs: 10, because the field modification is visible.

    original.ValueReceiverMethod()
    fmt.Println(original.Value) // Still outputs: 10, modifications in a value receiver method do not propagate.
}

In this example, modifications to the receiver's fields within PointerReceiverMethod are visible to the caller because it operates directly on the original instance. However, reassigning the receiver to point to a new instance (m = &MyStruct{Value: 20}) within the method does not change the caller's instance. This reassignment is local to the method's scope.
Issue in MigrateLegacy:
The MigrateLegacy method contains lines like pp = pp.AddSBOMs(), suggesting an expectation that such reassignments would propagate back to the caller. This is a misunderstanding of Go's semantics, as such reassignments only affect the method's local scope.
Suggested Action:
It's crucial to clarify the intent behind these receiver reassignments in the MigrateLegacy method. If the intention is to modify the caller's instance, the current approach may not achieve the desired effect. A review and possible revision of the method's implementation could ensure it aligns with Go's behavior and the intended outcomes.
This clarification will help prevent confusion and ensure that the method's behavior is correctly understood and utilized by developers working with or extending the codebase.

@naveensrinivasan This behavior is really a quick and dirty implementation I wrote for modular population of a struct at runtime. I chose reassignment over pp.AddSBOMs() to be a bit more clear that the operation was mutating the internals of the struct itself. Whatever is the true go-native / semantic pattern to implement here I am all for it!

@naveensrinivasan and I discussed this issue synchronously. We verified that the behavior of the client/calling code mentioned in this issue works as expected. We acknowledge that PackagePaths receiver methods such as AddImages and AddSBOMs modify the state of the PackagePaths object and then returns the modified object, and this is not strictly necessary or idiomatic Go. With that being said, we are not prioritizing updating our codebase to be idiomatic at the moment. Because this is low priority for the Zarf team, I am closing this issue for now.


Prompt PS1 value is wrong when ssh'ing

When using the ssh feature in Azure Portal, the initial prompt value shows the current folder as  /home/site/wwwroot even though the pwd is /home. See the attached screenshot. I think the current behaviour is misleading.
As verified by Azure Support,

On this line https://github.com/Azure-App-Service/node/blob/master/10.10/Dockerfile#L40 we set the WORKDIR as /home/site/wwwroot which is why when you SSH in the prompt displays /home/site/wwwroot

But on this line https://github.com/Azure-App-Service/node/blob/master/10.10/Dockerfile#L9 we add cd /home to /etc/bash.bashrc so that whenever the shell is called (such as when an SSH operation is performed)  the cd /home is executed and therefore the current directory is actually set to /home

This seems to be working fine now. I think it was fixed, but I didn't hear anything from Azure support regarding this matter.


expression.Compile should not be executed for each item

Compillation of expression is done in the IsEquivlent method, for each entity/object to match. This is huge degradation of performance. This is a fix for AutoMapper 4.2 version and exists already in master-branch.
Before change

After change

I just came into this situation where this was a problem.


Solver.duplicateModel produce invalid copy when cumulative constraints are in a model

Hello,
it seems to me that there's a bug in a code that duplicates cumulative constraints - both version PropGraphCumulative and PropFullCumulative.
I tried to use more than one solver via following code ...
MasterSolver ms = new MasterSolver();
ms.populate(solver, 1);
ms.findOptimalSolution(ResolutionPolicy.MINIMIZE, objectiveVar);

alternative with direct calling of Solver.duplicateModel gave me same result
Solver solver = masterSolver.duplicateModel();
solver.findOptimalSolution(ResolutionPolicy.MINIMIZE, objectiveVar);

when cumulative constraints were present, attached stacktrace was generated.

My model is quite big, I'll try to make smaller subset to demonstrate a bug. The bug was reproduced in version 3.3.0 and current develop branch on various input data for my model.

Thank you for the bug report. I'll try to figure this out without your minimal working example, but if you can give me one, it will certainly be easier.

Thanks for explanation, I tried to give a breakpoint to the comparator.
Task start has domain [1223,44294], task end has domain [750,1223] and a duration is fixed to 30, shouldn't assert failt also when eub[i]==slb[i] and eub[i]>slb[i] ?
To answer your question, I tried two variants - run only duplicated solver without running original solver and run them in parallel (via first example with MasterSolver)

There seems to be another error: how a task with such start, end and duration does not fail?
To be clearer: the duplication of a model can not be done before solving it (otherwise an error is thrown).
I have the feeling that the error comes from your model but is showed thanks duplication.
Could you try to give me a working example: I ensure anonymity of the model and the data, if you need it.


feat: migrate to superset v3.1.2

Description
This PR upgrades the superset version to v3.1.2.
This PR also:

Automatically refresh datasets on import which will load the most recent columns (and remove old ones) on datasets
fixes an issue with the from_dttm SQL template

Thanks for the pull request, @Ian2012! Please note that it may take us up to several weeks or months to complete a review and merge your PR.
Feel free to add as much of the following information to the ticket as you can:

supporting documentation
Open edX discussion forum threads
timeline information ("this must be merged by XX date", and why that is)
partner information ("this is a course on edx.org")
any other information that can help Product understand the context for the PR

All technical communication about the code itself will be done via the GitHub pull request interface. As a reminder, our process documentation is here.
Please let us know once your PR is ready for our review and all tests are green.

@Ian2012 🎉 Your pull request was merged!  Please take a moment  to answer a two question survey so we can improve your experience in the future.


make number of retries configurable via system property

when polling for activation records

LGTM

@csantanapr will you have a look and merge?


MindTagger clips last item in display list

MindTagger clips the last item in a given display page, meaning you can't provide a label.  Tested on Chrome Version 49.0.2623.110 (64-bit)

@netj Any ideas?

Short term solutions are 1. Skip the candidate or 2. Change the number per page by one (there's some better modular arithmetic to be done here, but I'm not going to add it to Issues)

I'll improve this..

Skipping the candidate is fine -- it's a low priority issue.

This is probably fixed by HazyResearch/mindbender@786a0dc41669abb93b5002c774a0b5b5326de216.  Can someone confirm and close? :)

On it

@netj Just reinstalled DD, and it actually looks like MT isn't displaying at all in the embedded DDLite cell. The process is running and is accessible by navigating to the port on localhost (and the last item isn't clipped :+1: ). Any change I need to make to display the instance in the notebook?
Note: this is explains some difficulties during the hackathon

@netj Nix the above comment (I had a hostname config issue). DDLite still downloads the last DD release, which doesn't include the clip fix. Can verify it works when DD is updated.

Thanks for verifying!  Latest releases (0.8-STABLE and UNSTABLE) include the fix.


Multiple Bluetooth Headsets

Is your feature request related to a problem? Please describe.
Android phones often allow multiple Bluetooth headsets to be bonded at once. The library only seems to populate and connect to the last one in the found bonded devices.
Describe the solution you'd like
The dialog presented to the user should show all Bluetooth devices rather than one and allow the ability to switch between them.
Describe alternatives you've considered
Currently, the only way to accomplish this is to manually disconnect one of the devices from the phone settings or turning off the Bluetooth device. The sample app twilio-quickstart-android usually needs to be restarted for the change to be reflected.
Additional context
I was able to load in the list of bonded Bluetooth devices after modifying the source code myself by switching the variable bluetoothAudioDevice: AudioDevice to ArrayList<AudioDevice> and other code relevant to making the variable into a mutable list. However, the challenge seems to be the API that Android provides for switching Bluetooth devices. The method startBluetoothSco() does not provide a way to specify a device.

Hi @cyodrew! Thank you for reaching out regarding this enhancement. This is definitely a realistic scenario that the library should handle. I will go ahead and add a spike story to our backlog to investigate this more, as you have pointed out, there may be a limitation due to the startBluetoothSco method.

Hi,
This feature would be great to have.  We've implemented it in our app outside of this library by using some bluetooth admin commands (requires permission) on the BluetoothHeadset object.
If we could get this in the Twilio SDK we would prefer to use it would allow the community as whole to improve it and fix all the oddities the OS throws at us.
Feel free to reach out to discuss as you look into implementing this
@SystemApi
@RequiresPermission(android.Manifest.permission.BLUETOOTH_ADMIN)
public boolean connect(BluetoothDevice device)
@SystemApi
@RequiresPermission(android.Manifest.permission.BLUETOOTH_ADMIN)
public boolean disconnect(BluetoothDevice device)
@SystemApi
@RequiresPermission(android.Manifest.permission.BLUETOOTH_ADMIN)
public boolean setPriority(BluetoothDevice device, int priority)
We used setPriority to ensure that when Bluetooth SCO started, it would choose the device the user manually chose should the other headset reconnect during the call.  Priorities were then set back when the call ended.

Thanks for the input @babramovitch ! I'm glad to see you were able to get this working in the meantime. We are planning to look into support for this soon in one of our upcoming sprints.

@cyodrew @babramovitch Here's an update regarding our research into supporting multiple bluetooth devices. It appears that the only way to be able to change the active (meaning audio is routed to the device) bluetooth device is through calling the setActiveDevice() method from the BluetoothHeadset class. Unfortunately this is a system API method, similar to the other system method calls that @babramovitch mentioned above. Although this solution works with reflection, we are hesitant to begin implementation on this right away as it has been Greylisted as a non-SDK interface and could be potentially Blacklisted in a future Android release. In response to that, we created a new API request on Google Issue Tracker so that Google can consider creating a public SDK interface to handle this functionality. Here is the link for that issue, but for some reason the component that it is under limits the visibility to the requester and Google's team. In the meantime, we are going to make sure that this library accurately represents a single active bluetooth headset, even if multiple headsets are connected. I'll provide more updates regarding this enhancement as we learn more. Thanks!

@Alton09 The only way to change device when multiple are connected is setActiveDevice, but the solution I worked out didn't change devices specifically, it disconnected one and connected the other.
Both of those API's are listed as system-api and whitelisted, so I would not expect them to become blacklisted if that path was used.

@babramovitch @cyodrew The library now provides support for multiple bluetooth headsets! Check out the latest version, 0.2.0. It doesn't allow users to select from a list of devices in the library, but it does accurately show the active bluetooth headset, even when changing the active headset in the bluetooth settings system app.

Hey @babramovitch @cyodrew
In our research, we found that we would not be able to offer in-app Bluetooth Headset selection without using reflection of the Android Bluetooth APIs. As a result, we decided to support multiple Bluetooth devices by allowing users to switch Bluetooth devices from the Bluetooth settings. This behavior is consistent with what is done in Google Meet with multiple bluetooth devices and requires no non-public APIs. Please see the Bluetooth Support section of the README for more details.
We will close this issue as officially supported in part to the merging of #40 released in 0.2.0.
If we find that we can support selecting a specific bluetooth device with public APIs, we will reprioritize.
Thanks!


Add log message to show supported and enabled tls versions in ssl engine

Show tls version when creating ssl engine.

Codecov Report

Merging #2147 (b9264a9) into master (c845363) will increase coverage by 14.94%.
The diff coverage is 0.00%.

@@              Coverage Diff              @@
##             master    #2147       +/-   ##
=============================================
+ Coverage          0   14.94%   +14.94%
- Complexity        0     2286     +2286
=============================================
  Files             0      731      +731
  Lines             0    55513    +55513
  Branches          0     6828     +6828
=============================================
+ Hits              0     8296     +8296
- Misses            0    46734    +46734
- Partials          0      483      +483

Impacted Files
Coverage Δ

...java/com/github/ambry/commons/NettySslFactory.java
0.00% <0.00%> (ø)

...com/github/ambry/commons/NettySslHttp2Factory.java
0.00% <0.00%> (ø)

.../src/main/java/com/github/ambry/store/Message.java
0.00% <0.00%> (ø)

...a/com/github/ambry/utils/ZeroBytesInputStream.java
0.00% <0.00%> (ø)

...s/src/main/java/com/github/ambry/store/MockId.java
82.97% <0.00%> (ø)

.../com/github/ambry/account/MySqlAccountsDBTool.java
0.00% <0.00%> (ø)

...com/github/ambry/commons/NettyInternalMetrics.java
0.00% <0.00%> (ø)

...a/com/github/ambry/messageformat/UpdateRecord.java
68.42% <0.00%> (ø)

.../com/github/ambry/config/ConnectionPoolConfig.java
0.00% <0.00%> (ø)

...om/github/ambry/replication/ReplicationEngine.java
0.00% <0.00%> (ø)

... and 723 more

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 c845363...b9264a9. Read the comment docs.