Play YouTube and Vimeo

Is there any way we can use youtube videos instead of html5 videos?
Thanks.

We definitely could. It would probably have to be some sort of module/add I'd say as not everyone would want it but it would definitely be a plus. The YouTube player would have to be rendered as an iframe and the YouTube API used to control it. It can be done. I'll look into it. The same would apply for Vimeo I'd imagine. For obvious reasons they don't expose the raw files although services exist to fetch the mp4 from YouTube pages. Hardly ideal though and probably against YouTubes usage policies.

It would be great to see it implemented. I think a lot of people would
actually use this because the only other solution is to pay for this:
http://embed.ly/
On Thu, Feb 26, 2015 at 1:40 AM Sam Potts<EMAIL_ADDRESS>wrote:

We definitely could. It would probably have to be some sort of module/add
I'd say as not everyone would want it but it would definitely be a plus.
The YouTube player would have to be rendered as an iframe and the YouTube
API used to control it. It can be done. I'll look into it. The same would
apply for Vimeo I'd imagine. For obvious reasons they don't expose the raw
files although services exist to fetch the mp4 from YouTube pages. Hardly
ideal though and probably against YouTubes usage policies.
—
Reply to this email directly or view it on GitHub
https://github.com/Selz/plyr/issues/8#issuecomment-76148423.

Yes, it would be great, or at least, one of the reason I would love to switch to plyr

VideoJS has a plugin that does this, but it seems they use the iframe rendering option in most cases.

Would be cool for plyler to have this as well.
On Tue, Mar 3, 2015, 7:20 AM Eric Martindale<EMAIL_ADDRESS>wrote:

VideoJS has a plugin that does this
https://github.com/eXon/videojs-youtube, but it seems they use the
iframe rendering option in most cases.
—
Reply to this email directly or view it on GitHub
https://github.com/Selz/plyr/issues/8#issuecomment-76964980.

If it's possible to use a native video element, that would be vastly preferred to the iframe solution.

I'd also prefer that option but unfortunately getting access to the raw mp4 files from YouTube and Vimeo isn't possible (Vimeo do I think depending on what settings the author sets). In that case if it's to be done, it might have to use iframes and PostMessage/APIs to control playback. I'd probably build this as an add-on or module as mentioned previously.

+1 for this feature. I'll immediately switch to plyr when this gets done :)

From time to time the feature would be cool to have. Add the ability to overlay some text on YT videos and you have a huge winner for many YT heads.

+1 for this features.

+1

Sorry, I will get around to this, I just need to lock myself away for a day :+1:

Np.
On Sat, Apr 4, 2015, 8:56 PM Sam Potts<EMAIL_ADDRESS>wrote:

Sorry, I will get around to this, I just need to lock myself away for a
day [image: :+1:]
—
Reply to this email directly or view it on GitHub
https://github.com/Selz/plyr/issues/8#issuecomment-89711862.

Good luck, this features is the most importante part of this librarie now I think (design is already awesome) :)

Any update?

Sorry, I have started on YouTube playback. Will update once I have more. Will find some more time this week.

Hello, some news ? :)

Sorry, I'm still working on it around other commitments. Will try to devote some more time to it. I really want to get it in and already made a good start on it.

Awesome. Thanks for the update.
On Mon, May 11, 2015, 7:54 AM Sam Potts<EMAIL_ADDRESS>wrote:

Sorry, I'm still working on it around other commitments. Will try to
devote some more time to it. I really want to get it in and already made a
good start on it.
—
Reply to this email directly or view it on GitHub
https://github.com/Selz/plyr/issues/8#issuecomment-100934160.

Hello, news about youtube and vimeo please ?

Sorry I'm currently on vacation at the moment. It's hard to find the time so if anyone wants to contribute, feel free to pull develop and do a pull request if you're desperate.
I am working on it just life takes precedence over work and life's been busy.

Could you push what you got on a branch so we could have a look and contribute?

Will do when I get home. Currently in Dallas, about to board my 17 hour (!) flight home to Sydney.

Thanks, can't wait for this feature, so cool :)

A bit of an update on this. I finally managed to find some time today and I have made some more progress with YouTube playback and should have something to release this week. It'd be great if you guys could give it a spin once done and let me know any changes/improvements.
I'll keep you guys posted and sorry about the slowness on this. Next up Vimeo.

Nice and thanks, I try when update is online :)

@SamPotts Good to hear. I think instead of doing Vimeo next, you should do Twitch.tv. Its much more popular IMO.

Just pushed the YouTube support in v1.2.0. Please give it a test and if you find anything quirky, let me know. I'll make a start on Vimeo on this week. Sorry it's taken so long!
Hey @nahtnam, I'll take a look but Vimeo's API is decent (better than YouTube's) and not sure Twitch has support for HTML5? It wants me to install Flash. That's a no-go :-1:

@SamPotts Yeah, not sure if Twitch.tv has html5 support (they mentioned they do for safari on mac).
This is the api docs that twich has: https://github.com/justintv/Twitch-API/blob/master/embedding.md
Not sure if it will work.

@SamPotts Will you add API functionality for adding/ switching source for Youtube (and Vimeo) videos?

Even moreso, changing sources altogether – for example from a YouTube video to an mp3 audio file.

@calvintam236 Yep, this is in the docs. Have a read :+1: https://github.com/Selz/plyr#embeds

The .source() API method can also be used but the video id must be passed as the argument.

@martindale I'll work on this too, shouldn't be too hard (he says...)

@SamPotts Can you add an example what is the format for embed source in the API? You mean just plyr.source('YouTube video ID')? If so, it would be great to add the info into the API table.

Yep, e.g. go to plyr.io and chuck this in the console:
document.querySelector("#youtube .player").plyr.source("-jp3o7R5Q1I")
I'll add to the docs now in the API table

I notice it is getting a warning message.
requestFullscreen() is deprecated on insecure origins, and support will be removed in the future. You should consider switching your application to a secure origin, such as HTTPS. See https://goo.gl/rStTGz for more details.

Another issue I have is when I set the source as how you mentioned above at my script, it loads as mysitelink/youtubeid instead of loading youtube video.. Maybe because it requires to set type = 'youtube'? API does not have any method to set it. https://github.com/Selz/plyr/blob/master/src/js/plyr.js#L1605

Weird, I'm not seeing that error. The source change works for me although I've just seen that it doesn't reset the seek position properly in Chrome (annoying) so I'll look at that.
Currently switching between HTML5 and YouTube isn't supported but I am working on that and will get that sorted before moving on to Vimeo.

I see that warning message everytime I fullscreen the youtube video on the demo. Another warning I see is "Untrusted origin: https://www.youtube.com".
Is it possible to add caption support for YouTube videos?

@nahtnam @SamPotts Good news! Twitch is phasing out Flash for HTML5. http://www.vg247.com/2015/07/24/twitch-takes-another-step-in-ditching-flash-with-new-html5-player/

@calvintam236 Yep, but I havent actually seen it yet. I would really like a twitch version of plyr.

@nahtnam It seems twitch.tv works without flash now. I disabled the flash player on Safari, and the video can play. It just works with HTML5.

The YouTube API (and YouTube in general) is a bit flaky. I occasionally see errors in the console but none actually effect playback which lets be honest, is the most important thing.
There is no API method (that I could see) to toggle captions on or off. Currently it will use whatever your account (if logged into YouTube is set for).
Good news about Twitch. I'll get there, but Vimeo first. They must be rolling it out in phases or they do as Facebook does and user agent sniff, for whatever reason. I still get this:

@SamPotts The caption option does not load for YouTube videos. Does not show icon nor caption. Try this video with captions at your demo.
document.querySelector("#youtube .player").plyr.source("CevxZvSJLk8")

I can load twitch video without flash. They might just roll it out and the CND is not updated yet. Attached screenshot on Safari. Works with front page video as well.

@SamPotts Is this the parameter you are looking for in order to enable caption? https://developers.google.com/youtube/player_parameters#cc_load_policy
Setting the parameter's value to 1 causes closed captions to be shown by default, even if the user has turned captions off. The default behavior is based on user preference.

@SamPotts Twitch mentioned somewhere that html5 only works on user pages...

@nahtnam It seems work in other places now. Test it yourself without flash.
@SamPotts I just get another error at YouTube when I changed the source at your demo.
Blocked a frame with origin "https://www.youtube.com" from accessing a frame with origin "http://plyr.io".  The frame requesting access has a protocol of "https", the frame being accessed has a protocol of "http". Protocols must match.

A possible solution at http://stackoverflow.com/questions/16941139/methods-of-removing-the-youtube-iframe-api-console-error-blocked-a-frame-with

@calvintam236 Yes. I use Opera though, which also doesn't work for HTML5 on Facebook because they UA sniff, no other reason. Another reason UA sniffing is not ideal. If you change UA to Safari, videos play fine. Still, I'll do twitch after Vimeo like I say.
Well that error will be caused by their API I guess then, since the API is used to create the iframe. I'll look into it though. Odd that I'm not seeing any of these issues.
@nahtnam Cheers, I'll look into it :+1:

@ChangeTip, give @SamPotts $5 for working so hard on this library!

Hi @sampotts, @martindale sent you a Bitcoin tip worth 16,949 bits ($5.00), and I'm here to deliver it ➔ collect your tip.
Learn more about ChangeTip

Ill second that. :P

@changetip, give @SamPotts 0.01456 BTC for being so $wag.

@ChangeTip, send $4 to @SamPotts !

Hi @sampotts, @nahtnam sent you a Bitcoin tip worth 13,559 bits ($4.00), and I'm here to deliver it ➔ collect your tip.
Learn more about ChangeTip

Cheers guys, that's awesome :+1: :+1:
I'll work on Vimeo and Twitch asap.

@SamPotts Awesome. I have been insistent on Twitch because my site is going to be related to gaming. ;)

requestFullscreen() is deprecated on insecure origins, and support will be removed in the future. You should consider switching your application to a secure origin, such as HTTPS. See https://goo.gl/rStTGz for more details.

Finally found out why this message is showing up. If you run the site in HTTP, you will get it as The Chromium Projects marked HTTP as non-secure. https://goo.gl/rStTGz

I'll create another issue for that. Not really too sure what to do there apart from disable full screen on non HTTPS for Chrome then.

@SamPotts Actually I also see this message in Opera. At this moment it is just a warning which can be ignored; however, when The Chromium Projects kills it, everyone using plyr with HTTP cannot use full screen.

Just upgraded to Opera 31 and seeing it myself. OK I'll start an issue since it's not related to this one.

For the record, the https issue is #110

I have Vimeo in a working state now but the issue is that Vimeo's embed has limited options in terms of controls. The emphasis is left more to the video owner. I have, however found a way to hide the controls (while still being responsive of course) by making the iframe taller than 16:9 (the video is centered) so the controls are hidden in the overflow. This has me worried though that it will be a breach of the Vimeo AUP. I need to look into it further before I release it and get people in hot water with Vimeo. If only they added an option like YouTube have :-1:

Can we unify the API for YouTube vs. other sources?  It's extremely inconvenient to have to tear-down and reconstruct a new Plyr instance when switching from a YouTube source to an MP3 source, and vice-versa.

Yep. I'll work on that this weekend then. Makes sense. I'll release it with Vimeo as well (which is pretty much done).

I've basically rewritten how the .source api function works, it will now only accept an object but has much greater flexibility which makes sense for the next big feature, playlists. You can change type, specify title (for the aria label on the play button), specify multiple or single sources and tracks (although only one track is supported until I sort out multiple tracks).
player.source({
	type:       'video',
	title: 		'Bug Buck Bunny',
	sources: [{
		src:    'https://cdn.selz.com/plyr/1.0/movie.mp4',
		type:   'video/mp4'
	},
	{
		src:    'https://cdn.selz.com/plyr/1.0/movie.webm',
		type:   'video/webm'
	}],
	poster:     'https://cdn.selz.com/plyr/1.0/poster.jpg',
	tracks:     [{
		kind:   'captions',
		label:  'English',
		srclang:'en',
		src:    'https://cdn.selz.com/plyr/1.0/example_captions_en.vtt',
		default: true
	}]
});

This is currently in the develop branch. I'm just finishing up some more testing and working with a couple of Vimeo quirks and then it's good to go. Should be within the next couple of days. I'll report back.
Then the plan is to tackle loop and playback speed controls before I crack on with playlists.

This is great.  I'll be using this immediately (from the develop branch indeed, but will switch to a release as soon as it's available).  Thanks a ton!

Cool. Let me know if you find any bugs, I'm still finishing it up.

@SamPotts Can you update the API doc for .source()? For tracks, is it necessary to put kind, label, etc.? Can I just give a link if I have only one track?

Yes I will once it goes to the master branch. As I said, it's in the develop branch at present so if I update the release docs, it'd be a bit pointless.
Yes, I'll probably add that back in although it won't be as useful as the full object as above.

Okay, started my integration, but I'm not sure of the correct approach as expected by the library.  I've posted the following experiment, which implements the general use case I need:
plyr.setup();

var player = document.getElementsByClassName('player')[0].plyr;

var sources = [
  {
    src: 'http://inumedia.io/whalestep.mp3',
    type: 'audio/mp3'
  },
  {
    src: 'SZO5QYP-GeQ',
    type: 'youtube'
  }
];

setInterval(function() {
  var time = new Date();

  player.source({
    sources: [(time % 2) ? sources[0] : sources[1]]
  });

  player.play();
}, 5000);

It seems to correctly load the direct mp3, but not the YouTube video.  Am I doing it wrong?  Maybe this case will help you define an API, alternatively.

Damn. I'll take a look. What's your html look like?

It's Jade, but very simply:
extends layouts/media

block content
  h1 yo

  .player
    video

block scripts
  script.
    //var player = plyr.setup();
plyr.setup();

var player = document.getElementsByClassName('player')[0].plyr;

var sources = [
  {
    src: 'http://inumedia.io/whalestep.mp3',
    type: 'audio/mp3'
  },
  {
    src: 'SZO5QYP-GeQ',
    type: 'youtube'
  }
];

setInterval(function() {
  var time = new Date();

  player.source({
    sources: [(time % 2) ? sources[0] : sources[1]]
  });

  player.play();
}, 5000);

    (function(d, p){
    var a = new XMLHttpRequest(),
        b = d.body;
    a.open("GET", p, true);
    a.send();
    a.onload = function(){
        var c = d.createElement("div");
        c.style.display = "none";
        c.innerHTML = a.responseText;
        b.insertBefore(c, b.childNodes[0]);
    }
    })(document, "/img/sprite.svg");

That looks fine. I'll have a play tonight and get back to you. Sorry about that.

Heroic.  Getting library interfaces built in a way that's easily accessible is a non-trivial problem.  You're doing an amazing job.

Sorry I just looked through this again but basically the shape of your object is a little off. You need to pass the type of the player to the method as well.
var sources = [
	{
		type: 'audio',
		sources: [{
			src: 'http://inumedia.io/whalestep.mp3',
			type: 'audio/mp3'
		}],
		autoplay: true
	},
	{
		type: 	'youtube',
		sources: 'SZO5QYP-GeQ',
		autoplay: true
	}
];

setInterval(function() {
	player.source(sources[Math.floor(Math.random() * 2)]);
}, 5000);

Also calling play() straight away on a YouTube video after source change will throw an error because there's a high chance it's not had time to load. I can add a callback if you think it's beneficial, otherwise you can pass an autoplay option as above.
Still working on the Vimeo issue. It works but their API throws an error for some reason:
Uncaught TypeError: Cannot read property 'ready' of undefined

Had a busy week but hopefully I can find some more time this week.

I'd like as consistent an API as possible across all sources; YouTube and direct mp3 streams are the only ones we are using in production now, and we have several different code paths depending on the audio player's behavior with a particular source.  Our choice to use Plyr was in hopes that we can finally find a tool that lets us reduce that to exactly one code path!
Ideally, you use the callback you mention internally, to fire an event to Plyr, which then handles the YouTube videos identically to a direct MP3 stream.  I'm not sure Plyr is designed this way, though!
On the note of consistency; can the YouTube sources property be an array?  In your above example it's a single value, while the mp3 source has an array.  (We actually keep track of several different YouTube videos per audio track, and the clients will rotate on to the next element in the array if the first video doesn't load -- which is surprisingly common!  Some videos aren't available in some countries, so the ability to use "fallback videos" is necessary).
@changetip, give @SamPotts 1,000 bits for continuing to be awesome.

Hi @sampotts, I've delivered a tip worth 1,000 bits (1,000 bits/$0.25) from @martindale to your ChangeTip pocket.
Learn about ChangeTip

Hey @martindale , that's fair enough. I can make the YouTube type sources property an array also and do something with error handling. I need to look at this as a whole for HTML5 too.
It does in a way. Once YouTube's API fires a ready event, then event listeners etc are setup. These differ slightly between audio, video, YouTube and Vimeo but to you, they're the same (or should be).

Hey @ChangeTip, give @SamPotts a helpful hacker to help him wrap up the YouTube and audio APIs!  Can't wait to finish integration with soundtrack. :D

Hi @sampotts, I've delivered a tip worth a helpful hacker (25,000 bits/$6.97) from @martindale to your ChangeTip pocket.

Learn about ChangeTip

Heh, thanks for this. I'll try and find some time today to crack on. If not, tomorrow.

Pushed changes to the develop branch:

Fullscreen audio option
Fullscreen bug fix when changing source
Docs for .source method
.source api method is universal so the same shape object can be passed for all types although only the first item in the array will be used for YouTube and Vimeo at this point until I work on error handling as a whole.

I think it might be ready to go to master (with a big warning around Vimeo, I'm not sure what's going on with that)

Alright, this looks much better.  There's a couple minor tweaks I'll be submitting in a pull request, but first some questions;

is play among the methods that YouTube doesn't support? Uncaught TypeError: plyr.media.play is not a function when attempting to call player.play() immediately after loading a YouTube video.
are you opposed to unifying the video and youtube "type" at the top level, in favor of adding a new attribute type to source?  The "media" would still have type: 'video', even if one of the sources in the array had type: 'youtube' (as perhaps another source is a pure mp4 stream, or an audio file).

Was unable to test Vimeo for now, but will happily do so once I iron out the above two issues.  Adding Vimeo support to soundtrack will be great!  Their API always has been a pain...

I presume you want to just autoplay the video you added with the API? You can just add an autoplay property to the source as above. It's because the YouTube API needs to load first.
It would make the code a bit more complex since I'd have to parse the each of the sources before I could determine the actual type of the player to set up the correct markup, etc. I could but it doesn't feel as clean to me but if you feel really strongly, I could look at it.

Hello
Please Help Me On
https://www.changetip.com/tipme/rashed0

Hello
Please Help Me On
https://www.changetip.com/tipme/rashed0

Hello
Please Help Me On
https://www.changetip.com/tipme/rashed0

Hello
Please Help Me On
https://www.changetip.com/tipme/rashed0

http://rashed0.tip.me/

http://rashed0.tip.me/

http://rashed0.tip.me/

http://rashed0.tip.me/

http://rashed0.tip.me/

http://rashed0.tip.me/

http://rashed0.tip.me/

http://rashed0.tip.me/

http://rashed0.tip.me/

http://rashed0.tip.me/

http://rashed0.tip.me/

http://rashed0.tip.me/

http://rashed0.tip.me/

http://rashed0.tip.me/

http://rashed0.tip.me/

http://rashed0.tip.me/

http://rashed0.tip.me/

http://rashed0.tip.me/

http://rashed0.tip.me/

http://rashed0.tip.me/

http://rashed0.tip.me/

http://rashed0.tip.me/

http://rashed0.tip.me/

http://rashed0.tip.me/

http://rashed0.tip.me/

http://rashed0.tip.me/

http://rashed0.tip.me/

http://rashed0.tip.me/

http://rashed0.tip.me/

http://rashed0.tip.me/

http://rashed0.tip.me/

http://rashed0.tip.me/

http://rashed0.tip.me/

http://rashed0.tip.me/

http://rashed0.tip.me/

http://rashed0.tip.me/

http://rashed0.tip.me/

http://rashed0.tip.me/

http://rashed0.tip.me/

http://rashed0.tip.me/

http://rashed0.tip.me/

http://rashed0.tip.me/

http://rashed0.tip.me/

http://rashed0.tip.me/

http://rashed0.tip.me/

http://rashed0.tip.me/

http://rashed0.tip.me/

http://rashed0.tip.me/

http://rashed0.tip.me/

http://rashed0.tip.me/

http://rashed0.tip.me/

http://rashed0.tip.me/

http://rashed0.tip.me/

http://rashed0.tip.me/

http://rashed0.tip.me/

http://rashed0.tip.me/

http://rashed0.tip.me/

http://rashed0.tip.me/

http://rashed0.tip.me/

http://rashed0.tip.me/

http://rashed0.tip.me/

http://rashed0.tip.me/

http://rashed0.tip.me/

http://rashed0.tip.me/

http://rashed0.tip.me/

http://rashed0.tip.me/

http://rashed0.tip.me/

http://rashed0.tip.me/

http://rashed0.tip.me/

http://rashed0.tip.me/

http://rashed0.tip.me/

http://rashed0.tip.me/

http://rashed0.tip.me/

http://rashed0.tip.me/

http://rashed0.tip.me/

http://rashed0.tip.me/

http://rashed0.tip.me/

Locked it while this spamming twat is around

Hrm.  We do want autoplay, but this working shouldn't be dependent on that feature (since we'll be allowing our users to turn the player off entirely).  I'd rather Plyr wait for the YouTube API to emit some sort of "loaded" event, but allow .play to be queued up when called so it actually plays when the YouTube event is emitted, not simply hard error... though your comments about polling make me a sad panda when it comes to the feasibility of this.
More importantly is the separation of source and media objects; I agree it's more complex, but it's a little more accurate.  A YouTube video is still a video after all, not a different "type" of media.  We've the need to feed an array of potential sources to the player, and they might all be of different types (YouTube, mp3, etc.), so this would vastly simplify the code necessary to use Plyr, which would be a better experience for future users, IMHO.

Yes, sorry, it's just the way the YouTube API works. Not so great. Both Vimeo and YouTube API's have their flaws. A combination of them both would be good. I could however look at queuing the call to play() but that would probably set the expectation that all the other API methods would allow this (meaning massive headache) so perhaps a callback would be better.
Yes, it's more the type of the container. Which makes sense to me. There's arguments either way but I'll take a look. If we're to do that then the mime type within the sources array would be mandatory. The way it's setup, any attribute inside the sources array is mapped to a HTML attribute (so you can easily add custom) but I guess I'll have to rethink that.

@martindale , I was thinking about your suggestion to use type as video for YouTube and Vimeo and I think it makes sense as we might be able to use YouTube as a source for Audio also (at a later date).
Vimeo will be a beta feature on release, I'll need help/feedback on it I think. I think the fragaloop API is really the problem and might have to write my own (it just uses window.postmessage anyway). We'll see.
I'm almost done with v1.5. Sorry it's taken so long. Christmas and New Year was pretty hectic. Hope you all had a good one! :+1:

Fixed in v1.5.0

Hi guys, what about a support for Dailymotion?


How to loop over a list of functions

Hi,
I've seen similar issues, so I apologize if this is redundant, but I haven't been able to fully answer this on my own:
There is a spot in my code in which I have a list of functions f_list = [f1, f2, f3, ...], all written with JAX and mapping float -> complex. For a given input value t I need to create a 1d array containing the outputs of these functions, i.e. I need to evaluate jnp.array([f1(t), f2(t), f3(t), ...]). I'm currently doing this with a list comprehension, but I'd like to do it using one of the lax loop constructs. Unfortunately I can't think of how to do this without looping over the indices of the original list and at some point calling f_list[idx](t), which I know is problematic as you can't index with tracers.
An important additional note:

Apart from assuming these functions are written with JAX and have the signature float -> complex, I explicitly need to leave these functions as arbitrary, so there is no internal structure that can be exploited to rephrase the computation.

Any ideas, or am I stuck using a standard python loop?
Thanks!

You could do this with a vmapped lax.switch statement; something like this:
from jax import lax, vmap

funclist = [jnp.real, jnp.imag, jnp.abs]
x = jnp.array([1+2j, 3+4j, 5+6j])
indices = jnp.arange(len(x))

func = vmap(lambda i, x: lax.switch(i, funclist, x))
print(func(indices, x))
# [1.        4.        7.8102493]

Ah amazing, I was unaware of switch. Just tried it and it worked immediately, thank you!


WIP: Add functional tests

Created https://github.com/openshift/doozer/pull/161 to test build commands.


Add a workaround for modals to the readme

I'm curious, haven't tried it, is that a known issue ? I'd like to refer to it if that is the case.

@lfabreges At least I've had a conversation in slack with some other guy that faced the same issue.


Add IncludedMacros to default rubocop config for Style/MethodCallWithArgsParentheses

My bad, this should have been done in https://github.com/rubocop-hq/rubocop/pull/6337
I didn't realize parameters to cops were validated in this file, and it doesn't look like the spec codepath hits the relevant logic. I ran into this when trying to remove the forked version of the cop locally in favor of upstream with the fix.

Before submitting the PR make sure the following are checked:

[x] Wrote good commit messages.
[x] Commit message starts with [Fix #issue-number] (if the related issue exists).
[x] Feature branch is up-to-date with master (if not - rebase it).
[x] Squashed related commits together.
[ ] Added tests.
[x] Added an entry to the Changelog if the new code introduces user-observable changes. See changelog entry format.
[x] The PR relates to only one subject with a clear title
and description in grammatically correct, complete sentences.
[x] Run bundle exec rake default. It executes all tests and RuboCop for itself, and generates the documentation.

You'll have to regen the manual as well.

Fixed and ready to merge -- no test for this though, since I don't think specs test this config?


German documentation is badly translated - how can i help

I am trying to use the German pages for Business Central documentation over and over again, you just can't read it because the translations are often so bad. I'd like to help but while there is an "edit" button on the English pages, there is no option for me to edit the German translation? is there any way to support the product here?

Dokumentdetails
⚠ Bearbeiten Sie diesen Abschnitt nicht. Er ist für die Verknüpfung von docs.microsoft.com zum GitHub-Artikel erforderlich.

ID: 613d9e8a-856d-e913-ca98-c48e8376fb22
Version Independent ID: a7b2e7f3-d8f4-8504-fa5b-fa9fa0afc4cc
Content: Finanzberichte mithilfe von Kontenschemata bauen - Business Central
Content Source: business-central/bi-how-work-account-schedule.md
Service: dynamics365-business-central
GitHub Login: @edupont04
Microsoft Alias: edupont

Hello,
Thank you for your feedback! Our internal processes mean that our translation repos cannot receive contributions. We encourage you to submit feedback about what you consider incorrect or poor translations using the Feedback link at the bottom of the relevant article here on the Docs.microsoft.com site. Each submitted issue is then reported to our translation team,  who will triage and fix in the next translation update, which could be 1-2 months later.
Thanks!


Changed LDO to AP2112 and Changes to Silkscreen

The changes that the PR makes are:

TLV1117 to AP2112 regulator. AP2112 has a lower dropout voltage, allowing the board to be powered using a LiPo / Li-ion battery.
Silkscreen changes. JLCPCB only supports 1mm text height silkscreen, so all silkscreen text was changed accordingly. This also led to changing the location of the Logo to the front

While I appreciate the input, I don't think I'll be changing the LDO. I will however label it clearly that the TLV761 is the primary choice of LDO and that it's just compatible with the 1117 series. The main reason why I went with the TLV761 is the larger package allowing for the LDO to match the rated current output of the original Pico and a better PSSR allowing for less overall noise being coupled into the system. Which matters in a lot of analog applications me and my friends originally intended to use this board in.
Regarding the text size, I was aware that it's technically too small for some cheaper boardhouses, but from my experience you can still submit it and in most cases it will come out just fine. I will get back to this later, thank you for the tip.

I understand. If you find the LDO to be up to spec for your application, then there is no need of change. On another note, a quick look at the datasheets of TLV and AP2112 showed the ap2112 having similar-ish PSRR curves. The only compromise is the lower current rating of 600-ish mA.


Interesting Work

Hi @backseason,
I got some introduction about this work from here https://mp.weixin.qq.com/s?__biz=MzIwMTc4ODE0Mw==&mid=2247497352&idx=1&sn=dff7e64e7d388fbb394d6f7c81a544bc&chksm=96ea2908a19da01edc1697644be521b818e08625e13d20aff91aa350e8a8197fb963e84eaf9e&scene=0&xtrack=1#rd .
The idea is simple yet effective, thanks for your work. My question is, have you tried to implement FAM as a refinement of FPN in those SOTA detection algorithms like yolov3 or retinanet? I think the FAM should be useful in detection also.

Thanks!
We haven't tried this on other vision tasks.
You may give it a try, and it should be simple to plug FAM into other frameworks as there are many open source PyTorch-based detection implementations.
Good luck!


Connection refused

Hi. I'm a young programer and i cant seam to get a break. I'm working on a arduino mkr wifi 1010. My friend has setup a firebase real time database, i would like to connect to it via this arduino and pull a json from it so i can format it to a usable state and use the data from the database to check if it maches a cody i imput through a 4x4 keypad. This project should be mostly done, except the logic to for checking and the actual connection becase my attempts to connect to this database are resulting in a refused connection message.
I don't know how to proceed? Can you help ?
This is the code I'm using:
#include <WiFi.h>
#include <WiFiUdp.h>
#include <Wire.h>
#include <Arduino.h>
#include <U8g2lib.h>
#include <Keypad.h>
#include "Firebase_Arduino_WiFiNINA.h"
using namespace std;
U8G2_SH1106_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);
const byte ROWS = 4;
const byte COLS = 4;
const int MAX_LENGTH = 9;
char keys[ROWS][COLS] = {
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}
};
byte rowPins[COLS] = {A4, A3, A2, A1};
byte colPins[ROWS] = {5, 4, 3, 2};
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);
String input = "";
#define Firebase_Host "https://□□□□□□□□□□□□□□□□□.firebasedatabase.app/"
#define Firebase_Auth "EY□□□□□□□□□□□□□□□XCEwJUZh7gdwuAzwT"
#define WSsid "Vik"
#define Wpassword "ToJeMojeMeno"
String path = "/Skrinky";
String path2 = "/Objednávka";
const char* ssid = "Vik";
const char* password = "ToJeMojeMeno";
WiFiClient client;
unsigned long startTime;
class PingGoogle {
public: void ping() {
startTime = millis();
if (WiFi.begin(ssid, password)) {
if (client.connect("www.google.com", 80)) {
Serial.println("Connected to Google");
} else {
Serial.println("Failed to connect to Google");
}
client.stop();
Serial.println("Response time: " + String(millis() - startTime) + "ms");
delay(5000);
} else {
Serial.println("Failed to connect to WiFi network");
}
}
};
class PingServer {
public: void ping() {
unsigned long startTime = millis();
WiFiClient client;
if (WiFi.begin(ssid, password)) {
if (client.connect("https://bilza-8760c-default-rtdb.europe-west1.firebasedatabase.app/", 3315)) {
Serial.println("Connected to server");
client.stop();
unsigned long responseTime = millis() - startTime;
if (responseTime > 3000) {
Serial.println("Response time exceeded 3000ms");
client.stop();
return;
}
Serial.println("Response time: " + String(responseTime) + "ms");
} else {
Serial.println("Failed to connect to server");
}
} else {
Serial.println("Failed to connect to WiFi network");
}
delay(500);
}
};
PingGoogle pingGoogle;
PingServer pingServer;
void setup()
{
Serial.begin(9600);
Wire.begin();
u8g2.begin();
u8g2.setFont(u8g2_font_ncenB14_tr);
u8g2.firstPage();
u8g2.clearBuffer();
u8g2.drawStr(3,25,"Zadaj kod:");
while (!Serial) {
;
}
if (WiFi.begin(ssid, password) == WL_CONNECTED) {
Serial.println("Connected to WiFi");
Serial.print("Connected with IP: ");
Serial.println(WiFi.localIP());
Serial.println();
} else {
Serial.println("Failed to connect to WiFi");
}
delay(500);
pingGoogle.ping();
Firebase.begin(Firebase_Host, Firebase_Auth, WSsid, Wpassword);
Firebase.reconnectWiFi(true);
FirebaseData data;
if (Firebase.getJSON(data, path)) {
Serial.println("Data Retrieved: ");
Serial.println(data.jsonData());
} else {
Serial.println("Error Retrieving Data: ");
Serial.println(data.errorReason());
}
if (Firebase.getJSON(data, path2)) {
Serial.println("Data Retrieved: ");
Serial.println(data.jsonData());
} else {
Serial.println("Error Retrieving Data: ");
Serial.println(data.errorReason());
}
}
void loop() {
u8g2.setFont(u8g2_font_ncenB14_tr);
u8g2.firstPage();
u8g2.clearBuffer();
u8g2.drawStr(3,25,"Zadaj kod:");
char key = keypad.getKey();
if (key)
{
if (key == 'A' || key == 'B' || key=='C' || key=='D' || input.length() >= MAX_LENGTH) {
input = "";
u8g2.clearBuffer();
u8g2.drawStr(5,25,"Zadaj kod:");
} else {
  input += key;
}
do {
  u8g2.drawRFrame(0,0,127,63,7);

  u8g2.drawStr(5,50,input.c_str());
  Serial.println(input.c_str());
}while ( u8g2.nextPage() );

}
}
this is my serial monitor:

this is my ruleset for my database:

Please read this issue https://github.com/mobizt/Firebase-Arduino-WiFiNINA/issues/18

You need to update firmware and add host certificate to device.

Ithe firmwase for wifi nina was updated and i canot choose a board even tho i have the arduino mkr wifi 1010 connected.

The only certificate i have the option of uploading is the arduino.cc443 but that fails every time so i dont know what to do.
I have already read the issue #18 before contacting you via this thread. I tried every thing from that isue and it changed nothing so im sorry for casuing trouble, but i didnt find any other way to fix this other than contacting you.

The Firebase_Host should not include https:// at the beginning and / at the end of string or only host name.
Library does not manage this for you because of the code size for some device e.g., UNO WiFi Rev2. is limited.

Thanks. It finally works.


1.2 docs already point to cilium/cilium:v1.2.4

It's a side effect of the docs being built from the v1.2 branch instead of the latest tagged release.

That's why we set stable to point to the latest tagged release, it knows about rc tags and will only change when a real release occurs:
http://docs.cilium.io/en/stable/

Discussed during the community meeting. I will do the following:

Revert k8s yaml version changes so docs point to existing stable image tag
Update k8s yaml version just before the release of v1.2.4.

Fixed via #5781


Incompatible with Ruby >= 2.6 with recent Webrick version

Hi! There is an issue with Ruby >= 2.6 with a recent Webrick version. Webrick public API was changed and now it requires more arguments.
Check the do_PUT / do_DELETE / do_PATCH / etc methods that calls perform_proxy_request(req, res) under the hood. But in a new Webrick it requires 3..4 arguments to be passed:
https://github.com/ruby/webrick/blob/master/lib/webrick/httpproxy.rb#L298
So we catch wrong number of arguments (given 2, expected 3..4) exception.

Indeed. Perhaps easiest is to RVM an older version... not that this approach has been proven sane (looking at some Pythons...).


Consider wrapping cfitsio on each build to keep up with fitsio changes

As per this blog post, fitsio can be wrapped in the fitsio-sys module on each compile. This means the API stays exactly matched to the installed cfitsio library, rather than the rust API being generated once, and therefore which may get out of sync.

This has been implemented in the fitsio-sys-bindgen directory


wrong ip assigned to container with fixed ip, after container was copied

Dnsmasq assigns a random IP to a running container which has a fixed ip address configured with
lxc config device set www2 eth0 ipv4.address <IP_ADDRESS>
when a copy of that container was created.
The stopped copy contains the same fixed ip address configuration and this seems to "confuse" dnsmasq when renewing the ip address lease of the running container.
This happened to my setup this early morning, when no special operation was happening. After multiple days/weeks running with the same config, incl. the stopped copy.
Now when analysing the situation it happened again with a second container when I was not directly making any operations on this container.
Steps to reproduce

Create a container with network device and fixed ip address
Start container
Create a copy
Wait until renewal of dhcp lease. or provoke it somehow, restart running container, do some other operations.

Required information

Distribution: ubuntu xenial
Distribution version:
The output of "lxc info" , see below

Information to attach
lxc config show www2
architecture: x86_64
config:
  image.architecture: amd64
  image.description: ubuntu 16.04 LTS amd64 (release) (20170307)
  image.label: release
  image.os: ubuntu
  image.release: xenial
  image.serial: "20170307"
  image.version: "16.04"
  volatile.base_image: 2cab90c0c342346ea154bc2e8cacdae752a70747a755ce1f2970c9a9ebb5fe8c
  volatile.eth0.hwaddr: 00:16:3e:8f:2a:b3
  volatile.eth0.name: eth0
  volatile.idmap.base: "0"
  volatile.idmap.next: '[{"Isuid":true,"Isgid":false,"Hostid":100000,"Nsid":0,"Maprange":65536},{"Isuid":false,"Isgid":true,"Hostid":100000,"Nsid":0,"Maprange":65536}]'
  volatile.last_state.idmap: '[{"Isuid":true,"Isgid":false,"Hostid":100000,"Nsid":0,"Maprange":65536},{"Isuid":false,"Isgid":true,"Hostid":100000,"Nsid":0,"Maprange":65536}]'
  volatile.last_state.power: RUNNING
devices:
  eth0:
    ipv4.address: <IP_ADDRESS>
    nictype: bridged
    parent: lxdbr0
    type: nic
ephemeral: false
profiles:
- default
stateful: false
description: ""

# lxc config show www2-bkp
architecture: x86_64
config:
  image.architecture: amd64
  image.description: ubuntu 16.04 LTS amd64 (release) (20170307)
  image.label: release
  image.os: ubuntu
  image.release: xenial
  image.serial: "20170307"
  image.version: "16.04"
  volatile.base_image: 2cab90c0c342346ea154bc2e8cacdae752a70747a755ce1f2970c9a9ebb5fe8c
  volatile.eth0.hwaddr: 00:16:3e:e5:cf:2d
  volatile.eth0.name: eth0
  volatile.idmap.base: "0"
  volatile.idmap.next: '[{"Isuid":true,"Isgid":false,"Hostid":100000,"Nsid":0,"Maprange":65536},{"Isuid":false,"Isgid":true,"Hostid":100000,"Nsid":0,"Maprange":65536}]'
  volatile.last_state.idmap: '[{"Isuid":true,"Isgid":false,"Hostid":100000,"Nsid":0,"Maprange":65536},{"Isuid":false,"Isgid":true,"Hostid":100000,"Nsid":0,"Maprange":65536}]'
  volatile.last_state.power: STOPPED
devices:
  eth0:
    ipv4.address: <IP_ADDRESS>
    nictype: bridged
    parent: lxdbr0
    type: nic
ephemeral: false
profiles:
- default
stateful: false
description: ""

# cat /var/lib/lxd/networks/lxdbr0/dnsmasq.leases
1503767752 00:16:3e:8f:2a:b3 <IP_ADDRESS> www2 *

# lxc info
config:
  core.https_address: asdfasdf
  core.trust_password: true
api_extensions:
- storage_zfs_remove_snapshots
- container_host_shutdown_timeout
- container_syscall_filtering
- auth_pki
- container_last_used_at
- etag
- patch
- usb_devices
- https_allowed_credentials
- image_compression_algorithm
- directory_manipulation
- container_cpu_time
- storage_zfs_use_refquota
- storage_lvm_mount_options
- network
- profile_usedby
- container_push
- container_exec_recording
- certificate_update
- container_exec_signal_handling
- gpu_devices
- container_image_properties
- migration_progress
- id_map
- network_firewall_filtering
- network_routes
- storage
- file_delete
- file_append
- network_dhcp_expiry
- storage_lvm_vg_rename
- storage_lvm_thinpool_rename
- network_vlan
- image_create_aliases
- container_stateless_copy
- container_only_migration
- storage_zfs_clone_copy
- unix_device_rename
- storage_lvm_use_thinpool
- storage_rsync_bwlimit
- network_vxlan_interface
- storage_btrfs_mount_options
- entity_description
- image_force_refresh
- storage_lvm_lv_resizing
- id_map_base
- file_symlinks
- container_push_target
- network_vlan_physical
- storage_images_delete
- container_edit_metadata
- container_snapshot_stateful_migration
- storage_driver_ceph
- storage_ceph_user_name
- resource_limits
- storage_volatile_initial_source
api_status: stable
api_version: "1.0"
auth: trusted
public: false
environment:
  addresses:
  - asdfasdf
  architectures:
  - x86_64
  - i686
  certificate: |
   asdfasdf
  certificate_fingerprint:
  driver: lxc
  driver_version: 2.0.8
  kernel: Linux
  kernel_architecture: x86_64
  kernel_version: 4.10.0-32-generic
  server: lxd
  server_pid: 22769
  server_version: "2.17"
  storage: zfs
  storage_version: <IP_ADDRESS>-2

I'm not sure what we can really do about this. LXD does tell dnsmasq about what you want, that is, two containers with the same static IP.
dnsmasq then apparently considers that to be invalid and ignores both static entries.
There's unfortunately no real API to configure dnsmasq, all that LXD can do is dump a bunch of text files into place and send SIGHUP to dnsmasq to have it reload its configuration. Whether that reload succeeds or fails, we unfortunately have no way of knowing.

The few options we have are unfortunately all bad...
Prevent you from copying the container in the first place
You'd then need to alter the source container to remove its static IP before you can copy it, which may cause your source container to loose its IP at that point...
Only apply DHCP static leases when the container is running
There are a few problems with this approach, one is that reconfiguring dnsmasq is pretty expensive, so doing it every time a container state changes will cause significant load on busy systems.
The other problem is that if the static address is part of the dynamic range, it may end up being assigned to another running container, causing a later conflict when the container that has the static IP is started.
Prevent starting containers any container which has a duplicate static address with another
This should be pretty safe to implement but certainly won't cover all cases as creating a container and not starting it is enough to cause the problem.

So it looks like dnsmasq will let you have multiple MACs get the same address if it's listed on the same dhcp-host line. The issue with this is that we also use the dhcp-host line to set the DNS entry for the container which means we have the container name in there...

I'll have to check whether it's allowed to have multiple dhcp-host lines for the same MAC. If so, then we can have one line which does the MAC to NAME assignment and another which does the MACs to IP part, but I doubt that dnsmasq is going to let us get away with that.

Oh, unless we can also specify multiple names on the same line, then we may be able to keep things working that way. I'll have to experiment.

Somehow related to: https://github.com/lxc/lxd/issues/3694 ?

A simple solution would be to delete the static address when creating a copy.
Then one could set a new ip. lxd could prevent or warn if an ip is already configured.
As a shortcut lxd could promt for a new ip when creating a copy, respectively allow it to be specified as an option.
PS: Stéphane your response time and dedication is phenomenal. Thank you a lot!

@huegelc I don't think so. dnsmasq would have logged an error if that had been the case, something like:
Aug 24 00:44:02 castiana dnsmasq[9831]: duplicate dhcp-host IP address <IP_ADDRESS> at line 1 of /var/lib/lxd/networks/lxdbr0/dnsmasq.hosts/cont8

@pgassmann deleting the static IP would be pretty easy indeed, except for a few things:

There is no mechanism in the LXD API for giving a "warning" back to the user. Just errors. That's something we may want to add for such cases.
The user may actually want the two containers to have the same IP address. Assuming they never plan for the two of them to be running at the same time.
We'd need to special case local copies as cross-host copy would be fine.

Preventing the user from setting an ipv4.address value which is already used would also prevent the case where the user is doing this on purpose and isn't planning on running both containers at the same time. A warning would be appropriate, but a hard error not so much.
The way local container copies work at the API level does make it possible to send an alternative list of devices to LXD which would then override what's on the source container. So it is technically possible to allow overriding the address. We've never added such interactive behavior in the client though and I'm concerned it'd break a bunch of people scripting LXD.
Having some command line language to override a particular field of a particular device would be nice though. Similar to the "-c" parameter we have which lets you override normal config keys (so outside of a device).

Yes, the user might want that. But only if it does not affect the one running container properly. With the current behaviour it is better not to allow setting two times the same IP than allowing it and risk a totally different IP.
Interactive behaviour can be omitted by throwing an error and prompting to either specify a new ip or set a flag to drop the ip configuration.
Example
# lxc copy web1 web1-bkp
=> cannot copy container with fixed ip. Specify --drop-ip or --config-set device eth0 ipv4.address <foo> to copy the container
# lxc copy web1 web1-bkp  --config-set device eth0 ipv4.address <IP_ADDRESS>
=> success

From a networking standpoint, you never want two machines with the same mac.  Not only will it cause the above problems, but if those MAC addresses hit the network on two different ports, ie, it was copied to another host, you will get MAC flapping which can bring down ports, or even cause issues on the control plane of a switch and bring it down.  I would suggest that the MAC address,  be recreated, or if statically assigned, perhaps allow the copy, but leave the container in a shut state, and provide a notice that a possible conflict can occur.   :)  At least I always do.

LXD ensures that the MAC isn't the same, unless the user really forces us. So that part is fine. We're only talking about IP here. And yes, two containers running with the same IP but different MAC is not much better as far as the network is concerned as you're going to be hitting one or the other depending on what's in your ARP cache.
But at least it won't trip things like loop detection at the switch level.

Ah, I was thinking IP from MAC-reservation, not host-name.  Typically don't allow my server administrators to use anything but static configs.  DHCP is strictly for clients, so never an issue.  But on a clone, doesn't the hostname get set in the meta-data from the container name?  I know cloud-init it doing some work, but thought LXD was as well, since hostname does get set even on the non-cloud enabled images.  If only on the first run, then maybe reset the boot-instance or some other trigger on a copy to do so.

The hostname part that's related to dnsmasq is so that dnsmasq can generate the relevant DNS records (both forward and reverse) for the container's IPv4 and IPv6 addresses.

On a normal LXD, that gets you container-name.lxd to resolve to the container's IPv4 and IPv6 addresses (regardless of whether static DHCP assignment is used or not).

Thank you! What solution did you implement?

We detect if two containers have the same ipv4.address and ipv6.address, if that's the case, the second container gets its mac address added to the static entry of the first.
So we effectively give you exactly what you asked for. Both containers do get the same addresses as requested.


[SPARK-11034] [LAUNCHER] [MESOS] Launcher: add support for monitoring Mesos apps

What changes were proposed in this pull request?
Added Launcher support for monitoring Mesos apps in Client mode. SPARK-11033 can handle the support for Mesos/Cluster mode since the Standalone/Cluster and Mesos/Cluster modes use the same code at client side.
How was this patch tested?
I verified it manually by running launcher application, able to launch, stop and kill the mesos applications and also can invoke other launcher API's.

Can one of the admins verify this patch?

ok to test

Test build #82744 has started for PR 19385 at commit 28f511e.

Test build #82744 has finished for PR 19385 at commit 28f511e.

This patch passes all tests.
This patch merges cleanly.
This patch adds no public classes.

Merged build finished. Test PASSed.

Test PASSed.
Refer to this link for build results (access rights to CI server needed):
https://amplab.cs.berkeley.edu/jenkins//job/SparkPullRequestBuilder/82744/
Test PASSed.

This only solves half the problem, right? What about cluster mode?

Thanks @vanzin for looking into this.

This only solves half the problem, right? What about cluster mode?

Yes, it solves the Mesos/Client mode. For Mesos/Cluster mode, I think the Standalone/Cluster(SPARK-11033) implementaton(or similar way) would handle since both use the same logic at the client side to submit the application.

Test build #82750 has started for PR 19385 at commit ced3e58.

Test build #82750 has finished for PR 19385 at commit ced3e58.

This patch passes all tests.
This patch merges cleanly.
This patch adds no public classes.

Test PASSed.
Refer to this link for build results (access rights to CI server needed):
https://amplab.cs.berkeley.edu/jenkins//job/SparkPullRequestBuilder/82750/
Test PASSed.

Merged build finished. Test PASSed.

Merging to master.


Combine visit-build-open and visit-build-closed

There is a lot of duplicated logic in these scripts. I think we can combine them.

We should ensure that permissions are set appropriately.


Tried fixing drugs.yml again.

Okay.  I've done some tinkering on my local copy of the drugs-fixed/ branch, and I think this is a cleaner merge.  Could you take a look at it, and if it's still bad I might need some help fixing it (because Git claims everything's fine on my end and there is no conflict, even after a git fetch upstream).

@virtadpt This branch has conflicts that must be resolved

I've noticed that even after you push up a merge commit (I recommend doing a rebase instead of this month) your branch is still out of date. This leads me to believe that the master branch on your fork of this repository is out of date with the master branch of the main repository. You should be able to check this by verifying if the latest commit on the master branch of each repository is the same.
I'll be more than happy to help you further as soon as we figure out why in the pull quests are continuously out of date.

@virtadpt I'm going to close this ticket off. The drugs.yml file was removed some time ago.

Acknowledged.


Support "SAML" and/or "OpenID Connect" with OKTA Integration

Feature Suggestion
While I was trying to onBoard Backstage to our OKTA platform, I was asked to provide the protocol/method .. and I have only 2 options; either SAML or OpenID Connect. So, it would be nice to consider these options (especially the SAML one).

Hey, I'm trying to implement SAML login for backstage as our organization's identity provider supports SAML. I've submited a PR (still WIP) #2284 :)

Based on #2284 for SAML and https://github.com/backstage/backstage/pull/3309 for OpenID, and even Okta in https://github.com/backstage/backstage/pull/1455, I think the ask in this issue is covered. Those methods are available auth providers for backstage.

Closing!


Calling appendbufline() against an empty file will introduce an extra unexpected line

Describe the bug
Calling appendbufline() against an empty file will introduce an extra unexpected line.
To Reproduce
Detailed steps to reproduce the behavior:
Case 1:

Run vim --clean -c 'set number' tmp.vim
:call appendbufline('', '$', [1, 2])

Line 1 is the unwanted blank line.
Case 2:

Run vim --clean -c 'set number' tmp.vim
:call appendbufline('', 0, [1, 2])

Line 3 is the unwanted blank lines.
Expected behavior
Don't introduce extra blank line.
Environment (please complete the following information):

Vim version 8.1-2108
OS: Ubuntu 18.04
Terminal: GNOME Terminal

Additional context

An empty buffer consists of one empty line.  If you append, this line is still there.
This has always been this way, plugins normally overwrite the empty line or delete it after appending lines.  We can't change the behavior without breaking that.


Better changed union UX

Is your feature request related to a problem? Please describe.
I'd like ?-like (maybe) bubbling for .changed(). Currently I have to bubble InnerResponse<bool>s and OR them until I get to the root of the form which makes for very ugly code:

I have this form that requires manual re-submission once it's all done: https://github.com/ckiee/desk-fcobs/blob/1487181fde7d3c23cac169be74b09d60c2134c28/ledc/src/ui.rs#L147-L181
This strip controls "component" which has two controls that need to be bubbled in order to trigger an update on my I/O thread: https://github.com/ckiee/desk-fcobs/blob/1487181fde7d3c23cac169be74b09d60c2134c28/ledc/src/ui.rs#L52-L76; This one is trickier.

Describe the solution you'd like
Maybe add a change field to egui::Sense? No longer sure.
Describe alternatives you've considered
Additional context

You can run ledc from the desk-fcobs repository pretty easily if you want to try this. But it won't do anything since it won't be able to connect to the serial port.

I think what you are looking for is the union method.
For example, here is the hello_world example modified to count changes made to the form:
impl eframe::App for MyApp {
    fn update(&mut self, ctx: &egui::Context, _frame: &mut eframe::Frame) {
        egui::CentralPanel::default().show(ctx, |ui| {
            ui.heading("My egui Application");
            let mut form_response = ui
                .horizontal(|ui| {
                    let name_label = ui.label("Your name: ");
                    ui.text_edit_singleline(&mut self.name)
                        .labelled_by(name_label.id)
                })
                .inner;
            form_response = ui
                .add(egui::Slider::new(&mut self.age, 0..=120).text("age"))
                .union(form_response);
            if ui.button("Click each year").clicked() {
                form_response.mark_changed();
                self.age += 1;
            }
            if form_response.changed() {
                self.total_changes += 1;
            }
            ui.label(format!("Hello '{}', age {}", self.name, self.age));
            ui.label(format!("Total changes: {}", self.total_changes));
        });
    }
}

For your first example, you could create a function/closure schedule_grid_ui(ui: &mut Ui) -> Response, and return a response that is the union of all the responses from the editable widgets (or the widgets you care about), then do if schedule_grid_ui(ui).changed() {...}.

Oh, that's quite good (:  I suppose the Sense idea was wrong since that seems to be the input to the widget/Ui?
But it is still lacking, I'd have to manually reduce over an array of Uis and that seems very messy.

Yes, Sense is for the widget to tell the Ui what input events it's interested in, while the changed flag is set by the widget's own logic. So I think you do have to write the logic for how to combine the responses of the individual widgets in your form. The alternative would be for the Ui to intercept the responses somehow and combine them, but I don't know where that would even happen.
Consider the toggle_switch sample:
https://github.com/emilk/egui/blob/3a8ed37f491e2bf63395632bb9e98c6ed198ae67/crates/egui_demo_lib/src/demo/toggle_switch.rs#L73-L96
It initially gets a response from the Ui, to see if the area has been clicked. Then, the logic for this particular widget dictates that it changes when it is clicked, so it calls mark_changed as appropriate. But at this point the Ui no longer has access to the Response, it is returned to the caller. So it is up to the caller who is using the widget as part of an Ui to decide what to do with its response.
Actually, I just looked at the docs again and there is a trait implementation meant specifically for that, that I hadn't noticed before: https://docs.rs/egui/0.23.0/egui/struct.Response.html#impl-BitOr-for-Response
So you can just do:
ui.add(Slider::new(&mut strip.0, 0..=65535).text("cold"))
| ui.add(Slider::new(&mut strip.1, 0..=65535).text("warm"))

Then I guess it's a matter of breaking the UI code down into small functions that return Response, so this is easier to write and keep track of.


fix: style multiselect input

SUMMARY
Per @ktmud's findings from https://github.com/apache/incubator-superset/pull/11289 there is some jumpy behavior if the
placeholder is very wide. It looks like react-select is setting a dynamic width on the input based on the length of the placeholder. Then there's an overflow: hidden to cut down the size to fit the component. Together with the existing flex-box styling, it forced the element to go off the element to the left. The width element is somewhat fighting with the flex-box functionality, so I overwrote it and relied solely on flexbox to determine the width of the elements and let it adjust more gracefully. I'm not 100% familiar with the react-select library, so there may be more tooling hid somewhere that we can utilize.
BEFORE/AFTER SCREENSHOTS OR ANIMATED GIF

TEST PLAN
tested visuallly in storybook
ADDITIONAL INFORMATION

[ ] Has associated issue:
[x] Changes UI
[ ] Requires DB Migration.
[ ] Confirm DB Migration upgrade and downgrade tested.
[ ] Introduces new feature or API
[ ] Removes existing feature or API

Thanks for the fix! Will verify later.
In the meantime, can we disabled browser's native autocomplete as well?

It looks like the onPaste also wraps the Input in another div, so the styles aren't applied for flexbox in that case. I'm poking around inside react-select a bit more to see if I can pass in some styles that get applied to the input or it's wrapper so that it stays within the bounds of the flexbox component. Also, will turn off the autocomplete.. thanks for the reminder!

Codecov Report

Merging #11732 (d3baea6) into master (8a39f27) will decrease coverage by 0.68%.
The diff coverage is n/a.

@@            Coverage Diff             @@
##           master   #11732      +/-   ##
==========================================
- Coverage   63.04%   62.36%   -0.69%
==========================================
  Files         895      443     -452
  Lines       43315    27260   -16055
  Branches     4015        0    -4015
==========================================
- Hits        27308    17000   -10308
+ Misses      15829    10260    -5569
+ Partials      178        0     -178

Flag
Coverage Δ

javascript
?

python
62.36% <ø> (-0.82%)
:arrow_down:

Flags with carried forward coverage won't be shown. Click here to find out more.

Impacted Files
Coverage Δ

superset/db_engines/hive.py
0.00% <0.00%> (-85.72%)
:arrow_down:

superset/databases/commands/create.py
32.65% <0.00%> (-59.19%)
:arrow_down:

superset/db_engine_specs/hive.py
54.08% <0.00%> (-29.97%)
:arrow_down:

superset/views/database/mixins.py
59.64% <0.00%> (-22.81%)
:arrow_down:

superset/db_engine_specs/presto.py
69.76% <0.00%> (-12.53%)
:arrow_down:

superset/db_engine_specs/mysql.py
79.59% <0.00%> (-12.25%)
:arrow_down:

superset/databases/commands/update.py
85.71% <0.00%> (-8.17%)
:arrow_down:

superset/databases/api.py
81.93% <0.00%> (-6.04%)
:arrow_down:

superset/databases/dao.py
94.11% <0.00%> (-5.89%)
:arrow_down:

superset/views/database/validators.py
78.94% <0.00%> (-5.27%)
:arrow_down:

... and 482 more

Continue to review full report at Codecov.

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

Ok, I was able to find a way to pass styles into react-select for the input element. The reason I think it needs to be contained to the parent element is for long placeholders. Here's an example:

I updated the OnPasteSelect as mentioned above by removing the wrapper so that we could continue to utilize the flex box styles, and it appears to work, but lmk if there's maybe some functionality that I didn't test.
Here are videos of three places that I tested. Some of us are looking into automated visual testing tools as well!

quick note: I wasn't able to get autocomplete to show, but I saw that react-select has autocomplete="off" which doesn't work for chrome, so I'm fairly certain that what you had should do the trick.

Tests are taking a long time to run. Restarting.

Thanks @ktmud! Feel free to merge when ready.

Something in this PR caused an issue with our listview filters width
before this change:

After this change:


feat: integrate the native runner with a composite action

Fixes #83

There is still some things to clean up, like the src folder


Upgrade rb-readline to version 0.5.1

See also https://github.com/luislavena/rb-readline/compare/v0.5.0...v0.5.1

I think that this is more or less outdated, since I had to build off the master branch for 2.2.
If I'm wrong let me know.


What's your mmdetection version used in this repo?

I need to decide which version of mmcv to be installed according to mmdetection version.

1.1.0


De-randomize the listener map property

Since it makes no sense to have two OpenLayers scripts loaded on one page, we do not need to randomize the listener map property.

LGTM


Error appears when trying to open Empty schema in Simple view

System information:

Operating system (distribution) and version win10 x64
DBeaver version 7.1.0

Connection specification:

Database name and version PostgreSQL

Steps to reproduce, if exist:

Switch database view to simple
Open any empty database in property viewer
Actual result:
error appears

Fixed (error was caused by permission editor, now we don't show it in simple view mode)

verified


DdlParserException if subject contains line breaks

When add line breaks (\r\n) to a document's subject property, a DdlParserException is thrown:

MigraDoc.DocumentObjectModel.IO.DdlParserException: '']' expected, found '}'.'
Error	{[(9,3):] xxx DDL1001: ']' expected, found '}'.

Document = new Document
            {
                Info =
                {
                    Title = "A Title",
                    Subject = "A subject with a \r\n line break",
                    Author = "Jovic"
                },
             };

A stumbled across this issue when I added the WPF DocumentPreview control and set it's Ddl property. The stack trace is:
at MigraDoc.DocumentObjectModel.IO.DdlParser.ThrowParserException(DomMsgID errorCode, Object[] parms)
   at MigraDoc.DocumentObjectModel.IO.DdlParser.AssertSymbol(Symbol symbol)
   at MigraDoc.DocumentObjectModel.IO.DdlParser.ParseAttributes(DocumentObject element, Boolean readNextSymbol)
   at MigraDoc.DocumentObjectModel.IO.DdlParser.ParseDocument(Document document)
   at MigraDoc.DocumentObjectModel.IO.DdlReader.ReadDocument()
   at MigraDoc.DocumentObjectModel.IO.DdlReader.DocumentFromString(String ddl)
   at MigraDoc.Rendering.Windows.DocumentPreview.DdlUpdated()

My first idea: do not use line breaks in document properties.
Adobe Reader DC only shows the part before the line break.
So maybe MigraDoc should throw exceptions when the document properties contain line breaks or other unsupported control characters.

Yes, the workaround is obvious, so it's not a major issue.
The current behaviour is inconsistent in my opinion: The serialization works without errors, but the deserializer stumbles across that line break.

Problem still exists with PDFsharp 6.0.0. But I close here as we won't fix it for PDFsharp 1.5.


Recursion error in DataFrame.set_index

git bisect traced this regression back to #8517:
import dask, distributed
client = distributed.Client()
# Create an already-sorted index; reset first so we can actually call .set_index()
ddf = dask.datasets.timeseries(end="2000-07-01").reset_index().astype({"timestamp": str})
ddf = ddf.set_index("timestamp", sorted=True)
ddf.to_csv("/tmp/dask_test/")

pre-#8517, this finishes in ~30s on my laptop; post-#8517, it fails with
---------------------------------------------------------------------------
Exception                                 Traceback (most recent call last)
<ipython-input-4-29e339cba513> in <module>
      1 from uuid import uuid4
----> 2 ddf.to_csv(f"gs://model_bigquery_tmp/{uuid4().hex}/")

~/Dropbox/Documents/dask/dask/dataframe/core.py in to_csv(self, filename, **kwargs)
   1621         from .io import to_csv
   1622
-> 1623         return to_csv(self, filename, **kwargs)
   1624
   1625     def to_sql(

~/Dropbox/Documents/dask/dask/dataframe/io/csv.py in to_csv(df, filename, single_file, encoding, mode, name_function, compression, compute, scheduler, storage_options, header_first_partition_only, compute_kwargs, **kwargs)
    955         import dask
    956
--> 957         return list(dask.compute(*values, **compute_kwargs))
    958     else:
    959         return values

~/Dropbox/Documents/dask/dask/base.py in compute(traverse, optimize_graph, scheduler, get, *args, **kwargs)
    573         postcomputes.append(x.__dask_postcompute__())
    574
--> 575     results = schedule(dsk, keys, **kwargs)
    576     return repack([f(r, *a) for r, (f, a) in zip(results, postcomputes)])
    577

~/Dropbox/Documents/distributed/distributed/client.py in get(self, dsk, keys, workers, allow_other_workers, resources, sync, asynchronous, direct, retries, priority, fifo_timeout, actors, **kwargs)
   3002                     should_rejoin = False
   3003             try:
-> 3004                 results = self.gather(packed, asynchronous=asynchronous, direct=direct)
   3005             finally:
   3006                 for f in futures.values():

~/Dropbox/Documents/distributed/distributed/client.py in gather(self, futures, errors, direct, asynchronous)
   2176             else:
   2177                 local_worker = None
-> 2178             return self.sync(
   2179                 self._gather,
   2180                 futures,

~/Dropbox/Documents/distributed/distributed/utils.py in sync(self, func, asynchronous, callback_timeout, *args, **kwargs)
    307             return future
    308         else:
--> 309             return sync(
    310                 self.loop, func, *args, callback_timeout=callback_timeout, **kwargs
    311             )

~/Dropbox/Documents/distributed/distributed/utils.py in sync(loop, func, callback_timeout, *args, **kwargs)
    374     if error:
    375         typ, exc, tb = error
--> 376         raise exc.with_traceback(tb)
    377     else:
    378         return result

~/Dropbox/Documents/distributed/distributed/utils.py in f()
    347                 future = asyncio.wait_for(future, callback_timeout)
    348             future = asyncio.ensure_future(future)
--> 349             result = yield future
    350         except Exception:
    351             error = sys.exc_info()

~/model/.venv/lib/python3.9/site-packages/tornado/gen.py in run(self)
    760
    761                     try:
--> 762                         value = future.result()
    763                     except Exception:
    764                         exc_info = sys.exc_info()

~/Dropbox/Documents/distributed/distributed/client.py in _gather(self, futures, errors, direct, local_worker)
   2039                             exc = CancelledError(key)
   2040                         else:
-> 2041                             raise exception.with_traceback(traceback)
   2042                         raise exc
   2043                     if errors == "skip":

Exception: RecursionError('maximum recursion depth exceeded in __instancecheck__')

and also eats up an enormous amount of memory in the process (reaches several times higher than peak memory in the older version before giving up).
I haven't been able to reproduce the same error without the distributed.Client(), the computation seems to just hang forever with other schedulers...will keep playing around with the size of dataset/partitions and see if I can get something breaking w/o distributed.
EDIT: it did finally complete after ~10 minutes with scheduler="threads" (compared to ~90s on 2022.2.1), no recursion error
EDIT 2: couldn't reproduce the error w/ processes but I did manage to brick my OS by using so much memory 😅
cc @jsignell @gjoseph92

Hey @bnaul thanks for the report and bisecting the issue. I'll be taking a look at this in the coming days.

Thanks for the report and the ping. I am taking a look at @phobson's PR now.

I have isolated a suspicious looking change in fix_overlap. Pushing soon.

Thank you for the fast turnaround time @jsignell  !
On Sun, Apr 24, 2022 at 7:39 PM Julia Signell @.***>
wrote:

I have isolated a suspicious looking change in fix_overlap. Pushing soon.
—
Reply to this email directly, view it on GitHub
https://github.com/dask/dask/issues/8955#issuecomment-1107953502, or
unsubscribe
https://github.com/notifications/unsubscribe-auth/AACKZTC3HWJZL7XJB2PS3RTVGXSTXANCNFSM5T4J63QA
.
You are receiving this because you commented.Message ID:
@.***>


Make 'Now' button consistent with 'Add' buttons

cc: @adamcogan @pierssinclairssw @bradystroud
To Myself,
We have raised an issue on the Netlify CMS repository to address UX concerns our users have.

Resolve netlify/netlify-cms#5706

Thanks,
Taine
AB#63366

@adamcogan @pierssinclairssw @bradystroud
Hi,

Resolve netlify/netlify-cms#5706

Done - see screenshot

Figure: Now button consistent with Add buttons


Added Level Indicator for #2351 (changed XP to Level)

I thought that XP was used for this game because it appears in the bottom left of campaign view.
I changed it to Level, maybe the XP on the campaign view should be changed aswell then?
It looks like this:

Let's only change it in the campaign view.  The items dialog isn't fullscreen, so it's likely to be visible even when open.


update symbol-sdk version to latest

superseded by https://github.com/symbol/mobile-wallet/pull/282


waitForFileChooser

I followed the examples of 'puppeteer' and 'issue', but there was a problem and I couldn't find a solution.
Tell us about your environment:

Puppeteer version<EMAIL_ADDRESS>/<EMAIL_ADDRESS>Platform / OS version: Windows / 10 Enterprise
URLs (if applicable): None
Node.js version: 12.18.3

What steps will reproduce the problem?
const puppeteer = require('puppeteer');

(async () => {
    const browser = await puppeteer.launch({
        product: "chrome",
        executablePath: "C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe",
        ignoreDefaultArgs: ['--disable-extensions'],
        headless: false,
    });

    const page = await browser.newPage();
    await page.goto('about:blank');
    await page.setContent('<input type="file">');

    await page.waitForFileChooser()
        .then(value => {
            console.log(value);
        })
        .catch(reason => {
            console.log(reason);
        });
})();

What is the expected result?
return variable Promise<FileChooser>
What happens instead?
Error: Protocol error (Page.setInterceptFileChooserDialog): 'Page.setInterceptFileChooserDialog' wasn't found
    at c:\Users\MT01045\node_modules\puppeteer\lib\Connection.js:183:56
    at new Promise (<anonymous>)
    at CDPSession.send (c:\Users\MT01045\node_modules\puppeteer\lib\Connection.js:182:12)
    at Page.waitForFileChooser (c:\Users\MT01045\node_modules\puppeteer\lib\Page.js:163:26)
    at Page.<anonymous> (c:\Users\MT01045\node_modules\puppeteer\lib\helper.js:112:23)
    at c:\Users\MT01045\git\webmail\test.js:15:16
    at processTicksAndRejections (internal/process/task_queues.js:97:5) {message: 'Protocol error (Page.setInterceptFileChooser….setInterceptFileChooserDialog' wasn't found', stack: 'Error: Protocol error (Page.setInterceptFileC…ctions (internal/process/task_queues.js:97:5)'}

Chrome reinstallation and module reinstallation have resolved this issue.


#57

#57

I don't understand the purpose of this change. Can you explain please?

See #57

Can you change everything that you did in #57.

I see #57, but I don't understand why the binary is being pushed to the repo. Is there some specific issue you are trying to solve? Maybe I can help?

Think so this explains it:

Unfortunately I do not understand and you are not telling me why this is being done. Feel free to open an issue instead, I will be happy to help.


Flow can't resolve libdef modules

I run flow-typed install and it installed for all dependencies on package.json
Flow is version 0.60.1 (wasn't working for 0.59 too)
Flow-typed is version 2.2.3
Libdef are in the root folder called flow-typed
But it won't resolve library specific types for example redux or axios

Could you paste the contents of .flowconfig?

[ignore]
; We fork some components by platform
.*/*[.]android.js

; Ignore "BUCK" generated dirs
<PROJECT_ROOT>/\.buckd/

; Ignore unexpected extra "@providesModule"
.*/node_modules/.*/node_modules/fbjs/.*

; Ignore duplicate module providers
; For RN Apps installed via npm, "Libraries" folder is inside
; "node_modules/react-native" but in the source repo it is in the root
.*/Libraries/react-native/React.js

; Ignore polyfills
.*/Libraries/polyfills/.*

[include]

[libs]
node_modules/react-native/Libraries/react-native/react-native-interface.js
node_modules/react-native/flow/
flow-typed

[options]
emoji=true

module.system=haste

munge_underscores=true

module.name_mapper='^[./a-zA-Z0-9$_-]+\.\(bmp\|gif\|jpg\|jpeg\|png\|psd\|svg\|webp\|m4v\|mov\|mp4\|mpeg\|mpg\|webm\|aac\|aiff\|caf\|m4a\|mp3\|wav\|html\|pdf\)$' -> 'RelativeImageStub'

suppress_type=$FlowIssue
suppress_type=$FlowFixMe
suppress_type=$FlowFixMeProps
suppress_type=$FlowFixMeState
suppress_type=$FixMe

suppress_comment=\\(.\\|\n\\)*\\$FlowFixMe\\($\\|[^(]\\|(\\(>=0\\.\\(5[0-3]\\|[1-4][0-9]\\|[0-9]\\).[0-9]\\)? *\\(site=[a-z,_]*react_native[a-z,_]*\\)?)\\)
suppress_comment=\\(.\\|\n\\)*\\$FlowIssue\\((\\(>=0\\.\\(5[0-3]\\|[1-4][0-9]\\|[0-9]\\).[0-9]\\)? *\\(site=[a-z,_]*react_native[a-z,_]*\\)?)\\)?:? #[0-9]+
suppress_comment=\\(.\\|\n\\)*\\$FlowFixedInNextDeploy
suppress_comment=\\(.\\|\n\\)*\\$FlowExpectedError

unsafe.enable_getters_and_setters=true

[version]
^0.60.1


RunPipeline action failed

When running the build pipeline on a self hosted (azure) machine, this has happened multiple times. I have not been able to see the logic behind what is causing it. Sometimes it feels that it could be related to the version of BC in the container being built.
When I look in the Event Viewer of the build machine, I see the following event that seem to be related.
Handler for GET /v1.41/plugins/bc4925104438/json returned error: plugins are not supported on this platform
This is the error message from the Action:
RunPipeline action failed. Error: Docker Build failed with exit code 1 Stacktrace: at New-BcImage, C:\Users\vmadmin\AppData\Local\Temp\ac333ae3-13cb-442d-a689-8d7ec83db6d6\BcContainerHelper\ContainerHandling\New-NavImage.ps1: line 705 at New-BcContainer, C:\Users\vmadmin\AppData\Local\Temp\ac333ae3-13cb-442d-a689-8d7ec83db6d6\BcContainerHelper\ContainerHandling\New-NavContainer.ps1: line 605 at <ScriptBlock>, C:\Users\vmadmin\AppData\Local\Temp\ac333ae3-13cb-442d-a689-8d7ec83db6d6\BcContainerHelper\AppHandling\Run-AlPipeline.ps1: line 693 at <ScriptBlock>, C:\Users\vmadmin\AppData\Local\Temp\ac333ae3-13cb-442d-a689-8d7ec83db6d6\BcContainerHelper\AppHandling\Run-AlPipeline.ps1: line 915 at <ScriptBlock>, C:\Users\vmadmin\AppData\Local\Temp\ac333ae3-13cb-442d-a689-8d7ec83db6d6\BcContainerHelper\AppHandling\Run-AlPipeline.ps1: line 845 at <ScriptBlock>, C:\Users\vmadmin\AppData\Local\Temp\ac333ae3-13cb-442d-a689-8d7ec83db6d6\BcContainerHelper\AppHandling\Run-AlPipeline.ps1: line 827 at Run-AlPipeline, C:\Users\vmadmin\AppData\Local\Temp\ac333ae3-13cb-442d-a689-8d7ec83db6d6\BcContainerHelper\AppHandling\Run-AlPipeline.ps1: line 789 at <ScriptBlock>, C:\actions-runner\_work\_actions\microsoft\AL-Go-Actions\v3.0\RunPipeline\RunPipeline.ps1: line 367 at <ScriptBlock>, C:\actions-runner\_work\_temp\d7794a38-2a94-4d82-8009-454534d84906.ps1: line 2 at <ScriptBlock>, <No file>: line 1

Is there enough disk space and memory on these self-hosted runners?
How did you create them?

Is there enough disk space and memory on these self-hosted runners?

Yes, I checked because I had that problem earlier, and there is plenty of disk space (90 GB free) and 16 GB memory (3.4 GB used).

How are they created?
Which docker version is installed?
I use https://aka.ms/getbuildagent to create my agents (or actually a PS script) - and if they fail - I re-run the script, which removes the old agents and creates new ones.
Hasn't failed for months though.

Yes, I used that link to create the machine. But I can create a new one and see if it works better.

How many agents did you select?

I believe I have added one agent manually after I created the machine. But I am really unsure about the details since this was a while back. Now I'm even unsure if I actually used the template when I think more about it. I'll try to create a new machine and see if that solves the problem.

In the template you can also specify the disk space I think.
I use this script to create two beefy self-hosted agents in my org.
It will automatically remove old agents, remove old VMs, create new VMs and register agents:
$subscriptionId = $FreddysSubscription
try {
    Set-AzContext -Subscription $subscriptionId
} catch {
    Connect-AzAccount -Environment AzureCloud -TenantId $tenantId
    Set-AzContext -Subscription $subscriptionId
}

# Resource Group
$resGroup                 = "bcapprunner"
$resLocation              = "Sweden Central"
$org                      = "BusinessCentralApps"
$removeResGroupIfExist    = $true
$machines                 = 2
$offset                   = 0

if ($removeResGroupIfExist) {
    # Remove offline runners
    $runners = (gh api /orgs/$org/actions/runners | ConvertFrom-Json).runners
    if ($runners | Where-Object { $_.busy }) {
        Read-Host "Some agents are listed as busy. Press ENTER to proceed"
    }
}

$resourceGroup = Get-AzResourceGroup -name $resGroup -ErrorAction Ignore
if ($resourceGroup -and $removeResGroupIfExist) {
    Write-Host "Removing Resource Group $resGroup"
    Remove-AzResourceGroup -Name $resGroup -Force
    $resourceGroup = $null
}

if ($removeResGroupIfExist) {
    # Remove offline runners
    $runners = (gh api /orgs/$org/actions/runners | ConvertFrom-Json).runners
    $runners | Where-Object { $_.status -eq "offline" } | ForEach-Object {
        $id = $_.id
        gh api -X DELETE /orgs/$org/actions/runners/$id
    }
}

if (!($resourceGroup)) {
    $resourceGroup = New-AzResourceGroup -Name $resGroup -Location $resLocation -Force
}

1..$machines | ForEach-Object {
    # Deployment
    $no                       = $offset + $_
    $branch                   = "dev"
    $template                 = "buildagent"

    # ARM template
    $templateUri = "https://raw.githubusercontent.com/microsoft/nav-arm-templates/$branch/$template.json"

    $registrationToken = (gh api -X POST /orgs/$org/actions/runners/registration-token | ConvertFrom-Json).token

    $Parameters = @{
        "VmName"              = "$resgroup$no"
        "Remotedesktopaccess" = "-"
        "OperatingSystem"     = "Windows Server 2022"
        "VmSize"              = "Standard_D32as_v5"
        "OSDiskSize"          = 2000
        "StorageAccountType"  = "Premium_LRS"
        "AdminPassword"       = [SecureString]$AzureVmPasswordSecret.SecretValue
        "Count"               = 4
        "Token"               = $registrationToken
        "Organization"        =  "https://github.com/$org"
        "LabelsOrPool"        = "bc-build"
        "AgentUrl"            = "https://github.com/actions/runner/releases/download/v2.298.2/actions-runner-win-x64-2.298.2.zip"
        "RunInsideDocker"     = "No"
        "FinalSetupScriptUrl" = "additional-installforbuildagent.ps1"
    }

    $err = $resourceGroup | Test-AzResourceGroupDeployment -TemplateUri $templateUri -TemplateParameterObject $Parameters
    if ($err) {
        $err
        throw "stop"
    }
    $resourceGroup | New-AzResourceGroupDeployment -TemplateUri $templateUri -TemplateParameterObject $Parameters -Name $Parameters.vmName -ErrorAction Ignore
}

Should be the same result with the template though

BTW - I actually never remote desktop into the build machines, I never troubleshoot - I just recreate.

We're having this exact issue, but with an on-prem action runner in a VM instead of Azure.
The VM can start up a container with New-BCContainer, but fails in the github pipeline action runner.
Are there no way to see what the error actually is? The command just seems to return exit code 1.

I don't think I get more info than the text returned after the error.
If you can create containers manually, but AL-Go cannot - then I would look at the output form both and compare.
Maybe hyperv vs. process isolation?

The container is created just fine and I can see the processes from the container in taskmanager, so it would appear it's running process isolation like the test container I created.
It fails on the 'New-BcImage' commandlet it would appear, I'd like to run that manually on the server, how can I find what parameters it's being executed with?

Nevermind, appears it's working now! I enabled the Hyper-V role and then it worked.