TabNavigator change icon sizes per screen

Im facing an issue that others may face or have faced and was curious how we feel the best solution would be to fix this.
Right now there is no way to set icon styles on the tab navigator configuration.  That's easy enough to fix by passing props.  The other issue im facing is having different icon styles per screen.
Here is the example I have:

On android views are clipped so this will clip the icon if the icon is larger than the styles passed.
Here are a few idea I have and working through:

Allow users to pass in a react component that will display in the tab.  This would allow users to format the tab anyway they see fit.  I believe ex-navigation did this.

Allow users to set icon styles per screen.  This would require a getter and would update the style based off the scene.

I'll be happy to work on a PR but was curious what the community thinks is the best solution.

You can define tabBarIcon function on each of the screens and define the style of icon respectively.


Make sure image data is an array and not a string (MCS-405).

It looks like we are saving most of our images as PIL.Images, but rereading the original Slack comment and looking at the code, it looked like the issue here was actually that we were saving the image data specifically for target object data as a string -- Falk mentioned that a NumPy array would be acceptable so that's what I went with.
This change wasn’t hard, but I needed to get the image generator working (or in my case, at least get around current issues well enough to generate a scene with target objects).
In addition, I realized that this change might be more of a backwards compatibility thing. Our target objects are always going to be the same anyway for Eval 3, and I’m not even sure we’re going to need to save the information for the target objects the same way we used to going forward.
Also wanted to verify the debug output file size -- looks like a .5 MB increase for this change (I did notice the depth mask update bumped up my MCS output file for this to about 8-9 MB, so just something to keep in mind Nevermind this was because I was using an old unity app build from before we removed substeps).

@rartiss55 Can you also please verify that the target.image, target_1.image, and target_2.image documentation in goal_metadata.py is correct? https://github.com/NextCenturyCorporation/MCS/blob/master/machine_common_sense/goal_metadata.py#L134

@rartiss55 Can you also please verify that the target.image, target_1.image, and target_2.image documentation in goal_metadata.py is correct? https://github.com/NextCenturyCorporation/MCS/blob/master/machine_common_sense/goal_metadata.py#L134

@ThomasSchellenbergNextCentury Yes, its a list of lists of lists.

Shouldn't this be a list of np.array? not a list of list of list of integers?

Shouldn't this be a list of np.array? not a list of list of list of integers?

@deanwetherby updated


Navigation buttons overlay adjustments on mobile UI

Issue:
The user faces trouble during navigation in onboarding due to partial visibility/non-visibility of the buttons.
Current visual:
The mobile UI of the onboarding pages has next and back buttons which gets behind the visuals.
Expected visual
The next and back buttons in the UI must go in front of the visuals.

The PR was merged, @ppagarawal , therefore I'm closing this issue.


PE-1789 chore: change font related px to em values

This commit changes font-related px values to corresponding em values. This was asked for in the SFCC cartridge review.
Most of these em values assume a "base font size" of 16px.
Some of the em values are not 1:1 with their previous px values. This was done because the 1:1 em value threw things off. I suspect this is because the "base font-size" for the element in question is actually different from 16px.
Before/After this commit

Images can be a tad misleading since they're not all the same size. You can however tell little if anything has changed.

before

after

Current dependencies on/for this PR:

main

PR #170  (this PR)

PR #171

This comment was auto-generated by Graphite.

Merging this to push to the mother repo


Prevent resetting the playhead to 0:00:00 when dragging the time marker to the far right

Subtract a small delta from the video's duration. This way the video does not switch back to the beginning.
Fixes #303

This works, but the fact that I could not actually consistently reproduce this made me curious, so I did a little digging myself. Apparently this is a feature of the MediaElement library that you can just turn off. I created #350 with this in mind; I think that is the cleaner solution. Thoughts @luniki?

#350 looks even better


New password has been saved. Is returned, when old_password doesn't match

Version: django-rest-auth      0.9.3
Route: /rest-auth/password/change/ (POST)
Expected behaviour:
Sending a POST request with the keys new_password1 and new_password2 matching, a valid authentication header token, content_type "application/json"  and a key old_password which does not match the users current password gives back:
{"detail":"Old password does not match."} and a status code of 400 Invalid Request.
Password is not changed.
Observed behaviour:
Sending a POST request with the keys new_password1 and new_password2 matching, a valid authentication header token, content_type "application/json"  and a key old_password which does not match the users current password gives back:
{"detail":"New password has been saved."} and a status code of 200 OK.
Password is not changed.

Thanks for pointing that out.
You can set OLD_PASSWORD_FIELD_ENABLED setting to True if you want the validation to work.
Of course we will make sure to add proper exception in upcoming version, which will resolve a case when this setting is turned off and old password is still posted (and vice versa). Thanks again.


Add TREC Core Track 2018 topics

Originally I also included the topics file. But later on removed it cause probably we are not allowed to put it publicly

@Peilin-Yang just saw you had a core18 topic file in this PR but then removed it... Do we already have the topics?


Please consider using indiatorAnimationController for your usecase


[SUGGESTION] Please use model.display() in Jupyter/Colab notebooks

Hi
Thank you for your amazing tutorials. Please add model.display() to show new users that they can get a solution summary using it.
Thanks

Thanks for the kind note. I've been cleaning up old issues, moved the notebooks to JupyterBook, and implemented this suggestion.


domain.com not redirecting to frontend

Hello,
I love your theme, it makes YOURLS much more modern, which is basically very old-fashioned...
However I have a problem, I moved the sleeky-frontend folder to the root, but when I go to domain.com I get a 403 forbidden error:

Can you help me to solve this problem please?
Thanks in advance,
Doncellup

I hadn't seen that the CONTENTS of the sleeky-frontend folder had to be moved to the root! I had moved the folder ^^'
Maybe you could bold the word "content" so that this error doesn't happen to others :

Sorry for inconvenience,
Have a good day :D


Do not write image list to args.json files

Related to #474.
TLDR: let's remove the args["metadata"]["image"] key-value pair before writing args.json files to disk.

Here is a real-life example (job ID 1029):

The workflow has nine tasks (from 0 to 8).
The dataset has 357 wells and 26 cycles, corresponding to 9282 images (these values are read for the last task).
The job folder uses approximately 25 GB.
The largest files in the folder are the args.json files, which are 38557 (not so far from 4x9282=37128).
Each one of these args.json file has a size of about 600K, and their total occupied size is then around 23 G. This the largest part of the whole job folder, then we'll ignore the rest.
The different contribution to these 600K are listed below, using the approximate size estimates from https://pympler.readthedocs.io:

See script:
import json
from pympler.asizeof import asizeof

FILENAME = "something.args.json"
with open(FILENAME, "r") as f:
    args = json.load(f)
args_size = asizeof(args)
print(f"args: {args_size}")
print("-" * 80)
for key, value in args.items():
    size_kB = asizeof(value) / 1000
    print(f"metadata    {key:22s}: size ~ {size_kB:07.2f} KB")
print("-" * 80)
for key, value in args["metadata"].items():
    try:
        len_value = len(value)
    except TypeError:
        len_value = 0
    size_kB = asizeof(value) / 1000
    print(f"metadata    {key:22s}: size ~ {size_kB:07.2f} KB (len={len_value})")
print("-" * 80)

and output:
args: 1092032
--------------------------------------------------------------------------------
metadata    input_paths           : size ~ 0000.21 KB
metadata    output_path           : size ~ 0000.12 KB
metadata    metadata              : size ~ 1089.17 KB
metadata    contrast_threshold    : size ~ 0000.03 KB
metadata    level                 : size ~ 0000.02 KB
metadata    overwrite             : size ~ 0000.03 KB
metadata    label_image_name      : size ~ 0000.06 KB
metadata    channel               : size ~ 0000.35 KB
metadata    label_image_cycle     : size ~ 0000.02 KB
metadata    intensity_image_cycle : size ~ 0000.03 KB
metadata    min_threshold         : size ~ 0000.03 KB
metadata    max_threshold         : size ~ 0000.03 KB
metadata    gaussian_blur         : size ~ 0000.03 KB
metadata    fill_holes_area       : size ~ 0000.03 KB
metadata    output_label_cycle    : size ~ 0000.03 KB
metadata    output_label_name     : size ~ 0000.06 KB
metadata    component             : size ~ 0000.10 KB
--------------------------------------------------------------------------------
metadata    plate                 : size ~ 0000.18 KB (len=1)
metadata    well                  : size ~ 0037.53 KB (len=357)
metadata    image                 : size ~ 1041.00 KB (len=9282)
metadata    num_levels            : size ~ 0000.03 KB (len=0)
metadata    coarsening_xy         : size ~ 0000.03 KB (len=0)
metadata    original_paths        : size ~ 0009.46 KB (len=26)
metadata    image_extension       : size ~ 0000.06 KB (len=3)
metadata    image_glob_patterns   : size ~ 0000.02 KB (len=0)
--------------------------------------------------------------------------------

It's clear that the args["metadata"][["image"] value (a list of 9282 strings) is the heaviest contributor to the file size.
After removing the image list, the size of one specific args.json file goes from 613K to 22K. This leads to a drastic size decrease of the args.json contribution, from about 23G to <1G.

For the record, this would break the copy-ome-zarr task in fractal-tasks-core, see https://github.com/fractal-analytics-platform/fractal-tasks-core/blob/main/fractal_tasks_core/tasks/copy_ome_zarr.py#L210-L215:
    for key in ["plate", "well", "image"]:
        meta_update[key] = [
            component.replace(".zarr", f"_{suffix}.zarr")
            for component in metadata[key]
        ]

Which means that we still need to include the image list, when working with this specific task. I guess the easiest is to have a boolean flag (e.g. include_image_list) internally that is always False and only set to True when a specific condition is met. The condition would be like: task name is Copy OME Zarr and task source include fractal_tasks_core. We can include more cases if we find them.


Update Container state when parent props changed

I'm trying to use DND for 2 containers.

container have static data form axios => tasks list.
container have only tasks which were set to user.

<Container id={1} list={this.props.tasks}/>
<Container id={2} list={this.state.userTasks}/>

When I change user (by select) X => Y I have to refresh data for Container(2).
My this.state.userTasks are refreshing but child component Container(2) still have the same elements.
This is because I use constructor to pass data. Constructor is call once. I know it.
constructor(props) {
        super(props);
        this.state = {cards: props.list};
    }

I can't use componentWillReceiveProps(nextProps) into Container (child) because I have to update only Container(2) and this method is calling when I moving element from Container(1) to Container(2)
How to update Container(2) cards when I change user? Do you have any ideas?

@dmarczydlo One alternative will be to pass unique user information to the Container and checking it in the Container when it changes reset lists by calling handler.
Better approach will be to use componentWillReceiveProps in the component where you are declaring
<Container id={1} list={this.props.tasks}/>
<Container id={2} list={this.state.userTasks}/>

This components.
Let me know if it helps!

@anilreddykatta

Better approach will be to use componentWillReceiveProps in the component where you are declaring

but I using this.state.userTasks as data which are pass. So this data where changing.
But in the Container(2) I have to change props but I don't know how.
Information about users tasks are updated only when I changed select. At the begining tasks are empty.

@dmarczydlo When user changes reset the this.state.userTasks. Container2 requires this from the state, I understand it. But for Container list is a prop.
componentWillReceiveProps(nextProps) {
 if (nextProps.userId !== this.props.userId) {
    this.setState({
      userTasks: [],
    })
 }
}

Somewhere in the render
render() {
 return (
   <Container id={1} list={this.props.tasks}/>
   <Container id={2} list={this.state.userTasks}/>
 )
}

OK thnx. Your answer gave me idea how to do that.
And now is working fine. So this issue could be close.

@dmarczydlo Can you close the issue?


I cann't load style

these 4 types of style cann't be load.
this has happened before

This is a known issue, see https://github.com/maputnik/editor/issues/541 and https://github.com/maputnik/editor/pull/549
You may use https://maputnik.github.io/releases/v1.6.0-beta in the meantime.
Closing as duplicate.


Typography-related symbols, middle dot, vertical ellipsis and clockwise circle arrow

Here are few symbols that I've been keeping at hand and which would be IMHO a great addition to your library of symbols :)

@pvoisin thank you for your contribution! ❤

You're very welcome! Thanks for carrying out symbol.wtf :)


[build error]gettimeofday is undefined

eqcow2/qcow2.cpp: In constructor ‘MetaFlushingState::MetaFlushingState(Qcow2TopTable&, bool)’:
qcow2/qcow2.cpp:917:2: error: ‘gettimeofday’ was not declared in this scope; did you mean ‘SYS_gettimeofday’?
917 |  gettimeofday(&last_flush, NULL);
|  ^~~~~~~~~~~~
|  SYS_gettimeofday
qcow2/qcow2.cpp: In member function ‘void MetaFlushingState::__done(Qcow2State&, ublksrv_queue*)’:
qcow2/qcow2.cpp:1121:2: error: ‘gettimeofday’ was not declared in this scope; did you mean ‘SYS_gettimeofday’?
1121 |  gettimeofday(&last_flush, NULL);
|  ^~~~~~~~~~~~
|  SYS_gettimeofday
qcow2/qcow2.cpp: In member function ‘bool MetaFlushingState::__need_flush(int)’:
qcow2/qcow2.cpp:1324:3: error: ‘gettimeofday’ was not declared in this scope; did you mean ‘SYS_gettimeofday’?
1324 |   gettimeofday(&t, NULL);
|   ^~~~~~~~~~~~
|   SYS_gettimeofday
make[2]: *** [Makefile:750: ublk-qcow2.o] Error 1
make[2]: Leaving directory '/root/work/ubdsrv'
make[1]: *** [Makefile:828: all-recursive] Error 1
make[1]: Leaving directory '/root/work/ubdsrv'
make: *** [Makefile:476: all] Error 2
Maybe we should include <sys/time.h> in qcow2/qcow2.h? I did so and it succeeded.

Maybe we should include <sys/time.h> in qcow2/qcow2.h? I did so and it > succeeded.

OK, care to send one MR?
BTW, not trigger in my test environment(fedora).
thanks,

Looks it is better to use system_clock of libstdc++, given qcow2 is basically
done via c++, and I will fix this issue.

Fixed by c4995da ("qcow2: replace gettimeofday with std::chrono::system_clock::now()")

Thanks for the fix, the build succeeds now!


add visibility control header, but don’t use it yet

To facilitate some work for other developers.

CI:

Linux
Linux-aarch64
macOS
Windows


Workmanager.getInstance() throws NullPointerException

See my comment https://github.com/googlecodelabs/android-workmanager/issues/44#issuecomment-404807404

Thanks for reporting this.
I'm closing this issue because I cannot reproduce it in this codelab.
If you think that this is a problem of the WorkManager library, please open a bug on the WorkManager public issue tracker: https://issuetracker.google.com/issues/new?component=409906&template=1094197
Please reopen if you still think this is an issue with the codelab.


About empty data in val dataset

I use the val data set for evaluation. However, there are some errors when running to certain data. Does the evaluation.py file have any problems with the handling the NII files without fractures?

Could you copy the error information?

Traceback (most recent call last):
File "evaluation.py", line 528, in
eval_results = evaluate(args.gt_dir, args.pred_dir)
File "evaluation.py", line 484, in evaluate
gt_arr, pred_arr, cur_gt_info, cur_pred_info))
File "evaluation.py", line 267, in evaluate_single_prediction
gt_info, pred_info)
File "evaluation.py", line 173, in _compile_pred_metrics
clf_conf_mat = _get_clf_confusion_matrix(gt_info, pred_metrics)
File "evaluation.py", line 86, in _get_clf_confusion_matrix
conf_mat.loc["FN", gt_info["label_code"][i]] += 1
File "/root/miniconda/envs/tf1.15_tr1.4.0_mx1.5.0_cu10.0_py36/lib/python3.6/site-packages/pandas/core/indexing.py", line 873, in getitem
return self._getitem_tuple(key)
File "/root/miniconda/envs/tf1.15_tr1.4.0_mx1.5.0_cu10.0_py36/lib/python3.6/site-packages/pandas/core/indexing.py", line 1044, in _getitem_tuple
return self._getitem_lowerdim(tup)
File "/root/miniconda/envs/tf1.15_tr1.4.0_mx1.5.0_cu10.0_py36/lib/python3.6/site-packages/pandas/core/indexing.py", line 810, in _getitem_lowerdim
return getattr(section, self.name)[new_key]
File "/root/miniconda/envs/tf1.15_tr1.4.0_mx1.5.0_cu10.0_py36/lib/python3.6/site-packages/pandas/core/indexing.py", line 879, in getitem
return self._getitem_axis(maybe_callable, axis=axis)
File "/root/miniconda/envs/tf1.15_tr1.4.0_mx1.5.0_cu10.0_py36/lib/python3.6/site-packages/pandas/core/indexing.py", line 1110, in _getitem_axis
return self._get_label(key, axis=axis)
File "/root/miniconda/envs/tf1.15_tr1.4.0_mx1.5.0_cu10.0_py36/lib/python3.6/site-packages/pandas/core/indexing.py", line 1059, in _get_label
return self.obj.xs(label, axis=axis)
File "/root/miniconda/envs/tf1.15_tr1.4.0_mx1.5.0_cu10.0_py36/lib/python3.6/site-packages/pandas/core/generic.py", line 3482, in xs
loc = self.index.get_loc(key)
File "/root/miniconda/envs/tf1.15_tr1.4.0_mx1.5.0_cu10.0_py36/lib/python3.6/site-packages/pandas/core/indexes/base.py", line 2891, in get_loc
raise KeyError(key) from err
KeyError: 'Background'
I don't know exactly where the problem is. The format and requirements of the file are as described above.

Is this the latest version of this repo? This seems to be the case that gt_info["label_code"][i] == "Background" and there is no such column as "Background" in the confusion matrix. In the current version, we have:
        if len(pred_metrics) == 0\
                or (gt_info.label_code[i] != "Background"\
                and gt_info.label_id[i] not in list(pred_metrics.hit_label)):
            conf_mat.loc["FN", gt_info["label_code"][i]] += 1

Thus, this line of code shouldn't be run if gt_info["label_code"][i] == "Background.

I see. This is because your prediction for that particular volume is empty (predicts no fracture at all). This is a bug and will be fixed soon.

Traceback (most recent call last):
File "evaluation.py", line 528, in
eval_results = evaluate(args.gt_dir, args.pred_dir)
File "evaluation.py", line 484, in evaluate
gt_arr, pred_arr, cur_gt_info, cur_pred_info))
File "evaluation.py", line 267, in evaluate_single_prediction
gt_info, pred_info)
File "evaluation.py", line 173, in _compile_pred_metrics
clf_conf_mat = _get_clf_confusion_matrix(gt_info, pred_metrics)
File "evaluation.py", line 86, in _get_clf_confusion_matrix
conf_mat.loc["FN", gt_info["label_code"][i]] += 1
File "/root/miniconda/envs/tf1.15_tr1.4.0_mx1.5.0_cu10.0_py36/lib/python3.6/site-packages/pandas/core/indexing.py", line 873, in getitem
return self._getitem_tuple(key)
File "/root/miniconda/envs/tf1.15_tr1.4.0_mx1.5.0_cu10.0_py36/lib/python3.6/site-packages/pandas/core/indexing.py", line 1044, in _getitem_tuple
return self._getitem_lowerdim(tup)
File "/root/miniconda/envs/tf1.15_tr1.4.0_mx1.5.0_cu10.0_py36/lib/python3.6/site-packages/pandas/core/indexing.py", line 810, in _getitem_lowerdim
return getattr(section, self.name)[new_key]
File "/root/miniconda/envs/tf1.15_tr1.4.0_mx1.5.0_cu10.0_py36/lib/python3.6/site-packages/pandas/core/indexing.py", line 879, in getitem
return self._getitem_axis(maybe_callable, axis=axis)
File "/root/miniconda/envs/tf1.15_tr1.4.0_mx1.5.0_cu10.0_py36/lib/python3.6/site-packages/pandas/core/indexing.py", line 1110, in _getitem_axis
return self._get_label(key, axis=axis)
File "/root/miniconda/envs/tf1.15_tr1.4.0_mx1.5.0_cu10.0_py36/lib/python3.6/site-packages/pandas/core/indexing.py", line 1059, in _get_label
return self.obj.xs(label, axis=axis)
File "/root/miniconda/envs/tf1.15_tr1.4.0_mx1.5.0_cu10.0_py36/lib/python3.6/site-packages/pandas/core/generic.py", line 3482, in xs
loc = self.index.get_loc(key)
File "/root/miniconda/envs/tf1.15_tr1.4.0_mx1.5.0_cu10.0_py36/lib/python3.6/site-packages/pandas/core/indexes/base.py", line 2891, in get_loc
raise KeyError(key) from err
KeyError: 'Background'
I don't know exactly where the problem is. The format and requirements of the file are as described above.

Just pushed a new commit. This bug should be fixed when your prediction is empty.

Great. The problem is solved

Great. The problem is solved

Cool. I will close this issue then.


Make images usable on ARM machines

https://github.com/apify/apify-actor-docker/blob/ee3852a92d7f3fd7bdd64348a890b0de4186c070/node/Dockerfile#L2
Is there a reason why this platform restriction is in place? At least the normal node-actor image seems to work fine on ARM machines. With the increasing number of ARM servers, VPSs and cloud offerings it would be nice to be able to use the images on those machines.

cc @vladfrangu


Add OpenAPI Specification v3.1 objects

Hi @tyzhnenko
Thank You for your contribution! It seems there is more analysis needed because I see several properties that were removed from OpenAPI specification in v3 are still included in the classes you proposed in this PR.
By the way - the complexity of OAD makes me feel that supporting it fully in web frameworks is a work for people like Hermes from Futurama! 😁

@RobertoPrevato I'll take a look at your comments and make changes. Thanks to the review


feat(#128): redirect to home, when hitting home without trailing slash

@followynne Thanks for taking care of issues.

@mo-esmp you're welcome, it's my pleasure! In the next days I'll open other prs for the remaining ones 😊

Perfect!
I will soon begin refactoring and standardizing the SQL query generation for SQL-based providers.


⚠ Bofrost.at has degraded performance

In f472831, Bofrost.at (https://www.bofrost.at) experienced degraded performance:

HTTP code: 200
Response time: 1172 ms

Resolved: Bofrost.at performance has improved in c3798d6 after 6 minutes.


Error while clicking on 'join roon

Hi,
After entering the username and room name , then clicking on join room button creating this error

Hi @deekshaa8 thanks for the issue!
I think that this error means that there is no token server that is able to serve a video access token to the app. Unfortunately, without more information from you, I'm not able to know what the problem might be. Can you please create a new issue and fill the bug report template in full? Some information that we would be interested in is: how did you run the app? Is the app deployed anywhere? Are you seeing any error messages in your terminal or browser console? What versions of Node and NPM are you running? What browser are you using? Did you make any changes to the code?
The more information that you can provide about this problem - the better we will be able to help you. Thanks for your understanding!


Create dependabot.yml

No offense, this is an unsolicited PR. Please open an issue.

Hey @FaisalAfroz, @iHiD pointed out that there was an issue open for this that I was not aware of as an org direction.  I'm just going to throw a request changes on it to give me time to review/make suggestions so it doesn't get merged accidentally.
Appreciate your efforts 💙


[MacOS][Web] The scrolling performance degradation

The scrolling performance on the MacOS Web platform was degrading.
Steps to Reproduce

Run the sample in the Web platform on MacOS.
Scroll the sample in vertical direction.

Expected results: The scrolling performance needs to be smoother.
Actual results: The scrolling performance was lack of smoothness.

Code sample

import 'package:flutter/material.dart';

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

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

  @override
  Widget build(BuildContext context) {
    return const MaterialApp(
      home: _FlutteDemo(),
    );
  }
}

class _FlutteDemo extends StatefulWidget {
  const _FlutteDemo();

  @override
  State<_FlutteDemo> createState() => _FlutteDemoState();
}

class _FlutteDemoState extends State<_FlutteDemo> {
  List<Widget> widgets = [];

  @override
  void initState() {
    super.initState();
    for (int i = 0; i < 200; i++) {
      widgets.add(Container(
        height: 50,
        width: 70,
        decoration: BoxDecoration(border: Border.all(color: Colors.black)),
        child: Text(i.toString()),
      ));
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
        appBar: AppBar(title: const Text('Flutter Sample')),
        body: SingleChildScrollView(
          child: Row(
            children: [
              Column(children: widgets),
              Column(children: widgets),
              Column(children: widgets),
              Column(children: widgets),
              Column(children: widgets),
              Column(children: widgets),
              Column(children: widgets),
              Column(children: widgets),
              Column(children: widgets),
              Column(children: widgets),
            ],
          ),
        ));
  }
}

Logs
[✓] Flutter (Channel stable, 3.7.7, on macOS 13.1 22C65 darwin-x64, locale en-GB)
[✗] Android toolchain - develop for Android devices
    ✗ Unable to locate Android SDK.
      Install Android Studio from: https://developer.android.com/studio/index.html
      On first launch it will assist you in installing the Android SDK components.
      (or visit https://flutter.dev/docs/get-started/install/macos#android-setup for detailed instructions).
      If the Android SDK has been installed to a custom location, please use
      `flutter config --android-sdk` to update to that location. [✓] Xcode - develop for iOS and macOS (Xcode 14.2)
[✓] Chrome - develop for the web
[!] Android Studio (not installed)
[✓] VS Code (version 1.75.1)
[✓] VS Code (version 1.76.2)
[✓] Connected device (3 available)
[✓] HTTP Host Availability

! Doctor found issues in 2 categories.

Hello @iapicca,
Thank you for your response. In my application, I am using a SingleChildScrollView for some use cases. The sample I provided was a simplified version of my application used to replicate the issue I am facing. After testing this sample on both the MacOS Desktop and the Web on the Mac platform, I have observed a difference in scrolling performance between the two platforms. For your reference, I have attached videos demonstrating the issue.
The output in MacOS Desktop platform:
https://user-images.githubusercontent.com/93904422/227139034-e93279d0-8915-4ae2-a00c-f30a24b5441a.mov
The output in Mac Web platform:
https://user-images.githubusercontent.com/93904422/227139085-2db4890c-3f98-4908-b949-aa30fcf6122f.mov

Thanks for the update. I am seeing same behavior as reported above, specially noticeable using canvaskit renderer. With html renderer, the scrolling is much better and smooth:
https://user-images.githubusercontent.com/67046386/227187969-24d03a88-0230-4edd-976f-210f8724da26.mov

 stable, master flutter doctor -v
[!] Flutter (Channel stable, 3.7.7, on macOS 12.2.1 21D62 darwin-x64, locale
    en-GB)
    • Flutter version 3.7.7 on channel stable at
      /Users/dhs/documents/fluttersdk/flutter
    ! Warning: `flutter` on your path resolves to
      /Users/dhs/Documents/Fluttersdk/flutter/bin/flutter, which is not inside
      your current Flutter SDK checkout at
      /Users/dhs/documents/fluttersdk/flutter. Consider adding
      /Users/dhs/documents/fluttersdk/flutter/bin to the front of your path.
    ! Warning: `dart` on your path resolves to
      /Users/dhs/Documents/Fluttersdk/flutter/bin/dart, which is not inside your
      current Flutter SDK checkout at /Users/dhs/documents/fluttersdk/flutter.
      Consider adding /Users/dhs/documents/fluttersdk/flutter/bin to the front
      of your path.
    • Upstream repository https://github.com/flutter/flutter.git
    • Framework revision 2ad6cd72c0 (12 days ago), 2023-03-08 09:41:59 -0800
    • Engine revision 1837b5be5f
    • Dart version 2.19.4
    • DevTools version 2.20.1
    • If those were intentional, you can disregard the above warnings; however
      it is recommended to use "git" directly to perform update checks and
      upgrades.

[!] Xcode - develop for iOS and macOS (Xcode 12.3)
    • Xcode at /Applications/Xcode.app/Contents/Developer
    ! Flutter recommends a minimum Xcode version of 13.
      Download the latest version or update via the Mac App Store.
    • CocoaPods version 1.11.2

[✓] Chrome - develop for the web
    • Chrome at /Applications/Google Chrome.app/Contents/MacOS/Google Chrome

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

[✓] Connected device (5 available)
    • SM G975F (mobile)       • RZ8M802WY0X • android-arm64   • Android 11 (API 30)
    • Darshan's iphone (mobile)  • 21150b119064aecc249dfcfe05e259197461ce23 •
      ios            • iOS 14.4.1 18D61
    • iPhone 12 Pro Max (mobile) • A5473606-0213-4FD8-BA16-553433949729     •
      ios            • com.apple.CoreSimulator.SimRuntime.iOS-14-3 (simulator)
    • macOS (desktop)            • macos                                    •
      darwin-x64     • Mac OS X 10.15.4 19E2269 darwin-x64
    • Chrome (web)               • chrome                                   •
      web-javascript • Google Chrome 98.0.4758.80

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

! Doctor found issues in 1 category.

[!] Flutter (Channel master, 3.9.0-12.0.pre.18, on macOS 12.2.1 21D62
    darwin-x64, locale en-GB)
    • Flutter version 3.9.0-12.0.pre.18 on channel master at
      /Users/dhs/documents/fluttersdk/flutter
    ! Warning: `flutter` on your path resolves to
      /Users/dhs/Documents/Fluttersdk/flutter/bin/flutter, which is not inside
      your current Flutter SDK checkout at
      /Users/dhs/documents/fluttersdk/flutter. Consider adding
      /Users/dhs/documents/fluttersdk/flutter/bin to the front of your path.
    ! Warning: `dart` on your path resolves to
      /Users/dhs/Documents/Fluttersdk/flutter/bin/dart, which is not inside your
      current Flutter SDK checkout at /Users/dhs/documents/fluttersdk/flutter.
      Consider adding /Users/dhs/documents/fluttersdk/flutter/bin to the front
      of your path.
    • Upstream repository https://github.com/flutter/flutter.git
    • Framework revision 28f17d345b (39 minutes ago), 2023-03-20 21:08:41 -0700
    • Engine revision ea6ed14b4e
    • Dart version 3.0.0 (build 3.0.0-345.0.dev)
    • DevTools version 2.22.2
    • If those were intentional, you can disregard the above warnings; however
      it is recommended to use "git" directly to perform update checks and
      upgrades.

[!] Android toolchain - develop for Android devices (Android SDK version 30.0.3)
    • Android SDK at /Users/dhs/Library/Android/sdk
    ✗ cmdline-tools component is missing
      Run `path/to/sdkmanager --install "cmdline-tools;latest"`
      See https://developer.android.com/studio/command-line for more details.
    ✗ Android license status unknown.
      Run `flutter doctor --android-licenses` to accept the SDK licenses.
      See https://flutter.dev/docs/get-started/install/macos#android-setup for
      more details.

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

[✓] Chrome - develop for the web
    • Chrome at /Applications/Google Chrome.app/Contents/MacOS/Google Chrome

[✓] IntelliJ IDEA Ultimate Edition (version 2021.3.2)
    • IntelliJ at /Applications/IntelliJ IDEA.app
    • Flutter plugin version 65.1.4
    • Dart plugin version 213.7228

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

[✓] Connected device (3 available)
    • Darshan's iphone (mobile) • 21150b119064aecc249dfcfe05e259197461ce23 • ios
      • iOS 15.3.1 19D52
    • macOS (desktop)           • macos                                    •
      darwin-x64     • macOS 12.2.1 21D62 darwin-x64
    • Chrome (web)              • chrome                                   •
      web-javascript • Google Chrome 109.0.5414.119

[✓] Network resources
    • All expected network resources are available.

! Doctor found issues in 1 category.

[!] Xcode - develop for iOS and macOS (Xcode 12.3)
    • Xcode at /Applications/Xcode.app/Contents/Developer
    ! Flutter recommends a minimum Xcode version of 13.
      Download the latest version or update via the Mac App Store.
    • CocoaPods version 1.11.2

[✓] Chrome - develop for the web
    • Chrome at /Applications/Google Chrome.app/Contents/MacOS/Google Chrome

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

[✓] Connected device (5 available)
    • SM G975F (mobile)       • RZ8M802WY0X • android-arm64   • Android 11 (API 30)
    • Darshan's iphone (mobile)  • 21150b119064aecc249dfcfe05e259197461ce23 •
      ios            • iOS 14.4.1 18D61
    • iPhone 12 Pro Max (mobile) • A5473606-0213-4FD8-BA16-553433949729     •
      ios            • com.apple.CoreSimulator.SimRuntime.iOS-14-3 (simulator)
    • macOS (desktop)            • macos                                    •
      darwin-x64     • Mac OS X 10.15.4 19E2269 darwin-x64
    • Chrome (web)               • chrome                                   •
      web-javascript • Google Chrome 98.0.4758.80

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

! Doctor found issues in 1 category.

@Tamilarasan-Paranthaman
I suspect SingleChildScrollView is the wrong tool for the job, you will have much better performances using a simple ListView.builder
please try the code sample below, here is the link to a dartpad sample
code sample

Well, reduce the vertical count to 50, and the SingleChildScrollView performs just like the ListView.builder. Why does it happen and what can be done to stop that from happening?

Well, reduce the vertical count to 50, and the SingleChildScrollView performs just like the ListView.builder. Why does it happen and what can be done to stop that from happening?

Basicly when you are scrolling flutter triggers painting phase, so you have to break your Row into smaller pieces (I would suggest to refactor Row -> Column to Column -> Row or just use the GridView).
Use ListView or CustomScrollView which will use RepaintBoundary for it's children by default.
If you want to stick with SingleChildScrollView then wrap your Container / Column by RepaintBoundary.

Well, reduce the vertical count to 50, and the SingleChildScrollView performs just like the ListView.builder. Why does it happen and what can be done to stop that from happening?

This is because a SingleChildScrollView does not lazily build children, but a ListView does. The more children you provide to a SingleChildScrollView, the more apparent the cost in performance of laying everything out is. It is called a single child scroll view very intentionally. It is not intended for use with many children.

specially noticeable using canvaskit renderer. With html renderer, the scrolling is much better and smooth

This is something for the web team to weigh in on when they have their weekly triage.

[...] In my application, I am using a SingleChildScrollView for some use cases.
[...] After testing this sample on both the MacOS Desktop and the Web on the Mac platform, I have observed a difference in scrolling performance between the two platforms. For your reference, I have attached videos demonstrating the issue.

@Tamilarasan-Paranthaman
I think you are making a good point, in some cases is not possible to implement it lazily (eg. https://github.com/flutter/flutter/issues/123204)
and web performance should match or be close enough to other platforms

This is because a SingleChildScrollView does not lazily build children, but a ListView does. The more children you provide to a SingleChildScrollView, the more apparent the cost in performance of laying everything out is. It is called a single child scroll view very intentionally. It is not intended for use with many children.

Got it! That makes sense, ListView is so much better for listing items. It should not be a problem.

Could this performance issue partially also be related to https://github.com/flutter/flutter/issues/122189?
After 3.7 Flutter was released, performance of any SKIA web build pretty much went down the drain, compared to where it was before. The optimization points above are still valid, but should not have a big impact on the example above.
Any significant amount text rendering is horrific on a canvaskit build now. Plus it leaks and will eventually crash. The more text/icons you have the worse it gets and the faster it crashes, especially if redrawn a lot like when toggling between light/dark mode multiple times.
The only workaround at the moment is unfortunately to use the html renderer.

possibly related to

https://github.com/flutter/flutter/issues/123484

https://github.com/flutter/flutter/issues/123484 is fixed now. Anyone available to test their apps at HEAD?

@grahamsmith
Thanks for checking! Can you please try again on this commit: 303d0d3e2b7131ed6177ec127f05a46f4307b519. We made another optimization with a significant improvement in some of our benchmarks. I checked the original repro as well and it improved significantly too. I'm curious if the gains are observable on other hardware/OS combinations.

It's 2am here so will check this in 12 hours or so.
Thanks for continuing to iterate on the issue.

This was reverted again (https://github.com/flutter/engine/pull/40937). I'm landing it again in https://github.com/flutter/engine/pull/40938. To make sure you get the right code when verifying the fix, syncing to specifically https://github.com/flutter/flutter/commit/303d0d3e2b7131ed6177ec127f05a46f4307b519 is the safest bet.

it would be nice to add a test/benchmark to prevent this issue to re-emerge in the future

@iapicca We have a benchmark, and it did show regressions (causing me to file https://github.com/flutter/flutter/issues/123484) and improvements. It just wasn't immediately obvious if this issue was caused by the same regression. The benchmark has been stable for a long time, since 2020, before we even launched CanvasKit in stable:

According to that benchmark this latest PR will hopefully make it the fastest it's ever been (you can see the last drop in the history chart, which covers the last couple of weeks, which is 2-3x faster than the previous fastest times we've seen).

I'm going to consider this as fixed. Performance optimization is never "done", but given that we're now 3x faster than pre-regression numbers I think this issue has served its purpose. We can open new issues for more specific cases.
The benchmark has been stable for almost a week now:

Thanks, everyone for reporting and kicking the tires!

@yjbanov can we expect the fix and https://github.com/flutter/engine/pull/40740 to land in beta channel soon? Would make them much more usable as interim solutions, while waiting for next stable (3.10?), than building with master, that can be bit too flaky sometimes.

@rydmike Yes, this should make it into the beta that will eventually become 3.10.


Interactive Meido

Still in development.

Always had, I already showed you a sample from the RB1 vn.

Grim

You can do it like Clipo and it may not be that much of a hassle to write, at least a simple version.

Found the code. It's gonna be full-featured with the whole package, along with rb1 vn. It's at the vn folder, and you can test the output I made a year ago here. Plans are at the Planning.txt at the same vn folder. I'll write up everything as soon as I find the time™.

PROGRESS: [][ ][ ][ ][ ][ ][ ] 14.28%

better than expected

Found the code. It's gonna be full-featured with the whole package, along with rb1 vn. It's at the vn folder, and you can test the output I made a year ago here. Plans are at the Planning.txt at the same vn folder. I'll write up everything as soon as I find the time™.

Wouldn't be better to put it in a separate repo? Well, not like this repo is the most organized thing ever.

Wouldn't be better to put it in a separate repo?

yes

I could probably help on the VN project as a dev if you want but since I didn't finish reading the rb1, don't expect me to be able to write any class

Wouldn't be better to put it in a separate repo?

Yes, but it's just there for backup. I'll make a separate repo for it.

I didn't finish reading the rb1

Same.

PROGRESS: [][ ][ ][ ][ ][ ][ ] 14.28%

better than expected

The original files for that with a template lobby is lost, so no it's worse sorry.

am I the only one that read rb1.....?

VN doko

i'll seriously start on a vn next week...

I can help after the league ends. In fact, I feel like if I help I'll end up coding the whole thing myself...

now if we only had a working script haha...

i'm still not sure on what direction is the vn going to head. will it be story-heavy, or will it be pure "learning mahjong with your favorite maid?" a class format, or should there be a proper storyline? i will write a proposal in the weekend so we can start from there

Make a new repo for it, don't clutter this one. We can also draft ideas there and use it to make a recruitment in the thread. What I would do is divide the game in 2 parts:

VN with story (full game)
RB1 teachings (skips the story mode and focuses on the learning)


Calculation of weights for un-weighted backends by controller

Calculating the weights for un-weighted backends by the controller would offload some of the work from the sidecar.  This weight calculation could potentially be returned in the controller API as implicit_weight

I think we should avoid any more fields in the JSON schema, especially for things like this. Two options:

We could actually replicate Nginx behavior and avoid the % based weights totally. In other words, you can specify any positive weight for a backend (100, 200, etc.). The controller can distribute the computed weights accordingly across the backends.

We could stick with existing weights (0-1.0]. In this case as well, the controller computes the weights for unweighted backends before passing them on to the sidecar.

I prefer the second option. Note that this will be a breaking change from the existing GET implementation, but maybe that's not so bad.

I think this has been handled in the recent changes to controller. @ijsnellf @GregHanson ?


Cannot connect to my Cosmos endpoint from MapReduce application

Query/Question
I am using the SDK in my Hadoop MapReduce application to post the results to a CosmosDB, and I am getting an error.
In the setup() function of my Reducer, I have this code:
        CosmosClient cosmos = new CosmosClientBuilder()
                .key("myKey")
                .endpoint("https://benhsu-cosmos-tryout.documents.azure.com:443/")
            .buildClient();

and when I run it, I get this stack trace:
Error: java.lang.RuntimeException: Client initialization failed. Check if the endpoint is reachable and if your auth token is valid. More info: https://aka.ms/cosmosdb-tsg-service-unavailable-java
	at com.azure.cosmos.implementation.RxDocumentClientImpl.initializeGatewayConfigurationReader(RxDocumentClientImpl.java:401)
	at com.azure.cosmos.implementation.RxDocumentClientImpl.init(RxDocumentClientImpl.java:436)
	at com.azure.cosmos.implementation.AsyncDocumentClient$Builder.build(AsyncDocumentClient.java:245)
	at com.azure.cosmos.CosmosAsyncClient.<init>(CosmosAsyncClient.java:127)
	at com.azure.cosmos.CosmosClientBuilder.buildAsyncClient(CosmosClientBuilder.java:773)
	at com.azure.cosmos.CosmosClient.<init>(CosmosClient.java:32)
	at com.azure.cosmos.CosmosClientBuilder.buildClient(CosmosClientBuilder.java:785)

What I have tried

As per https://aka.ms/cosmosdb-tsg-service-unavailable-java , I logged into the worker node (wn0-benhsu.4iaazpxvmzpexkmpw4balrlqpa.bx.internal.cloudapp.net) and tried to telnet benhsu-cosmos-tryout.documents.azure.com 443 and I was able to get a prompt back. Conclusion: no firewall issue
I took the "Azure Cosmos Java Getting Started" project (https://github.com/Azure-Samples/azure-cosmos-java-getting-started.git) , cloned it to the above worker node, and ran it with my hostname and key, and it worked. Conclusion: key is fine
in my Getting Started project from (2), I tried changing the key to a wrong key and got an error message, conclusion: its probably not my key that is wrong

So its not the key, not the hostname, and not the firewall, can you suggest some steps to figure out what else it could be? Do you have any sample code for using Cosmos SDK from MapReduce?
Why is this not a Bug or a feature Request?
I believe the code should work, but I have tried the troubleshooting/debugging steps provided and have not gotten anywhere.
Setup (please complete the following information if applicable):

OS: Ubuntu 18.04 (what Azure HDI Worker Nodes are running)
IDE: IntelliJ
Library/Libraries: Hadoop 2.6.0, Cosmos SDK version 4.26.0

Information Checklist

forgot to mention: this seems related to https://github.com/Azure/azure-sdk-for-java/issues/17866 , but the reporter there was connecting to an emulator

@benhsu  - that is older sample, approach to connecting mapreduce would be similar, rather using new V4 Java SDK.
It could also be related to DIRECT mode ports. I would recommend running the cosmosClient in GATEWAY mode, and see if it works fine.
If it does, then you will need to open ports from your worker node to be able to connect to Cosmos db. See this for more details - https://docs.microsoft.com/en-us/azure/cosmos-db/sql/sql-sdk-connection-modes#service-port-ranges

@kushagraThapar
Thank you, I will try this
Is this how I use Gateway mode?
        CosmosClient cosmos = new CosmosClientBuilder()
            .gatewayMode()
            .endpoint(cosmosEndpoint)
            .key(cosmosKey)
            .buildClient();

Also I tried some ports in the 10000 to 20000 range per the service port article
sshuser@wn0-benhsu:~$ telnet benhsu-cosmos-tryout.documents.azure.com 10500
Trying <IP_ADDRESS>...
^C ### FAIL
sshuser@wn0-benhsu:~$ telnet benhsu-cosmos-tryout.documents.azure.com 15000
Trying <IP_ADDRESS>...
Connected to cdb-ms-prod-eastus1-fd78.cloudapp.net.
Escape character is '^]'. ### SUCCESS

@benhsu - yes, that's the correct way of using gateway mode. I am surprised if the standalone application works, mapreduce should also work in your worker node.
Worth trying out the sample application with both direct and gateway mode, and then mapreduce application in the same way.

Hello. I looked more closely at my logs and found some classpath problems with Netty.
I was also able to connect from my worker node to Cosmos by modifying this code: https://docs.microsoft.com/en-us/azure/hdinsight/hadoop/apache-hadoop-develop-deploy-java-mapreduce-linux
I will try to use what I learned from  that demo code to get my actual job running. Will reach out if I get stuck resolving classpath issues


IA-980: add warning icon for bulk org unit update

Changes

Added  a "warning icon" (an emoji really) at the end of the confirmation message
Added a "sub-title" showing the amount of org units about to be modified
Added corresponding translations

This is really a ugly icon !! Is there anything better in material ui ?


Harvester: display the error message of insufficient storage volume

Summary

Occurred changes and/or fixed issues

https://github.com/harvester/harvester/issues/1695

Technical notes summary

Areas or cases that should be tested

Areas which could experience regressions

Screenshot/Video

Test cases
Case 1

Go to create a volume with<PHONE_NUMBER> Gi storage size.
The volume should not be created successfully.
The error message should be Exceed maximum size 999999999 Gi!

Case 2

Go to create a volume with 99999999 Gi storage size.
Back to volume list
The status of the volume should be NotReady
The error message should be insufficient storage

Case 3

Go to create a vm with the volume which is exceeded maximum storage size.
Go to vm detail page
Switch to volume tab
The status of the volume should be Degraded
The error message of the volume should be replica scheduling failed
Go to volume list page
The status of the volume should be Degraded
The error message of the volume should be replica scheduling failed

Case 4(ToDo)

Go to create a volume with appropriate size.
Go to resize it to 999999999Gi.
The status of the volume won't be NotReady
The error message won't be displayed.

Stop the vm
Resize the volume to 999999999Gi.
The status of the volume won't be NotReady
The error message won't be displayed.

Case 4 and case 5 are tracked: https://github.com/harvester/harvester/issues/3156


hashing uuids?

I saw that hashid intentionally doesn't support encoding strings because it's not secure, but I was wondering about hashing uuids as a way to shorten them (not for security). is that possible with this library? thanks!

I don't really get what you want, UUIDs are already numbers, totalling 128 bits IIRC, but in text form. So you might as well encode this into a hashid :)

Hey, thanks for your response!
What I was looking to do was take my database ID (a UUID) and make a short code for it using hash id.
IIRC, I realized that hashids != short ids, meaning that if i turn a UUID from base64 to base10 and then pass it into the hashid function, it'll still be a huge hash haha.


Proposal: universal method for premium subscriptions

After Apple's announcement about premium subscriptions (which many had expected), I've been thinking of a way that we could build a more universal "subscription" method that app developers could support.
Goals

To let podcasters monetize their podcasts directly via subscriptions, donations, exclusive access, bonuses, and more.
To provide podcast-app developers a framework to launch their own support and earn some extra profit, too.
to create a universal standard that would be easy for podcasters and podcast-consumers, and support the freedom of choice for consumption platforms.

Proposal: <podcast:exclusive>
My proposal is for a new <podcast:exclusive> tag and framework. The could be used at the channel level to lock an entire feed, at the item level to lock individual episodes, or even within an item to lock specific portions of content or additional bonuses.
While I think some of my idea might be invalid RSS or otherwise rough, I'll share it anyway to help inspire ideas for the problems I'm trying to solve.
Code concepts
There would be two ways to apply the "exclusive" feature: tag and attribute.
Tag: <podcast:exclusive roles="bronze,silver,gold">
Attribute: <enclosure exclusive-url="…" … /> or <title exclusive="90-minute episode">60-minute episode</title>
The idea is that the exclusive tag would wrap or mark whole items as exclusive, while the attribute would mark smaller pieces as exclusive.
A probably-invalid method for making an exclusive episode in a public feed could be like this:
<exclusive role="subscriber">
  <item>
    …
  </item>
</exclusive>
<item>
  …
</item>

My theory with this example is that it hides the item from unauthenticated users and from default RSS-reading apps (podcast apps or feed readers). This is not creating any security, only acting as a way to prevent exclusive content from showing in normal feed-reading places.
Or if you want the episode to be visible, only not downloadable, you could add the <podcast:exclusive> tag inside the item.
And if the only difference for the exclusive item is the media (like maybe an ad-free version), you would use the exclusive attribute on the enclosure (or maybe alternate enclosure).
Security and Authentication
Media would need to be stored in a secured method, such as with the Amazon S3 protocol. So the URL in the feed would be a normal URL that works for everyone, but the podcast app would have the access key stored to authenticate and access the media.
This would require some cooperation with podcast-publishing or hosting tools, to host with the authentication requirement. But neither the podcaster nor the host would have to manage the memberships, roles, and payments. That could be left to app developers.
I'm thinking that the podcaster could get an API key from their hosting account, sign up with the app-dev's website, give the app the API key and set pricing and roles, and then the app would handle payments, authorization, and access.
There could even be a way for the hosting provider or publishing tool to handle the admin while the podcast app simply interfaces via APIs, but I think that could be more difficult and more complicated than letting the app handle the admin.
Experience
The resulting experience would be very similar to the new Apple Podcasts Subscriptions, but in any supported app.
For example, PodFriend could integrate with this, apply ~3% for payment processing, pocket 12%, and the podcaster keeps 85%.
Maybe this could be merged in some way with the value block, too, so that if you stream a certain number of sats, you unlock exclusive access.
These are my rough thoughts for now.

Yes, that is invalid RSS.  But, I'm following what you're logic and I understand what you're trying to get at.  I think it can be done without wrapping by just tagging an item with a public key and then sending back a hash as an authentication that you have a private key given out by the feed owner.
Perhaps like this:
<item>
    <podcast:exclusive pubkey="1jfi3083ydnei228954fonnuroe" alternateEnclosure="[alternateEnclosureGuid]">
    <enclosure url="[episode teaser mp3 file url]" ...>
    <podcast:alternateEnclosure guid="[unique id]">...</podcast:alternateEnclosure>
</item>

Then the standard would be that the pubkey gets hashed with your private token and send back as a query param with the alternateEnclosure url like "https://example.org/path/to/privateaudio.mp3?token=1jdko4hw9aotv8aaahg"

What I'd like to try avoiding would be letting exclusive episodes display at all in "dumb" podcast apps that will list anything in the feed with a media file.

What I'd like to try avoiding would be letting exclusive episodes display at all in "dumb" podcast apps that will list anything in the feed with a media file.

I think for something like that we'd need to have a whole separate item tag, like <podcast:item>.
I think this overall concept is really neat and ambitious.  I'm willing to devote some time to fleshing it out.
Hey @agates , should alternateEnclosure's have some sort of unique identifier for situations like this where they might need to be addressable by other tags?

Hey @agates , should alternateEnclosure's have some sort of unique identifier for situations like this where they might need to be addressable by other tags?

If it's within the same item it could be the title of alternateEnclosure, although I don't quite understand what you mean.
How would the token be generated and why is it per alternateEnclosure?  It could be a child item of alternateEnclosure if that's the case, no?
<podcast:alternateEnclosure ....>
  <podcast:pubkey>1jfi3083ydnei228954fonnuroe</podcast:pubkey>
</podcast:alternateEnclsoure>

Although having it under the item makes sense -- I'm just not seeing the alternateEnclosure connection :).  And it wouldn't work with something like IPFS or magnet URLs either.

I don't know why the pubkey would need to be in the feed. I would think only the app would be given the pubkey by the podcaster.

The public key in the RSS feed would work perfect actually -- the application would need to support a private key added by the user.  This would definitely be an application-agnostic method to sign requests and make your proposal work, I'm just not sure of the specifics from dave

Exclusive episodes should be able to hide free episodes.
There are podcasts that offer ad free versions for subscribers. Some also do extended versions with pre and post shows.

Exclusive episodes should be able to hide free episodes.
There are podcasts that offer ad free versions for subscribers. Some also do extended versions with pre and post shows.

This could be handled by defining the alternateEnclosure as the exclusive, thus replacing the normal enclosure.
But I could see instances where you want something to display only to free followers and no alternative to subscribers. For example, a promotional episode for the premium content.
In such case, we could add an attribute to the exclusive tag that blocks the content from certain roles. So, instead of my roles attribute described above, it could be allow and block.
For example, <podcast:exclusive allow="silver"> shows the episode for only silver subscribers and no one else. And <podcast:exclusive block="silver"> hides the episode only silver subscribers, but anyone else (including free followers) can get it (assuming it's a native <item> visible to traditional apps).

The public key in the RSS feed would work perfect actually -- the application would need to support a private key added by the user. This would definitely be an application-agnostic method to sign requests and make your proposal work, I'm just not sure of the specifics from dave

Yes that’s exactly what I envisioned. When the feed gets added, the app asks for the private key and keeps it in remembered for signing.

Sounds good. Whatever it takes to make it work easily. Not like "my mom can't do it" level, but easy enough that the process doesn't turn people away and complements an app's smooth experience.
Tying this into a Satoshi-streaming app could let you set predetermined sat level(s) to unlock bonus content. Kind of like how Humble Bundle deals work, "Contribute more than __ sats per month/episode/week and unlock exclusive subscriber benefits!"

Love the idea. In a way this would be a higher tier than a ‘support the show’ tag potentially? Which is essentially a subscription without exclusive content.
Agree that looking at how the subscription is applied is useful since it’s a good implementation—correlating a subscription episode against a free one and showing it based on that, and having the option to tease content for free ones but not show up for paying subscribers is great.
Apps that implement this can create a URL-based flow, so we could show members a one-click add for compatible apps which adds both the feed and the pvtkey to make that slightly frictionless.

Great initiative @theDanielJLewis. I think I understand how it could work with private-public keys – but is it then easy for a podcast to 'depricate' a key of an individual subscriber, e.g. if their payments failed, so they no longer get access to new exclusive content?

There could even be a way for the hosting provider or publishing tool to handle the admin while the podcast app simply interfaces via APIs, but I think that could be more difficult and more complicated than letting the app handle the admin.

Not sure if that's still relevant with the latest ideas, but I'm thinking that the podcast apps should be as simple as possible.

As a listener, I would want to have no problem to move to another app, without having to deal with payment issues, or being afraid that my new app might not include payment systems that prevent me from enjoying it. When working with keys, they might be included in OPML files (?) that allow me to easily switch apps.
As a FOSS podcast developer I wouldn't want to deal with payment systems, just implement support for user access to private content. (Actually in general I'd say offering payment/exclusive content services should be one of the things that hosters can/should offer - taking admin out from the hands of the podcaster.)

There are some interesting ideas here.  However there is a mechanism to handle content like that already, usually password protected files.  I know that AntennaPod already supports this. This can be reused today and is supported today.  It is the RSS feed is where the problem is.
The big problem is the different RSS feeds required to show the free feed versus the paid one.  Typically if one gets their hands on the paid feed it can't be taken back, which isn't great.
I think the above goal is to have one feed, but lets say contain 2 episodes, one with ads and one without, free and paid respectively, and only have the episode that one has access to to show up in the feed.
One can possible set your own permissions level, which could just filter the feed accordingly, it is only when the user tries to fetch the paid file that the password will be requested and at that point success or blocked. So it is in the users interest to set the correct level even, it could be as simple as that.
I love public key signing and verification in ways I can't describe, but it is a order of magnitude jump in terms of support, do the gains justify it?

I realized a ridiculously easy way to write standard RSS while keeping some episodes exclusive: the alternate enclosure tag.
I believe all the podcast apps behave this same way: they'll display anything from the RSS feed as long as it has an enclosure. If an item doesn't have an enclosure, it won't display in the podcast app. That's our exclusive content right there. The apps will skip an item that has only alternateEnclosure, or it could display them disabled, but pay-subscribing will unlock those alternate enclosures that have the "exclusive" attribute.
About feeds, yes, the goal of this is to make it as seamless as possible for the listener. They click subscribe, enter their payment info, and they immediately get access to the exclusives. No additional feeds, no password entries.
And here's a new idea for how to handle this across apps, should a subscriber want to move: oauth.
If the app developer wants to support exclusive content in their app, but doesn't want to handle the admin (or share in the profit), they could authorize the user through an oauth token. The podcast would need the payment system set up (so this makes it suddenly much more complicated), but the user would simply click "subscribe" or "restore purchase," be prompted with an oauth sign-in, and then that unlocks the content, allowing them to switch to a different oauth app.
Then again, this doesn't work well moving from oauth to fully integrated app, or vice versa.
The other hurdle is, at least for iOS, I think Apple might have issues with an app that takes payments but doesn't give Apple their 15–30%.
But I like the discussions we're having. We can figure this all out and make something great that will be a win for everyone!

Password-protection works on only the entire feed. And I'd rather users not have to enter login information in the app at all. This can really mess with password auto-fills and also means the app is storing that private login information.

@theDanielJLewis
I don't see why the RSS feed can't be in an unpassword protected part of a site and it is only the files that are password protected (or not).  The issue here is correctly constructing a feed that can a) contain both the content for paid and unpaid b) only show the files you have permission for. Support needs to be added to do that
As to password logins etc etc, that is a known problem that has been solved loads of times, it might be a pain to do, but sure. Firefox and Chrome ask for you password once and stores it, what's wrong with that model?  In terms of getting something working with existing infrastructure this is probably the easier path.
However view my opinion as an "also" thing not an "instead of". There is no reason why both ways can't be listed as possibilities.

IMHO, it's better to not reinvent the wheel, and I agree with @douglaskastle on using HTTP Authentication :

it's already implemented on many podcasts clients
You enter your login/password once, the client remember it.
You can technically serve the free content when no login/password is used and switch to paid content when you enter a login/password
You can easily provide links with included token or login/password
Most podcatchers, directories, etc understand its a private feed when they see a username and password in URL

The main issue with HTTP Auth is getting all podcasts clients to understand they should not share this feed with logins when exporting or ingesting in their own directory. And I guess it's already a problem right now and most directories are already working on this.
I'm not sure what advantages you get from using private/public key on this, but I'm all hears. It's as easy to revoke either a private key or a login/password, and user/password is already largely implemented on client and on server side.

HTTP won't always be the only option for file transport.  Public/private keys would at least function for the file itself and be usable with IPFS etc.
Plus HTTP basic auth really isn't that secure, which is typically replaced with asymmetric encryption anyway.
It should be noted the irony of wanting DRM for podcasts leaves one thinking why not just stick with Apple

It should be noted the irony of wanting DRM for podcasts leaves one thinking why not just stick with Apple

Just on this point. I don't think there is anything wrong with what Apple is doing technically, it is just that it is Apple and once you are inside their walled garden the run the table.  Being able to recreate the feature they are adding and providing it out of their domain is still of value.

HTTP won't always be the only option for file transport. Public/private keys would at least function for the file itself and be usable with IPFS etc.

@agates is there a way to protect an IPFS file so that a person can see it exists but can't down load it unless they have some permission?  I thought if you are on the network it is open season, I personally have no problem with that.

Here is an example of the same feed providing different content when given a username/password
curl https://assets.podcloud.fr/feed/
curl -u michel:secret1234 https://assets.podcloud.fr/feed/
You also can achieve the same thing with a token inside the URL.

This is creeping into an idea I have had for a while, per user RSS feeds. Potentially everybody gets their own feed of .... The options here are enormous, maybe deserves its own issue ...

@agates IMHO Public/Private key is a bit overkill for this, and user specific tokens in file URL (HTTPS or IPFS or anything else) seems less work for the same result.
If the goal is to prevent files from "leaking", and be given to people whom didn't paid for it... One could easily share his private/public key, as they could with a "unique token URL". I think building an  asymetric cryptographic DRM system for podcasts episodes seems too much a hassle for the result we will get on either way : people will share the mp3 files if they want to.

Being able to recreate the feature they are adding...
@douglaskastle This is where I'm a bit lost, because we already have hundred of premium subscriptions podcasts in the wild. It seems we are kind of recreating an Apple re-creation of something that already exists and works.

I do understand the need to make it future proof etc, but we should not forget this kind of thing already exists and maybe we should build on it, and salvage some concepts and ideas, and not re-start everything from scratch.

per user RSS feeds

IMHO that's the way to go. You can have a main guest feed, and users subscribing to exclusive content get their own RSS feed.

@douglaskastle This is where I'm a bit lost, because we already have hundred of premium subscriptions podcasts in the wild. It seems we are kind of recreating an Apple re-creation of something that already exists and works.

@PofMagicfingers yes you are right. I think the best feasible solution should be used and not be limited by the Apple solution either.
I do find though that some of the premium solutions that low level podcasters are using are not fit for purpose. A lot of people who are on patreon are usually putting out two separate feeds. I think I know that patreon have a better solution, but the people are am supporting are struggling then to figure out how to use it.  Believe it or not a simple UX on the hosting side here will make or break this one. Too hard, it won't be used.

Believe it or not a simple UX on the hosting side here will make or break this one

Exactly, I think here the main problem is an UX problem, not a technical problem. Maybe we could imagine something like a channel wide attribute and something that kind of works like oauth : <podcast:exclusive uuid="anuuid" authUrl="https://hostingplatform.com/premium-feeds/login/" label="Unlock exclusive content">
Your podcast client will then show you a button "Unlock exclusive content", opening a webview to the URL given. There, the hosting platform will inform you about the exclusive content and let you subscribe, register, login, etc.
Then it will redirect you to your own personally crafted RSS feed. This is when the podcast client detects the redirection to a RSS feed and understand this is an update of the feed which you clicked on the button. If you use a redirect url to open the premium feed into the app, it should compare the uuid to update the existing feed instead of adding a new one

Earlier in this thread, people are writing about producing dynamic, personally-crafted RSS feeds for everyone. https://medium.com/acast/an-ode-to-rss-and-a-toast-to-the-future-e181a9f65a39 is Acast selling exactly this. (And I'd agree with the idea - indeed, I could already produce a dynamic RSS feed for Podnews which gives US people different content to UK people.
For login, I would be very keen to use OAUTH or similar; noting that https://www.facebook.com/login might open in the Facebook app rather than in a webview, and therefore the user might see nothing at all (or a simple consent screen). But I agree with the above that it is not a technical issue, and more of a UX one. Current solutions are clunky, or just don't work.

Adding my 2 satoshis here. I was thinking about the app sending a header with the mp3 download.
The header could hold the sender GUID and signature. Of the downloader/app has donated enough sats, the server could send a customized MP3.

personally-crafted RSS feeds

Yup ! I think that could be a great idea. That's what we're doing at podCloud : we are both a hosting company and a listening webapp / catalog. When you subscribe to a podcast on podCloud, you can get a personal RSS feed.
We're not providing premium subscriptions (yet), but every user can have his own personnal RSS feed for a podcast, a playlist or subscriptions.
It allow us for example, to gather all subscribed RSS feed into one : when I change my phone, I only re-subscribe to this feed on my podcast app (Podcast Addict)
We mark items as played when downloaded : we add a token inside the enclosure url. Items already played are shown with an :heavy_check_mark: in the title.

User tailored RSS seems a more reliable method for serving premium content. However, it does have its issues, especially with privacy : you can track precisely which user has listened to what etc. Some hosting services/podcasters already do it, some listeners won't care, some will not like this.

Earlier in this thread, people are writing about producing dynamic, personally-crafted RSS feeds for everyone. https://medium.com/acast/an-ode-to-rss-and-a-toast-to-the-future-e181a9f65a39 is Acast selling exactly this.

Jebus! I have been thinking about this for years, the day I mention it online there is a article and product  doing just that!
I also had been looking at it though as a curated feed.  You might be delivered suggested podcast episodes from a variety of different podcasts delivered into one feed based on some aspect of preference.  I am sure it could be widely abused, but driving new podcast discovery right inside your own podcatcher, and that would be a service providable in any podcatcher as is.

your own personally crafted RSS feed. This is when the podcast client detects the redirection to a RSS feed and understand this is an update of the feed which you clicked on the button. If you use a redirect url to open the premium feed into the app, it should compare the uuid to update the existing feed instead of adding a new one

Without knowing the tech details, I'm just thinking this might be tricky. E.g. quite a few FOSS enthusiasts combining AntennaPod and Gpodder.net are already faced with duplicate feeds (because the URL is different, or mal-redirected). I imagine the same would be true for (many) other client-server combinations. This makes it arguably less backwards compatible (compared to more generic authorisation mechanisms which might not have this issue).
And indeed there's the privacy issue @PofMagicfingers mentioned. And I'm wondering: would I still be able to share my OPML file with my parents to get them started with a great set of podcasts? Or will half of the links don't work because they're personal to me?

For the podcaster, they’re also safe in the knowledge that each paying member’s private feed is unique to them, which — along with plenty of other security measures — protects against piracy.
Acast firmly believes that podcasting, both now and in the future, should remain open and accessible to all.

Dynamic RSS sounds super interesting. But this somehow reads to me as (technically) incompatible. I.e. what does an open feed contain if it's tailored to every individual user?

quite a few FOSS enthusiasts combining AntennaPod and Gpodder.net are already faced with duplicate feeds (because the URL is different, or mal-redirected). I imagine the same would be true for (many) other client-server combinations.

There should not be any issues with duplicates : premium feeds are not meant to be part of public catalogs/directories.
In the authentication flow I'm describing, the podcast client itself is opening the provider website for you to login, and it gets back the user tailored rss feed, and replace the generic one with the premium one. Therefore the podcatcher cannot be confused between the 2 urls, because it is itself that is requesting the latter one.

This makes it arguably less backwards compatible (compared to more generic authorisation mechanisms which might not have this issue).

Well, the flow I'm describing is using in the end, current authentication mechanism (either http auth or a secret token in the premium feed url). It's just an UX improvement allowing to jump from a generic feed to a user specific premium feed from within the podcatchers, without having to remove and replace the feed url.

And indeed there's the privacy issue @PofMagicfingers mentioned. And I'm wondering: would I still be able to share my OPML file with my parents to get them started with a great set of podcasts? Or will half of the links don't work because they're personal to me?

All links will still works, but they're tied to your "user". It's already the case when you share an OPML with, for example, a patreon exclusives rss feed.

premium feeds are not meant to be part of public catalogs/directories.
the podcatcher cannot be confused between the 2 urls, because it is itself that is requesting the latter one.

I was referring to duplication with internal syncing, not indexing in public catalogs. I.e. if I am subscribed to a podcast, it gets updated to a private version in the database by AntennaPod as you describe, gpodder.net might not recognise this 'change' and add the private feed as an 'extra' feed. The mechanism with UUID recognition should be present in all clients/private servers in order for this to work. I don't think that's realistic, and as far as I can see it'll be a breaking change for the users of such systems (whereas tags would be less breaking).

the flow I'm describing is using in the end, current authentication mechanism (either http auth or a secret token in the premium feed url). It's just an UX improvement

I agree the UX flow is nice. But the authentication happens on feed level – I don't see why it shouldn't happen on file level. If authentication happens on file level (even with the UX you describe)

the feed remains the same (no clients or private servers have to implement feed-changing mechanisms) and
differentiation between users happens on client level using tags (support for tags should be implemented by clients).

All in all: I see that Personal feeds/Dynamic RSS can offer cool new things. But it is not required to achieve premium feeds (topic of this issue). And my gut feeling is that it's more work for developers and more breaking than including support for hiding/displaying feeds based on tags (e.g. enclosure). So maybe personal/dynamic RSS deserves its own issue?

One issue has come up as part of the Spotify Paid Subscriptions today - here's a snippet from Podnews later:

Listeners can't buy a paid subscription to your podcast in the Spotify app. (If they did, Apple and Google would want up to 30% of the money). Instead, they'll get taken to an Anchor web-page, and listeners will be asked to enter their credit card details. For Apple listeners, it's as simple as buying an app.

Worth just bearing in mind that, therefore, the UX is likely not to include podcast apps - merely a link to subscribe.
Also worth bearing in mind that podcast developers need paying too, and if we expect them to write this code, we might wish to consider how they can benefit.

gpodder.net might not recognise this 'change' and add the private feed as an 'extra'

I'm sorry, I don't use AntennaPod and gpodder...
But right now, if you are subscribed to a feed on your app, and edit that feed to update its URL, or if the feed redirects you to a new one, what does happen in gpodder?
If gpodder duplicates the feed, maybe it's an issue in the sync system between them.
If we design a new system/ux for premium subscriptions, yes it will work better with apps supporting it. I can't imagine AntennaPod implementing the new premium feed system, and forgetting to take gpodder sync into account...
Right now, if I'm listening to a podcast and it has premium episodes... if I pay for it, they will give me a new secret rss feed, and I'll go to my podcast app, and I'll edit that podcast subscription to change the URL. Or maybe I'll delete the old one and add the new one.
In either case, I'm describing exactly the same thing but paying is inside the app if supported and RSS url update is done automatically if supported.

I don't see why it shouldn't happen on file level.
I don't see why it should happen on file level : you will most likely only have only one account on the podcaster/hosting website... I don't see why you would authenticate for each premium content.

If you're offering a pay-per-episode podcast, you will still be able to purchase the episode, it will be linked into your account, and updating the feed makes appear the new premium episode you bought 🤷
You will anyway have an auth to do per feed, or per hosting service...
The UX I was describing is just an idea, maybe the auth mecanism can be something else, maybe we can imagine a  Authorization header supported by apps and servers, allowing them to get the user purchased content in the feed on the fly.

differentiation between users happens on client level based on tags in the feed (support for tags should be implemented by clients).

I strongly disagree on this one. As a hosting company I'd rather include only what the user is requesting than all episodes "just in case" they have bought one.
Netflix is only showing you shows and movies you have access to, not the whole catalog, filtered on client side.
If you go to an onlyfans page, they do not include all pictures hidden or encrypted on the page, and unlock them when you pay 😁

If you go to an onlyfans page, they do not include all pictures hidden or encrypted on the page, and unlock them when you pay

The porn guys figured this stuff all out years ago, we should be looking at them to see what they do ... is the excuse I'll be using if my wife catches me on one of their sites.

I don't really see what any of this has to do with a the Podcast Namespace?

I think we're discussing the best way for a rss feed to advertise to podcast client that a premium version is available, with tags.

That sounds like a terrible user experience and asking applications to implement it would be a tough bargain when they don't gain anything, doesn't matter how good the standard is.
The podcaster can announce it in the podcast/description itself and they have done so for a long time.
Alternatively, allowing the user to actually reward the podcast in real time while listening is already there, no?

asking applications to implement it would be a tough bargain when they don't gain anything

Well, they already show funding links without gaining anything.
But as I said before, I think this should be taken care of on server / hosting side, with custom rss feeds, like everyone is already doing right now.
I don't really think all app developers would be keen to implement a whole pub/priv key DRM system on each app.

You can technically serve the free content when no login/password is used and switch to paid content when you enter a login/password

Can we? I think the best user experience is to default to the public view, with a login button that can appear when the feed contains exclusive content, for example, "log in for exclusives."

we already have hundred of premium subscriptions podcasts in the wild

Yes, but they're 100% exclusive, not the hybrid model I'm proposing where logging in grants access to content already in the feed. Users should not have to resubscribe.

per user RSS feeds

IMHO that's the way to go. You can have a main guest feed, and users subscribing to exclusive content get their own RSS feed.

This already exists for years. I think Wishlist Member was the first highly available publishing tool to allow it. But it's a total pain for users. Again, users should not have to resubscribe.

That sounds like a terrible user experience and asking applications to implement it would be a tough bargain when they don't gain anything, doesn't matter how good the standard is.

That's why I started this suggesting a way app devs can benefit and take a reasonable cut (maybe 5–10%).
I'm absolutely anti-DRM. I think that provides way too many complications for everyone.

If we go down this road, I would aim for a solution like SQRL uses, with a master key that can be used to derive individual public/private key pairs per subscriber:
SQRL Exaplainer - page 7
I'm not sure it would work any other way.

I think standardizing on use of Authorization headers might be a good start.  A standard way of token retrieval would be even better.  This would allow use of traditional auth services and potentially even something like #355 for lightning payments.

Not yet. I haven’t written that proposal up into the namespace docs yet. Still trying to figure out how it relates the podpass system we found.


--bug-report will result in poxy experiencing repetitive self-invocation

Environment
version and/or commit hash:
0.13.4
Describe the bug
--bug-report will result in poxy experiencing repetitive self-invocation, where removing --bug-report from its children does not appear to take place.
C:\Users\wroy\Desktop\echo\doc>poxy --bug-report
Preparing output paths
Invoking poxy
Traceback (most recent call last):
  File "<frozen runpy>", line 198, in _run_module_as_main
  File "<frozen runpy>", line 88, in _run_code
  File "C:\Users\wroy\AppData\Local\Programs\Python\Python311\Scripts\poxy.exe\__main__.py", line 7, in <module>
  File "C:\Users\wroy\AppData\Local\Programs\Python\Python311\Lib\site-packages\poxy\main.py", line 74, in main
    _invoker(main, invoker=False)
  File "C:\Users\wroy\AppData\Local\Programs\Python\Python311\Lib\site-packages\poxy\main.py", line 26, in _invoker
    func(**kwargs)
  File "C:\Users\wroy\AppData\Local\Programs\Python\Python311\Lib\site-packages\poxy\main.py", line 239, in main
    result = subprocess.run(
             ^^^^^^^^^^^^^^^
  File "C:\Users\wroy\AppData\Local\Programs\Python\Python311\Lib\subprocess.py", line 550, in run
    stdout, stderr = process.communicate(input, timeout=timeout)
                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\wroy\AppData\Local\Programs\Python\Python311\Lib\subprocess.py", line 1196, in communicate
    stdout = self.stdout.read()
             ^^^^^^^^^^^^^^^^^^
  File "<frozen codecs>", line 319, in decode
KeyboardInterrupt
^C

lmao. "but who watches the watchmen?"


Dynamically added child with an empty path isn't being rendered, even when renavigating using the empty path

Version
4.0.11
Reproduction link
stackblitz.com
Steps to reproduce
Go to the path of the dynamically added child of Root (as it is an empty path, stick to the default url in the provided reproduction environment)
What is expected?
Root.vue  should be rendered in App.vue's router-view and  Home.vue should be rendered in Root.vue’s router-view
What is actually happening?
Root.vue is properly rendered in App.vue's router-view but Home.vue isn't rendered in Root.vue's router-view

This issue only occurs when using an empty path for the dynamically added child. With a non empty path and adding the child dynamically, it works. It works too with an empty path when the child is not added dynamically but defined directly in Root's children property

All root paths must start with a leading slash. There should be a warning about it in the console

I don't see a warning but I added it anyway, thanks. That done, the main issue still remains. Or maybe it's the expected behavior and so not an issue 🤔

A solution I found is to check that the matcher that is going to be inserted is not a child of the current itterated matcher here :
https://github.com/vuejs/router/blob/8744ea77eb71a876cc1e0e2675904c76578fb025/src/matcher/index.ts#L214-L220
So with this function :
  function isChildOf(child: RouteRecordMatcher, parent: RouteRecordMatcher): Boolean {
    return parent.children.some(currChild => {
      if (currChild === child) return true

      return isChildOf(child, currChild)
    })
  }

Adding !isChildOf(matcher, matchers[i]) as another condition in the while loop works.
What do you think about it ?


need a test to check that we no conflicting names of metrics

Let's create a test that will run all scripts in the metrics/ directory, collect their outputs and make sure we have only unique names. We do this in report.sh, but we don't test their uniqueness there. Let's create a unit test for this.

Seems to be ready for merging -- check pull-request #262, please!


Definitive guide for node API access

Is there a definitive guide for connecting to the VSTS API in a build/release task.
I have looked at a bunch of tasks in github and they all seem to do it differently.
For example:

Tasks in this repo seem to use the variable SYSTEMVSSCONNECTION
Other private repos seem to use SYSTEM.ACCESSTOKEN, which requires the "Allow scripts to access OAuth token" to be enabled.
Others seem to make direct HTTP calls to the endpoints and builds everything up manually.

Am I right in thinking that the SYSTEMVSSCONNECTION is only available to tasks in this repo?  If we are writing our own tasks, we need to use the SYSTEM.ACCESSTOKEN option?
Is there a definitive guide for this?  I have looked and looked, but can't find anything.

not an issue with task in this repo.  seems like an issue for vsts-task-lib

It would still be nice to know why you have chosen to use SYSTEMVSSCONNECTION in this repo, rather than SYSTEM.ACCESSTOKEN.  You must have some insight on that.

vsts-task-lib is the repo for that.  This repo is for the in the box tasks (/Tasks)


feat:  Allow review rejections to be undone

Addresses most of #5978 and part of #6169

There's at least one rough edge (and this all needs tests).
I ran through having cellar-flac assigned to me, and then rejecting/accepting/rejecting a few times. In my dev instance I've rejected the assignment there are no other assignements, and the open assignments management page doesn't allow the secretary to assign it to me again. The request, as I understand it, is to have me show up on the list here, but marked "has previously rejected reviewing this doc":

(right side truncated to not overshare current states)

@russhousley @ajeanmahoney @kivinen
This is what the assignment page will look like for a reviewer that has rejected a review before. This is Russ' view after both of us have been assigned and rejected the document.
Is the UI here intuitive enough? And if you have this as secretaries (if you were logged in, Jean, you would see accept buttons for both of us), would you be ok not having the person show up in the list above?

I would typically work from the list on the Manage unassigned open review requests page rather than an individual review request page. As secretary, I would expect to see all available reviewers.
On the individual review request page, the secretary is reassigning to Russ, yes?
Maybe add a date to "Assignment rejected" under the reviewer name, e.g., "Assignment previously rejected 18 Sept 2023". Maybe there should be a Reject again button?


Fix: interface and union ordering

This fixes the following bugs:

Interface no longer must be declared before any inheriting types
Unions are correctly added to the GraphQL schema

Fixes https://github.com/GraphQLSwift/Graphiti/issues/96

@NeedleInAJayStack, mind doing the new version release? I am not very good with naming new releases

Oh awesome @d-exclaimation! Thanks for adding your test recommendation in! I can definitely do the release no problem.


[Placement Group] Add support for soft anti affinity

Add support for soft anti affinity

To determine if FC supports SoftAntiAffinity, check if SoftAntiAffinity property is present in Affinity Rule class

For containers, fix issue where wrong volume is matched due to partial prefix match.

/azp run

/azp run

/azp run


Check SWC as alternative to TypeScript default build

SWC seems to support almost everything nowadays. Check it out as alternative build step to:

Maybe get easy minify, compress, and mangled release.
Support Rust based alternatives

In case of larger hardcoded sets of TS objects the minification would probably be notable benefit.

SWC does not seem to emit TS types (yet). The build process was super fast & minification results seemed good, but needs additional step of still running TSC with only types being emitted.


change test coverage requirement from 90% to 89%

Description
reducing coverage requirement to 89% to not get failures in CI.
Changes
Tests
Known Issues
Notes
We are actually over 90% test coverage, but since the CI skips integration tests, it comes out to less than 90%
Checklist

[ ] My name is on the list of contributors (CONTRIBUTORS.md) in the pull request source branch.
[ ] I have updated the documentation to reflect my changes.

I think we have tests covering almost everything, so it would be hard to create another test to bump up the test coverage.
I thought of creating a test for pagiantor.py class, but since that will send a request to the API to get results, it will also need to be skipped and will not bump up the overall test coverage percentage.


Aid testing by not wrapping flexmock expectation exceptions

Usually API methods will wrap any exceptions in OsbsException. However, if the exception is e.g. a MethodCallError, perhaps because a function expected never to be called has been called, this may cause a test to pass and mask a bug.
Don't wrap MethodCallError or other flexmock expectation exceptions.
Signed-off-by: Tim Waugh<EMAIL_ADDRESS>

Added test case.


2.1.3

Codecov Report

Merging #56 (ff0db1c) into release (efbf777) will decrease coverage by 0.14%.
The diff coverage is 57.37%.

@@             Coverage Diff             @@
##           release      #56      +/-   ##
===========================================
- Coverage    72.10%   71.95%   -0.15%
===========================================
  Files           17       17
  Lines         3348     3391      +43
===========================================
+ Hits          2414     2440      +26
- Misses         934      951      +17

Impacted Files
Coverage Δ

firepit/pgstorage.py
22.53% <11.76%> (-0.13%)
:arrow_down:

firepit/sqlstorage.py
85.87% <33.33%> (-0.35%)
:arrow_down:

firepit/cli.py
53.33% <50.00%> (ø)

firepit/splitter.py
82.79% <50.00%> (ø)

firepit/sqlitestorage.py
88.70% <77.77%> (-1.24%)
:arrow_down:

firepit/query.py
91.81% <87.50%> (-0.12%)
:arrow_down:

firepit/__init__.py
84.21% <100.00%> (ø)

firepit/splint.py
32.66% <100.00%> (ø)

firepit/stix20.py
84.84% <100.00%> (+0.59%)
:arrow_up:

firepit/woodchipper.py
73.59% <100.00%> (ø)

Continue to review full report at Codecov.

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


actorODP module report from the 2nd evaluation

ActorODP 0.2
Report from OOPS!

[ ] P08, Missing annotations, resourceODP:Resource, processODP:Process
[ ] P11, Missing domain or range in properties, actorODP:hasLocation, actor:capabilityExtent, actorODP:participationEndTime, actor:neededResourceRelation, actorODP:capabilityProperty
[x] P10, ~Missing disjointness~
[ ] P13, Inverse relationships not explicitly declared
[x] P39, ~Ambiguous namespace~

Report from FOOPS!

[ ] R1, Recommended/Detailed metadata, doi, publisher, logo, status, issued, OPTIONAL: precious version, backwards compatibility, modified
[x] F4, Error when retrieving prefix
[x] F4/A2, Ontology not found in a public registry
[x] F1, ~Ontology URI is different from ontology ID, Your ontologyURI (e.g., its w3id) should be the same as the one used within the ontology itself. Ontology URI: http://w3id.org/CEON/ontology/actorODP. Provided URI: https://w3id.org/CEON/ontology/actorODP/0.2~

See the following comments:
https://github.com/LiUSemWeb/CEON/issues/259#issuecomment-2413205462
https://github.com/LiUSemWeb/CEON/issues/259#issuecomment-2413224530
https://github.com/LiUSemWeb/CEON/issues/259#issuecomment-2413260918


DownloadFiles and UploadFiles conflict with RabbitMQTask

Frends.Community.RabbitMQ.RabbitMQTask.ReadMessageString 1.6.3
Frends.SFTP.DownloadFiles.SFTP.DownloadFiles 2.10.0 or Frends.SFTP.DownloadFiles.SFTP.DownloadFiles 2.10.0
Using the RabbitMQ task and any of DownloadFiles/UploadFiles produces the following error:

System.IO.IOException
Message
connection.start was never received, likely due to a network timeout
StackTraceString
at RabbitMQ.Client.Framing.Impl.Connection.StartAndTune()
at RabbitMQ.Client.Framing.Impl.Connection.Open(Boolean insist)
at RabbitMQ.Client.Framing.Impl.Connection..ctor(IConnectionFactory factory, Boolean insist, IFrameHandler frameHandler, String clientProvidedName)
at RabbitMQ.Client.Framing.Impl.AutorecoveringConnection.Init(IFrameHandler fh)
at RabbitMQ.Client.ConnectionFactory.CreateConnection(IEndpointResolver endpointResolver, String clientProvidedName)
InnerException
null

Internal issue link: FRR-203

We have tested this in very different setups and could not reproduce the problem. Until further additional input we are closing this issue.


Can task DownloadPackage@1 be used to download dependency from Maven ?

https://github.com/MicrosoftDocs/azure-devops-docs/blob/master/docs/pipelines/tasks/utility/download-package.md
I am trying to download a dependency from Maven during the build phase. I am using DownloadPackage@1 task.
- task: DownloadPackage@1
  displayName: 'Download Datadog Agent'
  inputs:
    packageType: 'maven'
    feed: 'internal-azure-feed-name'
    definition: 'com.datadoghq:dd-java-agent'
    version: '0.59.0'
    files: '*.jar'
    downloadPath: '$(Build.SourcesDirectory)/datadog'

The artifact is not present in the feed so I am assuming it should try get it from upstream global maven.
https://repo.maven.apache.org/maven2/com/datadoghq/dd-java-agent/0.59.0/
Is that assumption correct?
However I get the following error in the pipeline.

(node:3420) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 1): Package with name com.datadoghq:dd-java-agent not found.

I am trying to figure out the right task for this job. Is DownloadPackage@1 the right thing to use for this?
Or should I try something like UniversalPackage@0 ?

@neshant Thank you for the question.
Please note that support options in this forum are limited to issues in the documentation examples only.
Otherwise, the issue can be moved to one of the following support channels:

Azure DevOps community
Azure DevOps support
Azure DevOps on Stack Overflow