PageView controller's jumpToPage doesn't work properly on Android when jumping to a page after a new child was added, since 1.19.0-4.1.pre

When using a PageView, if the developer wants to keep the user on the "same" page when the children change, so that the user's experience doesn't get affected, it will not work on Android as of 1.19.0-4.1.pre, if the user is on the last page of the PageView.
So imagine there are 4 pages, and the user is on Page 4. If a new page is added somewhere before Page 4, jumping to Page 5 to keep the user's experience unaffected no longer works on Android only as of 1.19.0-4.1.pre (from the beta channel). This does still work on iOS (using 1.19.0-4.1.pre and even the current 1.20 builds), and it also worked properly on Android on 1.19.0-4.0.pre (from the dev channel).
The trick I use is to call jumpToPage on the pageController right from the didUpdateWidget method, so that the next frame that is built correctly shows the same page as if nothing changed.
The following code reproduces this issue on Android, when building with Flutter 1.19.0-4.1.pre or later, and still works well on iOS. If you run this with flutter 1.19.0-4.0.pre on Android, it works as well.
Simply tap "Add" and you'll see the same page remains, but you can see that if you scroll, new pages can be found. If you go all the way to the last page (100), and press Add, you'll see that the PageView scrolls.
Another issue also in build 1.19.0-4.1.pre and later (only on Android as well) is that if you stay on the last page and Tap remove until all pages have been removed except for page 100, then trying to scroll does nothing (which is expected). Now add a new page, and notice you can no longer scroll, until you add yet another page again. This also does not happen on iOS.

Expand to see code

import 'package:flutter/material.dart';
import 'package:flutter/rendering.dart';
import 'dart:math' as Math;

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

class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: PageViewHomePage(),
    );
  }
}

class PageViewHomePage extends StatefulWidget {
  const PageViewHomePage();

  @override
  _PageViewHomePageState createState()  => _PageViewHomePageState();
}

class _PageViewHomePageState extends State<PageViewHomePage> {

  int _nextPageNum = 1;
  Math.Random _rand = Math.Random();
  List<CarouselPage> _pages = List();

  @override
  void initState() {
    super.initState();

    for (int i=0; i<5; i++) {
      _pages.add(CarouselPage(
          key: ValueKey("$_nextPageNum"),
          color: Color.fromARGB(
              255,
              (255 * _rand.nextDouble()).toInt(),
              (255 * _rand.nextDouble()).toInt(),
              (255 * _rand.nextDouble()).toInt()
          ),
          number: _nextPageNum++
      )
      );
    }
    _pages.add(CarouselPage(color: Colors.white, number: 100));
  }

  @override
  void dispose() {
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Column(
        children: <Widget>[
          Expanded(child: Carousel(
              pages: _pages
          )),
          Row(
            children: <Widget>[
              Expanded(child: Container()),
              FlatButton(
                child: Text("Add"),
                onPressed: () {
                  int index = _pages.length == 1 ? 0 : _rand.nextInt(_pages.length - 1);
                  _pages.insert(index, CarouselPage(
                      key: ValueKey("$_nextPageNum"),
                      color: Color.fromARGB(
                          255,
                          (255 * _rand.nextDouble()).toInt(),
                          (255 * _rand.nextDouble()).toInt(),
                          (255 * _rand.nextDouble()).toInt()
                      ),
                      number: _nextPageNum++
                  ));
                  setState(() {

                  });
                },
              ),
              Text(" | "),
              FlatButton(
                child: Text("Remove"),
                onPressed: () {
                  if (_pages.length > 1) {
                    _pages.removeAt(0);
                    setState(() {

                    });
                  }
                },
              ),
              Expanded(child: Container())
            ],
          )
        ],
      ),
    );
  }
}

class CarouselPage extends StatelessWidget {
  const CarouselPage({
    this.color,
    this.number,
    Key key
  }) : super(key: key);

  final Color color;
  final int number;

  @override
  Widget build(BuildContext context) {
    return Container(
        color: color,
        child: Center(
            child: Text("$number")
        )
    );
  }
}

class Carousel extends StatefulWidget {
  const Carousel({
    Key key,
    this.pages
  }) : super(key: key);

  final List<CarouselPage> pages;

  @override
  _CarouselState createState()  => _CarouselState();
}

class _CarouselState extends State<Carousel> {

  // page variables
  PageController _pageController;
  int _currentPage = 0;

  // controls updates outside of user interaction
  List<CarouselPage> _pages;
  List<CarouselPage> _queuedPages;
  bool _scrolling = false;
  bool _pagesChanged = false;
  bool _pageChangeQueued = false;
  bool _handlingPagesChange = false;
  bool _jumpingToPage = false;

  @override
  void initState() {
    super.initState();

    _pages = List.from(widget.pages);

    _pageController = PageController(
        initialPage: 0,
        keepPage: false
    );
  }

  @override
  void didUpdateWidget(Carousel oldWidget) {
    super.didUpdateWidget(oldWidget);

    // we are still updating the pages from a previous request,
    // so we can just queue this request and it will be
    // processed when the previous request is complete
    if (_pagesChanged) {
      _pageChangeQueued = true;
      return;
    }

    _pagesChanged = true;

    // handle the changes
    _handlePagesChanged();
  }

  @override
  void dispose() {
    _pageController.dispose();

    super.dispose();
  }

  static const double scrollBoundaryEpsilon = 0.001;
  bool _isOnPageBoundary(int page) {
    if (!_pageController.hasClients) {
      // the page view hasn't been built yet, so we should just return true
      return true;
    }
    double currentPage = _pageController.page;
    return currentPage >= page.toDouble() - scrollBoundaryEpsilon &&
        currentPage <= page.toDouble() + scrollBoundaryEpsilon;
  }

  bool _onScrollNotification(ScrollNotification notification) {
    if (notification is ScrollStartNotification) {

      _scrolling = true;
      // only setState if _handlingPagesChange is false
      // otherwise, we are already potentially calling setState()
      // This setState() is needed because the _scrolling variable is changing
      // which controls our IgnorePointer widget
      if (!_handlingPagesChange) {
        setState(() {});
      }
    }
    else if (notification is ScrollUpdateNotification) {
      // calculate the current page
      int page = _pageController.page.round();

      // check if the page has changed
      if (!_jumpingToPage) {
        if (_currentPage != page) {
          print("Carousel page changed: $page");
          _onPageChanged(page);
        }
      }
    }
    else if (notification is ScrollEndNotification) {
      // we always only evaluate when the page
      // value is on a true page boundary
      if (_isOnPageBoundary(_pageController.page.round())) {

        _scrolling = false;
        // only setState if _handlingPagesChange is false
        // otherwise, we are already potentially calling setState()
        // This setState() is needed because the _scrolling variable is changing
        // which controls our IgnorePointer widget
        if (!_handlingPagesChange) {
          setState(() {});
        }

        if (_pagesChanged) {
          _handlePagesChanged();
        }
      }
    }

    // this event doesn't need to bubble up the tree
    return true;
  }

  void _onPageChanged(int newPage) {
    _currentPage = newPage;
  }

  void _handlePagesChanged() {
    // this should technically never happen, but just in case
    // a scroll ends and we come back in here, let's ignore.
    if (_handlingPagesChange) {
      return;
    }

    // let's determine if the current selected page is still present
    // if so, let's determine which page it is in the new list
    // while we're at it, let's also determine if the pages are identical
    // if they are, we'll allow an update even if we're currently scrolling
    int oldPage = -1;
    int newPage = -1;
    bool pagesAreIdentical = widget.pages.length == _pages.length;
    if (_pages[_currentPage].number >= 0) {
      oldPage = _currentPage;
      for (int i = 0; i < widget.pages.length; i++) {
        if (widget.pages[i].number == _pages[oldPage].number) {
          newPage = i;
        }

        if (pagesAreIdentical) {
          if (_pages[i].number != widget.pages[i].number) {
            pagesAreIdentical = false;
          }
        }
      }
    }

    if (!pagesAreIdentical && _scrolling) {
      // let's handle this only once the scroll completes
      return;
    }

    // if the new page is the same as the old,
    // just update the pages immediately
    if (newPage == oldPage) {
      // no setState() needed here because all paths that call this method (_handlePagesChanged)
      // already have caused a build phase to be scheduled, and seeing nothing extra is needed,
      // it will build properly
      _pages = List.from(widget.pages);
      _pagesChanged = false;
      _onPageChanged(_currentPage);
    }
    else {
      // otherwise, let's wait until the end of the frame and then update the pages
      // at the same time, jump to the new page
      _handlingPagesChange = true;
      _jumpingToPage = true;
      // save the widget.pages list now, as it could change before the next frame completes
      _queuedPages = List.from(widget.pages);
      WidgetsBinding.instance.addPostFrameCallback((_) {
        if (mounted) {
          setState(() {
            _pages = _queuedPages;
            _queuedPages = null;

            // at this point, the page controller will accept the new page, but if it's
            // an index beyond the range of the current list, the widget will think the
            // current page is the last page index in the list because the scroll dimensions
            // haven't been updated yet.
            // this will happen during the jumpToPage call below
            // so let's set the actual current page properly ourselves
            // We set the current page to 0 if newPage is -1, because the widget
            // will automatically scroll to the first page for us.
            print("carousel jumping to page: $newPage");
            _onPageChanged(newPage >= 0 ? newPage : 0);

            // jump to the new page seamlessly
            _pageController.jumpToPage(newPage);

            WidgetsBinding.instance.addPostFrameCallback((_) {
              if (mounted) {
                setState(() {
                  _jumpingToPage = false;
                  _onPagesChangedComplete();
                });
              }
            });
          });
        }
      });
    }
  }

  void _onPagesChangedComplete() {
    _handlingPagesChange = false;
    if (_pageChangeQueued) {
      _pageChangeQueued = false;
      _handlePagesChanged();
    }
    else {
      _pagesChanged = false;
    }
  }

  @override
  Widget build(BuildContext context) {

    Widget carousel = ClipRRect(
        borderRadius: BorderRadius.vertical(top: Radius.circular(16)),
        child: NotificationListener(
          onNotification: _onScrollNotification,
          child: PageView.builder(
              controller: _pageController,
              itemCount: _pages.length,
              itemBuilder: (context, index) {
                // when scrolling, let's prevent any interactions with the page contents
                return IgnorePointer(
                    ignoring: _scrolling,
                    child: _pages[index]
                );
              }
          ),
        )
    );

    // when the pages are changing, prevent any further scrolling until done
    return AbsorbPointer(
        absorbing: _pagesChanged && !_scrolling,
        child: carousel
    );
  }
}

Flutter doctor on  1.19.0-4.1.pre
985aeb8ceee6:all danny.valente$ flutter doctor -v
[✓] Flutter (Channel beta, 1.19.0-4.1.pre, on Mac OS X 10.15.5 19F101, locale en-US)
• Flutter version 1.19.0-4.1.pre at /Users/danny.valente/Library/flutter/1.19.0-4.1.pre-beta
• Framework revision f994b76974 (6 weeks ago), 2020-06-09 15:53:13 -0700
• Engine revision 9a28c3bcf4
• Dart version 2.9.0 (build 2.9.0-14.1.beta)
[✓] Android toolchain - develop for Android devices (Android SDK version 29.0.2)
• Android SDK at /Users/danny.valente/Library/Android/sdk
• Platform android-29, build-tools 29.0.2
• Java binary at: /Applications/Android Studio.app/Contents/jre/jdk/Contents/Home/bin/java
• Java version OpenJDK Runtime Environment (build 1.8.0_242-release-1644-b3-6222593)
• All Android licenses accepted.
[✓] Xcode - develop for iOS and macOS (Xcode 11.4.1)
• Xcode at /Applications/Xcode.app/Contents/Developer
• Xcode 11.4.1, Build version 11E503a
• CocoaPods version 1.9.3
[✓] Android Studio (version 4.0)
• Android Studio at /Applications/Android Studio.app/Contents
• Flutter plugin version 47.1.2
• Dart plugin version 193.7361
• Java version OpenJDK Runtime Environment (build 1.8.0_242-release-1644-b3-6222593)

Hi @dannyvalentesonos
I see there's an open issue addressing the case you described. https://github.com/flutter/flutter/issues/58959
If you have any details, please add them there
Please follow up on that issue, I'm closing the current one as a duplicate.
If you disagree, please write in the comments and I will reopen it.
Thank you

@TahaTesser  I'd prefer we reopen this issue. I have code (that is attached in the description) that worked perfectly to work around the Feature Request which #58959 is about. That code still works perfectly on iOS, however something changed between Flutter 1.19.0-4.0.pre and 1.19.0-4.1.pre that broke this specifically on Android, and this is a rather very big problem for us, and we're about to ship our app.
If you run that code, you'll see that it works on iOS and doesn't work on Android. However, is you use 1.19.0-4.0.pre, you'll see it works.
Thanks.

Hi @dannyvalentesonos
Just reopened the issue, it's not clear based on description on how to reproduce the issue
Can you please provide steps and actual results vs expected results?
Thank you

1st issue:

Launch the app.
Tap "Add" and you'll see the same page remains.
Scroll to the last page (100).
Tap "Add" and you'll see that the PageView scrolls, on Android, but remains on page 100 on iOS. Also, it remains on 100 on Android with Flutter 1.19.0-4.0.pre.

The expected result is to remain on page 100 after tapping Add.
Second issue (which might just be a consequence of the same problem):

Launch the app.
Scroll to the last page (100).
Tap Remove until there are no more pages in the PageView. You can see this from the logs, once it says that we're on page 0, or by simply swiping to the left to verify no other pages exist.
Tap "Add" and on Android, it will scroll to the new page, but you can no longer scroll the PageView. If you tap "Add" again, scrolling will work again.

The expected result is to still be able to scroll once you've removed all pages except for page 100, and add a new page.
Again, this works on iOS, and on Android when running with Flutter 1.19.0-4.0.pre.

This is another side effect of the correctForNewDimensions change introduced in https://github.com/flutter/flutter/commit/98bc1766273fcdcf02f22f0bb193266b8c50145d
See https://github.com/flutter/flutter/issues/60288 and https://github.com/flutter/flutter/issues/61156

Seems like @Hixie is assigned on the other issue. I will reassign this to @Hixie as well. Feel free to reassign back if you don't have time.

i can reproduce the issue based https://github.com/flutter/flutter/issues/62209#issuecomment-664390879 steps on beta and master

Code Sample
import 'package:flutter/material.dart';
import 'package:flutter/rendering.dart';
import 'dart:math' as Math;

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

class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: PageViewHomePage(),
    );
  }
}

class PageViewHomePage extends StatefulWidget {
  const PageViewHomePage();

  @override
  _PageViewHomePageState createState() => _PageViewHomePageState();
}

class _PageViewHomePageState extends State<PageViewHomePage> {
  int _nextPageNum = 1;
  Math.Random _rand = Math.Random();
  List<CarouselPage> _pages = List();

  @override
  void initState() {
    super.initState();

    for (int i = 0; i < 5; i++) {
      _pages.add(CarouselPage(
          key: ValueKey("$_nextPageNum"),
          color: Color.fromARGB(
              255,
              (255 * _rand.nextDouble()).toInt(),
              (255 * _rand.nextDouble()).toInt(),
              (255 * _rand.nextDouble()).toInt()),
          number: _nextPageNum++));
    }
    _pages.add(CarouselPage(color: Colors.white, number: 100));
  }

  @override
  void dispose() {
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Column(
        children: <Widget>[
          Expanded(child: Carousel(pages: _pages)),
          Row(
            children: <Widget>[
              Expanded(child: Container()),
              FlatButton(
                child: Text("Add"),
                onPressed: () {
                  int index =
                      _pages.length == 1 ? 0 : _rand.nextInt(_pages.length - 1);
                  _pages.insert(
                      index,
                      CarouselPage(
                          key: ValueKey("$_nextPageNum"),
                          color: Color.fromARGB(
                              255,
                              (255 * _rand.nextDouble()).toInt(),
                              (255 * _rand.nextDouble()).toInt(),
                              (255 * _rand.nextDouble()).toInt()),
                          number: _nextPageNum++));
                  setState(() {});
                },
              ),
              Text(" | "),
              FlatButton(
                child: Text("Remove"),
                onPressed: () {
                  if (_pages.length > 1) {
                    _pages.removeAt(0);
                    setState(() {});
                  }
                },
              ),
              Expanded(child: Container())
            ],
          )
        ],
      ),
    );
  }
}

class CarouselPage extends StatelessWidget {
  const CarouselPage({this.color, this.number, Key key}) : super(key: key);

  final Color color;
  final int number;

  @override
  Widget build(BuildContext context) {
    return Container(color: color, child: Center(child: Text("$number")));
  }
}

class Carousel extends StatefulWidget {
  const Carousel({Key key, this.pages}) : super(key: key);

  final List<CarouselPage> pages;

  @override
  _CarouselState createState() => _CarouselState();
}

class _CarouselState extends State<Carousel> {
  // page variables
  PageController _pageController;
  int _currentPage = 0;

  // controls updates outside of user interaction
  List<CarouselPage> _pages;
  List<CarouselPage> _queuedPages;
  bool _scrolling = false;
  bool _pagesChanged = false;
  bool _pageChangeQueued = false;
  bool _handlingPagesChange = false;
  bool _jumpingToPage = false;

  @override
  void initState() {
    super.initState();

    _pages = List.from(widget.pages);

    _pageController = PageController(initialPage: 0, keepPage: false);
  }

  @override
  void didUpdateWidget(Carousel oldWidget) {
    super.didUpdateWidget(oldWidget);

    // we are still updating the pages from a previous request,
    // so we can just queue this request and it will be
    // processed when the previous request is complete
    if (_pagesChanged) {
      _pageChangeQueued = true;
      return;
    }

    _pagesChanged = true;

    // handle the changes
    _handlePagesChanged();
  }

  @override
  void dispose() {
    _pageController.dispose();

    super.dispose();
  }

  static const double scrollBoundaryEpsilon = 0.001;
  bool _isOnPageBoundary(int page) {
    if (!_pageController.hasClients) {
      // the page view hasn't been built yet, so we should just return true
      return true;
    }
    double currentPage = _pageController.page;
    return currentPage >= page.toDouble() - scrollBoundaryEpsilon &&
        currentPage <= page.toDouble() + scrollBoundaryEpsilon;
  }

  bool _onScrollNotification(ScrollNotification notification) {
    if (notification is ScrollStartNotification) {
      _scrolling = true;
      // only setState if _handlingPagesChange is false
      // otherwise, we are already potentially calling setState()
      // This setState() is needed because the _scrolling variable is changing
      // which controls our IgnorePointer widget
      if (!_handlingPagesChange) {
        setState(() {});
      }
    } else if (notification is ScrollUpdateNotification) {
      // calculate the current page
      int page = _pageController.page.round();

      // check if the page has changed
      if (!_jumpingToPage) {
        if (_currentPage != page) {
          print("Carousel page changed: $page");
          _onPageChanged(page);
        }
      }
    } else if (notification is ScrollEndNotification) {
      // we always only evaluate when the page
      // value is on a true page boundary
      if (_isOnPageBoundary(_pageController.page.round())) {
        _scrolling = false;
        // only setState if _handlingPagesChange is false
        // otherwise, we are already potentially calling setState()
        // This setState() is needed because the _scrolling variable is changing
        // which controls our IgnorePointer widget
        if (!_handlingPagesChange) {
          setState(() {});
        }

        if (_pagesChanged) {
          _handlePagesChanged();
        }
      }
    }

    // this event doesn't need to bubble up the tree
    return true;
  }

  void _onPageChanged(int newPage) {
    _currentPage = newPage;
  }

  void _handlePagesChanged() {
    // this should technically never happen, but just in case
    // a scroll ends and we come back in here, let's ignore.
    if (_handlingPagesChange) {
      return;
    }

    // let's determine if the current selected page is still present
    // if so, let's determine which page it is in the new list
    // while we're at it, let's also determine if the pages are identical
    // if they are, we'll allow an update even if we're currently scrolling
    int oldPage = -1;
    int newPage = -1;
    bool pagesAreIdentical = widget.pages.length == _pages.length;
    if (_pages[_currentPage].number >= 0) {
      oldPage = _currentPage;
      for (int i = 0; i < widget.pages.length; i++) {
        if (widget.pages[i].number == _pages[oldPage].number) {
          newPage = i;
        }

        if (pagesAreIdentical) {
          if (_pages[i].number != widget.pages[i].number) {
            pagesAreIdentical = false;
          }
        }
      }
    }

    if (!pagesAreIdentical && _scrolling) {
      // let's handle this only once the scroll completes
      return;
    }

    // if the new page is the same as the old,
    // just update the pages immediately
    if (newPage == oldPage) {
      // no setState() needed here because all paths that call this method (_handlePagesChanged)
      // already have caused a build phase to be scheduled, and seeing nothing extra is needed,
      // it will build properly
      _pages = List.from(widget.pages);
      _pagesChanged = false;
      _onPageChanged(_currentPage);
    } else {
      // otherwise, let's wait until the end of the frame and then update the pages
      // at the same time, jump to the new page
      _handlingPagesChange = true;
      _jumpingToPage = true;
      // save the widget.pages list now, as it could change before the next frame completes
      _queuedPages = List.from(widget.pages);
      WidgetsBinding.instance.addPostFrameCallback((_) {
        if (mounted) {
          setState(() {
            _pages = _queuedPages;
            _queuedPages = null;

            // at this point, the page controller will accept the new page, but if it's
            // an index beyond the range of the current list, the widget will think the
            // current page is the last page index in the list because the scroll dimensions
            // haven't been updated yet.
            // this will happen during the jumpToPage call below
            // so let's set the actual current page properly ourselves
            // We set the current page to 0 if newPage is -1, because the widget
            // will automatically scroll to the first page for us.
            print("carousel jumping to page: $newPage");
            _onPageChanged(newPage >= 0 ? newPage : 0);

            // jump to the new page seamlessly
            _pageController.jumpToPage(newPage);

            WidgetsBinding.instance.addPostFrameCallback((_) {
              if (mounted) {
                setState(() {
                  _jumpingToPage = false;
                  _onPagesChangedComplete();
                });
              }
            });
          });
        }
      });
    }
  }

  void _onPagesChangedComplete() {
    _handlingPagesChange = false;
    if (_pageChangeQueued) {
      _pageChangeQueued = false;
      _handlePagesChanged();
    } else {
      _pagesChanged = false;
    }
  }

  @override
  Widget build(BuildContext context) {
    Widget carousel = ClipRRect(
        borderRadius: BorderRadius.vertical(top: Radius.circular(16)),
        child: NotificationListener(
          onNotification: _onScrollNotification,
          child: PageView.builder(
              controller: _pageController,
              itemCount: _pages.length,
              itemBuilder: (context, index) {
                // when scrolling, let's prevent any interactions with the page contents
                return IgnorePointer(
                    ignoring: _scrolling, child: _pages[index]);
              }),
        ));

    // when the pages are changing, prevent any further scrolling until done
    return AbsorbPointer(
        absorbing: _pagesChanged && !_scrolling, child: carousel);
  }
}

flutter doctor -v
[✓] Flutter (Channel beta, 1.20.0-7.2.pre, on Mac OS X 10.15.6 19G73, locale en-GB)
    • Flutter version 1.20.0-7.2.pre at /Users/tahatesser/Code/flutter_beta
    • Framework revision a2bde82fbd (9 days ago), 2020-07-18 15:16:35 -0700
    • Engine revision 60b269d898
    • Dart version 2.9.0 (build 2.9.0-21.2.beta)

[✓] Android toolchain - develop for Android devices (Android SDK version 30.0.1)
    • Android SDK at /Users/tahatesser/Code/sdk
    • Platform android-30, build-tools 30.0.1
    • ANDROID_HOME = /Users/tahatesser/Code/sdk
    • Java binary at: /Applications/Android Studio.app/Contents/jre/jdk/Contents/Home/bin/java
    • Java version OpenJDK Runtime Environment (build 1.8.0_242-release-1644-b3-6222593)
    • All Android licenses accepted.

[✓] Xcode - develop for iOS and macOS (Xcode 11.6)
    • Xcode at /Applications/Xcode.app/Contents/Developer
    • Xcode 11.6, Build version 11E708
    • CocoaPods version 1.9.3

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

[✓] Android Studio (version 4.0)
    • Android Studio at /Applications/Android Studio.app/Contents
    • Flutter plugin version 47.1.2
    • Dart plugin version 193.7361
    • Java version OpenJDK Runtime Environment (build 1.8.0_242-release-1644-b3-6222593)

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

[✓] Connected device (3 available)
    • SM M305F (mobile) • 32003c30dc19668f • android-arm64  • Android 10 (API 29)
    • Web Server (web)  • web-server       • web-javascript • Flutter Tools
    • Chrome (web)      • chrome           • web-javascript • Google Chrome 84.0.4147.89

• No issues found!

flutter doctor -v
[✓] Flutter (Channel master, 1.21.0-6.0.pre.41, on Mac OS X 10.15.6 19G73, locale en-GB)
    • Flutter version 1.21.0-6.0.pre.41 at /Users/tahatesser/Code/flutter_master
    • Framework revision 39fa00201d (3 hours ago), 2020-07-27 21:11:43 -0700
    • Engine revision f27729e97b
    • Dart version 2.10.0 (build 2.10.0-0.0.dev 24c7666def)

[✓] Android toolchain - develop for Android devices (Android SDK version 30.0.1)
    • Android SDK at /Users/tahatesser/Code/sdk
    • Platform android-30, build-tools 30.0.1
    • ANDROID_HOME = /Users/tahatesser/Code/sdk
    • Java binary at: /Applications/Android Studio.app/Contents/jre/jdk/Contents/Home/bin/java
    • Java version OpenJDK Runtime Environment (build 1.8.0_242-release-1644-b3-6222593)
    • All Android licenses accepted.

[✓] Xcode - develop for iOS and macOS (Xcode 11.6)
    • Xcode at /Applications/Xcode.app/Contents/Developer
    • Xcode 11.6, Build version 11E708
    • CocoaPods version 1.9.3

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

[✓] Android Studio (version 4.0)
    • Android Studio at /Applications/Android Studio.app/Contents
    • Flutter plugin version 47.1.2
    • Dart plugin version 193.7361
    • Java version OpenJDK Runtime Environment (build 1.8.0_242-release-1644-b3-6222593)

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

[✓] Connected device (4 available)
    • SM M305F (mobile) • 32003c30dc19668f • android-arm64  • Android 10 (API 29)
    • macOS (desktop)   • macos            • darwin-x64     • Mac OS X 10.15.6 19G73
    • Web Server (web)  • web-server       • web-javascript • Flutter Tools
    • Chrome (web)      • chrome           • web-javascript • Google Chrome 84.0.4147.89

• No issues found!

I'll try to take a look this week.

I don't really understand why this ever worked, or why it would still be working today on any platform. Fundamentally, the code is requesting that we jump to a position that isn't yet in range (it does the jump just before the frame where we add the new page to the PageView). The scroll physics scroll to the new position and immediately try to go ballistic, and that means pulling back from the new position back to the nearest in-range position, which is what happens.

Oh, interesting. On stable, when the internal dimensions change, we go ballistic again, which essentially terminates the original ballistic scroll...

I don't really understand why this ever worked, or why it would still be working today on any platform. Fundamentally, the code is requesting that we jump to a position that isn't yet in range (it does the jump just before the frame where we add the new page to the PageView). The scroll physics scroll to the new position and immediately try to go ballistic, and that means pulling back from the new position back to the nearest in-range position, which is what happens.

I'm a little concerned about this comment, as this is a really important feature for us, and it seems like comments in #58959 suggest that developers should make this possible in their code, which I have. It really should be a natural use case to support to be honest. If a page is added before the current page, we should be able to "stay" on that page without disrupting the user's experience.

Oh, interesting. On stable, when the internal dimensions change, we go ballistic again, which essentially terminates the original ballistic scroll...

Does this comment mean there's hope we can get a fix for this?
Thanks very much!

Ah, I see. This is hitting the new logic for position correction. The test code sends the page position out of range (since the new page doesn't exist yet). Then we build with the new page. When we discover that the range has changed, we try to maintain the previous relationship between the position and the range, so we move ourselves out of range again, but then when we get the new set of dimensions, they aren't different that the previous call, so we never call applyNewDimensions and never go ballistic.

(Or rather, we only go ballistic once.)
But if we do go ballistic the second time, it'll be from the newly out-of-range position...

It really should be a natural use case to support to be honest.

This is absolutely something we should support.

Does this comment mean there's hope we can get a fix for this?

Working on it. :-)

So the ideal solution here would be that when one adds something to the list of contents in a list that is before the first rendered widget, either something that gets built or something that affects the known offset of the first rendered widget, the scroll position would be adjusted accordingly. Not sure how to do that...

Another option would be to provide a separate way to scroll that is immune to the logic mentioned above, something like "scroll to this position but hold it until after the next build then go ballistic" or something. should be possible with a new ScrollActivity...

I had to make a couple of framework changes but I created a ScrollActivity that the code can use to make this happen. Need to figure out if I think it should be in the base framework or if it's ok for someone to have to create their own.

https://github.com/flutter/flutter/pull/62757 makes this possible in a more reliable way. It's not built into the framework. Not sure if it's good enough or if we should do more...

I will apply your patch and give this a try. I think it's ok to create the scroll activity, but would be nice to have this built in, but if this works, this will be fine for me.
2 quick questions:

Why does this work for iOS but not Android, just out of curiosity.
In your test code, why are you doing + math.max(0, _pageController.position.viewportDimension * (_pageController.viewportFraction - 1) / 2)? What exactly does this do? Seeing this is being used in the call to jumToPage, shouldn't the pixels fall on a perfect page boundary?

Thanks!

@Hixie  So far, this is working and looking good. Thanks again for the quick fix!

re 1, I wasn't able to reproduce that this worked for iOS. It failed for both for me.
re 2, I just inlined all the code that I couldn't get to because those members are private. I haven't examined the maths to see if it's correct or not. :-)

An argument to not add the activity itself to the framework is that it's a really narrow use case and what we should really do is find a way to make this whole thing moot (by having a way to add content to a list without moving the perceived scroll position). An argument for adding it is that I have no idea how to do that...

If the goal is to keep the user on the "same" page when the children change, one could also use the old center work-around with a CustomScrollView:
import 'package:flutter/material.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: WrapHomePage(),
    );
  }
}

class WrapHomePage extends StatefulWidget {
  const WrapHomePage();

  @override
  _WrapHomePageState createState() => _WrapHomePageState();
}

class _WrapHomePageState extends State<WrapHomePage> {
  List<Widget> _pages;
  List<Widget> _newPages = <Widget>[];

  @override
  void initState() {
    super.initState();
    _pages = List.generate(2, (index) {
      final Key key = ValueKey(index);
      return Container(
        key: key,
        height: 50,
        color: index % 2 == 0 ? Colors.green : Colors.yellow,
        child: Text('Tile $index'),
      );
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: SizedBox(
          height: 100,
          child: CustomScrollView(
            center: ValueKey(0),  /// <-- Here...
            physics: PageScrollPhysics(),
            slivers: [
              SliverFillViewport(
                delegate: SliverChildBuilderDelegate(
                  (BuildContext context, int index) {
                    return _newPages[index];
                  },
                  childCount: _newPages.length,
                ),
              ),
              SliverFillViewport(
                key: ValueKey(0), /// <-- and here...
                delegate: SliverChildBuilderDelegate(
                  (BuildContext context, int index) {
                    return _pages[index];
                  },
                  childCount: _pages.length,
                ),
              ),
            ],
          ),
        ),
      ),
      persistentFooterButtons: [
        FloatingActionButton(
          child: Text('B'),
          onPressed: () {
            setState(() {
              _newPages.add(
                Container(
                  height: 50,
                  color: _newPages.length % 2 == 0 ? Colors.green : Colors.yellow,
                  child: Text('New Tile ${_newPages.length}'),
                ),
              );
            });
          },
        ),
        FloatingActionButton(
          child: Text('E'),
          onPressed: () {
            setState(() {
              _pages.add(
                Container(
                  height: 50,
                  color: _pages.length % 2 == 0 ? Colors.green : Colors.yellow,
                  child: Text('New Tile ${_pages.length}'),
                ),
              );
            });
          },
        ),
      ],
    );
  }
}

Thanks @goderbauer .
This seems like a very big change for us to change our use of PageView to instead use a CustomScrollView and have to use value keys to keep track of what is showing. I prefer @Hixie 's change which allows our changes to be very minimal, and I've already confirmed that they work very well.

and have to use value keys to keep track of what is showing.

You don't have to keep track of what's showing. The key is statically assigned to one of the SliverFillViewport that act as one of two page views.

I wonder if the right fix here is really just to drop the RangeMaintainingScrollPhysics from PageViews...

I wonder if the right fix here is really just to drop the RangeMaintainingScrollPhysics from PageViews...

@Hixie I'm not sure what that would entail, but one thing I really like is it takes care of animating should the page the user is on gets removed. At that point, it automatically scrolls and takes care of animating for us, so that the user is aware that something has changed.
Would your suggestion remove that? Basically, I call jumpToPage(-1) and it automatically scrolls to the last page nicely.

that should still work. RangeMaintainingScrollPhysics is essentially just doing the same thing you're doing, you don't need it in your case. (It does it in a way that has a different effect than what you want, hence this bug.)
I'm looking at https://github.com/flutter/flutter/issues/60288 which the PR above didn't fix, but which is fundamentally the same problem, some code tries to fix the position of a PageView before the PageView metrics change (in their case, the viewport metrics rather than the position, bu the effect is the same), and the RangeMaintainingScrollPhysics logic keeps the scroll position in "the same position" except that it doesn't know the position was already "fixed".

After some discussion on Discord I think we have a fix now that will let your old code work unmodified.

Proposed fix: https://github.com/flutter/flutter/pull/63146

The fix (https://github.com/flutter/flutter/pull/63146) that solved this issue has been reverted since it was failing some tests.
This issue report is however a duplicate of the older report https://github.com/flutter/flutter/issues/60288, so I recommend we keep this report closed and track future progress only via https://github.com/flutter/flutter/issues/60288 that has been reopened.

Can we open this? as the PR is reverted

For closure, the original fix was re-applied in https://github.com/flutter/flutter/pull/65135 and is in 1.22.0 and newer.


I can't drive robot.

Now I can drive do you want to merge?

Could you be a bit more specific?

I launched gazebo spawn and controller_manager one by one but gazebo controller it is the problem of controller param load to gazebo , the joint are quite well with Rviz . but gazebo doesn't move.

Hello,I loaded all joints (gazebo and JT) and tried to move robot but it still the same than I tried to publish the topic with it's default msg it show the msg_type format error. Do we need to change the "gazebo plugin"?

Now I can control hyperdog. Thank


mediaelch: fix loading of libmediainfo

(cherry picked from commit 64d9b62ab94116b675d10b2e8e1206d514253796)

Motivation for this change
#160200
Things done

Built on platform(s)

[ ] x86_64-linux
[ ] aarch64-linux
[ ] x86_64-darwin
[ ] aarch64-darwin

[ ] For non-Linux: Is sandbox = true set in nix.conf? (See Nix manual)
[ ] Tested, as applicable:

NixOS test(s) (look inside nixos/tests)
and/or package tests
or, for functions and "core" functionality, tests in lib/tests or pkgs/test
made sure NixOS tests are linked to the relevant packages

[ ] Tested compilation of all packages that depend on this change using nix-shell -p nixpkgs-review --run "nixpkgs-review rev HEAD". Note: all changes have to be committed, also see nixpkgs-review usage
[ ] Tested basic functionality of all binary files (usually in ./result/bin/)
22.05 Release Notes (or backporting 21.11 Release notes)

[ ] (Package updates) Added a release notes entry if the change is major or breaking
[ ] (Module updates) Added a release notes entry if the change is significant
[ ] (Module addition) Added a release notes entry if adding a new NixOS module
[ ] (Release notes changes) Ran nixos/doc/manual/md-to-db.sh to update generated release notes

[x] Fits CONTRIBUTING.md.

ping @jonringer . The package had a problem since it was packaged. Maybe we want to propagate this fix to the release branch.


scresonators-fit library won't install on a fresh venv, perhaps dependency issues?

From what I can tell, it seems that some of the modules on the requirements.txt are outdated relative to the others. I have been trying to download the library to use for some fitting on our data, but the setup.py process fails every time on a fresh python venv. I tried manually backdating my versions of setuptools and pip to around 01/2021, to match some of the older requirements in the requirements.txt but that also didn't work. The errors we are getting from trying to install dependencies from the requirements.txt file are either legacy-install-failure or metadata-generation-failed.
I eventually got the library to install by using the --no-dependencies flag, and then manually installing each module, but then any code I run from the library fails to execute due to deprecated functions.
I am working from my macOS 12.6.2, and my advisor also ran into the same issues on his windows computer.

going to use this library again for DCM fits and I forgot how I installed it the first time around. I will mess around with venvs and python package versions and try to reproduce the issues, but for now:

start with a fresh venv in your working area, since a lot of these packages are outdated
clone scresonators from git directly, probably somewhere outside your workspace,
git clone https://github.com/Boulder-Cryogenic-Quantum-Testbed/scresonators.git
remove the line from requirements.txt that says pandas==1.5.*
install the requirements manually,
pip install -r ../<scresonators dir>/requirements.txt
now install scresonators with two flags,
pip install --use-pep517 --no-dependencies scresonators-fit
good to go! import the library in your python code using
import fit_resonator.resonator as scres

I have no clue what specifically made things work, I remember the issue being about old libraries that were dependencies of pandas/numpy that were incompatible with modern versions of setuptools/wheel/whatever. I'm treating it as supernatural and moving on :)


Amazon Sagemaker Training, Deployment, and Inference API's

Pull request for an initial implementation of streamlined API's for Amazon Sagemaker.  Includes 3 functions: "fit", "deploy", and "predict".  The primary algorithms this was built around were XGBoost and Linear Learner, but it should be compatible with any built in algorithm that accepts 'text/csv' as a content-type.
Two additional environment variables are required to run these flows.

METAFLOW_SAGEMAKER_REGION is the region of your Sagemaker run.
METAFLOW_SAGEMAKER_IAM_ROLE is a Sagemaker execution role with permissions to access all appropriate cloud resources, most notably S3.

Usage consists of from metaflow import Sagemaker.
Sagemaker.fit(data, image, hyperparameters, stopping_condition, resource_config)
Returns a string object with the S3 URI of the model artifact generated by the fit.

data is a dictionary with keys that reference Sagemaker "channel names" found here, and values that consist of CSV data with no headers or indexes.

image is a string consisting of a Sagemaker built in algorithm container registry path, also found here.  Automatic mapping will be coming soon.

hyperparameters is a dictionary with hyperparameters for the specific algorithm referenced by image.  An example for XGBoost can be found here.

stopping_condition and resource_config are optional dictionaries for overriding some defaults, specifically that of a single ml.m4.xlarge training instance with a 5 GB volume, and a 1 hour max runtime.  Syntax for those overrides can be found here

Sagemaker.deploy(model_uri, image, instanceType, instanceCount, instanceWeight, variantName)
Returns a string object with the endpoint name generated by the model deployment.

model_uri is a string object with the S3 path for the model.  This string is returned by Sagemaker.fit

image is a string object.  It should be the same image used for training.

instanceType, instanceCount, instanceWeight, and variantName are all optional parameters for overriding the defaults of, respectively, "ml.m4.xlarge", 1, 1, and "AllTraffic".

Sagemaker.predict(data, endpoint_name)
Returns a list of predictions.

data is a CSV object with no headers or indexes representing the features for inference.

endpoint_name is a string object with the Sagemaker endpoint to be inferred against.  This value is returned by Sagemaker.deploy.

A short example of the usage can be found here.  This PR also brings in an 08-sagemaker tutorial for use with metaflow tutorials pull that demonstrates the above sample flow.

@queueburt Thanks for this great proposal! Do you have any news on the topic?

@queueburt Thanks for this great proposal! Do you have any news on the topic?

Closing this PR in favor of native support for hosting models on Sagemaker with Metaflow


move amazon vcr cassettes to manageiq-providers-amazon repo

PR on the other side: https://github.com/ManageIQ/manageiq-providers-amazon/pull/11
@miq-bot add_labels providers, providers/amazon
@Fryguy review?

the interesting thing here is, that without merging this first, we cant really make sure if the PR on the other side succeeds. It could still be using the cassettes here. So, after merging this, you probably want to restart the tests on the other PR.
I wonder when we will have circular dependencies, where we have to merge a failing PR

@miq-bot add_labels providers, providers/amazon


added tables from materialization

merge back my changes that you already merged into develop to get the tests to pass.


16 MidiOuts

Since we can mix and match gate and pitch tracks, can we have 16 midi outputs instead of 8, to utilize all channels?
Thanks!

I don't get this, I think 8 outputs are more than enough given that there are only 8 tracks in the sequencer. Typically you need 1 or more sequencer tracks for one MIDI output. Having 16 outputs would mean that tracks are assigned to more than one MIDI output.

But that is ok because you can have 64 unique combinations of gates from one track and pitch from another...


Native versioning in EvalEnv

@jmcardon Looks like two unit tests are failing on the macOS build.

I wonder if we've got a problem in the runInteractive process.

I re-triggered the tests at 8e744de
and (5993b24)[https://github.com/kadena-io/pact/pull/1195/commits/5993b24a390b8c3a1e49645540382ef55719fc3f]which are now successful.
I do think removing the tests should not be our solution. As my local tests (so-far) always passed, there might be a relation between github actions using PTY and test failure?

@rsoeldner the coverage was redundant in those tests, and the deadline was near, so we opted to punt on fixing the harness in a follow-up. It seems to be a handle encoding-related error, not related to the content of the PR.

@jmcardon This passed replay last night.


spring-cloud-starter-feign @RequestMapping bug

follow code:
have a Controller
@RestController
@RequestMapping("/v1/card")
public class IndexApi {

    @PostMapping("balance")
    @ResponseBody
    public Info index() {
        Info.Builder builder = new Info.Builder();
        builder.withDetail("x", 2);
        builder.withDetail("y", 2);
        return builder.build();
    }
}

and have feign client：
@FeignClient(
        name = "card",
        url = "http://localhost:7913",
        fallback = CardFeignClientFallback.class,
        configuration = FeignClientConfiguration.class
)
**@RequestMapping(value = "/v1/card")**
public interface CardFeignClient {

    **@RequestMapping(value = "/balance", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE)**
    Info info();

}

if @RequestMapping is used on class, when invoke http /v1/card/balance, like this :
Content-Type:application/json
**Accept:application/json**

POST http://localhost:7913/v1/card/balance

return 404
but like this:
Content-Type:application/json
POST http://localhost:7913/v1/card/balance

It's OK!
or like this use feign client:

@FeignClient(
        name = "card",
        url = "http://localhost:7913",
        fallback = CardFeignClientFallback.class,
        configuration = FeignClientConfiguration.class
)

public interface CardFeignClient {

    **@RequestMapping(value = "/v1/card/balance", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE)**
    Info info();

}

and also it's OK.
so, can't use @RequestMapping on class, only used to method.

So when the accept header is sent you get a 404 returned?  Or is there another difference I am missing?

Can't exists the follow conditions:

spring controller has endpoint /v1/card/balance
FeignClient has endpoint /v1/card/balance
to use @RequestMapping on FeignClient class

@tietang that does not answer my question

So when the accept header is sent you get a 404 returned?

yes, when the accept header is sent you get a 404 returned, if not headeraccept, it's ok.
the follow 4 conditions is cause to happen 404:

spring controller has endpoint /v1/card/balance
FeignClient has endpoint /v1/card/balance
to use @RequestMapping on FeignClient class
the accept header is sent

Sounds like your API may be rejecting the the request do to either the presence of the accept header or the value of the accept header.   You might want to look at making some changes to the API.  It does not sound like there is a problem from a Spring Cloud perspective.

if don't use @RequestMapping on  @FeignClient class , that's ok, whether has accept header.

You said

yes, when the accept header is sent you get a 404 returned, if not header accept, it's ok.

If you use a REST Client to make a request to your API including the accept header does it return a 404?  Maybe a sample project will help make the problem clearer.


update

Hello,
Thank you for the great tool!
I have а question about document update (I use it in node-webkit).
I have a collection of documents like {"test": 1}.
I try to update a document (I want to add options array to it):
datastore.update(
    {_id: 'Ggw6ck1vDoasn5eP'},
    {
        "test": 'a',
        "options": [
            {'aaa':1}
        ]
    },
    {},
    function (err, newDoc){
    console.log(err);
});

It doesn't fail but it adds a record with the same _id value,
so database file has 2 identical _id values.
Please advise.
Thanks,
Miriam

Haha I just spent two whole days debugging my code desperately trying to figure out why rows were being duplicated. I should've read the docs more carefully!


Add prerequisites checks for VCPKG, Rust, Cargo

REF:
https://github.com/Durengo/CPM/blob/3a395036e90805d3ce165c119e6512240e83769d/cpm/src/commands/setup.rs#L288
Add support for more prerequisites.

Solved by #2233a36f04ac2461681bec7f57b3ba1f59b75688

Resolved by 2233a36f04ac2461681bec7f57b3ba1f59b75688


Multiclass classification

Hi, I was looking at the classification example notebook and there's specifically an instruction of binary classification for generating the embeddings. For multiclass classification, it can be done without specifying labels and just a general instruction about the text should e enough. Is my understanding correct or there's some better approach for this?

Your understanding is correct, specific labels do not need to be mentioned in the instructions.


Upgrade GameSalad.app to v0.13.20

Looks good, thanks! :+1:
FYI this Cask needs a # amazonaws.com is the official download host per the vendor homepage comment at some point.

Ok. Thank you.


2-x: Search Location Click does not work ATM

Just in case its not a known issue already…
To reproduce:

open https://2-x--ideditor.netlify.com/#background=Bing&disable_features=boundaries&map=2.00/0.0/0.0
search for "Böhmische STraße, Berlin"
=> 3 results, clicking them does not zoom the map / do anything

Error message on console: TypeError: o.loadEntity is not a function
s.zoomToEntity = function (r, e) {
!1 !== e && o.loadEntity(r, function (e, t) {
if (!e) {

Looks like this was due to ES6's this behavior in fat arrow functions.


Replace deprecated .insert by .insert_one

It seems like the .insert function is deprecated. It should be a good idea to replace insert by insert_one.

It also seems that update, remove, and find_and_modify are deprecated as well.

Good job @trubesv !! Thank for the merge request.


Group subscriptions by directory (tenant)

I have access to many Azure subscriptions in several Azure directories. It's sometimes difficult to find the one I'm looking for in a very long list.
Describe the solution you'd like
It would be much easier to navigate subscriptions in Storage Explorer if they were grouped by directory.
Describe alternatives you've considered
Alternatively, some kind of manual organization of subscriptions in folders would be nice.

Additionally, it would be great if we could hide subscriptions, similar to the way it works in the Azure portal

@snapfisher You can already hide subscriptions today. If you click the Manage Accounts button at the left, you can uncheck any subscriptions you don't want to see.

@thomaslevesque What do you mean by "Azure directory"? Do you mean you'd like to group by tenant?

@thomaslevesque What do you mean by "Azure directory"? Do you mean you'd like to group by tenant?

Yes ("directory" is the the Azure portal terminology)

I never realized that!  Thanks.  Please close this, then.
Sent from Mailhttps://go.microsoft.com/fwlink/?LinkId=550986 for Windows 10

From: Craig Alvord<EMAIL_ADDRESS>Sent: Friday, November 1, 2019 11:46:56 AM
To: microsoft/AzureStorageExplorer<EMAIL_ADDRESS>Cc: Paul Fisher<EMAIL_ADDRESS>Mention<EMAIL_ADDRESS>Subject: Re: [microsoft/AzureStorageExplorer] Group subscriptions by directory (#1326)
@snapfisherhttps://github.com/snapfisher You can already hide subscriptions today. If you click the Manage Accounts button at the left, you can uncheck any subscriptions you don't want to see.
[image]https://user-images.githubusercontent.com/3473026/68037006-0ddd4b80-fc84-11e9-931a-53d67bf989fb.png
—
You are receiving this because you were mentioned.
Reply to this email directly, view it on GitHubhttps://github.com/microsoft/AzureStorageExplorer/issues/1326?email_source=notifications&email_token=AK36DPOSBNI2YG4GO7WBENTQRRFPBA5CNFSM4HHW3WU2YY3PNVWWK3TUL52HS4DFVREXG43VMVBW63LNMVXHJKTDN5WW2ZLOORPWSZGOEC3JZOY#issuecomment-548838587, or unsubscribehttps://github.com/notifications/unsubscribe-auth/AK36DPPYFWN26B44JS62T6DQRRFPBANCNFSM4HHW3WUQ.

Well, please don't actually close this issue. We still need the directory name to show in the UI. :)

@LarsKemmann Don't worry, we aren't close this! 😄@snapfisher's issue was a separate one, and it's been mitigate. This feature request is still quite valid.

This is going to be addressed as part of #460!


chore: Use AMI Status Controller to Asynchronously Hydrate AMI Data

Fixes #N/A
Description

Asynchronously hydrate with AMI data. The controller will attempt to refresh the data every 5 minutes, and implement a exponential backoff for delay: 1ms and max: 1000s

How was this change tested?
Does this change impact docs?

[ ] Yes, PR includes docs updates
[ ] Yes, issue opened: #
[x] No

By submitting this pull request, I confirm that my contribution is made under the terms of the Apache 2.0 license.

Pull Request Test Coverage Report for Build<PHONE_NUMBER>
Details

15 of 16 (93.75%)  changed or added relevant lines in 3 files are covered.
6 unchanged lines in 3 files lost coverage.
Overall coverage increased (+0.002%) to 81.98%

Changes Missing Coverage
Covered Lines
Changed/Added Lines
%

pkg/providers/amifamily/ami.go
10
11
90.91%

Files with Coverage Reduction
New Missed Lines
%

pkg/cloudprovider/drift.go
1
91.67%

pkg/fake/ssmapi.go
2
84.62%

pkg/providers/amifamily/ami.go
3
89.42%

Totals

Change from base Build<PHONE_NUMBER>:
0.002%

Covered Lines:
5391

Relevant Lines:
6576

💛  - Coveralls


Reactflow + MaterialUI Select when drag enabled = Broken Select

Describe the Bug
If you are using the latest version of reactflow (11.5.3) and the latest of Material-UI (5.11.7) there is a scenario where the Material UI Select component does not display the options. Clicking the dropdown perform the action but does not show the floating items. Material-UI puts these floating items at the root of the website.
Reactflow blocks Material UI to display the options only if the ReactFlow components has these two properties to true:
  panOnDrag={true}
  nodesDraggable={true}

performs
Your Example Website or App
https://codesandbox.io/s/reactflow-materialui-select-bug-3txn43?file=/src/Example.tsx:922-980
Steps to Reproduce the Bug or Issue

Open the CodeSandbox
Click the "Age" combo, it should show 3 items
BUG: It does not show the item
Co in the Example.tsx file and uncomment line 45 and 46 (panOnDrag={false} and nodesDraggable={false})
Try again, the select component shows its item

Expected behavior
As a user, I expect that what is inside a node displays as intended. The option of drag/no-drag shouldn't have an impact on the content of the node.
Screenshots or Videos
https://user-images.githubusercontent.com/1014796/216717904-a14cc8d8-a74f-4096-87a9-74c8c88bc57a.mp4
Platform

OS: macOS and Windows
Browser: Chrome
Version: Latest 109.0.5414.120

Additional context
No response

You need to add the class name "nodrag" to the select component.

Thank you @moklick I completely forgot about that property.
For future people, here is the CodeSandbox with the fix.

Hi @moklick! This works if the control is inside the node, but not if it is in the toolbar. Is there a similar fix for controls that are inside NodeToolbar?
Thanks!


Add files via upload

@AliouDIAITE What to do with this PR?

@Flurb I think @jeanetiennelemaire is the right person who can answer this question.


Re-integrate DMN editor actions, where applicable

Tasks

[ ] Undo / Redo via shortcut works in DRD and table editor
[x] Applicable Editor Actions for DRD can be invoked via menu (similar to BPMN editor)
[ ] Applicable Editor Actions for DRD can be invoked via shortcuts (similar to BPMN editor)
[ ] Editor Actions for Table can be invoked via shortcuts, if implemented

How was this implemented? I'm missing the reference to a commit.


fix: Sorted facets for OR queries

The fix was merged in 24c99f2332950c535bb1a125605463e971faebb0 , this is an empty commit to change the messaging

Codecov Report
Base: 30.44% // Head: 29.66% // Decreases project coverage by -0.77% :warning:

Coverage data is based on head (3057d59) compared to base (24c99f2).
 Consider uploading reports for the commit d1d8d9f to get more accurate results

Additional details and impacted files
@@            Coverage Diff             @@
##             main     #524      +/-   ##
==========================================
- Coverage   30.44%   29.66%   -0.78%
==========================================
  Files          88       87       -1
  Lines       10213    10135      -78
==========================================
- Hits         3109     3007     -102
- Misses       6817     6843      +26
+ Partials      287      285       -2

Impacted Files
Coverage Δ

server/search/hits.go
96.62% <0.00%> (-3.38%)
:arrow_down:

lib/container/priority_queue.go
100.00% <0.00%> (ø)

server/services/v1/search_reader.go
0.00% <0.00%> (ø)

server/search/facets.go

Help us with your feedback. Take ten seconds to tell us how you rate us. Have a feature suggestion? Share it here.

:umbrella: View full report at Codecov.
:loudspeaker: Do you have feedback about the report comment? Let us know in this issue.


[Linux] The window title gets ellipsized under stress

Steps to Reproduce

Run stress
Execute flutter run on the code sample
Observe the window title

Expected results:
The window title is fully visible: "My App", "My App - 1", "My App - 12", "My App - 123"
Actual results:
The window title is not correctly updated: "My App" -> "My A..."

Code sample

import 'dart:async';

import 'package:flutter/material.dart';
import 'package:window_manager/window_manager.dart';

String formatWindowTitle(String document) {
  return document.isEmpty ? 'My App' : 'My App - $document';
}

Future<void> main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await windowManager.ensureInitialized();

  final document = ValueNotifier<String>('');

  Timer.periodic(const Duration(seconds: 1), (timer) async {
    final name = List.generate(timer.tick % 4, (i) => '${i + 1}').join();
    document.value = name;
    windowManager.setTitle(formatWindowTitle(name));
  });

  runApp(
    ValueListenableBuilder<String>(
      valueListenable: document,
      builder: (context, value, child) {
        return MaterialApp(
          home: Scaffold(
            appBar: AppBar(title: Text(formatWindowTitle(value))),
            body: Center(child: Text(value)),
          ),
        );
      },
    ),
  );
}

Logs

[✓] Flutter (Channel stable, 2.10.3, on Ubuntu Jammy Jellyfish (development branch) 5.15.0-23-generic, locale en_US.UTF-8)
    • Flutter version 2.10.3 at /home/jpnurmi/.fvm/versions/stable
    • Upstream repository https://github.com/flutter/flutter.git
    • Framework revision 7e9793dee1 (3 weeks ago), 2022-03-02 11:23:12 -0600
    • Engine revision bd539267b4
    • Dart version 2.16.1
    • DevTools version 2.9.2

[✓] Android toolchain - develop for Android devices (Android SDK version 31.0.0)
    • Android SDK at /home/jpnurmi/Android/Sdk
    • Platform android-31, build-tools 31.0.0
    • ANDROID_SDK_ROOT = /home/jpnurmi/Android/Sdk
    • Java binary at: /home/jpnurmi/Android/android-studio/jre/bin/java
    • Java version OpenJDK Runtime Environment (build 11.0.10+0-b96-7249189)
    • All Android licenses accepted.

[✓] Linux toolchain - develop for Linux desktop
    • Ubuntu clang version 14.0.0-+rc4-1ubuntu1
    • cmake version 3.22.1
    • ninja version 1.10.1
    • pkg-config version 0.29.2

[✓] Android Studio (version 2020.3)
    • Android Studio at /home/jpnurmi/Android/android-studio
    • Flutter plugin can be installed from:
      🔨 https://plugins.jetbrains.com/plugin/9212-flutter
    • Dart plugin can be installed from:
      🔨 https://plugins.jetbrains.com/plugin/6351-dart
    • Java version OpenJDK Runtime Environment (build 11.0.10+0-b96-7249189)

[✓] VS Code
    • VS Code at /snap/code/current
    • Flutter extension version 3.36.0

[✓] Connected device (1 available)
    • Linux (desktop) • linux • linux-x64 • Ubuntu Jammy Jellyfish (development branch) 5.15.0-23-generic

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

• No issues found!

More details at https://github.com/jpnurmi/flutter_window_title_issue

Hi @jpnurmi, thanks for filing the issue, I was able to reproduce the issue on stable and the master channel. The title of the linux app has ellipses, On resizing the window or hovering another window on top the flutter app fixes the title.
I ran the below stress command, in parallel before the Linux app was built.
stress --cpu 8 --io 4 --vm 2 --vm-bytes 128M --timeout 100s

https://user-images.githubusercontent.com/31410839/159637926-c04da4f2-5536-432a-8f1b-ce27b9a2a7d6.mp4

flutter doctor -v (Linux)
[✓] Flutter (Channel stable, 2.10.3, on Ubuntu 20.04.4 LTS 5.13.0-30-generic, locale en_GB.UTF-8)
    • Flutter version 2.10.3 at /home/mahesh/Development/stable
    • Upstream repository https://github.com/flutter/flutter.git
    • Framework revision 7e9793dee1 (13 days ago), 2022-03-02 11:23:12 -0600
    • Engine revision bd539267b4
    • Dart version 2.16.1
    • DevTools version 2.9.2

[✓] Android toolchain - develop for Android devices (Android SDK version 31.0.0)
    • Android SDK at /home/mahesh/Android/Sdk
    • Platform android-31, build-tools 31.0.0
    • Java binary at: /home/mahesh/Downloads/android-studio-2<IP_ADDRESS>-linux/android-studio/jre/bin/java
    • Java version OpenJDK Runtime Environment (build 11.0.10+0-b96-7249189)
    • All Android licenses accepted.

[✓] Chrome - develop for the web
    • Chrome at google-chrome

[✓] Linux toolchain - develop for Linux desktop
    • clang version 10.0.0-4ubuntu1
    • cmake version 3.16.3
    • ninja version 1.10.0
    • pkg-config version 0.29.1

[✓] Android Studio (version 2020.3)
    • Android Studio at /home/mahesh/Downloads/android-studio-2<IP_ADDRESS>-linux/android-studio
    • Flutter plugin version 63.2.1
    • Dart plugin version 203.8452
    • Java version OpenJDK Runtime Environment (build 11.0.10+0-b96-7249189)

[✓] VS Code (version 1.64.2)
    • VS Code at /usr/share/code
    • Flutter extension version 3.36.0

[✓] Connected device (2 available)
    • Linux (desktop) • linux  • linux-x64      • Ubuntu 20.04.4 LTS 5.13.0-30-generic
    • Chrome (web)    • chrome • web-javascript • Google Chrome 98.0.4758.102

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

• No issues found!

[✓] Flutter (Channel master, 2.13.0-0.0.pre.218, on Ubuntu 20.04.4 LTS
    5.13.0-30-generic, locale en_IN)
    • Flutter version 2.13.0-0.0.pre.218 at /home/mahesh/Development/master
    • Upstream repository https://github.com/flutter/flutter.git
    • Framework revision 654ccf35c6 (19 minutes ago), 2022-03-22 23:23:08 -0700
    • Engine revision 4fbff7a511
    • Dart version 2.17.0 (build 2.17.0-227.0.dev)
    • DevTools version 2.11.4

[✓] Android toolchain - develop for Android devices (Android SDK version 31.0.0)
    • Android SDK at /home/mahesh/Android/Sdk
    • Platform android-31, build-tools 31.0.0
    • Java binary at:
      /home/mahesh/Downloads/android-studio-2<IP_ADDRESS>-linux/android-studio/jre
      /bin/java
    • Java version OpenJDK Runtime Environment (build 11.0.10+0-b96-7249189)
    • All Android licenses accepted.

[✓] Chrome - develop for the web
    • Chrome at google-chrome

[✓] Linux toolchain - develop for Linux desktop
    • clang version 10.0.0-4ubuntu1
    • cmake version 3.16.3
    • ninja version 1.10.0
    • pkg-config version 0.29.1

[✓] Android Studio (version 2020.3)
    • Android Studio at
      /home/mahesh/Downloads/android-studio-2<IP_ADDRESS>-linux/android-studio
    • Flutter plugin version 63.2.1
    • Dart plugin version 203.8452
    • Java version OpenJDK Runtime Environment (build 11.0.10+0-b96-7249189)

[✓] VS Code (version 1.64.2)
    • VS Code at /usr/share/code
    • Flutter extension can be installed from:
      🔨 https://marketplace.visualstudio.com/items?itemName=Dart-Code.flutter

[✓] Connected device (2 available)
    • Linux (desktop) • linux  • linux-x64      • Ubuntu 20.04.4 LTS
      5.13.0-30-generic
    • Chrome (web)    • chrome • web-javascript • Google Chrome 98.0.4758.102

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

• No issues found!


Fixes findbug in ClusteringServiceConfiguration by using StringBuilder instead of String

PR: https://github.com/ehcache/ehcache3/pull/2081

closed with successful PR


trying to clear some confusion in this tutorial

Hi. I read the tutorial and would like to clear some confusion.
This piece is from the tutorial:
These Key Vault credentials are only used within your application. Your application authenticates directly with Key Vault using these credentials without involving the App Configuration service. The Key Vault provides authentication for both your application and your App Configuration service without sharing or exposing keys.
I would like to understand how the service principle created for Key vault is authenticated for Azure App Configuation Service. since only "azure app configuration service endpoint" is used in the sample instead of "configuration service connect string"
Thanks
Kelly

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

ID: afc14028-8f4c-05bf-8a01-3ce82041b0b2
Version Independent ID: 05e48444-1d81-07de-5ca5-1efcc9241d00
Content: Tutorial for using Azure App Configuration Key Vault references in a Java Spring Boot app
Content Source: articles/azure-app-configuration/use-key-vault-references-spring-boot.md
Service: azure-app-configuration
GitHub Login: @lisaguthrie
Microsoft Alias: lcozzens

@kxying-kk Thank you for the feedback!  We are investigating this and will get back to you shortly.

I figured it out.  the last step of the az cli commands in the tutorial is very important
az role assignment create --role "App Configuration Data Reader" --assignee-object-id <objectId-of-your-service-principal> --resource-group <your-resource-group>

I was trying to use console directly but this step somehow i cannot replicate as what the command generated.
thanks
Kelly

@kxying-kk Thank you for the feedback! We are investigating this and will get back to you shortly.

I figured it out.  the last step of the az cli commands in the tutorial is very important
az role assignment create --role "App Configuration Data Reader" --assignee-object-id <objectId-of-your-service-principal> --resource-group <your-resource-group>

I was trying to use console directly but this step somehow i cannot replicate as what the command generated.
thanks
Kelly

@kxying-kk  Thank you for providing an update!

@lisaguthrie Ignore - tool test.


machine folk session tunes page: sort by date, number, popularity

https://themachinefolksession.org/tunes/
Currently sorted by date added, I think.

412642c

@boblsturm Check the site. OK?


fix: oom on long messages

fix: stop OOM on long messages
fix: use workqueue to offload progress events

Addresses: #403

I'm seeing this behavior with Confirm calls, Prompt calls and general tool calls.
https://github.com/user-attachments/assets/fa524080-3c87-4880-a030-9b049ae760f5


[Event Request] Table 249 "VAT Registration Log" - OnBeforeValidateField

Hi,
Would it be possible to pass "Value" parameter by reference (by var) in the OnBeforeValidateField publisher in table 249 "VAT Registration Log"?
Like this:
// Old publisher begin
    [IntegrationEvent(false, false)]
    local procedure OnBeforeValidateField(var RecordRef: RecordRef; FieldName: Text; Value: Text; var IsHandled: Boolean)
    begin
    end;
// Old publisher end

// New publisher begin
    [IntegrationEvent(false, false)]
    local procedure OnBeforeValidateField(var RecordRef: RecordRef; FieldName: Text; var Value: Text; var IsHandled: Boolean)
    begin
    end;
// New publisher end

Thanks in advance

Thanks for reporting this. We agree, and we’ll publish a fix asap, either in an update for the current version or in the next major release. Please do not reply to this, as we do not monitor closed issues. If you have follow-up questions or requests, please create a new issue where you reference this one.
Build ID: 41159.


Add a guard to manpager.vim

Closes #11388
Add a guard to manpager.vim to avoid double loading.

Not sure if @casparen is the right github user

I think it is @konfekt ?

Looks good to me.
@k-takata : The other boilerplate guards, such as
let s:keepcpo          = &cpo
set cpo&vim

...

let &cpo= s:keepcpo
unlet s:keepcpo

are not necessary?

The cpo guard is only needed when line continuation is used, and it is not used in this file. So, it is optional.


very nice thanks

can you suggest similar project but tracking also other biggest cap currencies?

found this https://support.kraken.com/hc/en-us/articles/360047124832-Downloadable-historical-OHLCVT-Open-High-Low-Close-Volume-Trades-data

and this https://www.cryptodatadownload.com/


Sanju github002 patch 1

Fixes #(67)
create Forget Password option in log in page.

Always mention issue number like this #67.
Also share the website link so I can review your changes.

@Sanju-github002 are you able to see sign up button in your system
because in my system it is looking like this

Yes.


💡 [REQUEST]: Create rent page cards

Start Date
04/16/2023
Implementation PR
No response
Reference Issues
No response
Summary
Create cards component for storing the house data from the database.
Basic Example
No response
Drawbacks
No response
Unresolved questions
No response
Code of Conduct

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

Created by myself. Please update in time @AmishB7


view has the wrong signature

Description
On one node (db-2.example.com) we catch error logs

[error] 2024-02-26T19:53:42.735715Z<EMAIL_ADDRESS><0.21142.1038> -------- ./data/.shards/e0000000-ffffffff/account/a1/15/78067a1db9f83fa4da53f6bacc16.1663539188_design/mrview/fa7a1a9e5db7f6873529299ea929daad.view has the wrong signature: expected: <<250,122,26,158,93,183,246,135,53,41,41,158,169,41,218,173>> but got <<87,225,55,84,101,143,50,221,45,61,42,165,141,102,202,177>>
[error] 2024-02-26T19:54:07.738902Z<EMAIL_ADDRESS><0.22173.1076> -------- ./data/.shards/40000000-5fffffff/account/a1/15/78067a1db9f83fa4da53f6bacc16.1663539188_design/mrview/fa7a1a9e5db7f6873529299ea929daad.view has the wrong signature: expected: <<250,122,26,158,93,183,246,135,53,41,41,158,169,41,218,173>> but got <<87,225,55,84,101,143,50,221,45,61,42,165,141,102,202,177>>

Then it triggers CPU usage and is not responsible CouchDB 3 nodes cluster.
In logs present messages like
fabric_worker_timeout get_db_info

[error] 2024-02-26T20:00:39.603653Z<EMAIL_ADDRESS><0.26790.1086> 182b91a95a fabric_worker_timeout get_db_info,'couchdb@db-0.example.com',<<"shards/20000000-3fffffff/account/56/3b/1e36302175513343e6a13f6a1372-202308.1690848013">>

fabric_worker_timeout open_doc

[error] 2024-02-26T20:00:40.479851Z<EMAIL_ADDRESS><0.2074.1115> -------- fabric_worker_timeout open_doc,'couchdb@db-2.example.com',<<"shards/40000000-5fffffff/account/e3/2d/d743a02e6ee4e28f02755e070d33.1685539862">>

fabric_worker_timeout open_doc

[error] 2024-02-26T20:00:45.480715Z<EMAIL_ADDRESS><0.26670.936> a6eca4ce74 fabric_worker_timeout open_doc,'couchdb@db-1.example.com',<<"shards/40000000-5fffffff/account/e3/2d/d743a02e6ee4e28f02755e070d33.1685539862">>

Steps to Reproduce
Not known.
Expected Behaviour
Error in the one view should not stop functionality of 3 nodes cluster.
Your Environment

CouchDB version used: 3.3.2
Browser name and version: browser do not used
Operating system and version: CentOS 8

Additional Context
Used apache/couchdb:3.3.2 docker container.

That happens when a view shard is opened but has a view signature that's not current. It comes from https://github.com/apache/couchdb/blob/29db2df901207d67e1975ca11a091bcb7f46abcc/src/couch_mrview/src/couch_mrview_index.erl#L141
The expected signature matches file path:
binary:encode_hex(<<250,122,26,158,93,183,246,135,53,41,41,158,169,41,218,173>>).
<<"FA7A1A9E5DB7F6873529299EA929DAAD">>

The other one is:
binary:encode_hex(<<87,225,55,84,101,143,50,221,45,61,42,165,141,102,202,177>>).
<<"57E13754658F32DD2D3D2AA58D66CAB1">>

I don't recall seeing this error too often. Is there any chance your view shard files were moved, copied, restored from backup from an much older couch instance, or mounted on a volume shared across multiple nodes?
Is it easy to reproduce? Just happened once or it's a regular occurrence?

Then it triggers CPU usage and is not responsible CouchDB 3 nodes cluster.

That's expected as the next action after the log is to reset the view shard and rebuild. So in other words, after the view rebuilds, it should be back to normal.

I would also ask that question: have the files been moved or renamed outside of couchdb's control? This error is not normal, and is a protection mechanism (effectively an assertion). another possibility is you have multiple nodes pointing at the same shared volume, and trashing each others state.

Is there any chance your view shard files were moved, copied, restored from backup from an much older couch instance, or mounted on a volume shared across multiple nodes?

I do not think we make something from the above.
We starting docker container and do not move CouchDB files.
Also, we do not use shared volumes.
We make couchdb backup using bulk requests but do not restore CouchdDB database at this time period.

Is it easy to reproduce?  Just happened once or it's a regular occurrence?
It is the first time.

after the view rebuilds, it should be back to normal.

This does not happen for 17 minutes and we have recreated the docker container.

Just checked via AWS console, the CouchDB has "Multi-Attach enabled: no".
So  use volume mounted to only one node.

after the view rebuilds, it should be back to normal.

Also, an issue with the view file happens on one node in the cluster. But this does not explain why CPU consumed on other nodes.
So view rebuild should happen on one node and two other nodes should be not affected.

We have reproduced the same issue on the server without docker.

It appears that it is possible for the design doc signature to vary according to something we have not yet determined. The client's cluster that we (Neighbourhoodie) are investigating gives the following results for one of the design docs affected by a bad index signature:
$ cdb '/' | jq '{ version, git_sha }'
{
"version": "3.3.3",
"git_sha": "40afbcfc7"
}
$ cdb '/{db}/_design/{id}' | md5sum
ef932f29b40bc1795360ea095051d782  -
$ cdb '/{db}/_design/{id}/_info' | jq '.view_index.signature'
"c15a2c0300aefa07abdea125eba80a98"
We copied this design doc and saved into a local dev cluster running the same CouchDB version/commit, and it gave the same md5sum and signature.
However, when putting this same design doc into the CouchDB service installed by Homebrew, it gives the same md5sum but a different signature:
$ cdb '/{db}/_design/{id}/_info' | jq '.view_index.signature'
"20ae103a2d660c16f4cbbc43703ede09"
This indicates that it’s possible for the same design document to produce a different signature on different systems, possibly on different nodes of the same cluster depending on what the cause is.
Environment of each test:

Customer production system: Linux, CouchDB v3.3.3, SpiderMonkey 1.8.5, Erlang <IP_ADDRESS>, ICU library 60.3, collator 153.80, algorithm 10

Local dev cluster: macOS 13.6.4, CouchDB v3.3.3, SpiderMonkey 91, Erlang <IP_ADDRESS>, ICU library 74.2, collator 153.121, algorithm 15.1

Homebrew install: macOS 13.6.4, CouchDB v3.3.3, SpiderMonkey 91, Erlang 26.2.1, ICU library 73.2, collator 153.120, algorithm 15

@jcoglan I suspect if term_to_binary output is different between architectures or erlang versions somehow.
View signatures are computed in: https://github.com/apache/couchdb/blob/33bfa1328ed7f20de2983c9394fb473cf4ca5ecf/src/couch_mrview/src/couch_mrview_util.erl#L280-L281
See if you can an add a log statement and dump the SigInfo term there and try running the term through the term_to_binary in an erlang prompt on all erlang/architecture versions and see it  produces the same result.
Erlang 26 had introduced the deterministic term_to_binary option so maybe we should start using that (though it only guarantees to be stable for the same Erlang/OTP release).
The other thing that's changed is UTF8 encoding of atoms. That's probably what the problem is here.
See some discussion from last year about it: https://github.com/apache/couchdb/issues/4467#issuecomment-1464005748

(node1@<IP_ADDRESS>)17> Views.
[{mrview,0,0,0,[],
         [{<<"consumed">>,<<"_sum">>}],
         <<"function (doc) { if (doc.pvt_type != 'allotment_consumption' || doc.pvt_deleted) ret"...>>,
         nil,[]},
 {mrview,1,0,0,
         [<<"consumed_by_callid">>],
         [],
         <<"function (doc) { if (doc.pvt_type != 'allotment_consumption' || doc.pvt_deleted)"...>>,
         nil,[]}]
(node1@<IP_ADDRESS>)18> Language.
<<"javascript">>
(node1@<IP_ADDRESS>)19> DesignOpts.
[]
(node1@<IP_ADDRESS>)20> Libs.
[]
(node1@<IP_ADDRESS>)21> couch_util:to_hex_bin(couch_hash:md5_hash(term_to_binary({Views, Language, DesignOpts, Libs}))).
<<"c15a2c0300aefa07abdea125eba80a98">>
(node1@<IP_ADDRESS>)22> couch_util:to_hex_bin(couch_hash:md5_hash(term_to_binary({Views, Language, DesignOpts, Libs}, [{minor_version, 2}]))).
<<"20ae103a2d660c16f4cbbc43703ede09">>

couchdb 3.3.3 does not use term_to_bin everywhere, so its output will vary based on whether it runs inside OTP 26 or earler.

fixed since 3.3.3 with commit https://github.com/apache/couchdb/commit/453c698a51b36b68e316a7f772d9120bd492670f

noting that couchdb 3.3.3 explicitly rejects OTP 26;
make
==> snappy (compile)
ERROR: OTP release 26 does not match required regex 23|24|25

@nickva term_to_binary is fragile and we should not be using it for view signatures (at least). The original decision was done I'm sure out of expediency and/or (benign) ignorance. forcing {minor_version, 1} is likely a solid fix for years to come, but the only truly safe path out is to define the view signature algorithm explicitly.

We have reproduced the same issue on the server without docker.

@sergey-safarov that's good news. Can it turned into a script or it's fairly simple to describe steps?

I searched through our logs and found a few of "has the wrong signature" errors as well. In our case they all happened on nodes were being decommissioned and database shards were migrating to new nodes. Wonder if there is a higher chance of it happening if there is a network partition or shard map changes when a the design document updates at the same time...

noting that couchdb 3.3.3 explicitly rejects OTP 26;

I seem to have been naughty when making the 3.3.3 Mac binaries, I swear I did this for a good reason, but I don’t recall it at the moment. I think the 25-jit failed on arm Mac, but I’m not sure: https://github.com/janl/build-couchdb-mac/blob/master/build.sh#L72-L73
None of this is relevant to the issue in the ticket, it just clarifies what @jcoglan reported

@jcoglan and I have come up with a repro for the 'wrong signature' event: https://gist.github.com/jcoglan/0a5feb4af2a496ce10c9b80cf02ea28f. Our theory is that when an index is first queried following a v2->v3 upgrade, https://github.com/apache/couchdb/blob/3.3.3/src/couch_mrview/src/couch_mrview_index.erl#L121 will rename the file and return the old signature. however, maybe_update_index_file/1 just renames the file, it does not change its content. https://github.com/apache/couchdb/blob/3.3.3/src/couch_mrview/src/couch_mrview_index.erl#L127 matches and the normal index update path is followed, but if the index is empty then no new content and no new header is written, so the old signature remains in the file. the next time the view is queried, maybe_update_index_file/1 will do nothing (the old file does not exist) and return ok, so we hit this clause where wrong signature appears https://github.com/apache/couchdb/blob/3.3.3/src/couch_mrview/src/couch_mrview_index.erl#L139

It just reproduced the issue.
The issue happened during the CouchDB upgrade from 2.3.1 to 3.3.1.
I have started daemon. Daemon failed because the user permission for the data folder was wrong. While updating the the CouchDB daemon was stopped on the old server, detached volume from the old server, attached to the new server, and started CouchDB on the new server. On user changed uid for couchdb user and daemons failed because does not have permission to data folder content.
I was making chown for the data folder content and then couchdb service started properly and the issue reproduced.
Now I can see in the logs
<EMAIL_ADDRESS><0.3795.3> -------- ./data/.shards/e0000000-ffffffff/account/44/3c/44a301b106b24f0fc1fd061d3e26.1668526196_design/mrview/462e71ffa4b5d3b38b811d08ad72396c.view has the wrong signature: expected: <<70,46,113,255,164,181,211,179,139,129,29,8,173,114,57,108>> but got <<2,65,77,140,1,52,42,68,196,86,58,98,97,23,145,106>>
<EMAIL_ADDRESS><0.3922.3> -------- ./data/.shards/e0000000-ffffffff/account/44/3c/44a301b106b24f0fc1fd061d3e26.1668526196_design/mrview/dd51edd8663a1cc90af2f8215cd797be.view has the wrong signature: expected: <<221,81,237,216,102,58,28,201,10,242,248,33,92,215,151,190>> but got <<174,153,108,105,115,213,43,72,131,221,10,174,163,141,228,115>>
<EMAIL_ADDRESS><0.3934.3> -------- ./data/.shards/e0000000-ffffffff/account/44/3c/44a301b106b24f0fc1fd061d3e26.1668526196_design/mrview/27fcce55829ac4f09ab0f195d43ad529.view has the wrong signature: expected: <<39,252,206,85,130,154,196,240,154,176,241,149,212,58,213,41>> but got <<241,187,13,21,148,238,32,71,82,114,244,157,164,178,210,214>>
<EMAIL_ADDRESS><0.4095.3> -------- ./data/.shards/e0000000-ffffffff/account/44/3c/44a301b106b24f0fc1fd061d3e26.1668526196_design/mrview/b9a49bb8b24a083e07c436f17397fb54.view has the wrong signature: expected: <<185,164,155,184,178,74,8,62,7,196,54,241,115,151,251,84>> but got <<255,60,196,213,171,156,94,131,41,80,206,111,60,138,78,212>>
<EMAIL_ADDRESS><0.2473.4> -------- ./data/.shards/c0000000-dfffffff/port_requests.1595155200_design/mrview/d2d3acac282c8c10e0edc3102682ae07.view has the wrong signature: expected: <<210,211,172,172,40,44,140,16,224,237,195,16,38,130,174,7>> but got <<91,44,84,255,172,124,87,248,145,234,222,14,180,50,2,102>>
<EMAIL_ADDRESS><0.5771.4> -------- ./data/.shards/00000000-1fffffff/port_requests.1595155200_design/mrview/d2d3acac282c8c10e0edc3102682ae07.view has the wrong signature: expected: <<210,211,172,172,40,44,140,16,224,237,195,16,38,130,174,7>> but got <<91,44,84,255,172,124,87,248,145,234,222,14,180,50,2,102>>

jan's theory makes sense to me. the 2.x -> 3.x upgrade code is flawed, it only tries the 2.0 sig if the file was found in the old location, and assumes we'll write a new header for all views on upgrade (any couchdb crash or restart would cause things to go wrong)
suggest a different approach at https://github.com/apache/couchdb/blob/3.3.3/src/couch_mrview/src/couch_mrview_index.erl#L121 or so, we can try to match the v2 sig if the v3 sig fails. that is, decouple the moving of the file from old to new location from whether the file itself is v2 vs v3.