Solution Execution Time Comparison

I suggest add a small statistic indication of the solutions' avg execute speed in the "Solutions" menu.
And when you click the "Compare with your solution" button, it will compare your solution and the other solutions execute speeds. I feel this will make room for improvement in people ideas of optimization.
┆Issue is synchronized with this Clickup  by Unito

You can fork a solution(which creates a kumite) and compare the performance of arbitrary code/solutions. Here's an example in ruby(the output isn't displaying correctly, but you can fork and run the tests yourself.)

@10XL,
you can do that yes, but maybe the suggestion is about showing the execution time, and maybe also the memory used, in every posted solution; a Performance Rating, if you will.
Clever solutions, or one-line solutions, would then have a clear Performance Rating that can be compared to other solutions.
This would add a new dimension to the Codewars platform.
Experienced users could then submit their solutions aimed at improving certain performance metrics (execution time, memory used, etc).
Which could lead to more in-depth discussions, learning, etc.

@esoNais
Yes, you hit it right on the head. Maybe performance statistics would be useful too. Like, documenting average execution time/memory used and then comparing your solution to the average for that kata would be useful as well.

Of course, then the problem is that you need to run the code a lot of times to get good results, which are often over 12 seconds.
(Statistics 101: To get a ±0.1% uncertainty, you need to run the code 10^6 times)
Also, how is runtime defined? Best case? Average case? Worse case? Mean or Median or quartiles? And how do you define an "average case"? What does a "random input" even mean for some problems?

@Voileexperiments
Is 0.1% uncertainty really necessary? I'd be perfectly comfortable with even +-10%, only because it's impractical to implement the means to reach 0.1%. I personally only want the Mean of the solution times. If anyone wants anything else they will have to consider the issues of implementing such a solution.

Just want to second this.
It's horrible to try to weigh your own solutions with other peoples solutions based only on how "beautiful" the code is.
In most cases you need to optimize either on footprint, memory usage or speed. We need those statistics on the solutions! Especially when learning a new language you can't really have a gut feeling for the performance on different ways to solve a problem.
BTW, Is there any way to check the full tests that run on the problems?

@Olangu

BTW, Is there any way to check the full tests that run on the problems?

Yes. You can click fork and view the tests, open a new translation and check the tests, or click "view test cases" on the discourse page.

i found this page because i was searching for this feature.. @Olangu is exactly correct. sometimes clever code, a perl looking one liner might perform best, but may also perform worst. using built in library tools (such as .net linq) may hurt or improve performance as well.
performance (speed) rating and memory usage rating should be auto calculated for each solution. and should be completely separate from users clicking like on "clever" or "best practice". many users may not even have a solid understanding of what "best practice" or "clever" would actually mean in real world scenarios. these 2 are relative to the audience, rather than to actual standards or veterans.
having performance (speed) rating and memory usage rating would be a much more accurate way to gauge ones owns code and see others that ranked higher. actually giving users a tool to use for improvement in both coding and understanding.
i created my own performance test on my local vs 10 other solutions. i was actually surprised on how well some did. i used a sample data set of 25 and ran each set in each iteration. i found that 500 or less usually gave same similar. 1000 to 10000 seemed to produce similar. anything over that, up to 500000 seemed to produce a third set of results. while the ones which performed great at over 1000, performed good below that - there were some that out performed by magnitudes but snailed over 1000.
so i would think a median of a similar approach would be reliable. or even just a flat number like 100000 iterations for different sample data sets.
nobody is expecting physics equations for performance accuracy. just some kind of benchmark for assessing a fair performance ranking.

In 2016, this was Codewars's ( @jhoffner ) response to a similar request: https://github.com/Codewars/codewars.com/issues/651#issuecomment-257320006
( TL:DR;  "The result are just too inconsistent to rely on and if its not reliable, there is no point to having it." )
I agree with @philsop and @heribertolugo that performance results don't need to be very accurate to be useful as a way of sorting unrated solutions.

performance results don't need to be very accurate to be useful as a way of sorting unrated solutions

@barakplasma the execution time is not just "inaccurate" or "inconsistent", it's completely unrepresentative of the real solution efficiency. A more or less accurate way to tell which solution is faster is by checking how far they can go without timing out which would mean manually editing the test cases to run the function thousands of times, or to generate huge inputs (whichever approach makes sense for that particular case). Remaining fair when the all the inputs for different solutions are different (due to randomness) is impossible, moreover sometimes the runtime will be jumping like crazy between runs because a solution can be optimized to efficiently handle one sort of data, but lose by a big margin for a different sort of data.
Everybody wants to have "execution time measurement" but nobody knows what a monumental feat it is to implement it in a remotely sensible way.

Hi,
I can't claim to know the inner workings of the current architecture of CodeWars, however I just want to point out that the described behavior is what LeetCode manages to do pretty well.
In LeetCode as well problems and tests are user-provided, just like in CodeWars.
Below is a screenshot of what it looks like once you've submitted the solution.
Notice the "You are here!", and you can also click on any of the bar in the chart to see a sample solution that received that score.

I can't claim to know the inner workings of the current architecture of CodeWars

Challenges on Codewars are based on unit tests unlike most of the similar platforms taking inputs from stdin. Like most of the things, both approaches have strengths and weaknesses. For example, our approach is more natural, but their approach have more control over how the solution is executed.

In LeetCode as well problems and tests are user-provided, just like in CodeWars.

I don't think so. As far as I know, their inputs are static (please correct me if I'm wrong).
Their user editable input looks like the following:
[2,7,11,15]
9

When you submit, your solution is tested against multiple inputs in the same format (They probably have some code that parses the stdin and passes to the user's solution to check the output.)
So on LeetCode, and most of the other similar platforms, testing the solution works like the following:

Get inputs from stdin (same inputs for everyone)
Parse inputs
Test the solution for each input

On Codewars, the following happens:

Run unit test

Inputs can be different for each submission due to random tests
The execution time shown on Codewars includes any code (test framework, random input generation, reference solution, etc.)

Even though LeetCode have significantly tighter control on how solution is executed, you'll see different execution time when you submit the same solution multiple times. And it can be different enough that it sometimes tells you that your solution is faster than 99% and sometimes 65% with the same solution.
On LeetCode, this is not a huge deal because it's not too obvious since you can't directly compare with other users (they have a "sample"). But imagine how you'd feel if you saw that someone else at 99% while you're at 65% with the same approach. Also, I don't know how they deal with changes in their environment that affect performance (e.g., language version, VM performance, changes in inputs, etc.), but all of the past submissions needs to be reevaluated when that happens.
The only way to minimize the divergence is to do proper benchmarking and this can be extremely expensive. I don't think LeetCode does it and I don't think any other platform does it for their free services.
Showing the total test time of the solution at the time of the submission is not difficult, but it's not really useful number and it can be extremely misleading.
So we'll need at least the following:

Way more servers
Separate setup for benchmarking including the same inputs for every submission

If we ever do something to compare performance, I'd probably try something that estimates the time complexity and classify solutions based on that instead of the actual time. This should be relative to the current environment so we don't need to redo whenever we make changes. I don't know exactly how to do it yet (maybe comparing the performance against fixed inputs of varying sizes will get us far enough).
Codility seems to take this approach in their reports for example:

One thing I don't understand in this frequently recurring topic is why lots of people involved have clear obsession over performance (especially runtime) while displaying a uniform, indiscriminating disgust of "one-liner, ''''''''clever'''''''' solutions".
Ranking everything blindly is easy. Making it meaningful and informative is really, really hard. So far I only see all these people making suggestions of how to do it (as if it's implying "look, making a chart is easy, WHY AREN'T YOU LAZY BUMS DOING IT?"), but not why to do it, or whether it should be done:

Running code on a platform is not like your typical video game speedrunning where if you make the same inputs, it'll always end up on the same frame. All modern CPU has scheduling. The only chance you're going to get that is with a MCU like Arduino, but good luck with that, it's literally a potato
Random tests essentially mean the runtime will be different every run, so the statistics argument still applies. 0.1% is barely enough when you're talking about the top end where many solutions are piled up together very closely. And this brings to the next point:
Benchmark requires clearly defined, objective test cases (or "categories" in speedruns). How are you defining test cases for every kata? The nature of the test cases will decide what is the fastest. A single "time" does not mean anything if you don't bring up the test cases used in measuring. And who's deciding the test cases? What counts as "sufficient test cases"? What should be tested? What about edge cases? So many questions, and none addressed by these people!
And even in the end, I struggle to see how ranking tons of very, very close solutions together brings upon any meaning. Nobody gives a damn to micro-optimization compared to obvious complexity pitfalls and failures. If you don't like one-line ''''''''clever'''''''' solutions because they have poor time complexity, a runtime ranking chart isn't what you want. You should request something actually useful for this purpose, like "detected time complexity".

So until the stances of the above-mentioned people are resolved, I propose we ignore whatever they says for the sole reason that they have clear bias and are not aimed at making things helpful compared to something like a "detected time complexity" feature. Honestly it's just a nuisance at this point.

Just to add some background information:
When a user pays for Codewars Red, the user receives a head-to-head comparison feature.
Part of the head-to-head comparison is a runtime speed comparison.
The following image is a screenshot from my view of a head-to-head comparison, since I pay for Codewars Red. Look below the solution where it compares runtime for this kata.

So this information is already collected, just not visible.

I was not aware of the randomness of the tests, that certainly makes it more complex.
@Voileexperiments Regarding the "why", I'll explain my experience. I used LeetCode, and other such websites, to train for technical interviews. And there, performance is VERY VERY important, in most algorithms questions at least.
Now you are right that I don't really care about the exact number of milliseconds, or if I'm faster than some other guy, but time complexity yes! I just assumed measuring time is easier than detecting the time complexity. Maybe this assumption was wrong. I'd be really happy if I could get complexity feedbacks compared to other solutions, even better than exact timing.
I don't think ignoring is the right approach, understanding the users' persona and requirements is the goal, ask your Product Management ;)

@nasht00 Yes, I know all of this comes from leetcode, and no, it's not commonplace at all, nor is it representative to its actual usage. If you ask people in typical OJ platforms, or some OI/ACM participants, they'll tell you its main usage is to compare very large time differences (e.g 8 seconds vs sub-second), not the tiny ones due to micro-optimizations.

I don't think ignoring is the right approach

Not when the same dead horse has been beaten 1000 times in the past with all kinds of loaded requests of "please do this so one liner, ''''''''clever'''''''' solution would stop appearing among the solutions". It's extremely obnoxious and unhelpful.

I can see another potential problem with this feature:
User1 submits their solution, and gets execution time measured as 100 ms. User2 submits their identical solution and execution time gets measured as 150 ms. They wonder what's going on, resubmit, and now they get 200 ms. Now I can see legions of noo newbies running around totally butthurt and complaining "booo hoooo LeetH4xX0r's solution is ranked at position 53 and mine is 376 and they are identical, whyyy!!1!!!1" I would not like this feature.
What I would like, tho, is to somehow enforce particular performance constraint on kata, even the easy ones. Make "Sum of numbers 1...n" fail with non-O(1), or "Sum of multiplies of 3 or 5" fail with O(n). However the problem is that this makes (would make) a lot of people complain about easy kata being too difficult (see "Is a number prime?") or it would require creating another version of kata, and effectively creating almost-a-duplicate. Tiered kata would be a nice solution to this problem, I think.

So this information is already collected, just not visible to everyone.

Yes, it's recorded at the time of the submission, but like I wrote above, it's not useful number. I wouldn't have included it in head to head compare either, but I wasn't involved back then.

And there, performance is VERY VERY important, in most algorithms questions at least.

There are some kata that have performance requirements. Not all of the kata needs it.

Now you are right that I don't really care about the exact number of milliseconds, or if I'm faster than some other guy, but time complexity yes! I just assumed measuring time is easier than detecting the time complexity. Maybe this assumption was wrong.

It is very easy to show some number (I bet many won't notice even if I just did randint(100,900)). It is difficult and resource intensive to show meaningful number. Detecting time complexity is not as easy, but it'll be useful and more stable metric.

However the problem is that this makes (would make) a lot of people complain about easy kata being too difficult (see "Is a number prime?") or it would require creating another version of kata, and effectively creating almost-a-duplicate. Tiered kata would be a nice solution to this problem, I think.

Yeah, tiered/sequential kata can be nice to have. At Qualified, we have something like that. A candidate is required to solve a challenge and the subsequent challenge adds more requirements using the previous solution as a starting point.
Another issue with having easy and hard version is spoilers. Sequential kata will prevent this too, by requiring one to solve the easy one first to proceed and not allowing to see the solutions until all of the kata in the sequence is completed.

Fair enough about exact timing.
Is there a separate issue tracking the idea of time complexity? I'd upvote that one instead.

Detecting time complexity is not as easy, but it'll be useful and more stable metric.

That would indeed be useful, I'm terrible at detecting that :)
But that's a different issue, right?
If you do implement this, however,  you can't do it for all the languages, tho, right? Just maybe JS and Python?

I only want to categorize the solutions, to know if my solution meets the expectations or if I'm very far off.

If you passed the tests in time, then your solution met the expectation. Try more difficult kata that requires performance.

But that's a different issue, right?

I'm just saying that's probably what I'd do if we're going to do something to classify solutions by performance.
We can either close this one and open a new issue for it or change this issue to a more generic request.

If you do implement this, however, you can't do it for all the languages, tho, right? Just maybe JS and Python?

Why do you think it's only JS/Python?
Anyways, it's not on our roadmap at the moment and it's not going to happen anytime soon.

It depends on what you use for detecting time complexity, if you find some library, do you really think it's going to support 40 languages?

No? I don't know why we need a single library that supports 40 languages. That's like saying we can't test different languages because they all have different test frameworks. We don't need to add it to every language for every kata at once.
Like I wrote above, I don't know exactly how to do it yet. But each language can have it's own ways as long as it can collect information and report back. It might be similar to how we handle the tests, but we get some data back instead of the test result. Again, I don't know about the details yet, but I don't think we need one library that supports many languages.

I think finding and classifying on the big O for an answer would be a better persuit than actual execution times because of the variability.  This could involve scaling the inputs at different points and doing a best-fit curve.  It doesn't necessarily need to rank off that (but could), but showing the big O under the answer would be informative.

I'd also like to see this feature! It is interesting how in leetcode sometimes you can exceed the time limit if your algorithm is not perfomant enough. I also agree that the way to go is to classify answers by big O and not time of execution. Would be great!

It is interesting how in leetcode sometimes you can exceed the time limit if your algorithm is not perfomant enough.

The time limit in CW is the very same thing...

It is interesting how in leetcode sometimes you can exceed the time limit if your algorithm is not perfomant enough.

The time limit in CW is the very same thing...

Oh, sorry, I didn't know it also existed, didn't come across that yet

Maybe this is a good use case for a chatGPT API or other LLM implementation. I tried it using the API playground with gpt4-1106-preview:
I asked:

Can you give the big O for the given solutions of a cpp programming problem? This is the problem:
"The goal of this exercise is to convert a string to a new string where each character in the new string is "(" if that character appears only once in the original string, or ")" if that character appears more than once in the original string. Ignore capitalization when determining if a character is a duplicate.

Examples
"din"      =>  "((("
"recede"   =>  "()()()"
"Success"  =>  ")())())"
"(( @"     =>  "))(("
Notes
Assertion messages may be unclear about what they display in some languages. If you read "...It Should encode XXX", the "XXX" is the expected result, not the input!"

This is solution 1:
#include <string>
using namespace std;

string duplicate_encoder(const string& word){
  unordered_map <char, int> char_map;
  string result;
  char state;
  for (size_t i=0; i<word.size(); i++) {
    char letter = tolower(word[i]);
    if (char_map.find(letter) != char_map.end()){
      int first_app_index = char_map[letter];
      // Check if it is second appearance (only one before)
      if (first_app_index != -1){
        result[first_app_index] = ')';
        char_map[letter] = -1;
      }
      // Repeated
      state = ')';
    } else {
      // Single
      state = '(';
    }
    char_map[letter] = i;
    result += state;
  }
  return result;
}

This is solution 2:
#include <string>
#include <cctype>

std::string duplicate_encoder(const std::string& word){

    std::map<char, int> table;
    for(auto x : word) table[std::tolower(x)]++;

    std::string result;
    for(auto x: word) result += (table[std::tolower(x)]==1)? "(":")";

    return result;
}

This is solution 3:
#include <string>
#include <algorithm>

std::string duplicate_encoder(const std::string& word){
    std::string encodedWord, comparisonWord;
    std::transform(begin(word), end(word), back_inserter(comparisonWord), ::tolower);

    std::transform(begin(comparisonWord), end(comparisonWord), back_inserter(encodedWord),
            [comparisonWord](char a) {
                int numDuplicates = count_if(begin(comparisonWord), end(comparisonWord), [a](auto elem) {return elem == a;});
                if (numDuplicates > 1) return ')';
                else return '(';
    });
    return encodedWord;
}

This is solution 4:
#include <string>
#include <cctype>
#include <limits>
#include <array>
#include <numeric>

std::string duplicate_encoder(const std::string& word) {
  std::array<int, std::numeric_limits<char>::max() + 1> charCounters{0};
  for(const auto& c : word) charCounters[std::tolower(c)]++;

  return std::accumulate(word.begin(), word.end(), std::string(),
    [&charCounters] (const auto& sum, auto c)
      { return std::move(sum) + (charCounters[std::tolower(c)] > 1 ? ')' : '('); });
}

Also explain any other performance traits that you might find in the different solutions.

The answer was:

Let's analyze the time complexity for the provided C++ solutions.
Solution 1
string duplicate_encoder(const string& word){
  unordered_map <char, int> char_map;
  string result;
  char state;
  for (size_t i=0; i<word.size(); i++) {
    char letter = tolower(word[i]);
    // ... Rest of the code
  }
  return result;
}

Big O Analysis:

Time Complexity: O(n), where n is the length of the input word string. The algorithm loops once through all characters, and each individual operation inside the loop (character lookup, insertion, and transformation) has an average time complexity of O(1) using std::unordered_map.
Space Complexity: O(k), where k is the size of the character set involved in the input string. It is common to limit k to a constant for character encoding (such as ASCII or extended ASCII).

Performance Traits:

The unordered_map uses hashing, which provides average constant time complexity for insertion and lookup.
The solution maintains the indices of characters in the map and uses them to update the result string accordingly.

Solution 2
std::string duplicate_encoder(const std::string& word){
    std::map<char, int> table;
    // ... Rest of the code
}

Big O Analysis:

Time Complexity: O(n log n), where n is the length of the input word string. The std::map is typically implemented as a red-black tree, which has O(log n) complexity for insertions and lookups. The algorithm has two loops over the word, each taking O(n log n) time.
Space Complexity: O(k), where k is again the size of the character set involved in the input string, though typically not larger than n.

Performance Traits:

The std::map is ordered, which results in higher complexity for insertion and lookup compared to std::unordered_map.
The solution uses two passes: one to count occurrences, and another to assemble the resulting string.

Solution 3
std::string duplicate_encoder(const std::string& word){
    // ... Rest of the code
}

Big O Analysis:

Time Complexity: O(n^2), as std::transform is called twice with O(n) complexity, and inside the second transform's lambda function, std::count_if is called which also has O(n) complexity and it's invoked for each of the n characters.
Space Complexity: O(n), as it stores an additional lowercased copy of the string (assuming worst case where all characters are unique).

Performance Traits:

Not efficient because of the nested loop effect (std::count_if inside the std::transform), resulting in quadratic time complexity.
Constructs a lowercased copy of the word which occupies additional space.

Solution 4
std::string duplicate_encoder(const std::string& word) {
  // ... Rest of the code
}

Big O Analysis:

Time Complexity: O(n), where n is the length of the input word string. The array charCounters allows O(1) time access to character counts. The std::accumulate function processes every character exactly once.
Space Complexity: O(1), as the size of std::array is constant and based on the character range, not affected by the size of the input.

Performance Traits:

Uses an array to store counts which is very efficient in terms of access time and memory locality.
The std::accumulate function is used creatively to build the output string in a functional style.

From the analysis, solutions 1 and 4 are the most efficient in terms of time complexity with Solution 4 likely being efficient in terms of both time (due to the constant size of the array and therefore better cache locality) and space complexity. Solution 2, while more inefficient, will work fine for short strings. Solution 3 has the highest time complexity and should be avoided for large strings.

How many languages on codewars do we have? 43? If we can make these as a separate service, and someone test all problems with all working solutions to produce the real big o notation regarding space & time used to execute, then that's a plan, I don't how bad is it on the current arch, but doing this as a separate service is doable? What do you think?

OK after reading the entire thread, and going through every nitty gritty, I will share why I need this feature, for sometime in the thread I thought this is a sales strategy to subscribe to codewars red, yet the main problem remains!!
Head to head comparison doesn't give me accurate info where my solution is stands with others.
And replying to @Voileexperiments , I've been involved with projects where not considering space & time complexity, or the big O notations would cost Megawatt/h losses!! I'm not here to compare any scream, hey I'm better than someone else!!
No, every problem is unique, heck I knew about two pointers approach or the sliding window is better than brute force because of leetcode one day!
There are other things some people, including me personally want to learn and understand, it doesn't work that way, and people will whine weather you like it or not, this is human nature!!!
As for microseconds differences, I guess hitting re-run will explain to a newbie that resources might be busy?!
Even these differences can be narrowed down using guaranteed resources, and in FIFO execution mode!
As for random test cases we can take the average, even if the input is very very big! we can classify them.
Heck we can even re-write the entire kata's, more people are willing to contribute to this, including me.
I think shutting down discussion on this is not the brightest decision.
And thank you @NathanHazout for this great comment

Can we add a new tab in the kata setup if enabled, then we can calculate the space time complexity of the code, and output to some variants in the user dashboard? So we can work through our bank of kata's one by one?

When considering benchmarking in unit tests, there are several important factors to consider:
Benchmarking Targets

User Code vs. Test Code

Benchmarking user code typically requires sophisticated profiler software, as it involves measuring the performance of the actual application code. On the other hand, benchmarking test code (such as "it" blocks) is more straightforward but may not always accurately represent real-world performance.

Test Code Complexity

It's crucial to recognize that unit tests often include test code generation and may group multiple calls to user code within a single test. This complexity can skew benchmark results and make them less representative of actual performance.
Time Complexity Prediction
Predicting time complexity is challenging, especially for complex code structures:

Recursive functions with nested iterations can have constant time complexity, defying simple analysis.
Sophisticated analysis tools and algorithms are needed to accurately predict time complexity for non-trivial code.

Challenges and Considerations

High Cost and Context Dependency

Benchmarking often comes with significant overhead and requires careful consideration of the context in which the code operates.

Measurement and Interpretation Pitfalls

There are numerous ways to incorrectly measure and interpret benchmark results. For example:

Failing to account for warm-up times or garbage collection cycles
Not considering the impact of system load or hardware variations
Misinterpreting statistical outliers

Limited Value Proposition

Given the complexities and potential for misinterpretation, the feature may not provide sufficient value to justify its implementation and maintenance costs.
Alternative Approaches
Instead of implementing complex benchmarking within unit tests, consider:
Code Review for Performance: Emphasize code review practices that consider algorithmic efficiency and potential performance impacts. This could be both community- and/or AI-driven.
In conclusion, while benchmarking can provide valuable insights, its implementation within unit tests presents significant challenges. The complexity of accurate measurement and interpretation, combined with the potential for misleading results, suggests that alternative approaches to performance optimization may be more effective and efficient.


release-2.1: cherry-pick fixes of help messages of tikv-ctl

Signed-off-by: MyonKeminta<EMAIL_ADDRESS>
What have you changed? (mandatory)
This PR cherry-picks #3840 to release-2.1 branch
Later, another PR that will be submitted by @hicqu will also be picked in this PR.
What are the type of the changes? (mandatory)

Improvement (non-breaking change which is an improvement to an existing feature)

How has this PR been tested? (mandatory)

By manual tests

Does this PR affect documentation (docs/docs-cn) update? (mandatory)
No
Does this PR affect tidb-ansible update? (mandatory)
No

@hicqu PTAL thanks!

LGTM.


GradientStopCollection does not work when used in Style

hi
I love this control and I am now upgrading from 1.4.2 , big jump. We use Styles quite a lot and noticed that when referencing a style the gradient stop does not seem to apply.
Any Suggestions?
Below works
<yummy:PancakeView  Margin="0,32,0,0" BackgroundGradientStartPoint="0,0" BackgroundGradientEndPoint="0,1" HorizontalOptions="FillAndExpand" HeightRequest="150" CornerRadius="10" >
            <yummy:PancakeView.BackgroundGradientStops>
                <yummy:GradientStopCollection>
                    <yummy:GradientStop Color="{StaticResource ColorStart}" Offset="0" />
                    <yummy:GradientStop  Color="{StaticResource ColorEnd}" Offset="1" />
                </yummy:GradientStopCollection>
            </yummy:PancakeView.BackgroundGradientStops>
            <Label Text="There are no mistakes, only happy accidents." TextColor="White" HorizontalTextAlignment="Center" VerticalOptions="Center" HorizontalOptions="Center" />
        </yummy:PancakeView>`

This does not works
  <ContentPage.Resources>
   <Color x:Key="ColorStart">Blue</Color>
    <Color x:Key="ColorEnd">White</Color>
    <Color x:Key="ColorRed">Red</Color>

    <Style x:Key="TestStylePancake" TargetType="yummy:PancakeView"  >
         <Setter Property="Margin" Value="0,32,0,0"></Setter>
        <Setter Property="HorizontalOptions" Value="FillAndExpand"></Setter>
        <Setter Property="HeightRequest" Value="150"></Setter>
        <Setter Property="CornerRadius" Value="10"></Setter>
        <Setter Property="BackgroundGradientStartPoint" Value="0,0"></Setter>
        <Setter Property="BackgroundGradientEndPoint" Value="0,1"></Setter>
        <Setter Property="BackgroundGradientStops">
            <GradientStopCollection>
                <GradientStop Color="{StaticResource ColorStart}" Offset="0"></GradientStop>
                <GradientStop Color="{StaticResource ColorEnd}" Offset="1"></GradientStop>
            </GradientStopCollection>
        </Setter>
        <Setter Property="Border">
            <yummy:BorderMarkup Color="{StaticResource ColorRed}" Thickness="2"/>
        </Setter>
    </Style>
</ContentPage.Resources>

<yummy:PancakeView Style="{StaticResource TestStylePancake}" >
            <Label Text="There are no mistakes, only happy accidents." TextColor="White" HorizontalTextAlignment="Center" VerticalOptions="Center" HorizontalOptions="Center" />
        </yummy:PancakeView>

I faced this issue. I solved it with MVVM binding. So what you can do is to define colors in your MVVM and then bind it in the color properties.

I faced this issue. I solved it with MVVM binding. So what you can do is to define colors in your MVVM and then bind it in the color properties.

Hi thanks for you reply we prefer not have any colours in Mvvm but we have a.resource. Dictionary X page where we put all style ,this is bcse we have a white label app. Each client can have a different look and feel.ideally it should be fixed otherwise we do in xaml refencing the colours as static resources

Hi thanks for you reply we prefer not have any colours in Mvvm but we have a.resource. Dictionary X page where we put all style ,this is bcse we have a white label app. Each client can have a different look and feel.ideally it should be fixed otherwise we do in xaml refencing the colours as static resources

Try this:
<Setter Property="BackgroundGradientStops">     <Setter.Value>         <pancakeView:GradientStopCollection>             ...         </pancakeView:GradientStopCollection>     </Setter.Value> </Setter>


Get rid of warning for Mapping processes

WARN: Duplicate output channel name: 'tiny' in the script context -- it's worth to rename it to avoid possible conflicts
tiny is the patientId
The warning message is not very helpful, so I don't know where this problem came from, so still looking...

Not in the Mapping process.
I added tags for every process.
And it's clearly a channel problem.
Trying to clean the code and to specify more things when we create Channels to get rid of it.
Not there yet...

Talked with Paolo about it

I've realised that message is confusing
I will improve [it], thanks for reporting it

New message with the new Nextflow version:
WARN: Output channel idPatient overrides another variable with the same name declared in the script context -- Rename it to avoid possible conflicts

will be fixed by next PR


Failed building wheel for qiskit

I am trying to install qiskit through pip on IBM DSX (Data science experience). Running Python 3.5 with Spark 2.1 Notebook.
Following the steps on the QISKit main page ( https://www.qiskit.org/ ) and here in this paper - https://nbviewer.jupyter.org/github/QISKit/qiskit-tutorial/blob/stable/1_introduction/running_on_IBM_DSX.ipynb
I always get to the point where I need to install qiskit:
pip install qiskit
Every time I try the installation fails with the following error:
running install_egg_info
Copying qiskit.egg-info to build/bdist.linux-x86_64/wheel/qiskit-QISKIT_VERSION.data/purelib/qiskit-QISKIT_VERSION-py3.5.egg-info
error: [Errno 2] No such file or directory: 'qiskit.egg-info'

Failed building wheel for qiskit
Running setup.py clean for qiskit
Also tried to clone the repo and rename the install.py.in file to install.py and run pip install ./qiskit-sdk-py/install.py but the error comes up.

Hello @pep3e ,
there were some changes in the build system for the latest 0.4.9 release that might the cause - however, I'm having some trouble reproducing the issue. Could you paste the output of these commands in your environment, to try to narrow down the issue?
cmake --version
pip --version
uname -a

Also, could you confirm if the following line you pasted has been copied verbatim (ie has not been modified by you when writing the issue)?
Copying qiskit.egg-info to build/bdist.linux-x86_64/wheel/qiskit-_QISKIT_VERSION_.data/purelib/qiskit-_QISKIT_VERSION_-py3.5.egg-info

The reason for asking is due to the last line of your comment - the file setup.py.in is not meant to be copied and renamed manually, and that copy and rename might be causing that particular error. Could you try running in a new folder:

Hello Diego,
The problem was that I didn't have cmake:
pip install cmake
fixed my issue. Thank you for the help

Glad to hear, @pep3e ! For the record (and for reference if the same problem is encountered by other users), on the upcoming QISKit releases, cmake will not be required for installing via pip - it was a temporary byproduct of the latest changes.

Hi @diego-plan9, I'm currently reworking the DSX install instructions and am having this problem as well. This is the error I get when I try pip install qiskit, even when cmake is available:

running install_egg_info
Copying qiskit.egg-info to /gpfs/fs01/user/s048-114a05d8c2ea2f-aeaae8f7ca3a/.local/lib/python3.5/site-packages/qiskit-0.4.9-py3.5.egg-info
error: [Errno 2] No such file or directory: 'qiskit.egg-info'`

Do I need to specify a particular version of QISKit?

Hi @attp let me jump in with @diego-plan9 permission.
I have just uploaded a prebuilt binary package compatible with DSX. Try to install again:
$ pip install --no-cache-dir qiskit

... and let me know if somehing is wrong.

Thanks @atilag - it works now. :)

pip install cmake ,is works fine!!! and then pip install qiskit


Fix AutoEncoder

Looks like AutoEncoder got out-of-synch with other changes.
AutoEncoder init() assumed both encoder and decode have same number
of parameters and regularizers; this is not the case when using default
Dense encoder/decoder in current revision of Keras for instance.

Existing code does not assume anything of the sort. If you look closely your proposed change does the same as the existing code, only it does not check for parameter redundancy.

Sorry, maybe I didn't explain very well..
For a Dense Layer with default parameters (all regularizers set to None), regularizers will be [], then the zip(params, regularizers) will be empty.
This causes the params list of the AutoEncoder to be empty and no parameters are updated during training.


Order enum values by DisplayAttribute.Order

Fixes #4297

:up::b::eight:

@tuespetre finally got the CI builds working! 😺
Thanks very much.

:+1: a pleasure


remove fn_kwargs from Filter and Mapper datapipes

Addresses https://github.com/pytorch/vision/pull/5112#issuecomment-997286379. After pytorch/pytorch#69560, Filter and Mapper no longer accept fn_kwargs. functools.partial is now the way to go.
cc @pmeier @bjuncek

CI failures seem related


Too many levels of symbolic links error on starting container

I have been successfully running docker on my Chromebook for a few months.
However since a recent update of Chrome OS I am unable to start containers, due to an ELOOP error when docker tries bind-mounting /proc/self/ns/net.
A Chrome OS update pushes a new kernel, and new root fs. However I am still using the same custom kernel and modules as before the update, leading me to think the problem is due to a change of the root filesystem - but I can't understand what could be impacting docker in such a way. If something else has changed in my environment, I cannot imagine what it could be.
Of course this is not exactly a standard setup, but I would appreciate any pointers.
docker version
I use the docker binary provided by the latest archlinux package.
Client:
 Version:      1.8.1
 API version:  1.20
 Go version:   go1.4.2
 Git commit:   d12ea79
 Built:        Sat Aug 15 17:29:10 UTC 2015
 OS/Arch:      linux/amd64

Server:
 Version:      1.8.1
 API version:  1.20
 Go version:   go1.4.2
 Git commit:   d12ea79
 Built:        Sat Aug 15 17:29:10 UTC 2015
 OS/Arch:      linux/amd64

docker info
Containers: 0
Images: 3
Storage Driver: devicemapper
 Pool Name: docker-254:1-8179-pool
 Pool Blocksize: 65.54 kB
 Backing Filesystem: extfs
 Data file: /dev/loop1
 Metadata file: /dev/loop2
 Data Space Used: 1.825 GB
 Data Space Total: 107.4 GB
 Data Space Available: 15.31 GB
 Metadata Space Used: 1.556 MB
 Metadata Space Total: 2.147 GB
 Metadata Space Available: 2.146 GB
 Udev Sync Supported: true
 Deferred Removal Enabled: false
 Data loop file: /var/lib/docker/devicemapper/devicemapper/data
 Metadata loop file: /var/lib/docker/devicemapper/devicemapper/metadata
 Library Version: 1.02.102 (2015-07-07)
Execution Driver: native-0.2
Logging Driver: json-file
Kernel Version: 3.14.0
Operating System: <unknown>
CPUs: 4
Total Memory: 15.59 GiB
Name: localhost
ID: E7D7:5RGA:JU6A:GWNZ:ACYA:VNQF:DOM6:AF4X:KGRY:RXRG:T2BT:OPGY
Debug mode (server): true
File Descriptors: 11
Goroutines: 19
System Time: 2015-08-18T23:00:37.68208035+01:00
EventsListeners: 0
Init SHA1: 3d05b45242f07d58ebcc51dc1a354a024048d0c7
Init Path: /usr/local/tmp/docker/dockerinit
Docker Root Dir: /var/lib/docker
Username: columnated
Registry: https://index.docker.io/v1/
WARNING: No memory limit support
WARNING: No swap limit support

uname -a
Linux arch 3.14.0 #1 SMP Tue Aug 18 22:43:56 BST 2015 x86_64 GNU/Linux
Environment details (AWS, VirtualBox, physical, etc.):
I run docker on a Chromebook Pixel LS, with a custom kernel.
The output of ./contrib/check-config.sh is: https://gist.github.com/perpen/6fe3de129df0716ab44e#file-output-of-check-config-sh
The full kernel config: https://gist.github.com/perpen/6fe3de129df0716ab44e#file-kernel-config
How reproducible:
Always
Steps to Reproduce:
$ /usr/local/tmp/docker-plain/docker -H unix:///tmp/docker.sock run -it --rm busybox
WARNING: Your kernel does not support memory swappiness capabilities, memory swappiness discarded.
Error response from daemon: Cannot start container<PHONE_NUMBER>7d0ce9b21b5820bd6f3c1c14fdf5334965e63a2254bf3e17ad59df: failed sandbox add: failed to create new sandbox: namespace creation reexec command failed: exit status 1

Additional info
The docker log output shows this:
level=fatal msg="too many levels of symbolic links"
Full docker log: https://gist.github.com/perpen/6fe3de129df0716ab44e#file-docker-log-output
Running strace against docker shows this error:
[pid  5518] mount("/proc/self/ns/net", "/var/run/docker/netns/3d21a7dd2745", 0xc20809b8e0, MS_BIND, NULL) = -1 ELOOP (Too many levels of symbolic links)
Running manually the command corresponding to the syscall above, ie mount --bind /proc/self/ns/net /var/run/docker/netns/3d21a7dd2745 does not result in an error.
The same error occurred with my previous version of docker, 1.7.

Do you still have this problem now, or find a way to solve this?
I am using latest chromiumos, with kernel 3.18 and docker 1.7.1, same error.

@apporc still the same. I switched to beta channel to see if it would make a difference, it didn't.
Did you have docker running with a previous version of Chromium OS?

@perpen no, in fact i am porting docker to chromium os on my local branch. the code is from current master branch of upstream. After all i have done, the dev image built for amd64 with docker builtin, can autostart. "docker info/version" all ok, but when i was trying to start a container, the error happened. Do you know from which version on, the error begin to show?

@apporc it must have happened with stable release 44.0.2403.155 (Platform version: 7077.123.0), released August 11th.
I don't know how you relate these versions to Chromium OS tags, but would you be able to apply your changes to the previous stable release, 44.0.2403.125 (Platform version: 7077.111.0) and see if it works?

I managed to find the problem: the Chrome OS kernel uses a custom lsm (linux security model, was new to me) which implements a check which refuses to mount a symlink, and returns -ELOOP if this is attempted.
Hence the failure when mounting /proc/self/ns/net into /var/run/docker/netns/<blah>.
I disabled this check by editing chromiumos_security_sb_mount() in security/chromiumos/lsm.c and with this new kernel I got docker back.
I'll mention it to the Chromium guys, it is disappointing that a custom kernel is still necessary to run docker properly.

I tried this too. It is working now .


Fix signed-off check in tolerant mode

JerryScript-DCO-1.0-Signed-off-by: Robert Fancsik<EMAIL_ADDRESS>

LGTM (informal)


Updates to existing partials

Update: due to changes to FRESCA
education

references 'highlights' but the model doesn't have a 'highlights' property

references

shouldn't the summary come before, not after the contacts list?

samples

references 'highlights' but the model doesn't have a 'highlights' property

affiliation

references 'keywords' but the model doesn't have a 'keywords' property

governance

references url but the model doesn't have a url property
references keywords but the model doesn't have a keywords property

interests

switch highlights to keywords to match the model

Thanks, agreed. I think education has highlights in the latest schema.
Once the "add partial XYZ" updates are complete, we'll refactor again, stripping out some of the cruft and making the partials a bit more agnostic and policy-free than they are now. For example, there's no real reason the section/projects partials should impose a
 container element. You may like
, I may like
, but the partial should impose as little structure as possible. Stuff like that.

@hacksalot I'm just making of the little discrepancies as I go. Most, if not all have been addressed thus far.
I just finished implementing all of the default partials, 'modern' theme, and models for everything. As soon as it's ready I plan to extract the component out into its own project.
Honestly, I don't think using
 is an issue. According to HTML5, there's no issue with a page containing multiple sections.
In Angular2, components are basically custom html elements so my entire app is structure. Aside from removing the  and  tags, the major problem I've had so far is relative css tags that rely on a specific structure.
IMHO, the section tags should stay but a class should be added to indicate that they belong to fresh-resume. That way, css tags can target specific sections by id and all sections by class.
For example here's the testimonials template (since it's the simplest):

{{ testimonial.name }}

      {{ testimonial.quote }}

On non-descriptive relative CSS:
#main > #container > section {
  margin-left: 5em;
  position: relative;
  display: block;
}

Has the potential to cause a lot of problems, that can be difficult to reason about if the template is incorporated into a relatively complicated site. Like I said before, I have the sandbox the resume CSS using the Shadow DOM so it doesn't break the layout of my site.
The same could be replaced with:
On non-descriptive relative CSS:
section .fresh-resume {
  margin-left: 5em;
  position: relative;
  display: block;
}

section #testimonials {
  /* testimonial-specific styling here */
}

...and it becomes immediately obvious what the styling applies to.

I need to push out an interim themes release to support HMR 1.6.0 and will roll with the proposed CSS changes for the next fresh-themes version ahead of the 1.0.0. To be clear, are you additionally suggesting Shadow DOM-related changes here or just the nominal CSS refactoring?
Re:
. There's a nice semantic connection between resume sections and HTML 5
 elements, but then you run into slightly older rendering systems and parsers that don't respect
 as a proper block-level element. Or users who want

 but don't want to override the entire section template. Or conventions around view rendering and markup when factoring into an MVC or MV* framework. But
 would still be the default. We'd just add the ability to override in the tooling.

To be clear, are you additionally suggesting Shadow DOM-related changes here or just the nominal CSS refactoring?

It's up to you really. If you're aiming for release, don't worry about it.

older rendering systems and parsers that don't respect

Damn... forgot about that. Why not just reference by CSS class? Then it doesn't matter whether it's a
 or
. Or, alternatively you could experiment with setting section as a block-level element explicitly using CSS. Ala display: block.

An iterative release, not a waterfall freeze-everything release. I'd guesstimate most of the above would be in place in the next 1-2 days. The CSS is still a bit of a mess - lots of 4am coding, no Sass or LESS support yet (at least, no built-in support), my own bad programming, etc. But pretty easy to clean.

Why not just reference by CSS class?

Yeah I think that should handle most of the context breakage. I've been waiting on CSS refactoring for a) template expansion of CSS files, which now exists, and b) a Sass/LESS translation step, which will be added shortly. Since both of those will end up influencing the structure.

@hacksalot Yeah... CSS hierarchies would be a lot easier with SASS/LESS.
On an unrelated note. I converted the Jane Q. Fullstacker example to work with the FRESH format. https://github.com/evanplaice/evanplaice.com/blob/master/content/vitae/jane-q-fullstacker.json
I also have models available that cover the entire schema.
https://github.com/evanplaice/evanplaice.com/tree/master/app/resume/shared/models
I'm almost ready to extract the resume portion of my site into a separate project.

Nice clean model structure. The flavor fields have been replaced with category, possibly a few other minor changes, but otherwise this looks clean. Keep me posted!
Not sure if this is relevant to your case but Jane was the original FRESH resume:
https://github.com/fluentdesk/jane-q-fullstacker
We did a conversion to JRS to support side-by-side testing but the canonical version is FRESH.

Damn... I was working off of the master branch. I should've checked dev. The same could be accomplished with 1/100th the code but I want finer grained control to add input type checking later.
Once the ng2 module is successfully extracted and hosted as an independent project, I plan to split out the modules as a separate project. That way, it's trivial to import them for reuse on both the client-side and server-side.
Damn... I just realized that I grabbed the JRS version. Derp.
What will JRS support look like in the future? Will FRESH be the 'everything and the kitchen sink' superset to JRS?

Not a big deal. I probably should've been more clear about the amount of work happening on dev.
HackMyResume will provide full support for JRS 1.0.0 when it drops, but we'll also be supporting...

FRESH 1.0/2.0
HR XML
StackCareers
LinkedIn
Etc.

Translations between the disparate formats are a lot easier if you have a universal container format that won't lose data. That format is FRESH. Since it's a superset format, we can also put a lot of analysis and validation-related stuff into FRESH that wouldn't fly in a standard like HR XML or JRS. It's not a competing format but a complimentary one.

@hacksalot It's all good. The hard was modeling everything from scratch. Adjusting things a bit gave me an opportunity to get a second look and fill the stuff I missed on the first pass.
I like the ambition. Data conversion tools should be pretty easy to implement since most of the formats follow the same general structure.
I actually suggested to JRS that they should include validation with their schema repo but the maintainers rejected the suggestion because validation was already tied to the JRS CLI tool. I tried the CLI tool and... well, that's the reason I ended up on HMR.

I don't contribute to (or even follow) JRS anymore, beyond keeping an eye out for the 1.0.0 when it drops. We didn't get a lot of support (= any) from them when HackMyResume dropped, despite shipping with support for JRS 0.0.0 above and beyond what their own tools offered, and I suspect the reason is because HackMyResume performs local resume generation, whereas the JRS tool appears to specifically have been built to silently upload user data to a remote registry with every export. Throw in their Hired.com sponsorship (a little early in the cycle for commercial endorsement, methinks, if FOSS is the real goal), not to mention the casual silent upload of user data, plus the general (top-down) tone of discussion, and this is not a standard I'd choose to be associated with. I wish them well, and we'll support their formats as long as users call for them, but FRESH is actually a user-first system. Not a system that pays lip service to being user first.

The validation component is called RedPen, and like HackMyResume/FluentCV, is 100% configurable. It's built on a system of YAML-driven rules. A simple "Hello World" example for a game developer:
description: Resume warnings and advice for game developers.
author: FluentCV
inherit: coder
rules:
  - condition: "sheet.hasSkill('Unity') || sheet.hasSkill('Unreal') || sheet.hasSkill('CryEngine')"
    brief: This resume lacks experience with one of the Big 3 gaming engines. Consider learning Unreal, Unity, CryEngine, or another flagship game production toolset.
    moniker: know-your-engines
    overtone: warning

  - condition: "sheet.demo"
    brief: This resume doesn't mention a playable game demo of your own device. A playable demo can be an essential asset for landing a game development job.
    moniker: have-a-demo
    overtone: danger

HMR will take this, compile the ruleset, apply it, and display industry-specific LINT that users can tweak, configure, or ignore entirely. For starters. We also support JSON rulesets. And because all of this starts to become overkill for a simple resume, we expand it to the notion of all arbitary documents whatsoever.

@hacksalot I knew JRS had the option to upload a resume, I didn't realize it uploads silently by default. What a scummy thing to do.
I noticed the top-down discussion. Three users in particular that seem to have assumed control of the project despite contributing little-to-no actual code. As soon as I realized how toxic the project is I noped out and went ghost mode (ie deleted all comments/references).
As for the validation scheme. Wow! No exaggeration, that's amazing. I didn't realize tools existed that could generate linters so easily. I figured it would take something like jison + custom EBNF to validate the input data.
BTW, I decoupled the feature I've been working on to work as a standalone <ng2-resume> component and created a demo project that can be seen in action here.
As soon as angular drops the next release. It'll add relative path support for component-specific templates/css, of which the component uses a lot.

Took the liberty of grabbing a fork of that -- so this will work as a drop-in component with any FRESH model? Sweet. I had thought there was a direct dependency on fresh-themes but I see you've factored that in. We should be opening up a new round of themes shortly, a couple of which are experimental 3D themes under WebGL/Three.js that it would be fun to see in this context.

@hacksalot NG2 uses it's own html-like templating, so the fresh-themes couldn't be used directly.
I use facades to hide the messy details. Themes can be composed of default partials and/or use their own partials. The modular nature of Angular2 makes things really nice. If you want to try changing the theme look up the constants under resume/resume.js.
The data is loaded within the component that consumes the resume component so users never have to see the inner workings. All of the components and subcomponents are also fully fault tolerant. If a section has no data it won't appear. As far as structure goes, everything should match 1:1 with fresh-themes.
I don't really have much else to add for now other than extracting the models into a separate project and publishing the resume component to the JSPM registry. I just need Google drop the next damn release to fix that bug.
I'll be interested to see how the 3D themes look. Hopefully, they won't be too painful to implement.


Use of deprecated OSAtomic* functions

Hi,
We are using the library in iOS and have recently decided to bump up our deployment target to iOS 10.0. However, we started getting errors for use of deprecated functions:
../../third_party/usrsctp/usrsctplib/usrsctplib/netinet/sctp_usrreq.c:861:7: error: 'OSAtomicCompareAndSwapIntBarrier' is deprecated: first deprecated in iOS 10.0 - Use atomic_compare_exchange_strong() from <stdatomic.h> instead [-Werror,-Wdeprecated-declarations]
            (atomic_cmpset_int(&inp->sctp_flags, flags, (flags | SCTP_PCB_FLAGS_SOCKET_GONE | SCTP_PCB_FLAGS_CLOSE_IP)))) {
             ^
../../third_party/usrsctp/usrsctplib/usrsctplib/user_atomic.h:59:42: note: expanded from macro 'atomic_cmpset_int'
#define atomic_cmpset_int(dst, exp, src) OSAtomicCompareAndSwapIntBarrier(exp, src, (int *)dst)
                                         ^
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator11.0.sdk/usr/include/libkern/OSAtomicDeprecated.h:580:6: note: 'OSAtomicCompareAndSwapIntBarrier' has been explicitly marked deprecated here
bool    OSAtomicCompareAndSwapIntBarrier( int __oldValue, int __newValue, volatile int *__theValue );
        ^
../../third_party/usrsctp/usrsctplib/usrsctplib/netinet/sctp_usrreq.c:1150:6: error: 'OSAtomicAdd32Barrier' is deprecated: first deprecated in iOS 10.0 - Use atomic_fetch_add() from <stdatomic.h> instead [-Werror,-Wdeprecated-declarations]
                                        SCTP_STAT_INCR_COUNTER32(sctps_aborted);
                                        ^
../../third_party/usrsctp/usrsctplib/usrsctplib/netinet/sctp_uio.h:1130:38: note: expanded from macro 'SCTP_STAT_INCR_COUNTER32'
#define SCTP_STAT_INCR_COUNTER32(_x) SCTP_STAT_INCR(_x)
                                     ^
../../third_party/usrsctp/usrsctplib/usrsctplib/netinet/sctp_uio.h:1120:28: note: expanded from macro 'SCTP_STAT_INCR'
#define SCTP_STAT_INCR(_x) SCTP_STAT_INCR_BY(_x,1)
                           ^
../../third_party/usrsctp/usrsctplib/usrsctplib/netinet/sctp_uio.h:1126:34: note: expanded from macro 'SCTP_STAT_INCR_BY'
#define SCTP_STAT_INCR_BY(_x,_d) atomic_add_int(&SCTP_BASE_STAT(_x), _d)
                                 ^
../../third_party/usrsctp/usrsctplib/usrsctplib/user_atomic.h:56:35: note: expanded from macro 'atomic_add_int'
#define atomic_add_int(addr, val) OSAtomicAdd32Barrier(val, (int32_t *)addr)
                                  ^
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator11.0.sdk/usr/include/libkern/OSAtomicDeprecated.h:161:9: note: 'OSAtomicAdd32Barrier' has been explicitly marked deprecated here
int32_t OSAtomicAdd32Barrier( int32_t __theAmount, volatile int32_t *__theValue );
        ^
../../third_party/usrsctp/usrsctplib/usrsctplib/netinet/sctp_usrreq.c:1155:6: error: 'OSAtomicAdd32Barrier' is deprecated: first deprecated in iOS 10.0 - Use atomic_fetch_add() from <stdatomic.h> instead [-Werror,-Wdeprecated-declarations]
                                        SCTP_STAT_DECR_GAUGE32(sctps_currestab);
                                        ^
../../third_party/usrsctp/usrsctplib/usrsctplib/netinet/sctp_uio.h:1135:36: note: expanded from macro 'SCTP_STAT_DECR_GAUGE32'
#define SCTP_STAT_DECR_GAUGE32(_x) SCTP_STAT_DECR(_x)
                                   ^
../../third_party/usrsctp/usrsctplib/usrsctplib/netinet/sctp_uio.h:1121:28: note: expanded from macro 'SCTP_STAT_DECR'
#define SCTP_STAT_DECR(_x) SCTP_STAT_DECR_BY(_x,1)
                           ^
../../third_party/usrsctp/usrsctplib/usrsctplib/netinet/sctp_uio.h:1127:34: note: expanded from macro 'SCTP_STAT_DECR_BY'
#define SCTP_STAT_DECR_BY(_x,_d) atomic_subtract_int(&SCTP_BASE_STAT(_x), _d)
                                 ^
../../third_party/usrsctp/usrsctplib/usrsctplib/user_atomic.h:58:40: note: expanded from macro 'atomic_subtract_int'
#define atomic_subtract_int(addr, val) OSAtomicAdd32Barrier(-val, (int32_t *)addr)
                                       ^
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator11.0.sdk/usr/include/libkern/OSAtomicDeprecated.h:161:9: note: 'OSAtomicAdd32Barrier' has been explicitly marked deprecated here
int32_t OSAtomicAdd32Barrier( int32_t __theAmount, volatile int32_t *__theValue );
        ^

Basically OSAtomicAdd32Barrier and OSAtomicCompareAndSwapIntBarrier are deprecated on iOS 10, which are used in user_atomic.h
We are using our own build rule and we are a bit hesitate to just suppress the warning instead of fixing the bug. I wonder if you guys have a long term plan to replace them?
The suggestion from the compiler is to use atomic_fetch_add() from <stdatomic.h>, but that would require some nontrivial refactoring in the codebase. We will need to use std::atomic instead of raw pointer.

The long term plan is to use the functions you suggest on newer platforms. Right now we suppress the warnings in the build scripts provided. But it will be fixed eventually.

Cool. So for now I think we could simply suppress that warning in our build script. Do you have an estimated time of moving to stdatomic?

Not really. Fixing some bugs has definitely higher priority...

There's perhaps some additional opportunity cost here: the lack of standard atomics means that dynamic debuggers such as TSAN cannot diagnose through any code that uses usrsctp, and thus we're missing out on valuable debugging of concurrency code.
After a brief look, I wonder how hard it would be to add support for standard atomics: you'd need to update (or add to) the macros in user_atomic.h, and then make all the variables that are accessed via those macros conditionally _Atomic (e.g. create a new macro USRSCTP_ATOMIC to wrap those variable/member definitions). Most of the uses of the atomic macros seems to go through refcounting logic, so maybe this wouldn't actually be such a large change?

Please note that this code is also used also in kernel land. So the macros must abstract that too.

For what it's worth, I've prototypes this change; it only took a few minutes. If you're interested I can post a patch.

Sure. We can look at it.

Here you go:
usrsctp-atomics.patch.txt
All the _Atomics would have to be turned into macro invocations.
The atomic_init function should probably just be renamed regardless (it clashes with a C standard library function).
For compare-and-exchange, the expected operand needs to be an address, so we need to have variables for those values.

How does this work on platforms not support C11? How does this work in kernel land? How to deal with changing struct sctpstat, which is part of the API?

I would add this code as a new, conditionally-compiled mode, in addition to the one that uses GCC intrinsics, so that this feature would only be used on demand (e.g. in a project that has C11 available and only runs in userspace). Existing code can continue as is. Is that reasonable?
I think if you really pressed the issue, you could squint at it decide that _Atomic int and int are layout compatible on the platforms on which you want to interop Linux kernel and userspace code (i.e. on Linux, with GCC), and that the relevant synchronization primitives are interoperable, too. But I'd also be happy if people who talk to the kernel would not use this new mode.

I would add this code as a new, conditionally-compiled mode, in addition to the one that uses GCC intrinsics, so that this feature would only be used on demand (e.g. in a project that has C11 available and only runs in userspace). Existing code can continue as is. Is that reasonable?

That sounds reasonable. You can create a PR, if you want...

I think if you really pressed the issue, you could squint at it decide that _Atomic int and int are layout compatible on the platforms on which you want to interop Linux kernel and userspace code (i.e. on Linux, with GCC), and that the relevant synchronization primitives are interoperable, too. But I'd also be happy if people who talk to the kernel would not use this new mode.

The sources in netinet/ and netinet6 also live in the FreeBSD kernel (and could be compiled as a NKE for Mac OS). So not changing that code would be preferable. One could use #ifdef here.

There would already be value in this feature for people who write pure userspace code and want to sanitize it for concurrency errors.

Hi, is the constraint on netinet/ still valid? I have draft changes in https://github.com/tkoeppe/usrsctp/commit/169c9ec7c514b5e2018ae64f69ceccdab1e18f31, but if we need to #ifdef everything, it'll be a bit more work.


MOB-3: Connecting Mobile App with Backend

What's up?
With the completion of backend part of login, signup and logout, we have to connect backend to mobile app by providing api calls on user interface and solving some authorization issues on mobile app.
To Do

[x] Configure backend tools to connect Flutter app with backend.
[x] Test connection with sending requests and receiving responses.
[x] Implement the client that sends requests.
[x] Send requests corresponding to button. ex login button sends login request.

Deadline
31.10.2022 @13.00
Additional Information
No response
Reviewers
@serdarakol @MustafaEmreErengul

Connections are done but 3 changes must be done in pages.
1- Forgot password button must be discarded
2- Login must be done with username
3- Signup page must include Confirn Password part.
@mustafa-cihan assigned to those changes. Deadline is 31.10.22 @13.00

3 changes made.
1- Forgot password button is discarded
2- Login email changed to username.
3- Added confirm password

All tasks are done, pull request is waiting for merge.


Look into flaky builds

Look into this https://github.com/hendriknielaender/double-trouble/actions/runs/82624522 Had to restart it to succeed, similar to a build in a MR
Look into upgrading deprecated actions
Look into difference between local biome linting and the one in the pipeline

Seems like this is resolved with the latest bun version.


Fix bug when setting table cell bounding box values

API change check
API changes are not detected in this pull request.

Should we add a test to check that the bounding boxes are correct?
I have a test for non-null but the service approximation keeps changing so don't want to add it for specific values.


Root flag --output should be a local flag

In some case this flag doesn't apply, and is ignored. Ingoring it is confusing because it can let the user think he could change the output, whihc is false. As a result, we need to transform this root flag to a local one.

This is slightly heavier than originally thought, because the update verification done at the root level of the command line relies on this flag. Moving it to the subcommand requires a rework of the version verification workflow.
I'll keep to PR as draft for the moment, until I come up with a clean implementation.

Draft PR on vegawallet repo:

https://github.com/vegaprotocol/vegawallet/pull/534


Ionic Error $cordovaGooglePlus

Hi,
I am Using $cordovaGooglePlus plugin.
It gives me this error when I include it in the controller:
Unknown provider: $cordovaGooglePlusProvider <- $cordovaGooglePlus
Please help I have been trying to solve this problem from 2 days

merged.


Are plugin arguments robust to whitespace?

I happen to be somewhere that the ssid has whitespace. Will that work?

network
Args: wifissid=Admin TBS|....

Bummer for you. Who does that???
I don't know what the correct incantation is offhand, and tied up so can't look into it.
Suggest you try using \  for the space

I "looks" like the string is handled correctly, at least from what sdm
prints to the screen. But who knows once it get to the rest of the system.
On Tue, Jul 16, 2024 at 6:51 PM Benn @.***> wrote:

Bummer for you. Who does that???
I don't know what the correct incantation is offhand, and tied up so can't
look into it.
Suggest you try using \ for the space
—
Reply to this email directly, view it on GitHub
https://github.com/gitbls/sdm/issues/239#issuecomment-2232015979, or
unsubscribe
https://github.com/notifications/unsubscribe-auth/AAEQXSOLBA23PSBQQ3X2P4LZMWWYPAVCNFSM6AAAAABK7QPGQGVHI2DSMVQWIX3LMV43OSLTON2WKQ3PNVWWK3TUHMZDEMZSGAYTKOJXHE
.
You are receiving this because you authored the thread.Message ID:
@.***>

--
Timothy H. Keitt
www keittlab org

Hell is other people's networks.
> Plugin network: Create NetworkManager WiFi configuration
  with SSID: 'Admin TBS' Password: 'Admin_TBS_2024' WiFi Country: 'US'
> Plugin network: Configure NetworkManager WiFi connection 'admin tbs' with SSID 'Admin TBS'
Error: invalid <setting>.<property> 'tbs'.
mv: target 'tbs.nmconnection': No such file or directory

Crazy. \  should fix it right up 😉

Needed \
On Wed, Jul 17, 2024 at 6:45 PM Benn @.***> wrote:

Crazy. \ should fix it right up 😉
—
Reply to this email directly, view it on GitHub
https://github.com/gitbls/sdm/issues/239#issuecomment-2234757632, or
unsubscribe
https://github.com/notifications/unsubscribe-auth/AAEQXSMAHRPXWSR3DHWQMB3ZM36Z7AVCNFSM6AAAAABK7QPGQGVHI2DSMVQWIX3LMV43OSLTON2WKQ3PNVWWK3TUHMZDEMZUG42TONRTGI
.
You are receiving this because you authored the thread.Message ID:
@.***>

--
Timothy H. Keitt
www keittlab org

Actually, I have tried up to \\\ and still get the error.

Plugin network: Start Phase post-install

Plugin network: Keys/values found:
wifissid: Admin TBS
wifipassword: Admin_TBS_2024
wificountry: US
noipv6: y
Plugin network: Set WiFi Country 'US' for sdm FirstBoot
Plugin network: Enable SSH service
Plugin network: Create NetworkManager WiFi configuration
with SSID: 'Admin TBS' Password: 'Admin_TBS_2024' WiFi Country: 'US'
Plugin network: Configure NetworkManager WiFi connection 'admin tbs' with SSID 'Admin TBS'
Error: invalid . 'tbs'.
mv: target 'tbs.nmconnection': No such file or directory

A quick run through chatgpt suggests that this is the error.
--- original_script.sh  2024-07-18 12:00:00.000000000 +0000
+++ modified_script.sh  2024-07-18 12:00:00.000000000 +0000
@@ -134,8 +134,8 @@
then
if [ "$wifissid" != "" -a "$wifipassword" != "" -a "$wificountry" != "" ]
then

  	logtoboth "> Plugin $pfx: Create NetworkManager WiFi configuration"

  	logtoboth "  with SSID: '$wifissid' Password: '$wifipassword' WiFi Country: '$wificountry'"

  	logtoboth "> Plugin $pfx: Create NetworkManager WiFi configuration with SSID: '$wifissid' Password: '$wifipassword' WiFi Country: '$wificountry'"

  	wificname=$(echo "${wifissid,,}" | tr -d ' ')
  	if [ $newnm -eq 1 ]
  	then
  	    # --offline should work

  	    logtoboth "> Plugin $pfx: Configure NetworkManager WiFi connection '$wificname' with SSID '$wifissid'"

  	    nmcli --offline c add type wifi con-name $wificname \

  		  ifname wlan0 ssid $wifissid wifi-sec.key-mgmt \

  	    logtoboth "> Plugin $pfx: Configure NetworkManager WiFi connection '$wificname' with SSID '$wifissid'"

  	    nmcli --offline c add type wifi con-name "$wificname" \

  		  ifname wlan0 ssid "$wifissid" wifi-sec.key-mgmt \
  		  wpa-psk wifi-sec.psk "$wifipassword" | tee /tmp/$wificname.nmconnection >/dev/null
  	    mv /tmp/$wificname.nmconnection /etc/NetworkManager/system-connections/$wificname.nmconnection
  	else

I'll have a look at this next week when I'm back at my desk.

This is the problem with bash. (Believe me, my bash skills are incredibly simple.) I don't know if you are into chatgpt, but it can be a great linter in some cases.
-original: source $SDMPT/etc/sdm/sdm-readparams
-modified: source "$SDMPT/etc/sdm/sdm-readparams"

-original: IFS="=" read a wificountry <<< $(grep 'country=' $assetdir/wpa.conf | head -n 1)
-modified: IFS="=" read -r a wificountry <<< "$(grep 'country=' "$assetdir/wpa.conf" | head -n 1)"

-original: logtobothex "? Plugin $pfx: Cannot find $assetdir/wpa.conf"
-modified: logtobothex "? Plugin $pfx: Cannot find \"$assetdir/wpa.conf\""

-original: cat > $assetdir/wpa.conf <<EOF
-modified: cat > "$assetdir/wpa.conf" <<EOF

-original: [ -f $assetdir/wpa.conf ]
-modified: [ -f "$assetdir/wpa.conf" ]

-original: IFS="=" read a wifissid <<< $(grep 'ssid=' $assetdir/wpa.conf | head -n 1)
-modified: IFS="=" read -r a wifissid <<< "$(grep 'ssid=' "$assetdir/wpa.conf" | head -n 1)"

-original: IFS="=" read a wifipassword <<< $(grep 'psk=' $assetdir/wpa.conf | head -n 1)
-modified: IFS="=" read -r a wifipassword <<< "$(grep 'psk=' "$assetdir/wpa.conf" | head -n 1)"

-original: IFS="=" read a wificountry <<< $(grep 'country=' $assetdir/wpa.conf | head -n 1)
-modified: IFS="=" read -r a wificountry <<< "$(grep 'country=' "$assetdir/wpa.conf" | head -n 1)"

-original: nmcli --offline c modify $cattr </etc/NetworkManager/system-connections/$fname.nmconnection | tee /tmp/$fname.nmconnection >/dev/null
-modified: nmcli --offline c modify "$cattr" </etc/NetworkManager/system-connections/"$fname".nmconnection | tee /tmp/"$fname".nmconnection >/dev/null

-original: rm -f /etc/NetworkManager/system-connections/$fname.nmconnection
-modified: rm -f /etc/NetworkManager/system-connections/"$fname".nmconnection

-original: mv /tmp/$fname.nmconnection /etc/NetworkManager/system-connections/$fname.nmconnection
-modified: mv /tmp/"$fname".nmconnection /etc/NetworkManager/system-connections/"$fname".nmconnection

-original: echo "nmcli c modify $cname $cattr" >> $nmdcfg
-modified: echo "nmcli c modify $cname $cattr" >> "$nmdcfg"

-original: phase=$1
-modified: phase="$1"

-original: pfx="$(basename $0)"
-modified: pfx="$(basename "$0")"

-original: args=$2
-modified: args="$2"

-original: assetdir=$SDMPT/etc/sdm/assets/network
-modified: assetdir="$SDMPT/etc/sdm/assets/network"

-original: plugin_getargs $pfx "$args" "$vldargs" "$rqdargs" || exit
-modified: plugin_getargs "$pfx" "$args" "$vldargs" "$rqdargs" || exit

-original: mkdir -p $assetdir
-modified: mkdir -p "$assetdir"

-original: netman=$(getdefnm "$netman")
-modified: netman=$(getdefnm "$netman")

-original: if [ -f $wpa ]
-modified: if [ -f "$wpa" ]

-original: tr -d '\r' < $wpa > $assetdir/wpa.conf
-modified: tr -d '\r' < "$wpa" > "$assetdir/wpa.conf"

-original: logtobothex "? Plugin $pfx: wpa file '$wpa' not found"
-modified: logtobothex "? Plugin $pfx: wpa file \"$wpa\" not found"

-original: if [ -f $dhcpcdappend ]
-modified: if [ -f "$dhcpcdappend" ]

-original: cp -a $dhcpcdappend $assetdir/dhcpcd-append.conf
-modified: cp -a "$dhcpcdappend" "$assetdir/dhcpcd-append.conf"

-original: logtobothex "? Plugin $pfx: dhcpcdappend file '$dhcpcdappend' not found"
-modified: logtobothex "? Plugin $pfx: dhcpcdappend file \"$dhcpcdappend\" not found"

-original: for c in "${citems[@]}"
-modified: for c in "${citems[@]}"

-original: if [ -f $c ]
-modified: if [ -f "$c" ]

-original: mkdir -p $assetdir/$conf
-modified: mkdir -p "$assetdir/$conf"

-original: logtoboth "> Plugin $pfx: Copy $conf '$c' to $assetdir/$conf"
-modified: logtoboth "> Plugin $pfx: Copy $conf \"$c\" to \"$assetdir/$conf\""

-original: cp -a $c $assetdir/$conf
-modified: cp -a "$c" "$assetdir/$conf"

-original: if [ -d $assetdir/nmconn ]
-modified: if [ -d "$assetdir/nmconn" ]

-original: grep -qs type=wifi $assetdir/nmconn/* >/dev/null && nmwifi=1
-modified: grep -qs type=wifi "$assetdir/nmconn"/* >/dev/null && nmwifi=1

-original: if [ -f $assetdir/wpa.conf ]
-modified: if [ -f "$assetdir/wpa.conf" ]

-original: cp -a $assetdir/wpa.conf /etc/wpa_supplicant/wpa_supplicant.conf
-modified: cp -a "$assetdir/wpa.conf" /etc/wpa_supplicant/wpa_supplicant.conf

-original: if ! ispkginstalled $pkg
-modified: if ! ispkginstalled "$pkg"

-original: doaptrpterror "install --no-install-recommends --yes $pkg" $showapt
-modified: doaptrpterror "install --no-install-recommends --yes $pkg" "$showapt"

-original: if [ -f $assetdir/dhcpcd-append.conf ]
-modified: if [ -f "$assetdir/dhcpcd-append.conf" ]

-original: cat $assetdir/dhcpcd-append.conf >> /etc/dhcpcd.conf
-modified: cat "$assetdir/dhcpcd-append.conf" >> /etc/dhcpcd.conf

-original: dex=$(grep -E "ExecStart=.*/dhcpcd" /lib/systemd/system/dhcpcd.service| head -n 1 -)
-modified: dex=$(grep -E "ExecStart=.*/dhcpcd" /lib/systemd/system/dhcpcd.service | head -n 1 -)

-original: if [ ! -f /lib/dhcpcd/dhcpcd-hooks/10-wpa_supplicant ]
-modified: if [ ! -f /lib/dhcpcd/dhcpcd-hooks/10-wpa_supplicant ]

-original: if [ -f /usr/share/dhcpcd/hooks/10-wpa_supplicant ]
-modified: if [ -f /usr/share/dhcpcd/hooks/10-wpa_supplicant ]

-original: cp -a /usr/share/dhcpcd/hooks/10-wpa_supplicant /lib/dhcpcd/dhcpcd-hooks
-modified: cp -a /usr/share/dhcpcd/hooks/10-wpa_supplicant /lib/dhcpcd/dhcpcd-hooks

-original: if ! ispkginstalled network-manager
-modified: if ! ispkginstalled network-manager

-original: for c in $assetdir/$conf/*
-modified: for c in "$assetdir/$conf"/*

-original: cbn=$(basename $c)
-modified: cbn=$(basename "$c")

-original: cp -a $c /etc/NetworkManager/$tgt
-modified: cp -a "$c" /etc/NetworkManager/$tgt

-original: [[ $nmvermaj -gt 1 ]] || [[ $nmvermin -ge 42 ]] && newnm=1 || newnm=0
-modified: [[ "$nmvermaj" -gt 1 ]] || [[ "$nmvermin" -ge 42 ]] && newnm=1 || newnm=0

-original: if ! compgen -G "/etc/NetworkManager/system-connections/*.nmconnection" >/dev/null && ! grep -qs interface-name=wlan0 /etc/NetworkManager/system-connections/*.nmconnection >/dev/null 2>&1
-modified: if ! compgen -G "/etc/NetworkManager/system-connections/*.nmconnection" >/dev/null && ! grep -qs interface-name=wlan0 /etc/NetworkManager/system-connections/*.nmconnection >/dev/null 2>&1

-original: if [ $newnm -eq 1 ]
-modified: if [ "$newnm" -eq 1 ]

-original: nmcli --offline c add type wifi con-name $wificname \
-modified: nmcli --offline c add type wifi con-name "$wificname" \

-original: ifname wlan0 ssid $wifissid wifi-sec.key-mgmt \
-modified: ifname wlan0 ssid "$wifissid" wifi-sec.key-mgmt \

-original: rm -f /etc/NetworkManager/system-connections/$wificname.nmconnection
-modified: rm -f /etc/NetworkManager/system-connections/"$wificname".nmconnection

-original: mv /tmp/$wificname.nmconnection /etc/NetworkManager/system-connections/$wificname.nmconnection
-modified: mv /tmp/"$wificname".nmconnection /etc/NetworkManager/system-connections/"$wificname".nmconnection

-original: nmcli c add type wifi con-name $wificname ifname wlan0 ssid $wifissid
-modified: nmcli c add type wifi con-name "$wificname" ifname wlan0 ssid "$wifissid"

-original: nmcli c modify $wificname wifi-sec.key-mgmt wpa-psk wifi-sec.psk "$wifipassword"
-modified: nmcli c modify "$wificname" wifi-sec.key-mgmt wpa-psk wifi-sec.psk "$wifipassword"

-original: if ! grep -qs interface-name=$ifname /etc/NetworkManager/system-connections/*.nmconnection 2>/dev/null
-modified: if ! grep -qs interface-name="$ifname" /etc/NetworkManager/system-connections/*.nmconnection 2>/dev/null

-original: nmcli --offline c add con-name "$lancname" type ethernet ifname $ifname | tee /etc/NetworkManager/system-connections/$lancname.nmconnection >/dev/null
-modified: nmcli --offline c add con-name "$lancname" type ethernet ifname "$ifname" | tee /etc/NetworkManager/system-connections/"$lancname".nmconnection >/dev/null

-original: echo "nmcli c add con-name "$lancname" type ethernet ifname $ifname" >> $nmdcfg
-modified: echo "nmcli c add con-name "$lancname" type ethernet ifname "$ifname"" >> "$nmdcfg"

-original: while read nmfile
-modified: while read -r nmfile

-original: IFS="=" read idx cname < <(grep ^id= $nmfile)
-modified: IFS="=" read -r idx cname < <(grep ^id= "$nmfile")

-original: modnmconn "ipv6.method disabled" $cname $nmfile
-modified: modnmconn "ipv6.method disabled" "$cname" "$nmfile"

-original: while read nmfile
-modified: while read -r nmfile

-original: IFS="=" read idx cname < <(grep ^id= $nmfile)
-modified: IFS="=" read -r idx cname < <(grep ^id= "$nmfile")

-original: modnmconn "ipv6.method disabled" $cname $nmfile
-modified: modnmconn "ipv6.method disabled" "$cname" "$nmfile"

I fixed the problem by hand editing the plugin using sdm explore.

Wow. Somehow I completely missed this. 😵 Haven't looked at the code yet, but clearly some of these are just wrong and will fix. Others...need to have a look at them more closely. Thanks!

Derived connection name now has spaces removed which eliminates all the issues, except for one other instance which is also fixed. Release coming soon.

V12.6 released which fixes this.

Closing due to no activity. Please re-open if you're still having issues.

Thanks!Sent from my iPhoneOn Aug 24, 2024, at 3:58 PM, Benn @.***> wrote:
Closing due to no activity. Please re-open if you're still having issues.
—Reply to this email directly, view it on GitHub, or unsubscribe.You are receiving this because you authored the thread.Message ID: @.***>

Hello,
I’m facing an issue with a Wi-Fi SSID that includes spaces and special characters (double lol). When customizing the image, I encounter the following error in post-install phase, though it doesn’t cause a failure:
* Plugin network: Start Phase post-install
> Plugin network: Keys/values found:
   ifname: wlan0
   wifissid: Voie lactée
   wifipassword: password
   wificountry: FR
> Plugin network: Set WiFi Country 'FR' for sdm FirstBoot
> Plugin network: Create connection 'voielactée' on interface 'wlan0'
Error: invalid <setting>.<property> 'lactée"'.
* Plugin network: Complete Phase post-install

IMG Information
   Name: raspi64.img
   Date: 2024-10-22
   RasPiOS Version: 12
   RasPiOS Architecture: 64-bit aarch64
   os-release Version: 12 (bookworm)

Everything works perfectly when using ethernet and this is what I get when I list the connections:
$ nmcli connection show "voielactée"
Erreur : voielactée - profil de connexion introuvable. # Error: voielactée - connection profile not found.

I tried using a backslash (\ and \) as suggested but had no success.
Thanks for your patience!

@gitbls should reopen maybe?

For NM connections with spaces in the SSID or password the best solution is to build a .nmconnection on your own and feed it into the network plugin using the nmconn argument.


Uri::from_parts to return SlashInPathMissing

When running this code:
let mut parts = Parts::default();
parts.scheme = Some(Scheme::HTTP);
parts.authority = Some(Authority::from_str("www.example.com").unwrap());
parts.path_and_query = Some(PathAndQuery::from_str("my_path").unwrap());

let uri = Uri::from_parts(parts).unwrap();
println!("{}", uri);

the intention would most likely be to print "http://www.example.com/my_path", but in reality it is "http://www.example.commy_path" (notice the missing slash).
Rust playground here: https://play.rust-lang.org/?gist=903f0d760c9b94b358a21540301c2a02&version=stable&mode=debug&edition=2015
This can lead into annoying bugs and furthermore is against the RFC3986 sections 3 and 3.3 where it states that:
URI         = scheme ":" hier-part [ "?" query ] [ "#" fragment ]
hier-part   = "//" authority path-abempty
              / path-absolute
              / path-rootless
              / path-empty
path-abempty  = *( "/" segment )

Oh my, yea, that's definitely wrong! Thanks for filing this. I wonder, should perhaps PathAndQuery::from_str("my_path") actually be the error? A path should always start with a slash, right?

According to the section 3 of the RFC mentioned above:
   The scheme and path components are required, though the path may be
   empty (no characters).  When authority is present, the path must
   either be empty or begin with a slash ("/") character.  When
   authority is not present, the path cannot begin with two slash
   characters ("//").  These restrictions result in five different ABNF
   rules for a path (Section 3.3), only one of which will match any
   given URI reference.
   The following are two example URIs and their component parts:

         foo://example.com:8042/over/there?name=ferret#nose
         \_/   \______________/\_________/ \_________/ \__/
          |           |            |            |        |
       scheme     authority       path        query   fragment
          |   _____________________|__
         / \ /                        \
         urn:example:animal:ferret:nose

the "urn:example:animal:ferret:nose" is a valid URI with schema "urn" and path "example:animal:ferret:nose" with no leading "/".
Taking into account that this is URI implementation for http crate one might argue that it is irrelevant to support generic URI, but then if we want to support relative references as defined in section 4.2. of the aforementioned RFC then
relative-part = "//" authority path-abempty
              / path-absolute   ; begins with "/" but not "//"
              / path-noscheme   ; begins with a non-colon segment
              / path-empty      ; zero characters

allows creation of such URIs that can be used in this kind of html:
Relative link

which kind of makes sense to support by a crate whose name is "http".
OTOH, neither hyper client nor server would have any use for a URI whose schema is not HTTP or HTTPS and if schema is provided then path can be either empty or has to have a leading "/".

I guess what I am saying is that it is up to your ambition whether you want to support generic URI or to be more hyper specific in which case a lot of code from https://github.com/hyperium/http/blob/master/src/uri/scheme.rs and this lines https://github.com/hyperium/http/blob/master/src/uri/mod.rs#L189-L193 can go away (unless I am missing something and there actually is a use case for relative uri in hyper)


Scripts evaluation build operations

Introduce build operations around init, settings, build, plugins script evaluation.

[ ] The pull request contains an appropriate level of unit and integration
test coverage to verify the behavior.

About the boundaries of the added build operations.
My changes above put them around each call to ScriptPlugin#apply(target).
ScriptPlugin instances are created by ScriptPluginFactory instances that can come from different providers (Groovy, Kotlin).
If I move the added build operations boundaries inside DefaultScriptPlugin, we'll have to do it properly too inside each provider implementation.
I get your point @adammurdoch, semantically the build operation should be part of ScriptPlugin#apply(target). This could be done without putting this burden on providers by wrapping ScriptPluginFactory instances. But, it won't take into account some of the processing needed to actually "apply a script".
I also get @bamboo's point in that we should include ScriptPluginFactory#create(..) into these build operations. This would account for ScriptPluginFactorySelector processing and would gives us a way to fairly compare providers.
In any case, ScriptPlugin#apply(target) does a lot more than just "applying the script", there is multi-phase compilation, caching, multi-phase application etc...
So, we could add more build operations to distinguish more steps. But they're not free.
My take would be to stick to the build ops added above and include ScriptPluginFactory#create(..).
@adammurdoch, @bamboo, wdyt?

I rebased the branch on master and introduced ScriptPluginApplicator that includes both ScriptPluginFactory#create(..) and ScriptPlugin#apply(target), and, emits build operations events around scripts applications. Build operations related code is not spread all over the place anymore.
This should comply with the concerns of you two, @adammurdoch and @bamboo

As discussed with @oehme, I have reworked the solution to wrap the ScriptPlugin implementations inside a  decorator BuildOperationScriptPlugin. This creates the build operation inside the apply().
https://github.com/gradle/gradle/pull/1527/commits/7c3695712078392fe55ab9918d63506c952f41ee
To make this work for nested scripts, I had to fix the problem that the DefaultScriptPluginFactory was only using itself for nested applications. I think that's a general fix we want (as already suggested in one earlier comment by @adammurdoch). This is not very beautiful and binds DefaultScriptPluginFactory and ScriptPluginFactorySelector very strongly together. But it was the best simple solution I came up with.
https://github.com/gradle/gradle/pull/1527/commits/4be6c9443c4a538df40f7c52fa5cddb505fd3658

I added a bunch of test coverage. Running CI branch build now. If that passes, I will merge.
https://builds.gradle.org/viewType.html?buildTypeId=Gradle_Branches_Checkpoints_Stage5Full&branch_Gradle_Branches_Checkpoints=pm-build-scripts-build-ops&tab=buildTypeStatusDiv

🎉


Update multi-paragraph list layout to facilitate migration from Jekyll to Hugo

This also fixes a number of instances of incorrect formatting.

[APPROVALNOTIFIER] This PR is NOT APPROVED
This pull-request has been approved by:
To fully approve this pull request, please assign additional approvers.
We suggest the following additional approver: linsun
Assign the PR to them by writing /assign @linsun in a comment when ready.
The full list of commands accepted by this bot can be found here.
The pull request process is described here

Needs approval from an approver in each of these files:

OWNERS

Approvers can indicate their approval by writing /approve in a comment
Approvers can cancel approval by writing /approve cancel in a comment


feat: detailed rating dispaly

[AB#87500]
Why:
Closes: #ID
Describe your changes
Checklist before requesting a review

[ ] My code follows the code style of this project.
[ ] I have read the CONTRIBUTING document.
[ ] I have added tests to cover my changes.
[ ] All new and existing tests passed.
[ ] I've updated docs/changelog/changelog_en.md and docs/changelog/changelog_de.md. If I'm a non-German speaker, I've still updated the file with the English version as a placeholder.

One more thing that I noticed @N-Feist , If you could have a look at the following, please (mevo system used):

This is caused, because i round the values as it says in the azure card: "Round down to the next half step. 4.3 will show 4 stars. 4.6 will show 4.5 stars". I have to round the value, to have the wanted value shown. I just havent applied this to every SFRating component, that already existed.
Another option, would be to adjust the getters, to already have the ratings rounded. I just don't really like the approach @csandru-plenty

Wouldn't we force the shop users then to have the ratings rounded, if we do it in the SDK? otherwise, it would be easy to change it up for our customers. Thats my main concerne, because i can image, some people wantting to display the full number. @ksted

Wouldn't we force the shop users then to have the ratings rounded, if we do it in the SDK? otherwise, it would be easy to change it up for our customers. Thats my main concerne, because i can image, some people wantting to display the full number. @ksted

That's possible. But from a shopper's perspective, it would be pretty odd to see three different numbers across the page, like in the screenshot Cristi shared. I don't think this should happen in our defaults. I don't know enough about aria labels to say whether they should track the visual element (3.5 stars) or the real average (3.7) that's displayed next to the star rating, but I think we should try to be consistent.
Ideally it's also easy to be consistent here. So even if this kind of calculation happens inside the app instead of the getter, it should probably be centralised, so that both PurchaseCard and ReviewsAccordion use the same representation.

Ok so i will unify the way PurchaseCard and ReviewsAccordion get the review average. @ksted

Found a few issues while testing on mevo
eg: http://localhost:3000/living-room/sofas/2-seater-red-carpet_135

hydration errors
closing/opening CustomerReviews tab non-functional


Azimuth & angle of Sun

Started looking at this on branch 'issue/52-sun-angle'
https://github.com/openclimatefix/nowcasting_dataset/tree/issue/52-sun-angle

Thanks so much for diving into the nowcasting_dataset code and working on some of the issues!  Absolutely awesome work!  (Sorry the code is a bit of a mess!)  I've got a few vaguely urgent emails to reply to this morning but I'll try to look at your pull requests before we chat this afternoon :)

https://github.com/openclimatefix/nowcasting_dataset/pull/70
@JackKelly no rush on this, just something I'm ticking away with

code in there, next step is to add it to the prepared ML data set

To get all the Azimuth angles, for time of day and locations, it took an hour. Perhaps a good way would be to do this process in one step first and save the dataset, and then load it later.
My feeling also is there must be a simple formula  that we can run on to calculate these.

Perhaps a good way would be to do this process in one step first and save the dataset, and then load it later.

That sounds like a good idea to me!  And maybe that pre-prepared dataset of Azimuth angles could extend a little way into the future (say, to the end of 2022), so we don't have to worry about re-computing the Azimuth angles for a while?

Needs to be {locations} x {time} vector, so perhaps I can do ~1km2 square grids in 5 min timesteps,  and then have a method to interpolate these for the actual location of the pv system

That could work!
For now, would it be simpler to pre-compute the Azimuth & angle of the Sun just for each PV system, and for the centroid of each GSP region?  (Instead of doing it at 1km^2 square grids)?  Or have I missed something?!  :)

It would be simplier, but when a new one gets added, we need to be able to run it for the new one. Perhas thats the way to do it, have a scrip that can eaily append new locations (and times)

sounds good to me! :)

I think i'll split into a separate datasource (out of pv data source), so its more general, and can be loaded nicely

Currently one year of data is ~ 250 MB. This is about ~2000 sites for 365*288 timestamps = 100 million data points.
My thinking is that 1 year will be enough accuracy for us to use for all the years, but I will look into the differences in the data in the differenent years

Sounds good to me!
@jacobbieker, as our resident astrophysicist :), are we safe to assume that the azimuth and angle of the sun will always be the same for a given time-of-year?  (I assume so, but I know just enough physics to know that I really don't understand very much physics!)

I think technically no, it changes, as the Earth wobbles around its axis over time, but that is only noticeable over the course of  thousands or hundreds of thousands of years, so it should be a very good approximation for the next few thousand years or so ;) So in essence, yeah that should be a fine thing to assume.

@peterdudfield now that #70 is merged, I'll close this issue.  Please re-open if I've misunderstood!