Channel router

@PetrGlad you brought this up somewhere else and I just saw it has actually been requested a few weeks ago: https://github.com/RustAudio/rodio/issues/626#issuecomment-2470118600
So lets discuss that here.

Can I write this? I have opinions on this.

Yes, this is something I had in mind. We do have a channel number converter (ChannelCountConverter) but its primary function seems to be mono->stereo or just discarding channels with higher numbers. It does not look very useful otherwise.
So here I see 3 options.
:one: The most generic channel router would be to have volume/amplification matrix so every output is a weighed sum of inputs. That is for $n$ input channels, and  $m$ output channels, there would be a matrix $A_{m,n}$ with floating point weights (those could even be negative :) This version could handle arbitrary routing, mixing, channel duplication, mono conversion, etc. But this one would be the slowest of three, although I would not worry about that much as it likely can be optimized. This version can probably needs coefficients to be floating point or at least fractional, because it can sum channels together which may cause clipping so one may want to adjust input weights.
:two: A simpler implementation could use just single weighted input for every output. In that case an output is specified as pair of {input_channel_index, weight}, and the router would have a list of those pairs one for every output channel. This version can still handle channel routing (including duplication), and adjusting per-channel volume.
:three:  A simpler still implementation of this would just route channel (equivalent to limiting all coefficients in previous version to 1.0). This only would have to use a list of input channel indexes, one for every output channel. This version is useful for arbitrary channel swaps, duplication, discarding channels but not for mixing.
@iluvcapra All of these versions look useful to me, so maybe you can pick whatever solves your problem the best. Maybe there are something else that I have missed.
Even simpler but inconvenient would be to use single channel converter and some kind of splitter, then single channel converter router, and then mixer. But this sounds rather cumbersome even to me :)

Can I write this? I have opinions on this.

have at it :)
It seems like Petr also has some thoughts so they'll probably be able to help out if you need some input along the way.

By the way https://github.com/RustAudio/rodio/issues/626#issuecomment-2470118600

After thinking more my personal preference would be :two: without limiting how many pairs can be added. Since it would support most if not all cases I saw so far. If there will be need for more complex processing :one: can be implemented separately.

Some thoughts:

Do we want to address the question of channel formatting at this time? Sources reflect the channel count of their outputs but not necessarily channel formatting or assignment.
Does channel mixing need to be dynamic? Or is it sufficient that it be static over the life of the router?
Ability to mix multiple inputs would be a must for my immediate use-case, you need both duplication and combining to do an ITU-BS.775 downmix of a 5.1 or 7.1 to a stereo.
1⃣ has the benefit of simplicity, I'm not really seeing how this is slower considering in this case next() just has to keep track of where it is in the input, where it is in the output, and then pull that coefficient out of the matrix. The alternative is keeping the coefficients in a list and having to do a lookup.

So in the case of 1⃣ it looks something like
struct ChannelMixer<I> {
    channel_matrix: Vec<Vec<f32>>, // dims are (input.channels(), self.channels())
    input_pos: usize,
    output_pos: usize,
    input: I,
    //... yada yada
}

impl<I> Iterator for ChannelMixer where I: Source {
    fn next(&mut self) -> Option<Sample> {
        let this = self.input.next().unwrap();
        let gain = self.channel_matrix[self.input_pos][self.output_pos];
        let retval = this * gain;
        self.input_pos = (self.input_pos + 1) % self.input.channels();
        self.output_pos = (self.output_pos + 1) % self.channels();
        // reset these if a frame ends, etc...
        retval
    }
}

In the case of 2 it looks something like:

struct MixCoefficient {
    input: usize,
    output: usize,
    gain: f32,
}

struct ChannelMixer<I> {
    mix_coefficients: Vec<MixCoefficient>
    input: I,
    input_pos: usize,
    output_pos: usize,
    //... yada yada
}

impl<I> Iterator for ChannelMixer where I: Source {
    fn next(&mut self) -> Option<Sample> {
        let this = input.next().unwrap();
        let gain = self.mix_coefficients.iter()
            .filter( |mc| { mc.input == self.input_pos })
            .filter( |mc| { mc.output == self.output_pos})
            .or_else(0.0f32);
            // 👆this procedure seems like it would take longer

        let retval = this * (*gain);
        self.input_pos = (self.input_pos + 1) % self.input.channels();
        self.output_pos = (self.output_pos + 1) % self.channels();
        retval
    }
}

The other applications to keep in mind for this source would be as a drop-in ambisonic encoder/decoder.

(Deleted the first try at this, it was too broken.)
Some thoughts:

Do we want to address the question of channel formatting at this time? Sources reflect the channel count of their outputs but not necessarily channel formatting or assignment (I notice this was brought up in the user story).
Does channel mixing need to be dynamic? Or is it sufficient that it be static over the life of the router?
Ability to mix multiple inputs would be a must for my immediate use-case, you need both duplication and combining to do an ITU-BS.775 downmix of a 5.1 or 7.1 to a stereo.
1⃣ has the benefit of simplicity, I'm not really seeing how this is slower considering in this case next() just has to keep track of where it is in the input, where it is in the output, and then pull that coefficient out of the matrix. The alternative is keeping the coefficients in a list and having to do a lookup.

struct ChannelMixer<I> {
    channel_matrix: Vec<Vec<f32>>, // dims are (input.channels(), self.channels())
    output_pos: usize,
    input: I,
    input_buffer: Vec<f32>, // dim is (self.input.channels())
    //... yada yada
}

impl<I> Iterator for ChannelMixer where I: Source {

    fn fill_input_buffer(&mut self) -> Void {
        // handling end-of-frame condition omitted here
        self.input_buffer = self.input.iter()
            .take(self.input.channels())
            .collect();
    }

    // for a gain matrix, this logic is relatively straightforward
    fn apply_gains(for_output_channel: usize) -> f32 {
        self.input_buffer.iter()
            .zip(self.channel_matrix)
            .map( |in_sample, out_gains| { in_sample * out_gains[for_output_channel] } )
            .sum()
    }

    fn next(&mut self) -> Option<Sample> {
        if (self.output_pos == self.channels()) {
            self.fill_input_buffer();
            self.output_pos = 0;
        }

        let retval = apply_gains(self.output_pos);
        self.output_pos = self.output_pos + 1;
        retval
    }
}

And then in the case of 2⃣...

struct MixCoefficient {
    input_channel: usize,
    output_channel: usize,
    gain: f32,
}

struct ChannelMixer<I> {
    channel_matrix: Vec<MixCoefficient>
    output_pos: usize,
    input: I,
    input_buffer: Vec<f32>, // dim is (self.input.channels())
    //... yada yada
}

impl<I> Iterator for ChannelMixer where I: Source {

    fn fill_input_buffer(&mut self) -> Void {
        // handling end-of-frame condition omitted here
        self.input_buffer = self.input.iter()
            .take(self.input.channels())
            .collect();
    }

    // Getting the coefficient in this case is a bit more involved, and there are more corner cases,
    // like what if there are two rules for the same pair of ins-outs, etc.
    fn get_mix_coefficient(for_input: usize, for_output: usize) -> f32 {
        self.mix_coefficients.iter()
            .filter( |mc| { mc.input_channel == for_input } )
            .find( |mc| { mc.output_channel == for_output } )
            .map( |mc| { *mc.gain })
            .or_else(0.0f32);
    }

    fn apply_gains(for_output_channel: usize) -> f32 {
        self.input_buffer.iter()
            .zip(self.channel_matrix)
            .map( |in_sample, out_gains| { in_sample * get_mix_coefficient[for_output_channel] } )
            .sum()
    }

    fn next(&mut self) -> Option<Sample> {
        if (self.output_pos == self.channels()) {
            self.fill_input_buffer();
            self.output_pos = 0;
        }

        let retval = apply_gains(self.output_pos);
        self.output_pos = self.output_pos + 1;
        retval
    }
}

Or! TBF you can do gain lookups in constant time with 2⃣ this way:

#[derive(Hash, Eq, PartialEq)]
struct InputOutputPair {
    input_channel: usize,
    output_channel: usize,
}

struct ChannelMixer<I> {
    channel_map: HashMap<InputOutputPair, f32>,
    output_pos: usize,
    input: I,
    input_buffer: Vec<Sample>, // dim is (self.input.channels())
    //... yada yada
}

impl<I> Iterator for ChannelMixer where I: Source {

    fn apply_gains(output_channel: usize) -> Sample {
        self.input_buffer.iter().enumerate()
            .map( | (input_channel, in_sample) | {
                let pair = InputOutputPair { input_channel, output_channel };
                in_sample * self.channel_map[pair]
            } )
            .sum()
    }

    fn next(&mut self) -> Option<Sample> {
        if (self.output_pos == self.channels()) {
            // handling end-of-frame condition omitted here
            self.input_buffer = self.input
                .take(self.input.channels())
                .collect();
            self.output_pos = 0;
        }

        let retval = apply_gains(self.output_pos);
        self.output_pos = self.output_pos + 1;
        retval
    }
}

Yes, first option is logically the simplest but for larger number of channels the matrix will grow bigger and usually most of the coefficients  will be zero. For example for 8 channels it the matrix will have 64 elements.
In the second option I think, no complex containers are necessary (would do for a prototype, though). I had in mind plain array of tuples {in, volume, out}. Users can provide a bunch of those but it is required to have at most one for any {in, out} pair chat should be checked only at the construction time. Also can discard any items with zero coefficients. At the construction time the router would sort those by in. Channel samples are coming in ascending order, so the algorithm could do something like
  let links = vec![(0, 0.3f32, 2), (0, 0.7, 2), (2, 0.9, 1)];
  let input = vec![12, 34, 56].iter()

  // Process input samples until whole frame (all channels) is read and then produce output.
  let mut link_i = 0;
  // For output channels that are not supposed to get any sound
  //     "silence" values should still be produced.
  let mut output = [0f32; self.n_out__channels];
  for (i, sample) in input.take(self.n_in.channels).enumerate() {
    while let Some(link) = thunks.get(link_i) {
       if th.0 > i {
            break;
       }
       assert!(th.0 == i);
       output[link.2] += link.1 * (*sample as f32);
       link_i += 1;
    }
  }
  // normally we have to read all the input channels before the output frame is ready.
  // I do not know yet how this should look like.
  for out in output {
      yield out; // Rust cannot do that yet.
  }

Regarding dynamic adjustments, there are some examples of how this is done currently (see e.g. Sync implementation). I think the whole list of links should be replaced at once. But changes should only take effect when the complete frame is processed (between processing frames), so this will complicate the code a bit.

Another option for :one: (full matrix case) is always having matrix of size inputs x outputs and use atomics as the coefficients. Then all the adjustments can be done in real time. Maybe that is an advantage of having bigger matrix.

I do like the matrix but I do also agree it's not a great idea for something like a 256x256 matrix, which is definitely something somebody might want to do, but I envision this source as primarily acting on single multichannel sounds, not hundreds. The widest multichannel sounds you might get are an Atmos 9.1.6 bed or 3-order Ambisonic, and both of these are only 16 and this would be the max. I've laid it out at the moment as a HashMap but a matrix of atomics seems like it might do just fine.

Germaine to this conversation I raise #657, I'm wide open on this and am curious for comments.

I've laid it out at the moment as a HashMap but a matrix of atomics seems like it might do just fine.

We need a test to quantify the speed difference between atomics and using the periodic callback. That would be checking 16*16 atomics. In #654 we are trying to hammer out the rodio goals but it seems like we all agree rodio should be as performant as possible while easy to use. Periodic callback offers the balance between latency (the period) and efficiency. On (arm) mostly smartphones and now mac's atomics have a different impact.
Maybe we can compare three different versions of this:

on periodic callback + vec[^1] of float pairs
on periodic callback + matrix of floats
a matrix of atomics

[^1]: While a hashmap::get is O(1) that 1 is quite heavy given you need to hash the value. The vec might be faster. Though feel free to take the hashmap if thats easier to implement.

@will3942 from your comment in the ChannelVolume PR it sounds like you might be interested in this

@will3942 from your comment in the ChannelVolume PR it sounds like you might have a use case for this. Any preferences for the API?

Thanks for remembering and tagging me in the issue.
For us we're going to be using this for OutputStreams/Devices of up to 128 channels but realistically only with input sources of 2 channels (stereo).
In terms of a wishlist for us it would be:

Ability to route a specific input channel to a specific output channel
Ability to apply a specific volume to a routing (e.g. Input 0 to Output 32 at Volume 0.8)
Ability to convert an input source from stereo to mono and route it to a specific channel (e.g. Input [0,1] to Output 16)

From the APIs/implementations discussed I think 1⃣ and 2⃣ would work well for us.

What I've done for the time being is an array of floats that are updated over a mpsc channel, this channel is checked every audio frame but this could be done less frequently easily enough.
Atomic floats are gated by experimental so I decided to sidestep that for now but that's doable if we wanted to.
A hashmap-type solution could be sped up by eliminating hashing, by using a u32 as a key and constructing the key by or-ing the input and (output << 16).

@dvdsk I believe the loop in my example above is the leanest approach to process sparse matrix ( for variant :two: ) - it only uses 2 vectors (one for coefficients and one output accumulator).

@dvdsk I believe the loop in my example above is the leanest approach to process sparse matrix ( for variant 2⃣ ) - it only uses 2 vectors (one for coefficients and one output accumulator).

sparse matrix seems to be the way to go. An optimal HashMap would be the same as a sparse matrix I think.

Well, the difference in efficiency may not be significant, but in the simplest version it is just iteration over an array, since we know in advance in which order the channel samples will be processed. A hash map would require at least calculating a hash value for every query.


Bump tests timeout to fix Windows tests.

The numbers are pretty random found with trial and error, but tests seem to pass now on Windows too.

Coverage remained the same at 96.735% when pulling 37c56863c109447aa94a659106b497d49ad99ce9 on bump-tests-timeout into 9d696247593a111afbe1557cf30b54dd633b1385 on master.


Token, BaseToken, TokenDocument → v0.8.6

Changes on Combatant has been made only to fix the build. Combatant should be addressed in another PR.
Resolves #486
Resolves #642
Resolves #688

I rebased it and applied the requested changes.

Great, thanks! I'm not going to review it in detail again. If you fixed all the open points, that's fine :) However, do I understand correctly that you want #893 to be merged before this? Also, _token still needs to be updated :)

Ready


Cannot clone submode of PX4

I cannot build the code follow the guide: https://github.com/orig74/DroneSimLab/wiki/Easy-start
I use Ubuntu 18.04
Please help me.

skip unreal engine option = False
update submodules...
updating submodule: PX4/Firmware
Submodule 'PX4/Firmware' (https://github.com/orig74/Firmware.git) registered for path 'PX4/Firmware'
Cloning into '/home/hieudv/Project/Onboard/ML/DroneSimLab/DroneSimLab/PX4/Firmware'...
remote: Enumerating objects: 4, done.
remote: Counting objects: 100% (4/4), done.
remote: Total 294639 (delta 3), reused 3 (delta 3), pack-reused 294635
Receiving objects: 100% (294639/294639), 108.59 MiB | 1.28 MiB/s, done.
Resolving deltas: 100% (220397/220397), done.
Submodule path 'PX4/Firmware': checked out '4e8ae4d825dfbdaab73cc3c14878fb52d19c6505'
Submodule 'Tools/jMAVSim' (https://github.com/PX4/jMAVSim.git) registered for path 'PX4/Firmware/Tools/jMAVSim'
Submodule 'Tools/sitl_gazebo' (git@github.com:orig74/sitl_gazebo.git) registered for path 'PX4/Firmware/Tools/sitl_gazebo'
Submodule 'boards/atlflight/cmake_hexagon' (https://github.com/PX4/cmake_hexagon.git) registered for path 'PX4/Firmware/boards/atlflight/cmake_hexagon'
Submodule 'cmake/configs/uavcan_board_ident' (https://github.com/PX4/uavcan_board_ident.git) registered for path 'PX4/Firmware/cmake/configs/uavcan_board_ident'
Submodule 'mavlink/include/mavlink/v2.0' (https://github.com/mavlink/c_library_v2.git) registered for path 'PX4/Firmware/mavlink/include/mavlink/v2.0'
Submodule 'msg/tools/gencpp' (https://github.com/PX4/gencpp.git) registered for path 'PX4/Firmware/msg/tools/gencpp'
Submodule 'msg/tools/genmsg' (https://github.com/PX4/genmsg.git) registered for path 'PX4/Firmware/msg/tools/genmsg'
Submodule 'platforms/nuttx/NuttX/apps' (https://github.com/PX4/NuttX-apps.git) registered for path 'PX4/Firmware/platforms/nuttx/NuttX/apps'
Submodule 'platforms/nuttx/NuttX/nuttx' (https://github.com/PX4/NuttX.git) registered for path 'PX4/Firmware/platforms/nuttx/NuttX/nuttx'
Submodule 'src/drivers/gps/devices' (https://github.com/PX4/GpsDrivers.git) registered for path 'PX4/Firmware/src/drivers/gps/devices'
Submodule 'src/drivers/uavcan/libuavcan' (https://github.com/PX4/uavcan.git) registered for path 'PX4/Firmware/src/drivers/uavcan/libuavcan'
Submodule 'src/lib/DriverFramework' (https://github.com/PX4/DriverFramework.git) registered for path 'PX4/Firmware/src/lib/DriverFramework'
Submodule 'src/lib/ecl' (https://github.com/PX4/ecl.git) registered for path 'PX4/Firmware/src/lib/ecl'
Submodule 'src/lib/matrix' (https://github.com/PX4/Matrix.git) registered for path 'PX4/Firmware/src/lib/matrix'
Submodule 'src/modules/micrortps_bridge/micro-CDR' (https://github.com/PX4/micro-CDR.git) registered for path 'PX4/Firmware/src/modules/micrortps_bridge/micro-CDR'
Cloning into '/home/hieudv/Project/Onboard/ML/DroneSimLab/DroneSimLab/PX4/Firmware/Tools/jMAVSim'...
remote: Enumerating objects: 124, done.
remote: Counting objects: 100% (124/124), done.
remote: Compressing objects: 100% (77/77), done.
remote: Total 3171 (delta 43), reused 79 (delta 13), pack-reused 3047
Receiving objects: 100% (3171/3171), 53.21 MiB | 754.00 KiB/s, done.
Resolving deltas: 100% (1563/1563), done.
Cloning into '/home/hieudv/Project/Onboard/ML/DroneSimLab/DroneSimLab/PX4/Firmware/Tools/sitl_gazebo'...
<EMAIL_ADDRESS>Permission denied (publickey).
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.
fatal: clone of 'git@github.com:orig74/sitl_gazebo.git' into submodule path '/home/hieudv/Project/Onboard/ML/DroneSimLab/DroneSimLab/PX4/Firmware/Tools/sitl_gazebo' failed
Failed to clone 'Tools/sitl_gazebo'. Retry scheduled
Cloning into '/home/hieudv/Project/Onboard/ML/DroneSimLab/DroneSimLab/PX4/Firmware/boards/atlflight/cmake_hexagon'...
remote: Enumerating objects: 517, done.
remote: Total 517 (delta 0), reused 0 (delta 0), pack-reused 517
Receiving objects: 100% (517/517), 92.29 KiB | 194.00 KiB/s, done.
Resolving deltas: 100% (293/293), done.
Cloning into '/home/hieudv/Project/Onboard/ML/DroneSimLab/DroneSimLab/PX4/Firmware/cmake/configs/uavcan_board_ident'...
remote: Enumerating objects: 15, done.
remote: Total 15 (delta 0), reused 0 (delta 0), pack-reused 15
Cloning into '/home/hieudv/Project/Onboard/ML/DroneSimLab/DroneSimLab/PX4/Firmware/mavlink/include/mavlink/v2.0'...
remote: Enumerating objects: 279, done.
remote: Counting objects: 100% (279/279), done.
remote: Compressing objects: 100% (160/160), done.
remote: Total 18804 (delta 237), reused 158 (delta 119), pack-reused 18525
Receiving objects: 100% (18804/18804), 8.71 MiB | 973.00 KiB/s, done.
Resolving deltas: 100% (17242/17242), done.
Cloning into '/home/hieudv/Project/Onboard/ML/DroneSimLab/DroneSimLab/PX4/Firmware/msg/tools/gencpp'...
remote: Enumerating objects: 837, done.
remote: Total 837 (delta 0), reused 0 (delta 0), pack-reused 837
Receiving objects: 100% (837/837), 140.41 KiB | 243.00 KiB/s, done.
Resolving deltas: 100% (458/458), done.
Cloning into '/home/hieudv/Project/Onboard/ML/DroneSimLab/DroneSimLab/PX4/Firmware/msg/tools/genmsg'...
remote: Enumerating objects: 1780, done.
remote: Total 1780 (delta 0), reused 0 (delta 0), pack-reused 1780
Receiving objects: 100% (1780/1780), 375.19 KiB | 118.00 KiB/s, done.
Resolving deltas: 100% (955/955), done.
Cloning into '/home/hieudv/Project/Onboard/ML/DroneSimLab/DroneSimLab/PX4/Firmware/platforms/nuttx/NuttX/apps'...
remote: Enumerating objects: 620, done.
remote: Counting objects: 100% (620/620), done.
remote: Compressing objects: 100% (321/321), done.
remote: Total 56842 (delta 354), reused 418 (delta 287), pack-reused 56222
Receiving objects: 100% (56842/56842), 14.61 MiB | 900.00 KiB/s, done.
Resolving deltas: 100% (46806/46806), done.
Cloning into '/home/hieudv/Project/Onboard/ML/DroneSimLab/DroneSimLab/PX4/Firmware/platforms/nuttx/NuttX/nuttx'...
remote: Enumerating objects: 1768, done.
remote: Counting objects: 100% (1768/1768), done.
remote: Compressing objects: 100% (939/939), done.
remote: Total 498761 (delta 927), reused 1205 (delta 710), pack-reused 496993
Receiving objects: 100% (498761/498761), 152.79 MiB | 387.00 KiB/s, done.
Resolving deltas: 100% (383641/383641), done.
Cloning into '/home/hieudv/Project/Onboard/ML/DroneSimLab/DroneSimLab/PX4/Firmware/src/drivers/gps/devices'...
remote: Enumerating objects: 72, done.
remote: Counting objects: 100% (72/72), done.
remote: Compressing objects: 100% (50/50), done.
remote: Total 615 (delta 46), reused 36 (delta 22), pack-reused 543
Receiving objects: 100% (615/615), 273.19 KiB | 361.00 KiB/s, done.
Resolving deltas: 100% (446/446), done.
Cloning into '/home/hieudv/Project/Onboard/ML/DroneSimLab/DroneSimLab/PX4/Firmware/src/drivers/uavcan/libuavcan'...
remote: Enumerating objects: 17893, done.
remote: Total 17893 (delta 0), reused 0 (delta 0), pack-reused 17893
Receiving objects: 100% (17893/17893), 2.88 MiB | 730.00 KiB/s, done.
Resolving deltas: 100% (12078/12078), done.
Cloning into '/home/hieudv/Project/Onboard/ML/DroneSimLab/DroneSimLab/PX4/Firmware/src/lib/DriverFramework'...
remote: Enumerating objects: 5109, done.
remote: Total 5109 (delta 0), reused 0 (delta 0), pack-reused 5109
Receiving objects: 100% (5109/5109), 958.20 KiB | 508.00 KiB/s, done.
Resolving deltas: 100% (3515/3515), done.
Cloning into '/home/hieudv/Project/Onboard/ML/DroneSimLab/DroneSimLab/PX4/Firmware/src/lib/ecl'...
remote: Enumerating objects: 61, done.
remote: Counting objects: 100% (61/61), done.
remote: Compressing objects: 100% (32/32), done.
remote: Total 8566 (delta 33), reused 41 (delta 28), pack-reused 8505
Receiving objects: 100% (8566/8566), 23.23 MiB | 843.00 KiB/s, done.
Resolving deltas: 100% (6194/6194), done.
Cloning into '/home/hieudv/Project/Onboard/ML/DroneSimLab/DroneSimLab/PX4/Firmware/src/lib/matrix'...
remote: Enumerating objects: 8, done.
remote: Counting objects: 100% (8/8), done.
remote: Compressing objects: 100% (8/8), done.
remote: Total 2159 (delta 0), reused 3 (delta 0), pack-reused 2151
Receiving objects: 100% (2159/2159), 1.06 MiB | 289.00 KiB/s, done.
Resolving deltas: 100% (1593/1593), done.
Cloning into '/home/hieudv/Project/Onboard/ML/DroneSimLab/DroneSimLab/PX4/Firmware/src/modules/micrortps_bridge/micro-CDR'...
remote: Enumerating objects: 4, done.
remote: Counting objects: 100% (4/4), done.
remote: Compressing objects: 100% (4/4), done.
remote: Total 1573 (delta 0), reused 0 (delta 0), pack-reused 1569
Receiving objects: 100% (1573/1573), 652.91 KiB | 523.00 KiB/s, done.
Resolving deltas: 100% (867/867), done.
Cloning into '/home/hieudv/Project/Onboard/ML/DroneSimLab/DroneSimLab/PX4/Firmware/Tools/sitl_gazebo'...
<EMAIL_ADDRESS>Permission denied (publickey).
fatal: Could not read from remote repository.
Please make sure you have the correct access rights
and the repository exists.
fatal: clone of 'git@github.com:orig74/sitl_gazebo.git' into submodule path '/home/hieudv/Project/Onboard/ML/DroneSimLab/DroneSimLab/PX4/Firmware/Tools/sitl_gazebo' failed
Failed to clone 'Tools/sitl_gazebo' a second time, aborting
Failed to recurse into submodule path 'PX4/Firmware'
Error:  failed updataing submodules.. please check you connection

I used branch 18.04 and ran it successfully! Thanks


Sample type handling

https://github.com/pothosware/SoapyAirspy/blob/master/Streaming.cpp#L147
I was expecting airspy_set_sample_type(dev, asFormat);

@touil thanks; I had left it hard-coded since It's only doing a cast conversion from FLOAT to INT16 at the moment instead of using the proper libairspy sample type facilities -- will fix this up once the support is implemented.

I dont have an airspy to test, but I implemented this feature on the streaming work branch. Any volunteers to give a quick int16 test or confirm floats still work?


[FEATURE] Support HubVirtualNetworkConnectionProperties ConnectivityStatus

Feature Request
Support HubVirtualNetworkConnectionProperties struct ConnectivityStatus field.
type HubVirtualNetworkConnectionProperties struct {
  ConnectivityStatus *ConnectivityStatus `json:"connectivityStatus,omitempty" azure:"ro"`
}

This field appears to be undocumented in the Azure REST API and even the Azure .NET SDK docs.
However, it's in the live response and portal.azure.com UI. I've tested 2 versions so far, and it's present in both:

2022-01-01
2022-05-01

{
  "name": "<redacted>",
  "id": "<redacted>",
  "etag": "<redacted>",
  "type": "Microsoft.Network/virtualHubs/hubVirtualNetworkConnections",
  "properties": {
    "provisioningState": "Succeeded",
    "resourceGuid": "<redacted>",
    "routingConfiguration": {
      "associatedRouteTable": {
        "id": "<redacted>"
      },
      "propagatedRouteTables": {
        "labels": [
          "none"
        ],
        "ids": [
          {
            "id": "<redacted>"
          }
        ]
      },
      "vnetRoutes": {
        "staticRoutes": [],
        "staticRoutesConfig": {
          "propagateStaticRoutes": false,
          "vnetLocalRouteOverrideCriteria": "Contains"
        }
      }
    },
    "remoteVirtualNetwork": {
      "id": "<redacted>"
    },
    "allowHubToRemoteVnetTransit": true,
    "allowRemoteVnetToUseHubVnetGateways": true,
    "enableInternetSecurity": true,
    "connectivityStatus": "Connected"
  }
}

cc: @juicybaba

This seems to be a Swagger correctness issue. @tadelesh, could you help to double check?

Yes. It is a swagger correctness issue. @kuwas I'll migrate this issue to the swagger repo and involve service team then.


The VERY SERIOUS warning message

Dark place is very serious business as we all know. Definitely nothing silly in that text file that's marked as co-authored by @SadDiamondMan :)

Draft because I realized it's a no-go without the animation


Add Element.ALLOW_KEYBOARD_INPUT to webkitRequestFullScreen request

I need to layer an input form over MEJS and have it work in full-screen mode.
I modified the source to call webkitRequestFullScreen as follows:
el.webkitRequestFullScreen(Element.ALLOW_KEYBOARD_INPUT);
If you don't want to make this the default, please provide an option to enable it so I don't need to merge in my mod to your JS file every time I upgrade to a new release of the player.

@msgilligan Closing old issues. If you'd like to reopen this, let us know. Thanks!


Added sample for WinAppSDK CameraCaptureUI

Description
This pull request adds a sample application demonstrating the use of the CameraCaptureUI API in WinAppSDK. The sample showcases how to capture both photos and videos using custom settings such as format and resolution. It includes implementations in C++ and C# to highlight cross-language compatibility. The sample aims to provide developers with a practical example of integrating camera functionality into desktop apps.
Target Release
1.7
Checklist

[x] Samples build and run using the Visual Studio versions listed in the Windows development docs.
[ ] Samples build and run on all supported platforms (x64, x86, ARM64) and configurations (Debug, Release).
[ ] Samples set the minimum supported OS version to Windows 10 version 1809.
[ ] Samples build clean with no warnings or errors.
[ ] [For new samples]: Samples have completed the sample guidelines checklist and follow standardization/naming guidelines.
[ ] If I am onboarding a new feature, then I must have correctly setup a new CI pipeline for my feature with the correct triggers and path filters laid out in the "Onboarding Samples CI Pipeline for new feature" section in samples-guidelines.md.
[ ] I have commented on my PR /azp run SamplesCI-<FeatureName> to have the CI build run on my branch for each of my FeatureName my PR is modifying. This must be done on the latest commit on the PR before merging to ensure the build is up to date and accurate. Warning: the PR will not block automatically if this is not run due to '/azp run' limitation on triggering more than 10 pipelines.

/azp run SamplesCI-CameraCaptureUI

Skipping setting up the actual pipeline for now because the "ms" ADO has been deprecated and we currently don't have a new home for these samples validation pipeline yet.


How to set my own expiration

I have been googling for 2days now and all answers never seem to work, is there any straight forward way to set my own expiration session or token, all I want to do is redirect the user to log in again on Identity Server after a specific time for instance maybe after 20minutes.
A number of ways I have tried googling around:

 app.UseCookieAuthentication(new CookieAuthenticationOptions
        {
            AuthenticationScheme = "Cookies",
            SlidingExpiration = true,
            ExpireTimeSpan = System.TimeSpan.FromSeconds(1.0)
        });

.AddOpenIdConnect(OpenIdConnectDefaults.AuthenticationScheme, options =>
{
  // ..
  options.Events.OnTicketReceived = async (context) =>
  {
    context.Properties.ExpiresUtc = DateTime.UtcNow.AddHours(1);
  };
  // ..
}

services
   .AddIdentityServer(options =>
   {
      options.Authentication.CookieLifetime = TimeSpan.FromDays(30);
   })

// AccountController.cs - Login()
await HttpContext.SignInAsync(isuser, new AuthenticationProperties
   {
       IsPersistent = true,
       ExpiresUtc = DateTimeOffset.UtcNow.Add(TimeSpan.FromDays(30))
    });

But none of the above work. Could someone please point me in the right direction and I have seen a lot of people struggle with this so perhaps this needs to be documented. Thanks in advance.

I've just run into this problem. I believe it used to work as our solution was teste din the past with a custom sliding expiry.

There are so many issues related to this on github that has been closed with no solution.

Given your examples above, this may not be helpful, but I've got things working by combining 3 and 4. The documentation is unclear:
"This is separate from the value of , which specifies how long the browser will keep the cookie."
" , "!

Take a look in your client configuration in IS4. There is a field where you can setup the lifetime of your AccessToken. The field is called AccessTokenLifetime. When you don't use the refresh token mechanism, your access token will live (per default) 1 hour. What kind of client are you using? Is it a javascript or net app? Depending on that you need to make some adjustments. See http://docs.identityserver.io/en/dev/topics/signout.html

It seems I misunderstood the original question. My answers refer to setting the expiration of the Identity Server authentication session i.e. how long idsvr cookie and auth ticket last.
@mirnoca is correct. For the client session this depends on what sort of grant type you're using.

@mirnoca not sure I follow what adjustments you referring to. The link you sent is about signing out.
I'm using the .net core MVC app. With grant type code.
@alexcmoss the combination you mentioned is what most blogs and StackOverflow answers suggest but with no luck, it has never worked for me. Even though the cookie seems expired if I do a refresh I am still not redirected to login.

@alexcmoss  I misunderstood the problem. I tried picture 4 and set ExpiresUtc  = 5 minutes. I see in the developer tools that the cookie "idsrv"  expires in 5 minutes. But the other cookies don't have any expire time.

This combination works for me. I used the "samples\Quickstarts\5_EntityFramework" project in IdentityServer repository.
Startup.cs  Client

Startup.cs  IdentityServer

@mirnoca i will try your combo and get back to you. Thanks.


CI/CD - cleanup AWS Elastic Block Store volumes

When deploying Rasa enterprise to a cluster, 3 Persistent Volumes are dynamically provisioned, using the gp2 Storage Class created during cluster creation with eksctl:

postgresql
redis
rabbit

These are awsElasticBlockStore volumes.
These EBS volumes persist when:

Uninstalling Rasa enterprise
Deleting the EKS cluster

They must be removed separately, by the cleanup workflows.

Done!

Done!


How to change content

Hi,
Just a question, I want to change the content of my popover :
$('ID').webuiPopover({content:'TEXT'})
ID : the ID of the popover
Am I wrong somewhere ?
Thanks

In ID you should put the JQuery selector of the element. It's $('#ID') if you want to pick from the element ID.
There are several samples in the documentation. Have you tried them yet?


Webhook for katacoda

Define a webhook in the repository settings using the payload defined at https://katacoda.com/kubevirt/settings
With target url: https://editor.katacoda.com/scenarios/updated
and payload as application/json for 'send events'

/kind bug

@iranzo I added the hook.
I wasn't sure about what you meant with "for 'send events'"...  the choices we have when configuring when to trigger the webhook are:

just for the push event
send me everything
let me select individual events

I believe that we only need to check for updates so I selected "just the push event". If that's not what was needed let me know, otherwise feel free to close this as done.

Perfect, thanks
/close


Claire Zhao Week 1: Fastpages

Quiz made using Python: Link
Post with terms learned in CSP using Markdown: Link
Blog post about day made using Markdown: Link
Bash Installation Check made using Shell Script: Link

2.8

Python quiz worked well and had new questions showing proof of understanding python and coding
Blog includes personal life and productive blogging tools
Bash tool check complete
Personalized the front page by adding colors and logo

2.8

Finished bash tool installment
Added colors to front page
Included details about her life on blog
Python quiz was successful and showed understanding

finished python quiz
did a blog about classes md post
finished tool check
colorful front page
has a place for csp vocab and terms

Overall: Really good job this week. 2.8


variables defined, but not seen, or ignored, or not liked ?

dvtm-0.15 © 2007-2016
as shown in the screen, the environment variable DVTM_TERM is defined with a perfectly fine terminal name, which works well with an editor like micro, but dvtm doesn't like it.
Also DVTM_EDITOR is set too, but it does nothing, and MOD e does also nothing.
Why ?

Looks you meant to attach screenshot, but didn't actually.


Allow build man-pages with ronn

See-also: #386

pandoc is written in Haskell, which is very hard to port across
platform. While ruby is also hard to port, it's slightly easier to
port than Haskell.
Let's support building man-pages with both pandoc and ronn.

I've just built with configure option --with-ronn and the resulting man pages look good to me.


UI in linux

Hi, is it possible to run the UI in linux (ubuntu)?

It hasn't been tested, but it should work.  The builds are in Windows, but only because that is what we primarily use.  Would you be able to test?

Hi @ericgyounkin Yes I'd be happy to test it out if you could give me some pointers to get it running, thanks.

Yes I have have got the environment setup, I'm able to import the module in a python console

@davesteps oh, then you should be run kluster as a module from a shell, after you have activated the environment
(pydro38) C:>python -m HSTB.kluster

Thanks, I'm getting
ModuleNotFoundError: No module named 'posixreg'

That is a module that should get installed with Kluster.
C:\Pydro21_Dev\envs\kluster_test_disabled\Lib\site-packages\HSTB\shared\posixreg.py
Your path won't be exactly like mine of course, but do you have this file in your site-packages?

@davesteps  I would also try "whereis python" just to ensure that you are using the kluster_test (or whatever you named your new environment) python.  I mention that because that module is automatically installed on pip installing Kluster.

That is a module that should get installed with Kluster.
C:\Pydro21_Dev\envs\kluster_test_disabled\Lib\site-packages\HSTB\shared\posixreg.py

Yes the module exists in my site-packages

I would also try "whereis python" just to ensure that you are using the kluster_test (or whatever you named your new environment) python. I mention that because that module is automatically installed on pip installing Kluster.

Confirmed I am using the correct python:
(kluster_test) david@ubuntuv20:~$ which python
/home/david/miniconda3/envs/kluster_test/bin/python

I'm wondering if it is a environment variable issue

It could also be some of the path stuff that I use to get QGIS to work.  You could try:
(kluster_test) C:>python
Python 3.8.12 | packaged by conda-forge | (default, Oct 12 2021, 21:22:46) [MSC v.1916 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.

from HSTB.shared import posixreg

Just to isolate that one call.
I can also try and spin up a Linux instance via Docker to try and get it all working.

The above (from HSTB.shared import posixreg straight into the console) worked. Just appears to be the gui module cannot find the shared module. Here is the full error:
(kluster_test) david@ubuntuv20:~$ python -m HSTB.kluster
Traceback (most recent call last):
  File "/home/david/miniconda3/envs/kluster_test/lib/python3.8/runpy.py", line 194, in _run_module_as_main
    return _run_code(code, main_globals, None,
  File "/home/david/miniconda3/envs/kluster_test/lib/python3.8/runpy.py", line 87, in _run_code
    exec(code, run_globals)
  File "/home/david/miniconda3/envs/kluster_test/lib/python3.8/site-packages/HSTB/kluster/__main__.py", line 7, in <module>
    from HSTB.kluster.gui import kluster_main
  File "/home/david/miniconda3/envs/kluster_test/lib/python3.8/site-packages/HSTB/kluster/gui/kluster_main.py", line 25, in <module>
    from HSTB.kluster.gui import dialog_vesselview, kluster_explorer, kluster_project_tree, kluster_3dview_v2, \
  File "/home/david/miniconda3/envs/kluster_test/lib/python3.8/site-packages/HSTB/kluster/gui/dialog_vesselview.py", line 19, in <module>
    from HSTB.kluster.gui.common_widgets import AcceptDialog
  File "/home/david/miniconda3/envs/kluster_test/lib/python3.8/site-packages/HSTB/kluster/gui/common_widgets.py", line 9, in <module>
    from HSTB.shared import RegistryHelpers
  File "/home/david/miniconda3/envs/kluster_test/lib/python3.8/site-packages/HSTB/shared/RegistryHelpers.py", line 23, in <module>
    from .settings import *
  File "/home/david/miniconda3/envs/kluster_test/lib/python3.8/site-packages/HSTB/shared/settings.py", line 6, in <module>
    from posixreg import *
ModuleNotFoundError: No module named 'posixreg'

Hi @davesteps.  OK that's good information.  I'll try and get Docker going tomorrow to test on Ubuntu.
I did notice that you have a path like
../envs/kluster_test/lib/python3.8/site-packages/HSTB/shared\posixreg.py
where mine is like
..\envs\kluster_test\Lib\site-packages\HSTB\shared\posixreg.py
without that python3.8 folder.  Is that the norm for conda in Linux environment?  Are all your site packages in that python3.8 folder?  I wonder if that difference is breaking our codebase somewhere.

Is that the norm for conda in Linux environment?

Pretty sure that is standard for conda in linux, all the python packages are in there

I've tested Kluster GUI in VirtualBox/Ubuntu 20.04.3 LTS and replicated your issue.  I believe I have resolved this issue in the hstb.shared repository.  Can you try uninstalling/reinstalling hstb.shared?
(kluster_test) eyou102@eyou102-VirtualBox:/$ pip uninstall hstb.shared
(kluster_test) eyou102@eyou102-VirtualBox:/$ pip install git+https://github.com/noaa-ocs-hydrography/shared.git#egg=hstb.shared
(kluster_test) eyou102@eyou102-VirtualBox:/$ python -m HSTB.kluster
That should bring up the GUI.  I've tested with the .all file that is in the Kluster repo, and it works.

Yes can confirm that works for me now. Thanks!

Fantastic!  Thanks for testing!

For reference the recipe I am using to run UI on Ubuntu (20.04.3):

Clone repo and cd into it (v0.8.8)
conda env create -f environment.yml
pip install .
python -m HSTB.kluster


Schema for uniqueness comparison improvement with hashing -> schema.UUID

Problem
Schema comparison is done with mysql comparison in schema.type_defs
#168 + #106
Changes

Add schema normalization - this should get rid of extra tabbing / spacing
Fix knex migration generation
Improve migration scripts to support JS migrations
Migrate schemas to now include UUID
Do not delete duplicate schemas as its a bit dangerous

Testing
TBD

Main branch dependencies

Neodora Analysis ⛔
 ⛔ Forbidden use of Docker base image

Message: Only pipedrive base images must be used. For more please refer to the documentation
File: Dockerfile.CI
Actual image:
node:16-alpine

🔍 How to fix it

Commit 090007a  Job 98213

Neodora Analysis ⛔
 ⛔ Forbidden use of Docker base image

Message: Only pipedrive base images must be used. For more please refer to the documentation
File: Dockerfile.CI
Actual image:
node:16-alpine

🔍 How to fix it

Commit 5ddd9ec  Job 98222

Neodora Analysis ⛔
 ⛔ Forbidden use of Docker base image

Message: Only pipedrive base images must be used. For more please refer to the documentation
File: Dockerfile.CI
Actual image:
node:16-alpine

🔍 How to fix it

Commit baa72e3  Job 98293

Neodora Analysis ⛔
 ⛔ Forbidden use of Docker base image

Message: Only pipedrive base images must be used. For more please refer to the documentation
File: Dockerfile.CI
Actual image:
node:16-alpine

🔍 How to fix it

Commit e8bcd56  Job 98319

Neodora Analysis ⛔
 ⛔ Forbidden use of Docker base image

Message: Only pipedrive base images must be used. For more please refer to the documentation
File: Dockerfile.CI
Actual image:
node:16-alpine

🔍 How to fix it

Commit 4d278f1  Job 98351

Neodora Analysis ⛔
 ⛔ Forbidden use of Docker base image

Message: Only pipedrive base images must be used. For more please refer to the documentation
File: Dockerfile.CI
Actual image:
node:16-alpine

🔍 How to fix it

Commit 2ed5cac  Job 98422

Neodora Analysis ⛔
 ⛔ Forbidden use of Docker base image

Message: Only pipedrive base images must be used. For more please refer to the documentation
File: Dockerfile.CI
Actual image:
node:16-alpine

🔍 How to fix it

 ⚠ Incorrect runner in Github Workflow

Message: Github workflow must run on a self-hosted runner

Workflow file
Job name
Actual runs-on value
Expected runs-on value

integration-test.yml
test
ubuntu-latest
Any of [eks-runner, eks-runner-php, eks-runner-nano, eks-runner-debug, eks-runner-compute]

🔍 How to fix it

 ⚠ Incorrect runner in Github Workflow

Message: Github workflow must run on a self-hosted runner

Workflow file
Job name
Actual runs-on value
Expected runs-on value

unit-test.yml
test
ubuntu-latest
Any of [eks-runner, eks-runner-php, eks-runner-nano, eks-runner-debug, eks-runner-compute]

🔍 How to fix it

 ⚠ Incorrect runner in Github Workflow

Message: Github workflow must run on a self-hosted runner

Workflow file
Job name
Actual runs-on value
Expected runs-on value

lint.yml
test
ubuntu-latest
Any of [eks-runner, eks-runner-php, eks-runner-nano, eks-runner-debug, eks-runner-compute]

🔍 How to fix it

 ⚠ Incorrect runner in Github Workflow

Message: Github workflow must run on a self-hosted runner

Workflow file
Job name
Actual runs-on value
Expected runs-on value

functional-test.yml
docker
ubuntu-latest
Any of [eks-runner, eks-runner-php, eks-runner-nano, eks-runner-debug, eks-runner-compute]

🔍 How to fix it

 ⚠ Incorrect runner in Github Workflow

Message: Github workflow must run on a self-hosted runner

Workflow file
Job name
Actual runs-on value
Expected runs-on value

perf-test.yml
docker
ubuntu-latest
Any of [eks-runner, eks-runner-php, eks-runner-nano, eks-runner-debug, eks-runner-compute]

🔍 How to fix it

Commit 54f3ef6  Job 99946

Neodora Analysis ⚠
 ⚠ Incorrect runner in Github Workflow

Message: Github workflow must run on a self-hosted runner

Workflow file
Job name
Actual runs-on value
Expected runs-on value

lint.yml
test
ubuntu-latest
Any of [eks-runner, eks-runner-php, eks-runner-nano, eks-runner-debug, eks-runner-compute]

🔍 How to fix it

 ⚠ Incorrect runner in Github Workflow

Message: Github workflow must run on a self-hosted runner

Workflow file
Job name
Actual runs-on value
Expected runs-on value

functional-test.yml
docker
ubuntu-latest
Any of [eks-runner, eks-runner-php, eks-runner-nano, eks-runner-debug, eks-runner-compute]

🔍 How to fix it

 ⚠ Incorrect runner in Github Workflow

Message: Github workflow must run on a self-hosted runner

Workflow file
Job name
Actual runs-on value
Expected runs-on value

unit-test.yml
test
ubuntu-latest
Any of [eks-runner, eks-runner-php, eks-runner-nano, eks-runner-debug, eks-runner-compute]

🔍 How to fix it

 ⚠ Incorrect runner in Github Workflow

Message: Github workflow must run on a self-hosted runner

Workflow file
Job name
Actual runs-on value
Expected runs-on value

integration-test.yml
test
ubuntu-latest
Any of [eks-runner, eks-runner-php, eks-runner-nano, eks-runner-debug, eks-runner-compute]

🔍 How to fix it

 ⚠ Incorrect runner in Github Workflow

Message: Github workflow must run on a self-hosted runner

Workflow file
Job name
Actual runs-on value
Expected runs-on value

perf-test.yml
docker
ubuntu-latest
Any of [eks-runner, eks-runner-php, eks-runner-nano, eks-runner-debug, eks-runner-compute]

🔍 How to fix it

Commit e4c1e21  Job 99963


No strict_raw_type error reported in casts

I would expect that when strict-raw-types is enabled, the following cast leads to an analysis error:
final foo = null as List;

The type argument for List is omitted, so it is inferred to be dynamic, but without reporting a strict_raw_type error.

This is intentional. The rule does not protect against raw types in as or is checks, as it was deemed too onerous to comply with and too noisy. I'm not sure we have a linter rule which would enforce explicit type arguments in those positions, but it's something we could do. If you'd like such a rule, please file a request at https://github.com/dart-lang/linter/issues.

Shouldn't this warning be enough?

That might be a red herring. I think a more complete example would be:
void m(dynamic d) {
  d as List;
}


Resurrect async to break.

Pretty simple, actually.

Use async to break, but do not use async() or similar to retry. (Although you could always have async.repeat() as you do in Hotspot.)

Or, you could have async.done and async.repeat, which is a little more explicit and would work with zero and Infinity respectively.

Do not need an index. You jump to start or end.

We're adding an if to see if there is a cadence specified, if so, let's do something, otherwise do nothing.

async can be an alias for async.break, but we can be adamant about async.continue.


Bump GMT dev version to 6.1.1.dev1+e13923f

It is very likely that the current package version for this feedstock is out of date.
This PR will update the following package:
- gmt=6.1.1.dev1+e13923f
Notes for merging this PR:

Feel free to push to the bot's branch to update this PR if needed.
Checklist before merging this PR:

[ ] Dependencies have been updated if changed
[ ] Tests have passed

Hi! This is the friendly automated conda-forge-linting service.
I just wanted to let you know that I linted all conda-recipes in your PR (recipe) and found it was in an excellent condition.

Getting close! This is an auto-generated PR from #100, please do not merge for now.

Superseded by #104


[triton] Build error

install-x64-windows-dbg-out.log
Host Environment

OS: win11 x64
Compiler: revision

To Reproduce
Steps to reproduce the behavior:
./vcpkg install triton triton:x64-windows
Failure logs
Installing 4/6 triton:x64-windows...
Building triton[core]:x64-windows...
-- Downloading https://github.com/JonathanSalwan/Triton/archive/243026c9c1e07a5ca834c4aaf628d1079f6a85ea.tar.gz -> JonathanSalwan-Triton-243026c9c1e07a5ca834c4aaf628d1079f6a85ea.tar.gz...
-- Extracting source E:/GitHub/vcpkg/downloads/JonathanSalwan-Triton-243026c9c1e07a5ca834c4aaf628d1079f6a85ea.tar.gz
-- Applying patch 001-fix-dependency-z3.patch
-- Applying patch 002-fix-capstone-5.patch
-- Applying patch 003-fix-python.patch
-- Using source at E:/GitHub/vcpkg/buildtrees/triton/src/079f6a85ea-4848cd5073.clean
-- Found external ninja('1.10.2').
-- Configuring x64-windows
-- Building x64-windows-dbg
CMake Error at scripts/cmake/vcpkg_execute_build_process.cmake:129 (message):
Command failed: "C:/Program Files/CMake/bin/cmake.exe" --build . --config Debug --target install -- -v -j21
Working Directory: E:/GitHub/vcpkg/buildtrees/triton/x64-windows-dbg
See logs for more information:
E:\GitHub\vcpkg\buildtrees\triton\install-x64-windows-dbg-out.log
Call Stack (most recent call first):
installed/x64-windows/share/vcpkg-cmake/vcpkg_cmake_build.cmake:111 (vcpkg_execute_build_process)
installed/x64-windows/share/vcpkg-cmake/vcpkg_cmake_install.cmake:41 (vcpkg_cmake_build)
ports/triton/portfile.cmake:41 (vcpkg_cmake_install)
scripts/ports.cmake:147 (include)
vcpkg-tool version: 2022-07-14-fb7e3b1bb3b1ca185fffe2be36b2fbc53198360f
vcpkg-scripts version: 8ff168270 2022-07-19 (33 hours ago)

Please provide the error log: E:\GitHub\vcpkg\buildtrees\triton\install-x64-windows-dbg-out.log

@LilyWangLL done

E:\GitHub\vcpkg\buildtrees\triton\src\079f6a85ea-4848cd5073.clean\src\libtriton\includes\triton/tritonTypes.hpp(17): fatal error C1083: Cannot open include file: 'boost/multiprecision/cpp_int.hpp': No such file or directory

Can you please remove boost-uninstall boost-uninstall:x64-windows then try again?
Thanks.

I tried, but I still have this problem

You may need to clone a new vcpkg and try again.

@JackBoosY  I update to vcpkg-tool version: 2022-07-14-fb7e3b1bb3b1ca185fffe2be36b2fbc53198360f
vcpkg-scripts version: b2a22ff59 2022-07-20 (11 hours ago), it still have this problem

@JackBoosY I update to vcpkg-tool version: 2022-07-14-fb7e3b1bb3b1ca185fffe2be36b2fbc53198360f vcpkg-scripts version: b2a22ff 2022-07-20 (11 hours ago), it still have this problem

You should use command ./vcpkg upgrade.
Or you should remove boost-build boost-modular-build-helper boost-build:x64-windows boost-modular-build-helper:x64-windows.

I've tried both methods, but it's the same mistake


update example panel 3

update static html on the panel 3 example.

I found one little problem when toggle the tables. See the attached gif.
http://localhost:4567/documentacao/exemplos/painel3/contacts

@diegoeis I sent the fix.

Another thing:

Font size of inputs
Little gray line before the buttons
Compare this two images.

Another one:

@diegoeis I sent

I will approve this issue, but we need wait a response of designer to change something else.


Fix MSHV VM create stress test

VM creation is failing due to the "readonly=on" flag passed in cloud-hypervisor's disk config.
Don't use readonly disks for the VMs. Instead, create a copy of the disk image for each VM.
Signed-off-by: Anirudh Rayabharam<EMAIL_ADDRESS>

@cwize1 please have a check.

This doesn’t seem to be touching the libvirt orchestrator. Instead it is testing cloud hypervisor. So, I am not sure why I would need to review.
But regardless, LGTM


Can't copy and paste prior output

Not sure if this worked before or not, but I can't select text and hit command-c and command-v. Did this just never work?

Hmm. It works for me only Chrome OS. I'm guessing this is related to #49.

Not quite, it listens sometimes but when I paste it erases all the output. I dm'd you a video