Select channels for dipole fit

I have a problem selecting channels for dipole fitting. Is there a way to select channels by using MNE Python? With Neuromag software it is possible to select channels, but haven't succeeded with MNE Python.
I use the fit_dipole function and give it an Evoked object with only selected 90 channels and noise_covariance made from Epochs including only those same 90 channels. As a result i get a dipole fitted totally wrong place. Results are better without channel selection. What am I doing wrong?
epochs_ch = epochs.copy().pick_types(selection=channels)
noise_cov = mne.compute_covariance(epochs_ch, tmax = 0.0)
evoked_ch = evoked.copy().pick_channels(channels)

dipoles, _ = mne.fit_dipole(evoked_ch.copy().crop(t_max, t_max), noise_cov, fname_bem, fname_trans)

how did you pick the 90 channels?

They were selected around where the activation was visible (somatosensory area). They are these channels plotted below.

Your code looks fine. Can you see if it works reasonably on the sample dataset?
When I do this sort of thing I usually just pick the evoked object, no need to pick the epochs or cov as fit_dipole will automatically pick the channels it needs from the cov. I've validated it against Xfit results and the MNE result matches well (at least when using a diagonal cov, which is all that Xfit supports).

You're crop call uses tmax twice. Is that intentional?

Drammock: Yes, the time is just limited to one specific timepoint. That's why the tmax is there twice.
Larsoner: Okay, I first used the pick just with evoked, but when it didn't work, I tried to limit the cov also. I'll try next with the sample dataset.

Hmm.. the sample dataset seems to work fine (or at least with a left-temporal subset of channels the 'right-auditory' fit is almost the same as without the selection).
What then could cause the problem with my data? If I select only all the channels from the left side of the brain, the dipole is fitted on the right side close to ear. With all channels the stimulation is correctly fitted on the left side somatosensory area.

I doubt there is a bug then. Just use all sensors?

I have done this a few times successfully in the last few years so maybe we fixed some bug. Closing from non-response / inability to reproduce but if someone can come up with a minimal example let's reopen and fix!


[Fix] Hikari maximumPoolSize should be configurable

From @hkkenneth on November 11, 2016 17:29
When more threads / steps are running concurrently, the default pool size of 10 will run out.
Copied from original issue: KHP-Informatics/cogstack#9

This issue was moved to CogStack/cogstack#6


Refactor Function GUIs

This is the refactor of the Function workstream module's GUI.

This was created off the wrong forked branch.  Closing this pull request without merging and opening a new one against the correct forked branch.


Fix tab navigation for dropdown

Description
This PR removes the use of a dynamic key prop that was introduced to solve clearing the dropdown when using dynamic options and the source value for the options has changed. This does no longer seem to fix the previous issue.
Removing this workaround no longer causes the dropdown to completely re-render and lose focus after its value has updated.

Related Issue(s)

closes #2486

Verification/QA

Manual functionality testing

[x] I have tested these changes manually
[ ] Creator of the original issue (or service owner) has been contacted for manual testing (or will be contacted when released in alpha)
[ ] No testing done/necessary

Automated tests

[ ] Unit test(s) have been added/updated
[x] Cypress E2E test(s) have been added/updated
[ ] No automatic tests are needed here (no functional changes/additions)
[ ] I want someone to help me make some tests

UU/WCAG (follow these guidelines until we have our own)

[x] I have tested with a screen reader/keyboard navigation/automated wcag validator
[ ] No testing done/necessary (no DOM/visual changes)
[ ] I want someone to help me perform accessibility testing

User documentation @ altinn-studio-docs

[ ] Has been added/updated

[x] No functionality has been changed/added, so no documentation is needed
[ ] I will do that later/have created an issue

Support in Altinn Studio

[ ] Issue(s) created for support in Studio

[x] This change/feature does not require any changes to Altinn Studio

Sprint board

[x] The original issue (or this PR itself) has been added to the Team Apps project and to the current sprint board
[ ] I don't have permissions to do that, please help me out

Labels

[x] I have added a kind/* label to this PR for proper release notes grouping
[ ] I don't have permissions to add labels, please help me out

@bjosttveit I have not filed a issue with DS. I can see to it 👍

@Magnusrm @bjosttveit An issue already exists here: https://github.com/digdir/designsystemet/issues/2264


Video encoder failed！

Hello,I can not do this “sudo apt-get install -y libavformat-dev libavutil-dev libavcodec-dev libswscale-dev libfreetype6-dev”.No package ... available, so could you guide me in the issue?
Thank u!!!

The idea is that you need to install libav or ffmepg. The exact command can vary depending on your OS and its version.

Hi,thank u for your answer. My problem is that centos7 can't be loaded with libav which include libavformat-dev,libavutil-dev,libavcodec-dev,libswscale-dev and libfreetype6-dev . Is there any package that can be used? Please ...


Add S3 object lock configuration

What problem are you facing?

User need set up the object lock configuration of S3 bucket such as retention period and legal hold.
How could Crossplane help solve your problem?

Currently provider-aws only supports the object lock flag, but not the configuration content. With this new feature, user can configure the object lock details.
https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-lock-console.html

Appears these apis are needed to complete this request:
https://docs.aws.amazon.com/sdk-for-go/api/service/s3/#S3.PutObjectLegalHold
https://docs.aws.amazon.com/sdk-for-go/api/service/s3/#S3.PutObjectLockConfiguration

/fresh Hi, I would also be interested in having this configuration available for object lock.


Nested text issue on iOS platform

Description
appearance on iOS is different from android and web
CodeSandbox/Snack link
https://codesandbox.io/s/practical-night-4uq15g?file=/src/components/Example.tsx
Steps to reproduce
Execute this following code
      <Text fontWeight={"bold"}>Taj Mahal</Text>
      <Text>
        <Text fontWeight={"bold"}>Taj Mahal</Text> is in Agra.
      </Text>
      <Text bold>
        Taj Mahal <Text bold={false}>is in Agra.</Text>
      </Text>

NativeBase Version
3.4.4
Platform

[ ] Android
[ ] CRA
[X] Expo
[X] iOS
[ ] Next

Other Platform
No response
Additional Information
Hi,
I've just created simple nested styling text. it works fine on android and web but not on ios.

as you can see in the image I attached above, on iOS it looks like there is no change in the word "Taj Mahal".
Code
      <Text fontWeight={"bold"}>Taj Mahal</Text>
      <Text>
        <Text fontWeight={"bold"}>Taj Mahal</Text> is in Agra.
      </Text>
      <Text bold>
        Taj Mahal <Text bold={false}>is in Agra.</Text>
      </Text>

native-base: 3.4.4
expo: 43.0.0
react-native: tested on 0.64.3 & 0.68.2

Hey @anazaim77, I wasn't able to reproduce the issue. Can please try using the latest version?

It's also not working for me on iOS. The nested Text elements don't show any difference in styling.
native-base: 3.4.16
expo: 46.0.10
react-native: 0.69.5

I do have this issue as well on iOS. Nested text styling such as Italics, and bold doesn't work but changing colors does.
native-base: 3.4.19
expo: 45.0.0
react-native: 0.68.2

I'm having some similar consistency issues between Android and iOS, with the added wrinkle that certain fonts (I can't work out why) error when they're applied to the inner nested text.
    "native-base": "3.4.25",
    "react": "18.2.0",
    "react-native": "0.71.2",

I think I have a related issue. Setting the font on the inner Text causes the font to not be recognised. I suspect it might be changing the font-weight to one that doesn't exist in my theme, but I can't work out the issue because I have all the major font weights specified.

Im having the same issue

any updates on it? I am having the same issue


please post clarification (clearing cache clears ETags)

there are erroneous articles being put up based upon your demo (e.g. https://www.ghacks.net/2017/12/09/a-solution-to-etag-tracking-in-firefox/) which are claiming that browsers aren't deleting ETags when clearing the cache. They have reached this conclusion by a combination of the implication that the PoC is based upon ETag and/or cache alone, which is not accurate, as it's based off of IP address, and switching back and forth between IPs (having cleared cache between) shows this. Please post a clarification of the fact that clearing the cache (in Firefox, at least) does in fact remove the ETag, and the fact that the PoC still shows stored data is based upon re-populating the ETag based upon the connecting IP.

How it is based off of IP address?
I'm not a web developer, so my understanding of the subject is limited, and the only part of the source code where I see the IP and user-agent being relevant is the single line where it generates the unique ETag for that client (index.php line 15):
$etag = substr(sha1($secret . sha1($_SERVER["REMOTE_ADDR"]) . sha1($_SERVER["HTTP_USER_AGENT"])), 0, 18);
Changing the IP after caching the tracker.jpg file indeed gives an unexpected result, but using the built-in Developer Tools in Firefox (don't know about other browsers), in the Network tab, you can see that the tracker.jpg file still has the same ETag even after you change the IP and reload the page.
So, I still don't get why this happens. I'm more inclined to think that something else is going on, and that this PoC does not rely on the client's IP staying the same by design.
Would you (or anyone else in the know) mind explaining what's going on?

@claustromaniac
The proof of concept is intended to demonstrate that ETag can be used as a permanent identifier, and it is true that it can be (so long as user doesn't clear cache, either manually or automatically), however, since each user's ETag is generated based upon a repeatable hash of a combination of their IP address and user-agent, the proof of concept works even if the cache is cleared and the request to tracker.jpg doesn't include the ETag. I will explain why momentarily ...
First, let me point out that, while not ideal, the method of generating the ETag does NOT invalidate the claim about how ETag can be used as a permanent identifier. It does however cause a ton of confusion, such as users and tech authors coming to believe that the ETags aren't getting deleted when their browser cache is cleared. Ways to address this could include:

generating the ETag randomly, so that the PoC is based purely upon ETag, rather than using the IP (along with user agent) as the true identifier; or
if for some reason there's objection to generating the ETag randomly, the PoC could instead detect when a request to tracker.jpg doesn't include an ETag, while the hash of the user's IP and user-agent for that connection matches an existing session, and invalidate that session; or
at the very least, as requested in this bug, the author of the PoC could post a clarification explaining that clearing the cache really does remove the ETag, and the reason the demo still shows the stored text, even if the user cleared the ETag, is that the demo automatically regenerates the exact same ETag based upon the user's IP and user-agent.

Anyway, to explain to you exactly what's happening ...
Line 15 of index.php is as follows:
$etag = substr(sha1($secret . sha1($_SERVER["REMOTE_ADDR"]) . sha1($_SERVER["HTTP_USER_AGENT"])), 0, 18);
This is a programmatic formula which generates the same ETag given the same IP and user-agent. In short, the formula takes 3 strings (IP address ($_SERVER["REMOTE_ADDR"]), user-agent ($_SERVER["HTTP_USER_AGENT"]), and the "$secret" salt specified in config.php ("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx")), runs them through the SHA-1 algorithm (an algorithm that, given the same strings, will always output the same result), and then keeps the first 18 character substring.
So, even if the cache is cleared, and the browser doesn't send the ETag when first requesting tracker.jpg after clearing the cache, tracker.jpg generates the same ETag automatically, tells the browser to store that value, and when the page is automatically reloaded (as it's explained that it does on the page itself), tracker.jpg is thus requested a second time, and the second request includes the ETag, and the page "thinks" it remembers you from cache, but (for users who cleared their cache), it's actually remembering you by IP address and user agent.
You can confirm all of this yourself using Firefox's Developer Tools Network pane. I'll quote an outline about how to reproduce this from https://www.ghacks.net/2017/12/09/a-solution-to-etag-tracking-in-firefox/#comment-4306403 ...

How to reproduce:
On your regular home ISP, clear your cache, then open the developer tools Network panel and go to the URL noted in prior paragraph [https://lucb1e.com/rp/cookielesscookies/tracker.jpg]. Click on the row for the tracker image and a pane will open on right. Go to the request headers and you'll see there is no If-None-Match header specifying the ETag. Then look at the response headers, and you'll see the same ETag as before. NEXT, close the page and clear your cache. Then use your mobile phone hotspot to connect your computer over cellular data. Repeat the same steps as above, and you'll see a different Etag. Then repeats the steps again on your home ISP and you'll get the original ETag. Then switch back to cellular and repeat and you'll see the cellular ETag. You can do this over and over and get the same two ETags, based upon your two different connections.

More simply, after closing the page and clearing the cache, if you open the Network Pane of Developer Tools and load http://lucb1e.com/rp/cookielesscookies/ , the second row will be a request for tracker.jpg -- click it, and in the right pane, scroll to "Request headers" you'll see there is no "If-None-Match" header (this is the header that tells the server what ETag you have stored). You will however see that the "Response headers" listed above specify the ETag, which is automatically generated by IP address and user-agent. The next request for tracker.jpg includes the "If-None-Match" header with the ETag which it was just told of. You can see this by reloading the page ... after reloading, click on the row for tracker.jpg, scroll down to the "Request headers", and you'll see the second request includes the "If-None-Match" header with the ETag.
In short: the PoC sets the ETag, which is stored until browser cache is cleared. When user goes to the page again after clearing cache, the ETag is (initially) regenerated based upon IP and user-agent, rather than retrieved from cache (because at that point it doesn't exist in cache) ... then the page automatically reloads (as stated on the page), and at that point the ETag the site stored a moment before is sent back, and it makes it look like you still had the ETag from much earlier whereas in reality you've only had it for about a second ... it just happens to be the same ETag from earlier because the same formula was used to generate it.
Clear as mud, right? This is why I've requested the author of the PoC post a clarification.

We're talking about slightly different things. I'm not even thinking about clearing the cache at all. Change your IP without clearing the cache and you will not get the result you would otherwise expect from the PoC. This is what puzzles me.
I think I must be missing some vital piece of information that prevents me from getting why that happens. You can see my interpretation of how this should work (after looking at the source code) here and here.


Rename "Liquidity Mining" to "Staking"

Done in the pull request, waiting for the merge to the Master.


doc: security: Info for CVE 2023 4264

Add information about CVE-2023-4264

@kartben AFAICT there is nothing to change in this pr. Have I missed something ?

pr rebased.

@kartben AFAICT there is nothing to change in this pr. Have I missed something ?

see my latest comment, at least one backport is missing.

@kartben AFAICT there is nothing to change in this pr. Have I missed something ?

see my latest comment, at least one backport is missing.

thanks ! Added the backported pr.


Support Adding Additional Changelog Types

TL;DR
I need to generate a changelog without PR links for each commit and would like to do so by adding my own changelog-type as described here.
Detailed design
Docs mentioned that we can use ChangelogNotes interface to add additional changelog types; but this seems to not apply to the Github action.
Additional information
No response

See related: https://github.com/googleapis/release-please/issues/2080

It will be nice if they provide some clear and concise instructions about how to do things. As by most google products, the existing documentation is ambiguous and it is not clear if some things are even possible.


CSP blocks mixpanel-2-latest due to use of unsafe-eval

Refused to load the script 'http://cdn.mxpnl.com/libs/mixpanel-2-latest.min.js' because it violates the following Content Security Policy directive: "script-src 'self' 'unsafe-eval'
Any suggestions?

I think there's no way but changing the host page's CSP config. Add mixpanel js to the whitelist of CSP.


Week of January 18: Cut buildpack releases

https://github.com/paketo-buildpacks/go/releases/tag/v4.0.2


noDataTemplate prop as html

Please, could you use noDataTemplate as v-html? Now html tags are disabled in this message
Thanks

@itelmenko It's better that you send the PR (based on develop branch) for this and I can easily merge it.

Fixed by #292


TextureAtlasBuilder padding

Objective
TextureAtlas supports pregenerated texture atlases with padding, but TextureAtlasBuilder can't add padding when it creates a new atlas.
fixes #8150
Solution
Add a method padding to TextureAtlasBuilder that sets the amount of padding to add around each texture.
When queueing the textures to be copied, add the padding value to the size of each source texture. Then when copying the source textures to the output atlas texture subtract the same padding value from the sizes of the target rects.
unpadded:

padded:

Changelog
TextureAtlasBuilder

Added support for building texture atlases with padding.
Adds a padding method to TextureAtlasBuilder that can be used to set an amount of padding to add between the sprites of the generated texture atlas.

Might also be good to expand the texture atlas builder example in another PR.
We could generate atlases with and without padding and render the textures with and without anti-aliasing to demonstrate how different approaches can deal with bleeding issues etc.


[Docker-compose install on EC2] metadata_service.exception.NotFoundException: User test_user_id not found in the graph

I installed Amundsen with docker-compose to EC2 instance.
Everything looks good, sample data was loaded successfully.
The only error I have is about test user.
Steps to Reproduce

Install Amundsen to EC2 instance via docker-compose with neo4j option.
Load sample data to Amundsen by the script from the Quick start guide.
Open Amundsen UI with developer network bar opened.

Expected Behavior

All services are up and running, no errors in logs.
Sample data was loaded without errors.
On the UI user name (Test user) is displayed in the right up corner. No errors occured in dev console and services logs.

Current Behavior
1-2. OK
3. No username is displayed in the right up corner of the UI. In network bar of dev browser console error is displayed:

In services log error occurs, connected with test_user_id
log.txt
Possible Solution
No suggestions
Screenshots (if appropriate)

Context
I want to setup Amundsen for its demo across the organization.
Your Environment

Amunsen version used:
docker-amundsen.yml.zip
Data warehouse stores: sample data from Amundsen Quick start guide

Was resolved by adding user with email == test_user_id to sample data databuilder/example/sample_data/sample_user.csv and reloading sample data with script databuilder/example/scripts/sample_data_loader.py


Banner size

Hello ı have a problem for banner size when ı open app on large size phone ,banner closing tab menu   https://prnt.sc/x7gsu6
I use adSize: AdSize.SMART_BANNER,
I give margin for tab menu<ion-tab-bar slot="bottom" style="margin-bottom: 42px;">
Should I use Adsize.CUSTOMto fix this? how is it used?
*Is there anyone who can help?

Have you tried the code in the demo project?
I use this code below and it seems it does the trick for me. I tried it with different sizes and it works fine
`    /**
* Run every time the Ad height changes.
* AdMob cannot be displayed above the content, so create margin for AdMob.
*/
this.eventOnAdSize = AdMob.addListener('onAdSize', (info: any) => {
this.appMargin = parseInt(info.height, 10);
if (this.appMargin > 0) {
const body = document.querySelector('body');
const bodyStyles = window.getComputedStyle(body);
const safeAreaBottom = bodyStyles.getPropertyValue("--ion-safe-area-bottom");
    const app: HTMLElement = document.querySelector('ion-router-outlet');
    if (this.bannerPosition === 'top') {
      app.style.marginTop = this.appMargin + 'px';
    } else {
      app.style.marginBottom = `calc(${safeAreaBottom} + ${this.appMargin}px)`;
    }
  }
});`

Have you tried the code in the demo project?
I use this code below and it seems it does the trick for me. I tried it with different sizes and it works fine
`    /**
* Run every time the Ad height changes.
* AdMob cannot be displayed above the content, so create margin for AdMob.
*/
this.eventOnAdSize = AdMob.addListener('onAdSize', (info: any) => {
this.appMargin = parseInt(info.height, 10);
if (this.appMargin > 0) {
const body = document.querySelector('body');
const bodyStyles = window.getComputedStyle(body);
const safeAreaBottom = bodyStyles.getPropertyValue("--ion-safe-area-bottom");
    const app: HTMLElement = document.querySelector('ion-router-outlet');
    if (this.bannerPosition === 'top') {
      app.style.marginTop = this.appMargin + 'px';
    } else {
      app.style.marginBottom = `calc(${safeAreaBottom} + ${this.appMargin}px)`;
    }
  }
});`

@amrtahlawi Thanks comment. This is very helpful.
This Issue closes as there seems to be no new issues.

I am encountering an issue where this does not work:
      AdMob.addListener(BannerAdPluginEvents.SizeChanged, (size: AdMobBannerSize) => {
        document.documentElement.style.setProperty(
          '--ad-banner-height',
          `calc(${size.height}px + var(--ion-safe-area-top))`
        );
      });

Somehow this returns a banner size of 95px where when I check with a ruler, the banner is only 60px
this was tested on Iphone 15 Pro in portait mode.


upload_file fails on one specific script

Trying to upload a specific python file to the workers, through upload_file, throws an exception "Exception: object Future can't be used in 'await' expression". I'm running out of ideas of what the problem could be, which is why I need your help. But these are my current hypothesis:

It somehow doesn't like that I'm uploading a script that contains potentially unwanted pandas usages, as it allows uploading the file if I remove certain apply methods (although, if I just remove some surrounding code and leave there the supposedly conflicting pandas line, it also starts working).

It has a certain memory limit as to the file size that I want to upload (which would be strange as the file is only 10KB and other dummy examples with several lines of code work just fine).

Here's the full error message:

What I'm doing in the notebook before calling upload_file:

The file that I'm trying to upload:
utils.py.zip
Please help me as I'm really feeling clueless here!

@AndreCNF generally, text tracebacks are better than screenshots.
Can you post the output of client.get_versions(check=True)?


RLC-410W Live view (stream) not work

Error log:
Эта ошибка возникла в кастомной интеграции.
Logger: aiohttp.server
Source: custom_components/reolink_dev/camera.py:200
Integration: Reolink IP camera (documentation, issues)
First occurred: 19:09:24 (2 occurrences)
Last logged: 19:10:36
Error handling request
Traceback (most recent call last):
File "/usr/local/lib/python3.9/site-packages/aiohttp/web_protocol.py", line 422, in _handle_request
resp = await self._request_handler(request)
File "/usr/local/lib/python3.9/site-packages/aiohttp/web_app.py", line 499, in _handle
resp = await handler(request)
File "/usr/local/lib/python3.9/site-packages/aiohttp/web_middlewares.py", line 119, in impl
return await handler(request)
File "/usr/src/homeassistant/homeassistant/components/http/security_filter.py", line 60, in security_filter_middleware
return await handler(request)
File "/usr/src/homeassistant/homeassistant/components/http/forwarded.py", line 89, in forwarded_middleware
return await handler(request)
File "/usr/src/homeassistant/homeassistant/components/http/request_context.py", line 24, in request_context_middleware
return await handler(request)
File "/usr/src/homeassistant/homeassistant/components/http/ban.py", line 78, in ban_middleware
return await handler(request)
File "/usr/src/homeassistant/homeassistant/components/http/auth.py", line 144, in auth_middleware
return await handler(request)
File "/usr/src/homeassistant/homeassistant/components/http/view.py", line 135, in handle
result = await result
File "/usr/src/homeassistant/homeassistant/components/camera/init.py", line 517, in get
return await self.handle(request, camera)
File "/usr/src/homeassistant/homeassistant/components/camera/init.py", line 552, in handle
stream = await camera.handle_async_mjpeg_stream(request)
File "/config/custom_components/reolink_dev/camera.py", line 200, in handle_async_mjpeg_stream
await stream.open_camera(self._input, extra_cmd=self._extra_arguments)
AttributeError: 'ReolinkCamera' object has no attribute '_input'

You could try deleting the camera and adding it back..also ensure that the camera's ip address is static

@svsolopov  please try v0.37. thank you

v0.37 is working for me

Closed unless requester complains and reopens

It's work, super :)


FCM provider instead APNS on iOS registration event

Expected Behaviour
I want to recieve the push registration data in iOS
Actual Behaviour
i recieve FCM provider instead APNS
Platform and Version (eg. Android 5.0 or iOS 9.2.1)
IOS 13.1
Cordova CLI version and cordova platform version
Cordova: 9.0.0
Cordova iOS: 5.0.1
Plugin version
2.3.0
Sample Push Data Payload
{     provider: FCM,      push: {         handlers: [Object],          options: [Object]     },      token: XXXXXXXXXXXXXXX }
Sample Code that illustrates the problem
push.on('registration', (data) => {     self.$store.dispatch('setFCMToken', { token: data.registrationId, provider: data.registrationType, push });     console.log(data) });
xCode log

2019-11-10 23:47:09.191562+0100 XXXXXX[1340:298342] 4.13.0 - [Firebase/Messaging][I-FCM001000] FIRMessaging Remote Notifications proxy enabled, will swizzle remote notification receiver handlers. If you'd prefer to manually integrate Firebase Messaging, add "FirebaseAppDelegateProxyEnabled" to your Info.plist, and set it to NO. Follow the instructions at:
https://firebase.google.com/docs/cloud-messaging/ios/client#method_swizzling_in_firebase_messaging
to ensure proper integration.
2019-11-10 23:47:09.192554+0100 XXXXXX[1340:298229] FCM Registration Token: XXXXXXXXXXXXXXXXXXXXXXX
2019-11-10 23:47:09.209083+0100 XXXXXX[1340:298229] Push Plugin register success: {length = 32, bytes = 0x1bce8745 0e2f1491 46218a1a d87148d1 ... 8b7a3c9c c4976c03 }
2019-11-10 23:47:09.577881+0100 XXXXXX[1340:298367] [] tcp_input [C3.1:3] flags=[R] seq=2219178548, ack=0, win=0 state=CLOSED rcv_nxt=2219178548, snd_una=2358841174

the same problem here :(

I am experiencing the same. Did you figure out how to handle it?

@chris-guidry  works well

I was experiencing the same. In GoogleService-info.plist try setting IS_GCM_ENABLED to false.

Man you've done a perfect job..I've wasted many hour then I found you but still I'm getting :
{"registrationId":"{length=32,bytes=0xca41e884d5074db33213b17f635c8db1...83934181230c3b27}","registrationType":"APNS"}
registrationId is not in right format


[WiP] [security] New, deprecate merge_perm, FAB method is fixed

CATEGORY

[X] Refactor

SUMMARY
Since FAB version 2.0.0 that safe guards made on merge_perms on Superset were included on FAB.
This makes it possible to simplify Superset's custom SecurityManager. And remove merge_perms.
Note: Only after PR #7323
ADDITIONAL INFORMATION

[X] Has associated issue: #1944

REVIEWERS

Codecov Report

Merging #7355 into master will decrease coverage by 0.01%.
The diff coverage is 43.75%.

@@            Coverage Diff             @@
##           master    #7355      +/-   ##
==========================================
- Coverage   64.89%   64.88%   -0.02%
==========================================
  Files         428      428
  Lines       20937    20929       -8
  Branches     2330     2330
==========================================
- Hits        13588    13579       -9
- Misses       7225     7226       +1
  Partials      124      124

Impacted Files
Coverage Δ

superset/connectors/sqla/views.py
63.15% <0%> (ø)
:arrow_up:

superset/connectors/druid/views.py
66.21% <0%> (ø)
:arrow_up:

superset/cli.py
35.05% <100%> (ø)
:arrow_up:

superset/security.py
75.33% <100%> (-0.86%)
:arrow_down:

superset/views/core.py
72.96% <100%> (+0.07%)
:arrow_up:

superset/models/core.py
83.25% <0%> (-0.31%)
:arrow_down:

superset/utils/core.py
88.04% <0%> (-0.18%)
:arrow_down:

superset/db_engine_specs.py
57.36% <0%> (+0.12%)
:arrow_up:

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 845218d...8ba5213. Read the comment docs.


More than a single class for v-class

I need to add two classes based on a condition. The classes are has-error and has-feedback.
Currently I have:
v-class="'has-error': hasError('field')"

I'd like to also add the has-feedback class, without adding another v-class attribute, and without appending , 'has-feedback': hasError('field') to the current value above.
In fact, I expected the following to work:
v-class="'has-error,has-feedback': hasError('field')"

Hi jbruni,
this should do the trick:
v-class="has-error: hasError, has-feedback: hasFeedback"

Yes, you are correct. But I mentioned (and discarded) this solution - just read again with care.
Note that the condition is the same for both classes: hasError('field').
It would be performance-wise to perform the condition check only once, instead of twice.

Yes, sorry I wasn't paying attention enough.
On 11.6.2015 г. 17:27 ч., J Bruni wrote:

Yes, you are correct. But I mentioned (and discarded) this solution -
just read again with care.
Note that the condition is the same for both classes: |hasError('field')|.
It would be performance-wise to perform the condition check only once,
instead of twice.
—
Reply to this email directly or view it on GitHub
https://github.com/yyx990803/vue/issues/930#issuecomment-111154288.

In most cases this is not going to cause any performance issues, unless your hasError method takes more than 10ms, then there must be some serious problem in how you implemented it.
That said, you can directly pass v-style an object, which can be returned from a computed property. Inside the computed property you can call hasError() only once.


Add request timeouts

This is to help prevent systems choking when one of our metadata or static file servers goes down. Previously there was no timeout on requests and instead of cycling to the next possible server when one was down things would hang and cause backlog of requests.
ping @somexpert @vphill @jason-ellis @jthomale

:+1:

:thumbsup:


Incompatible Firmware

I am currently looking to buy an Ebike conversion kit.
It is important to me, that I find one with an open source tool to configure.
I was already about to buy a modern Bafang one, and just read the last minute on the forum, that some/most modern firmwares are not compatible.
I would have almost bought such a device, and strongly suggest to add a warning to the Github page.

Hello. Yes, I will add warning. But these devices are not completely incompatible: some settings are not available, but other functions (diagnostics, wheel size setting, etc) are still available. What model did you plan to buy? Most of kits on Amazon still have uart controllers. Later I will search for solution of this problem with other bafang enthusiasts - theoretically problem could be solved by one reflash, I will contact people who have experience with changing firmwares

Wonderful!
I have not decided yet, the Tongshen TSDG8 looks promising.
I would love to buy a modern 820 or so on the aftermarket, while they seem OEM only.
Old Bafang sadly have no torque sensor.

Wonderful!
I have not decided yet, the Tongshen TSDG8 looks promising.
I would love to buy a modern 820 or so on the aftermarket, while they seem OEM only.
Old Bafang sadly have no torque sensor.

Tonghshengs are absolutely not supported by this or any other project - I even don't think that they have configuration api at all.
Some of old bafangs have torque sensor, but they are designed for special frame, not for usual (as well as new). If you are enthusiast is bike building, there is also possibility to build bike from old usual ebike with dead motor and new bafang electrics - Tomblarom produces and sells special hardware kits to install new bafang mid-drive on frame designed for bosch, or shimano, or yamaha (disclaimer: I don't know details about this technology. Contact him directly to know more).
Also, there is https://github.com/OpenSourceEBike/Bafang_M500_M600 project, collaborated with GreenBikeKit shop - I think they can offer you some good solution

Tonghshengs are absolutely not supported by this or any other project - I even don't think that they have configuration api at all.

There is custom firmware for the TSDG2(B) that supports way more configuration options than this project.
But it requires a special cable, voids the warranty, and the engine requires a custom cooling solution for higher speeds, which costs time and work on top.
The 8 has no tooling yet, and is better across all aspects, except the weight.
https://github.com/emmebrusa/TSDZ2-Smart-EBike-1

Also, there is https://github.com/OpenSourceEBike/Bafang_M500_M600 project, collaborated with GreenBikeKit shop - I think they can offer you some good solution

I know that project. I just dont know, where I can get engines for it. Buying a broken bike seems suboptimal. I like to buy the engine from some shop.

Tonghshengs are absolutely not supported by this or any other project - I even don't think that they have configuration api at all.

There is custom firmware for the TSDG2(B) that supports way more configuration options than this project.
But it requires a special cable, voids the warranty, and the engine requires a custom cooling solution basically.
Which costs time and work on top.
The TSDG8 has no tooling yet, and is better across all aspects than the older sibling, except the weight.
https://github.com/emmebrusa/TSDZ2-Smart-EBike-1

Also, there is https://github.com/OpenSourceEBike/Bafang_M500_M600 project, collaborated with GreenBikeKit shop - I think they can offer you some good solution

I know that project. I just dont know, where I can get engines for it. Buying a broken bike seems suboptimal.
I like to buy the engine from some shop.

If your plan is to buy custom bike, you can buy engine and compatible frame from GreenBikeKit. If not, you can ask crew of this project for help to find firmware for your bafang device with available settings - not the reliablest way, but still more reliable than flash tongsheng with completely "homebrew" firmware

I am looking to build my own bike, and if there is a request, I would also build it for other people then.
So I like a reliable way of "engine x works" and "I can get it there and here"
Also, the offerings from Varstrom are so cheap, its really difficult to justify buying somewhere else.
And the only torque based devices there are again Tongshen.
I would love a hardware mod for Bafang devices, that retrofits them with torque sensors.
Or the way Geeko does it, by attaching a sensor to the cassette.

Added info about supported hardware and possible firmware limitations


TCP proxying support

This looks super cool. Wanted to send along a feature request that I think will make it even more useful.
At a previous job, we were using haproxy due to its ability to do not only straight TCP proxying, but straight TCP proxying while honoring the SNI header. This allows the TLS connection to be direct between a client and backend server, rather than having a proxy in the middle decrypt traffic and re-encrypt traffic to the backend. This direct connection is needed to avoid transitive trust issues, and can be especially important if you are required to adhere to various industry conformance standards like PCI.
So my feature request is: please allow straight TCP proxying while honoring the SNI header for routing.

Transparent TCP proxy support was on my radar at some point but so far I didn't have the use case for it. I want to enhance a couple of other things first so this is not high on my prio list ATM.
Leaving this open as enhancement

Sounds good. Just remember, when you get around to it, that SNI is a must as it's really the only way to route when doing TCP routing (since mapping ports is just awful)!

+1 Transparent TCP is currently a gaping hole that no one has filled.

@rvm2015 I assume you mean, "within Fabio"? Other services are capable of doing transparent TCP proxying,and have for a long time.

@rvm2015 What your use case?

If Fabio had the ability to do TCP as well as HTTP I'd have a reason to put in the work to extend the backend support to include Mesos/Maratho. I'd then be able to replace both Traefik and HAProxy/Mesos-DNS with a single service and greatly simplify my stack.

@rvm2015 Fabio is an FE-BE router which routes incoming traffic to different BE services based on information in the protocol (i.e. host and/or path from the HTTP request). I get the SNI use case for SSL traffic since I can get the host information and use that for routing information but how would I route an arbitrary incoming TCP stream to a BE service that can handle it? Based on ports? Which protocols are you using where you need raw TCP traffic?

I think I have a couple of use cases for TCP routing now and the proxy itself is pretty simple. I just need to update the config language and dynamic listener support. First version may not support SNI though but I'm still looking into this.

:+1:

Transparent TCP proxy is useful when deploying such services as IM server, RPC services within docker container cloud, given this feature enabled, fabio could be a replacement for HAProxy totally for cloud environment.

Don't want to be one of those "me too" people but did anyone manage to get anywhere with transparent TCP proxying (with or without SNI)? @magiconair I know above you said you were looking at this?
Is there any WIP we can possibly help commit to if not finished? Else I might take a stab at this, as this is currently the one thing we're missing as we're have lots of arbitrary TCP ports which would benefit hugely from fabio / only work through fabio.
Thanks in advance!

@JonathanBennett The TCP proxy itself is not difficult and I think I have that ready somewhere. Main issue is how to configure the listeners and that they need to start and shutdown automatically which is different from the statically configured HTTP listeners. That also isn't hard but $dayjob and $kids take most of my energy right now.
I'm going to focus on the API for the multiple registries since this is a small change but has lots of potential. Then I'll work on the config change which will enable the strip prefix and weight parameter and also offer the tcp syntax. Then it isn't far from the dynamic listeners. I have some code lying around for that as well but it probably won't merge anymore.
If you want to help you could pick up one of these things. Let me know if you are interested and we can try to figure something out.

Hi, is anyone working on this one?

@mterron It is on my list but I am working on other things right now. What is your use case?

@magiconair if fabio could do straight TCP+SNI (+PROXY proto) I wouldn't need to reply certs to fabio, this will solve a transitive trust issue where you have to trust fabio. It is much easier to only deploy certs to the server/container/vm that need access to the plain text and keep an end-to-end encrypted connection.

To speak in parallel with some of the mentions earlier, I would find sni passthrough extremely desirable. I know a lot of people, including myself, like to keep encryption end-to-end and store their key/cert with the application itself, instead of maintaining it at the LB.
As a previous user said, most solutions out there which implement dynamic backends making them more juicy for micro-service deployment don't support this (fabio, traefik, hipache, etc), whilst the solutions which support this don't support dynamic backends (i.e. haproxy, nginx, caddy). Fabio could be one of the first All-In-One solutions that is flexible enough to do this!

@InAnimaTe yes :)

@InAnimaTe, @mterron, @jefferai et. al. here you go.
This patch implements TCP passthrough support for TLS connections and uses the SNI header for routing providing end-to-end encryption with dynamic routing!
This is working but needs testing. Please hit on it and find out where it breaks. I need to think a bit more about timeouts and edge cases.
Here is how you can test this:
./fabio -proxy.addr ':9999;proto=tcp+sni'

This will configure a listener on port 9999 which will capture the first package, parse the TLS ClientHello and extract the server name from it. Any error or no TLS will close the connection immediately. Traffic is then routed to the service which is registered with prefix <serverName>/. Note the trailing slash which is something I need to fix later.
The demo/server now has an option to provide a TLS certificate as follows:
./server -proto http -prefix <serverName>/ -cert cert.pem -key key.pem

You'll get some TLS handshake error lines from consul performing health checks. That's fine for now. I'll suppress them later.
Then run openssl as follows:
/usr/local/opt/openssl/bin/openssl s_client -tls1_2 -connect <IP_ADDRESS>:9999 -servername <serverName>

and test with
GET /health HTTP/1.0

You should get
HTTP/1.0 200 OK
Date: Sun, 21 Aug 2016 09:18:49 GMT
Content-Length: 3
Content-Type: text/plain; charset=utf-8

OK
closed

Or with curl (make sure you use the homebrew version on OSX):
/usr/local/opt/curl/bin/curl -k -i https://<serverName>:5555/health
HTTP/2 200
content-type: text/plain; charset=utf-8
content-length: 3
date: Sun, 21 Aug 2016 09:22:34 GMT

OK

You sir are a God among Men.
I have a few services I plan to test this with sometime this week. Really glad you put forth the effort and time to get this initial version committed. Appreciate it!

@InAnimaTe any update?

@magiconair is there a binary for this feature or do I have to compile it myself?

Right now you have to compile it yourself.

 But that would give people a better opportunity to test this. Then I could tag a 1.3 release as well. Opinions?

+100

Done. Merged to master and released v1.3. Documentation is here:
https://github.com/eBay/fabio/wiki/Features#tcpsni-proxy-support
Please test and let me know where it breaks.

Any chance of vanilla TCP support?

@nugend yes, the tcp+sni proxy is essentially a vanilla TCP proxy with some goodies. So building the proxy isn't the problem. I need to add code to create listeners dynamically. It'll come but I'm working on something else right now.

@nugend What's your use case?

Internal app using a custom connection oriented protocol. A number of client teams that don't really have the ability to be aware of our multiple instances.

Hey @magiconair , I can't seem to get the ELB PROXY and tcp+sni pieces work together, should they, or am I missing something?
I.e. curl -k --resolve hello-world.blah.com:9999:<IP_ADDRESS> https://hello-world.blah.com:9999/hello_world.html works from a machine that's able to see that private IP, so I've seemingly verified that tcp+sni is working correctly.  But I'm trying to put fabio behind an AWS ELB, and whether I put the ELB into https 443 -> https 9999 or  tcp 443 -> tcp 9999 w/PROXY support, it doesn't work.  (Fabio was starting with just -proxy.addr ':9999;proto=tcp+sni' as its args here).  The curl command to hit the ELB is just curl -k https://hello-world.blah.com/
In the https case, my curl just hangs, I'm not sure where it's hanging.  Meanwhile fabio is spitting out 2016/10/11 03:51:57 [DEBUG] tcp+sni: server_name missing constantly, so I'm assuming something internal to the ELB is just spitting-out tons of request to fabio about something (the healthcheck is on 9998, so it shouldn't be that)?
In the tcp case, I get curl: (35) SSL received a record that exceeded the maximum permissible length. or curl: (35) Unknown SSL protocol error in connection to hello-world.blah.com:-9847.  On the Fabio side, the only log I get for each of these attempts is 2016/10/11 04:01:16 [DEBUG] tcp+sni: TLS handshake failed.  Any ideas?

@holtwilkins I'll have a look

@holtwilkins the PROXY protocol is only on the HTTP listener right now which will break the TCP+SNI listener as it will not be able to parse the ClientHello. I'll add that and put a patch on a branch. Could you test that?

I sure can, just point me at the branch when it's ready!

@holtwilkins I think that should do it. I'm working on making the TCP+SNI proxy more testable anyway and I'll add that to the test cases. However, that change isn't ready yet.

@holtwilkins In case you didn't see the issue-1-add-proxyproto-to-tcp-sni branch: https://github.com/eBay/fabio/tree/issue-1-add-proxyproto-to-tcp-sni

Thanks @magiconair , it worked for me!

@holtwilkins Excellent. Then I'll merge it and make sure that I have a test for it in the next update.

Merged this to master and referred to it as #177

@nugend I'm tracking the generic tcp proxy support separately in #179 but I'll keep this one open since it has the comprehensive discussion of use cases in a single place.

Generic TCP proxying support is now in the release-branch-1.4 Please check #179 for more info on how to use it. I'd really appreciate any feedback.

I thought you weren't supposed to ever close bug #1  :-D
Great job!


Switch to Outer Macro pattern

Motivation
Currently the macros depend on the line order of the code. Since recently the way the current macros work break rust analyzer. This was noted in #327.
A solution to this problem is to switch to the Outer Macro pattern, which allows to track the state of the macro without depending on the line order of the code.
Design Detail
The main idea is to use a #[php_module] macro on a module that contains all the functions, classes, etc. that should be exported to PHP.
As everything in that module is the input to the macro, the macro can track the state of the module and generate the necessary code.
While parsing the 'pseudo' inner macros are evaluated similar to the current macros.
This would look something like this:
#[php_module]
pub mod module {
    #[php_function]
    fn func() { ... }

    #[php_class]
    pub struct Example {
        [...]
    }

    #[php_impl]
    impl Example {
        [...]
    }
}

Drawbacks
The main drawback is that all functions, classes, etc. must be defined in the same module. This can make the code harder to read and maintain.
A workaround for this would be to include a require! macro that allows to include the code from another module. Functionality for this can be added using macro_magic.
It should be noted, that macro_magic has this warning about that approach:

Any types you may have brought into scope with use statements in the foreign module may or may not be available in their new context without additional use statements.

Another drawback is that this will break existing code that uses the old macro pattern.
Rationale and Alternatives
The main alternative is to drop the #[php_module] macro and require the user to register all functions, classes, etc. manually (#329).
This gives the author more control over how the module is wired in the end. I guess this would be similar to how crates like actix_web do things.
While this would work, it would also be a breaking change and not that easy to migrate to as this approach requires some manual work by the author.
Using the Outer Macro pattern would in theory allow to support both patterns, but would make most cases easier.
Another alternative is to keep the current macro pattern and fix the issues with it. This would still depend on the line order of the code and has no guarantee that it will not break again in the future.
Prior Art
This youtube video explains the concept of Outer Macros.

@faassen

Okay, I wasn't aware of this pattern, so I'm going to have to read up on it.
I disagree an explicit strategy "makes it harder to read and maintain". It's more typing, but it's also more straightforward - less magic that can go wrong. We've already seen that implicit can lead to problems. So it depends on whether outer macros avoid those and whether the magic has other possible drawbacks.

I just watched a bit of the video on the outer macro pattern. That's a neat trick! The outer macro pattern really needs to be documented in the form of text somewhere. Since the outer macro has access to the complete picture it can generate module information freely in any order that makes PHP happy.
I do have the use case of building a relatively large extension where I'd like to break stuff up into separate Rust modules that need to be able to refer to each other.  I don't understand yet how to make that work, unfortunately.
A question, does this have to be defined on an explicit mod statement that has actual Rust content? That is, would this work at all?
#[php_module]
mod my_module;

As to breaking backwards compatibility - that's a big one and I'm not sure how to handle it. I'm fine with breaking it as I'm writing something new, but existing PHP extension authors may have different ideas. If it'd just involve moving #[php_module] on an existing mod statement, it's easy enough, but is it?

As to a require! style statement, the example in macro_magic mentions this:

Any types you may have brought into scope with use statements in the foreign module may or may not be available in their new context without additional use statements.

which sounds scary. I don't understand this very well yet though. Presumably any use statements in the included module B are also in module A that does the including, and does this mean types are not available in A or in B?

I disagree an explicit strategy "makes it harder to read and maintain". It's more typing, but it's also more straightforward - less magic that can go wrong. We've already seen that implicit can lead to problems. So it depends on whether outer macros avoid those and whether the magic has other possible drawbacks.

True, I have updated the Issue. Hope this better reflects that option.
I would like to offer both (but do one first). As the macros inside the outer macro are not 'real' it would be possible to still provide a real version of those for ppl who like to do the wiring manually.

A question, does this have to be defined on an explicit mod statement that has actual Rust content? That is, would this work at all?
#[php_module]
mod my_module;

No, this won't work. You need to have an actual body.

As to breaking backwards compatibility - that's a big one and I'm not sure how to handle it. I'm fine with breaking it as I'm writing something new, but existing PHP extension authors may have different ideas. If it'd just involve moving #[php_module] on an existing mod statement, it's easy enough, but is it?

Should be easy enough to migrate. Ideally its just moving everything into that module. But an upgrade guide would definitely be required.
As this crate hasn't reached 1.0.0 yet I personally have no problem breaking things from time to time. But I am relatively new here, so I will refer to the others if there are differing opinions.

which sounds scary. I don't understand this very well yet though. Presumably any use statements in the included module B are also in module A that does the including, and does this mean types are not available in A or in B?

Wasn't entirely sure myself when I read that, but tested it and if I import mod B into A  it will also copy all the use statements. If both have a use statement with the same name this will cause conflicts. This can be resolved with something like this use crate::ext2::HELLO as HELLO_EXT;
Basically its acting like a copy paste from the other module.

I'm happy to break stuff to make progress on this crate, but I'm even more new! :)
As to migration, it would require people to introduce an outer module. I also think I managed to make multi-module registrations work with ext-php-rs, so you'd use the #[php_class] macro in a second module, and import it into the one defining #[php_module]. The magic of a global STATE will cause that stuff to get registered, but that won't work with the outer module pattern.

I wanted to understand the outer macro pattern better, and produced this repository to explore it:
https://github.com/faassen/outer_macro_pattern
I can confirm you can't mark non-inline mod foo with an attribute macro; stable Rust doesn't even support it I found out.
I intend to play around a bit more with modular patterns. I am wondering whether with macro magic we can cause other modules to be registered without importing them into the same namespace. Maybe we can cause something like this to work:
#[php_module]
mod my_module {
    #[php_register]
    use other;
}

Then the special #[php_register] attribute expands the use statement to this:
mod inner_other {
     // content of that other module included here
}

Then the #[php_module] macro can then treat these inner modules the same way as the module directly being registered, scanning them for structs, functions and impls. By wrapping them in a (hidden) module statement we won't get import conflicts. I'm handwaving a lot here, but I'm hopeful we can make something like that work.
(I just thought of something; inclusion of code with use statements into a submodule or something would break them, wouldn't it? hopefully we can come up with some restrictions, only direct sibling modules can be registered)

Then the #[php_module] macro can then treat these inner modules the same way as the module directly being registered, scanning them for structs, functions and impls. By wrapping them in a (hidden) module statement we won't get import conflicts. I'm handwaving a lot here, but I'm hopeful we can make something like that work.

Sounds interesting. So you are thinking about something that generates something like this?
mod my_mod {
    use crate::ext2::HELLO;
    use proc::require;
    pub fn hello2() {
        {
            ::std::io::_print(format_args!("{0}\n", HELLO));
        };
    }

    mod inner_other {
        use crate::ext2::HELLO;
        pub fn hello() {
            {
                ::std::io::_print(format_args!("{0}\n", HELLO_EXT));
            };
        }
    }
}

Did not have that much time, but built a rly simle poc only supporting functions for now.
#[php_module]
mod module {
    #[php_function()]
    /// Test Function
    pub fn hello_world() {
        println!("Hello, world!");
    }
}

expands to
#![feature(prelude_import)]
#[prelude_import]
use std::prelude::rust_2021::*;
#[macro_use]
extern crate std;
use ext_php_rs::prelude::*;
mod module {
    fn hello_world() {
        {
            ::std::io::_print(format_args!("Hello, world!\n"));
        };
    }
    #[doc(hidden)]
    pub extern "C" fn _internal_php_hello_world(
        ex: &mut ::ext_php_rs::zend::ExecuteData,
        retval: &mut ::ext_php_rs::types::Zval,
    ) {
        use ::ext_php_rs::convert::IntoZval;
        let parser = ex.parser();
        let parser = parser.parse();
        if parser.is_err() {
            return;
        }
        let result = hello_world();
        if let Err(e) = result.set_zval(retval, false) {
            let e: ::ext_php_rs::exception::PhpException = e.into();
            e.throw().expect("Failed to throw exception");
        }
    }
}
#[doc(hidden)]
#[no_mangle]
pub extern "C" fn get_module() -> *mut ::ext_php_rs::zend::ModuleEntry {
    let mut builder = ::ext_php_rs::builders::ModuleBuilder::new(
            "ext_outer_macro",
            "0.1.0",
        )
        .function(
            ::ext_php_rs::builders::FunctionBuilder::new(
                    "hello_world",
                    module::_internal_php_hello_world,
                )
                .build()
                .unwrap(),
        );
    match builder.build() {
        Ok(module) => module.into_raw(),
        Err(e) => {
            ::std::rt::panic_fmt(format_args!("Failed to build PHP module: {0:?}", e));
        }
    }
}
#[cfg(debug_assertions)]
#[no_mangle]
pub extern "C" fn ext_php_rs_describe_module() -> ::ext_php_rs::describe::Description {
    use ::ext_php_rs::describe::*;
    Description::new(Module {
        name: "ext_outer_macro".into(),
        functions: <[_]>::into_vec(
                #[rustc_box]
                ::alloc::boxed::Box::new([
                    Function {
                        name: "hello_world".into(),
                        docs: DocBlock(
                            <[_]>::into_vec(
                                    #[rustc_box]
                                    ::alloc::boxed::Box::new([" Test Function".into()]),
                                )
                                .into(),
                        ),
                        ret: abi::Option::None,
                        params: ::alloc::vec::Vec::new().into(),
                    },
                ]),
            )
            .into(),
        classes: ::alloc::vec::Vec::new().into(),
        constants: ::alloc::vec::Vec::new().into(),
    })
}

Was not 100% straight forward to implement, but not so bad.

You need to reproduce the content of the module while striping out the inner macros
Parsing arguments works a little different. parse_args panics if there are no args (empty is fine though, notice the brackets at #[php_function()]). This should be easily solvable though.
Multiple attributes on an item need to be handled.

Other than that I was able to just reuse most of the existing macro code. This is great, as this would allow both the manual registration using the existing macros and auto registration using the #[php_module] macro.
Will post the src once I have cleaned it up a little.

Sorry to be MIA, I focused on other parts of my project for a while. It's great you made progress! Is there a way we can collaborate on it?

Didn't have much time to work on it either. I hope I can find some time this or next week.

Created a branch with early wip. Still a lot of experimentation and stuff is not where its supposed to be.
feat/outer-macro

@faassen think I have a first version of everything implemented. Needs some cleanup, but all macros should work with outer macro pattern.


Rethink "extra" user info sections

📚 Documentation
Since #4661, what were "Iris Technical Papers" (were here), are now moved to be part of the "Developer docs" (now here)
The existing items here are :

"Iris Handling of PP and Fieldsfiles", and
"Missing Data Handling in Iris"

Meanwhile, with #3890, the User Guide has gained an extra "Further Topics" section, now containing:

"Metadata"
"Lenient Metadata"
"Lenient Cube Maths", and
"Mesh Support"

I think the result is now a bit confused + inappropriate :  None of the above are really developer-specific information, and the information sections like "Metadata" and "Mesh Support" are if anything of less general interest than the former "Technical Papers".
So I think these could usefully all go in the "Further Topics" section of the User Guide.
What does anyone else think of this ?
@bjlittle @tkknight @trexfeathers

Some possible problems, though ?

the older "technical papers" might want some rewrite to unify the styles a bit
the "metata" sections look like they might usefully be grouped together.  But I don't know if sections + subsections are easily achievable here ?

My personal instinct would be a dedicated heading for Further Topics and Technical Papers combined. But I'm not certain how that fits with the '4-quadrant' approach researched by @jamesp and @wjbenfold.

I'm not about to completely redesign the docs (probably) but will happily opine on them a bit:

Making a call about what's important for users and what's important for devs (can we use different words, given that users might consider themselves devs? Anyway...) seems sensible. I'd expect some users to benefit from an understanding of why choices have been made and the mental models behind them, so maybe there will be more in the user section than we'd expect. There could always be stubs in the dev bit that linked to the user bit?
I think we'd ideally be using a 4-quadrant style of tutorials, how-tos, reference and explanation - to me I think further topics tends to fall into explanation (leaving api docs as the reference). Based on that, and based on a quick skim of the contents of both, I'd stick them all in a "explanation" or "background information" or something. There might be an argument for having explanations for users and explanations for devs, though it seems like they're all user-type ones?

can we use different words, given that users might consider themselves devs?

I think there was talk at one point about rebranding the Developer’s Guide to the Contributor’s Guide.

My personal instinct would be a dedicated heading for Further Topics and Technical Papers combined.

#5602 ✅


Add hyperlinks for clarity whenever possible

Add hyperlinks whenever a new concept is introduced (and not covered in detail), or as a reminder in key places.
This may help clarifying the content without adding more text.

Most of the times the concepts are covered in the scikit-learn user guide.
Example:

Add link to the documentation for terms mean squared error and mean absolute error in this notebook

Some concepts are not in the user guide but we could find a way to link them to the Glossary.
Examples:

Add link to the Glossary for the word "uncertainty" in this notebook (See #426)
Add link to the Glossary the first time we introduce the word "hyperparameter" in this notebook  and in quiz M3.01 (to address this post in the forum)

I think the main problem here is that we don't have a technical way to do links between different places of the MOOC in a way that works for all setups: JupyterBook, Jupyter notebook outside FUN (used for in-person courses), and Jupyter notebook inside FUN

we can do links between documents in JupyterBook but then they would use MyST-specific syntax so they would not work in Jupyter notebook outside FUN. Maybe this is doable to use our notebook conversion script to rewrite the links although this may not be trivial at all
even if we manage to do the previous point, we would need to rewrite automatically the notebooks inside FUN to point to the FUN URL (e.g. glossary). That would mean we need:

custom logic inside JupyterHub to convert the notebooks
a URL correspondance table between JupyterBook and FUN so that the notebooks point to a URL within FUN

I think our general approach so far (not ideal I know) was:

let's try to explain well something the first time we encounter it (potentially also the next few times)
let's use the glossary as a fall-back when you don't remember the meaning of a central concept

Also I feel somehow that https://github.com/INRIA/scikit-learn-mooc/issues/420 could be another way to help find parts of the MOOC related to a given concept

If I understand correctly,  #420 proposes directing the search results links towards .github.io. That might be the easiest solution in both cases.

This search tab could also be a place to remind people that they can browse the material on our .github.io, since this is slightly more convenient that clicking around in FUN.
Caveat: the state of the .github.io is not completely is not in sync with the user Jupyter notebooks, but I think that's fine ...

If I understand correctly, #420 proposes directing the search results links towards .github.io. That might be the easiest solution in both cases.

It would be inside an iframe in FUN, so that would still give you the feeling you are inside FUN, the same way the forum tab on the top right gives you the feeling you are still inside FUN although the forum is in an exteral web page.

Worst case scenario, concepts that are not covered in the user guide could be linked to wikipedia, what do you think?

Using an external resource is fine I think.
The problem is that it is not so easy to find good resources at the level we want. The user guide is very often not such a good place for beginners, for example look at this section for nearest neighbors classification: https://scikit-learn.org/stable/modules/neighbors.html#nearest-neighbors-classification.
Finding a compromise solution where we hard-code links to .github.io (rather than making sphinx-like links between documents) could be a hacky yet good enough compromise. Other opinions more than welcome!
Note to our potential future selves: we can use linkcheck like this from time to time to make sure links still work:
jupyter-book build --builder linkcheck jupyter-book

This would help to have specific points to be addressed (there are a few at the beginning already). Generic issues like this tend to rot with time.

Hi all :wave:
scikit-learn beginner here, with a little background on ML/NLP. I'm doing the MOOC, and as mentioned in #623, search for things like "!wiki Bayes error rate" on DDG, or opening scikit-learn.org and searching in the site for some terms. But most of the time I use Wikipedia.
It'd be great to have links like foot notes (if we don't want to have links distracting users), as an extra section in the lesson like “References” or “Glossary”, etc., or maybe HTML links.
Thanks!
Bruno
p.s.: I just tried searching "!scikit make_pipeline" and it didn't work, so I asked DDG to add a new bang for it :man_shrugging: not sure if it'll be accepted, but doesn't hurt to try. At least that way I'll be able to search these terms quicker until we have hyperlinks or some other fix.

maybe HTML links.

I think that turning some word into HTML links to relevant wikipedia
pages would be useful, and it would not add "noise" to the current
material (we struggle to keep it not too long).
I can only speak for me, but I think that a PR doing that would be
welcomed.


Poll before unsubscribing

The previous version of the code was unstable, because sometimes the data structure resulting from the poll was empty. This was likely due to waiting too little time between the subscribe and the unsubscribe operations: time.sleep(0.01) was not always enough.
We can solve this by polling directly after subscribing, and unsubscribing just after the poll has ended. This should be stable because the default recording time of the poll function is 0.1s, which empirically is enough to always receive some data.

Tried running two batches, they all succeeded (look at the MFLI test)
https://jenkinscontroller2020.zhinst.com//batch/2022-10-31_10-44-31_4
https://jenkinscontroller2020.zhinst.com/batch/2022-10-31_10-50-18_5


Team work contract

rubric={correctness:10}
Similar to what you did in DSCI 522, create a team-work contract. The contract should outline how you are committed to work together so that you are accountable to one another. Again, you may start with your team contract document from 522 and adapt it for your new team. It is a fairly personal document and please do not push it into your public repositories. Instead, save it somewhere your team can easily share it, and you can share a link to it, or a copy with us in your submission to Canvas to prove you did this.

https://docs.google.com/document/d/1hESpR6ZZoblgm3hH_SBhIxkfYKHxL9oNLHIIGVjJDgU/edit#


Proposal: <podcast:gateway> item-level tag

Hi gang. Great to see such activity going on with the namespace of late.
I've written about "gateway episodes" before, as something podcasters can do on their websites to give new listeners a starting point into a long-running podcast. While we're all trying to make each episode better than the last, our 100th might not be as welcoming to new listeners as our first, so I was thinking it'd be great to be able to pin an episode to the top of a feed list, and indicate in the UI that this episode might not be the latest, much like a pinned tweet. I don't see why multiple episodes can't be pinned, but app UI developers should make their own decision as to how many is too many. I'd say a soft limit of 3.
Anyway, I think the ability to interrupt a chronological list and mark certain episodes as good starting points could be really helpful. A simple item-level <podcast:pinned> tag with the text value of yes would be simple enough. However, it could go a little further:
<podcast:pinned>
    <podcast:pinnedLabel lang="en">Start here</podcast:pinnedLabel>
    <podcast:pinnedLabel lang="es">Empieza aqui</podcast:pinnedLabel>
</podcast:pinned>

So the contents of the tag could either be

yes in which case the player app makes its own decision (perhaps we agree simply on "Pinned episode" to prevent any unintended meaning being drawn from it... we don't want to make an assumption as to why an episode is "pinned"), or
a list of labels in different languages that explicitly state what "pinning" means to this particular podcast. To avoid duplication, perhaps <podcast:pinnedLabel> could be channel-wide.

Would love your thoughts. I feel like I've kept abreast of developments but I don't use Mastodon so if this is something I've missed, and you already have a competing/better spec for this, obviously feel free to close this as a dupe. But I hope it's worth considering for phase 4.
Thanks so much.

This is a really interesting idea. It seems to share qualities with podcast:soundbite and podcast:trailer, but also is unique to its own purpose.
We’ve had this issue on our own show. Yes, the first show had a lot of value for new people. But, over time it became dated as the project evolved. And now I’d say that one of the episodes in the 20’s probably made more sense as an entry point.
I like this a lot. It could be that the UI of the podcast app suggests this episode to the listener when they first follow/subscribe. Maybe there is a pop up or something.

Thanks @daveajones, that's great to read. Your idea of the popup makes me think we could expand this a little to have a reason attribute to the <podcast:pinned> tag, so you can say "this one is pinned because it's a good one to start with", vs "this one is pinned because we had a stellar guest". If we limit the reason attribute to a few keywords, the app can make a safe inference as to why an episode is being pinned, and then if it's, say reason="gateway", the app can safely pop up a dialog saying "Do you want to start with this episode?" Then any other pinned episode can just be shown with a highlight and the pinned label.

Yes, with a proper reason code, the UI could really be adapted to fit a lot of different uses.

the app can safely pop up a dialog saying "Do you want to start with this episode?"

Yes, this is exactly the experience I would want as a listener.  I really love this idea.  It would also be great for discovery.  I can see services popping up that extract all of the gateway episodes from different podcasts into lists.

The No Agenda Show has several 'dot five' episodes that are perfect for this. 100.5, 200.5 would be our pins (if multiple are valid)

Think this is a fantastic idea and subtly different from Trailer in a good way. I think we should have an index value to order them so that if you have 3 pinned episodes, the client will show them in the same order (not just alphabetical or order they're entered in the feed). Or, we could just enforce the coding order in the feed from top to bottom should be the display order. Either works.

Yes, an index is a fine idea.

RadioPublic implements gateway episodes via RSS, which are presented at the top of the list. The latest (or first, for serially ordered shows) episode is presented in that spot when not present.
The specific structure of gateway episodes falls outside of the  tags, because we wanted them to be able to be strictly ordered. Thus, the structure is
...
<channel>
  ...
  <rp:gateway-episodes>
    <rp:episode-reference>[guid-1]</rp:episode-reference>
    ...
    <rp:episode-reference>[guid-n]</rp:episode-reference>
  </rp:gateway-episodes>
  ...
</channel>
</rss>

There's a lot to be said for allowing the categories / labels to be defined at the feed level, but I am wary of leaving ui localization to podcast publishers. I'm also wary of losing the defined semantic value of pinning, which I think is necessary for app makers to be comfortable building an analog in the absence of explicit values in the feed. At least from my perspective at RadioPublic, being able to backfill algorithmically was often a requirement before we built support for reading a value from the feed, because otherwise it generally wasn't worth supporting the very small number of podcasts which would proactively support an emerging standard.

@cqr, thanks very much for this info.  How widely used is 'rp:gateway-episodes'?  Do you know of any apps ingesting/acting upon it?  If so, would it be possible to adopt this tag into the podcast namespace in a way that is backwards compatible with what you guys have?  We did something similar with podcast:transcript.  Buzzsprout was using it and Podcast Addict was the only app ingesting it.  We adopted it in a way that kept compatibility and just changed the prefix.
Just wondering how we can advance what you guys have done and give it wider use in the industry.  Lots of hosting companies have the "podcast" xmlns declared now.  So, the barrier to adoption is getting lower.

Aside from the RadioPublic apps (including the native apps, website, embed, and podistes) I don't think any clients implemented it. Libsyn implemented it on the publishing side, and there were some boutique deals with smaller hosts.

Thanks @cqr .
Since the specific episode needs to live in the feed pretty much forever, even when others may roll off, there is also the option to wrap a standard episode in a tag that will obscure it from players that don't support it, like this:
<podcast:gatewayItem>
  <title>Episode 50: Max Boost Time</title>
  <description>Adam & Dave discuss the week's developments on podcastindex.org with free software entrepreneur Max Hillebrand. We go deep on how all this bitcoin lightning stuff works. An outstanding board meeting!</description>
  <link>http://adam.curry.com/html/PC205020210813Podcas-n6KRZ4qb827P30PgBqfRCtG1BHk0kP.html</link>
  <guid isPermaLink="false">PC2050</guid>
  <pubDate>Fri, 13 Aug 2021 20:27:20 GMT</pubDate>
  <podcast:chapters url="http://<IP_ADDRESS>/http%3Amp3s.nashownotes.compc20rss.xml/PC2050" type="application/json"/>
  <podcast:transcript url="https://mp3s.nashownotes.com/PC20-50-Captions.srt" type="application/srt"/>
  <itunes:subtitle>Episode 50: Max Boost Time</itunes:subtitle>
  <itunes:author>Podcast Index LLC</itunes:author>
  <author>Podcast Index LLC</author>
  <itunes:image href="https://noagendaassets.com/enc/1601061118.678_pciavatar.jpg"/>
  <itunes:explicit>no</itunes:explicit>
  <itunes:keywords>podcasting,curry,podfather,technology,deverlopers</itunes:keywords>
  <enclosure url="https://mp3s.nashownotes.com/PC20-50-2021-08-13-Final.mp3" length="97606680" type="audio/mpeg"/>
</podcast:gatewayItem>

I'm just thinking it keeps all the normal semantics we're used to, and doesn't need indexing against others because the date is already there as the normal sorting device.
Am I crazy with this?

I'm thinking this may be just too messy.  You'd have to resolve GUID collisions and such.  Giving this some thought...

I think the idea behind it is sensible, as it does allow for separation of episodes, but could be complex for apps to have to integrate, so maybe for phase 4 it could be worth sticking with the <item> element, and look further down-the-line at what's possible?

On the point-of-view of episodes dropping off feeds, for hosts that are implementing this feature at a native level – ie: they have a UI for it, and are not just relying on users being able to alter the feed themselves – I feel like it would be trivial to pick out the episodes from the feed that are marked as gateways, so that they always come up in the page 1 of a paginated list.
If I were still running Podiant – ah, those were the days 😉 – I might do something like this:

Query for all published episodes
Order the query by -is_gateway, so that episodes where gateway=true are always first in the list
Limit the query to 100 items
Optionally re-order the queryset results in Python, so that they're in reverse-chronological order
Render the list

Step 4 really shouldn't matter, but we're being good citizens by putting the episodes back in the expected order.

... it's also no different to the trailer episode in the iTunes spec, so podcast hosts should be used to it.

so maybe for phase 4 it could be worth sticking with the <item> element

Ok, I’ll write it up like I think you intend and then we can all hammer on it and shape it to what we’re comfortable with.

@daveajones Thanks for the invite to comment via Mastodon, I like where this is going. I have some questions/remarks:

@amarksteadman Server side, this appears perfectly doable, it's just adding an extra field and attributes to the feed.
The translations seem like a conversation that supersedes how pinning is handled, but I'll add my thoughts on that anyway while I'm here:
I'm curious how the translations would play out, surely there's a better way to do this than exponentially increasing the size of the fetch by putting it all in one file. Perhaps this could link to a child feed that follows a common convention *_en_US.rss to allow for players/UIs that honor translations to also know to follow any subfeeds with the correct locale string in the name.

@amarksteadman If you had to explain to someone programmatically how this feed is structured, with what criteria would you explain the difference between a 'pinning reason' from an 'episode description' in a way that could be translated to code?

@daveajones Though this is tangential to the discussion of a protocol, and it seems like more of a UI/UX concern, I like this idea, and would probably enjoy that or find it helpful.

@daveajones I've only just arrived, but from what I know of GUID's or UUID's in general, a collision would be unlikely. Is the term being used differently in this context? However, what I see in the field in the example is also not what I'd recognize as a GUID traditionally. In the interest of being concise, is there a better term we can use for this, or a better way we can specify what value is valid here?

@amarksteadman While reading this I'm reminded of two things, versioned protocols, and RFC's. A versioned protocol defines the mandatory elements from the supplemental elements, and RFC's define a way to comply with specificity to peripheral standards that have not yet made it to the protocol level.

I'm curious how the translations would play out, surely there's a better way to do this than exponentially increasing the size of the fetch by putting it all in one file

I'm curious too. We don't have translations for anything else, and I'd like to suggest that we remove translations here. The language of the RSS feed - the title, descriptions, and of the podcast itself, is already defined in the RSS's <language> element. Why would you have a label saying "Empieza aqui" when the podcast itself is only available in English?

versioned protocols, and RFC's

In the podcast namespace, we're confined by not being able to do this sort of thing. Everything we do has to be backwards-compatible, and not break current podcast apps. The good news is that the RSS specification works this way.

Why would you have a label saying "Empieza aqui" when the podcast itself is only available in English?

I agree, however, allow me to play devil's advocate: When English isn't your first language, a translation is helpful to clarify the bits you might not understand in the English translation.

In the podcast namespace, we're confined by not being able to do this sort of thing. Everything we do has to be backwards-compatible, and not break current podcast apps. The good news is that the RSS specification works this way.

I can appreciate this goal, it is the most inclusive path and poses a fun challenge while also respecting the parting wishes of the RSS devs

I'll reiterate my concern with localizing in an RSS feed. This label for a pinned section ultimately feels to me like a piece of UI that should be consistent, and localization is a solved problem in the world of mobile apps and web apps.
The simplest thing to do in this case would be to pick a single purpose (I would advocate the abstract "pinned" case, or "Start Here" or similar) which podcasters can interpret however they want and not to worry about labels in the feed. Leave it to the app.
If you want to add arbitrary labels to items, the rss  tag seems like a great fit.

@daveajones I've only just arrived, but from what I know of GUID's or UUID's in general, a collision would be unlikely. Is the term being used differently in this context? However, what I see in the field in the example is also not what I'd recognize as a GUID traditionally. In the interest of being concise, is there a better term we can use for this, or a better way we can specify what value is valid here?

While RSS GUIDs are not GUIDs in the sense that the fit the commonly used definition, that's what they're called in RSS. It may not be an ideal situation, but there's no putting that particular genie back in the bottle.

Please forgive me for having to skim this (so I might be saying something someone already said), but I suggest what I think would be a better term than "pinned" or "gateway": "feature."
Also, I suggest there be as little redundancy as possible. If this is a channel-level tag, it should reference the episodes by GUID with an optional title for each.
If it's item-level, I still recommend a separate title. For example, "Start here," or "Our most popular episode."

Moving this forward to another phase and posting this here as a placeholder to begin work on the combined podcast:popular tag.

<podcast:gateway> - Discuss

<podcast:gateway
  order="[(number)]"
>
[free form message to listeners(string)]
</podcast:gateway>

Item
(optional | multiple)
This tag, when present in an <item> indicates that this episode is a so-called "gateway episode".  Gateway episodes are episodes that the podcaster (or maybe crowd sourced) thinks
represent the best entry point into a long running show.  If a podcast has 300 episodes, it might be a good idea to designate 1 or more older episodes as the best place to start.
The order attribute is an unsigned integer that is meant as an ascending listening order.  The episode with order="1" should be played first, then order="2" and so on.
When podcast apps encounter gateway episodes, it is suggested that they present these episodes (in some form of UI) to the user when the user subscribes or follows the podcast.
Example of a single gateway:
<item>
    <title>Podcasting 2.0 - How it all Began</title>
    <description>A look into the future of podcasting and how we get to Podcasting 2.0!</description>
    <link>https://example.com/pc20/ep1</link>
    <guid isPermaLink="true">https://example.com/pc20/ep1</guid>
    <author>John Doe (john@example.com)</author>
    <podcast:images srcset="https://example.com/images/ep1/pci_avatar-massive.jpg 1500w,
        https://example.com/images/ep1/pci_avatar-middle.jpg 600w,
        https://example.com/images/ep1/pci_avatar-small.jpg 300w,
        https://example.com/images/ep1/pci_avatar-tiny.jpg 150w"
    />
    <podcast:person href="https://www.podchaser.com/creators/adam-curry-107ZzmWE5f" img="https://example.com/images/adamcurry.jpg">Adam Curry</podcast:person>
    <podcast:person role="guest" href="https://github.com/daveajones/" img="https://example.com/images/davejones.jpg">Dave Jones</podcast:person>
    <podcast:person group="visuals" role="cover art designer" href="https://example.com/artist/beckysmith">Becky Smith</podcast:person>
    <enclosure url="https://live.example.com/live.mp3" type="audio/mpeg" />
    <podcast:gateway>Start here!</podcast:gateway>
</item>

Example of a gateway series:
<item>
    <title>Podcasting 2.0 - How it all Began</title>
    <description>A look into the future of podcasting and how we get to Podcasting 2.0!</description>
    <link>https://example.com/pc20/ep1</link>
    <guid isPermaLink="true">https://example.com/pc20/ep1</guid>
    <author>John Doe (john@example.com)</author>
    <podcast:images srcset="https://example.com/images/ep1/pci_avatar-massive.jpg 1500w,
        https://example.com/images/ep1/pci_avatar-middle.jpg 600w,
        https://example.com/images/ep1/pci_avatar-small.jpg 300w,
        https://example.com/images/ep1/pci_avatar-tiny.jpg 150w"
    />
    <podcast:person href="https://www.podchaser.com/creators/adam-curry-107ZzmWE5f" img="https://example.com/images/adamcurry.jpg">Adam Curry</podcast:person>
    <podcast:person role="guest" href="https://github.com/daveajones/" img="https://example.com/images/davejones.jpg">Dave Jones</podcast:person>
    <podcast:person group="visuals" role="cover art designer" href="https://example.com/artist/beckysmith">Becky Smith</podcast:person>
    <enclosure url="https://live.example.com/pc20_ep1.mp3" type="audio/mpeg" />
    <pubDate>Fri, 11 Sep 2020 18:51:09 GMT</pubDate>
    <podcast:episode>1</podcast:episode>
    <itunes:episode>1</itunes:episode>
    <podcast:gateway order="1">Start here!</podcast:gateway>
</item>

<item>
    <title>Podcasting 2.0 - The tide has turned</title>
    <description>What a big week.  So many important things happened this week.  We dive into it all and what it means!</description>
    <link>https://example.com/pc20/ep45</link>
    <guid isPermaLink="true">https://example.com/pc20/ep45</guid>
    <author>John Doe (john@example.com)</author>
    <podcast:images srcset="https://example.com/images/ep1/pci_avatar-massive.jpg 1500w,
        https://example.com/images/ep1/pci_avatar-middle.jpg 600w,
        https://example.com/images/ep1/pci_avatar-small.jpg 300w,
        https://example.com/images/ep1/pci_avatar-tiny.jpg 150w"
    />
    <podcast:person href="https://www.podchaser.com/creators/adam-curry-107ZzmWE5f" img="https://example.com/images/adamcurry.jpg">Adam Curry</podcast:person>
    <podcast:person role="guest" href="https://github.com/daveajones/" img="https://example.com/images/davejones.jpg">Dave Jones</podcast:person>
    <podcast:person group="visuals" role="cover art designer" href="https://example.com/artist/beckysmith">Becky Smith</podcast:person>
    <enclosure url="https://live.example.com/pc20_ep45.mp3" type="audio/mpeg" />
    <pubDate>Fri, 20 Aug 2021 20:23:55 GMT</pubDate>
    <podcast:episode>45</podcast:episode>
    <itunes:episode>45</itunes:episode>
    <podcast:gateway order="2">We reached a milestone here!</podcast:gateway>
</item>

I still strongly urge us to use <podcast:featured> instead of <podcast:gateway> as "featured" is a friendlier word, more future-proof, and more extensible.

I think this would be great to have for music. Artists could add a featured tag for singles in the album feed.

I support the idea of a featured tag, with a type or reason indicator (gateway,popular,event etc).
(I initially liked Daniel's idea of extending the existing episodeType attribute, but now think that this is slightly different.  Maybe you want to feature a bonus episode, it would mean having an additional value for the attribute like "bonus,featured" which may not be backwards compatible.  That tag is also in the iTunes namespace, so not sure how that would work.)


Formatting erro

There is no line break between sip and Protocol of the SRV record paragraph.
Service: _sipProtocol: _tls

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

ID: d0937468-6fd2-c83a-ed60-81129a4b766a
Version Independent ID: 010a32f0-45a3-81da-1a6c-864996a86597
Content: Create DNS records for Office 365 using Windows-based DNS
Content Source: Office365-Admin/dns/create-dns-records-using-windows-based-dns.md
Service: o365-administration
GitHub Login: @pebaum
Microsoft Alias: pebaum

@officedocsbot assign @mypil

@andy2002a - Thank you for pointing this out.
I will get this issue over to the O365ITPro writing team for investigation.
Thank you for reporting and making the docs better. Much appreciated.
I made a note to request the team to update this when the work is complete.

Created PR https://github.com/MicrosoftDocs/OfficeDocs-O365ITPro/pull/421

@andy2002a - From our understanding, the issue has been resolved but it may take a few days for the merged content to appear in the article. If you feel it hasn't been resolved, please re-open this issue.
Thank you for your contribution to make the docs better! Much appreciated!

@officedocsbot close


can't pip install graphscope

when i pip the graphscope in my anaconda,it failed,python version is 3.8.8,pip version is  21.0.1
the error detail is as follow:

Hi @banbsyip ,
Currently Windows is not supported. You could try graphscope in WSL.

The error message could be improved to deliver users a hint.

@sighingnow ok,thanks


Plymouth Themes

Themes for plymouth boot animations.
Metadata

homepage URL: https://github.com/adi1090x/plymouth-themes
source URL: https://github.com/adi1090x/plymouth-themes
license: gpl-3.0
platforms: unix, linux, darwin, ...

https://github.com/NixOS/nixpkgs/pull/215693

Thanks, closing.


Arrival Estimation Data Model

Fede Facca is on vacation. A good opportunity for FF new staff to start reviewing and contributing to this repo


Hi

It doesnt work for me. I even copied the one that is in the format and it doesnt work.
Talonflame @ Flyinium Z
Ability: Gale Wings
EVs: 252 Atk / 4 Def / 252 Spe
Jolly Nature

Brave Bird
Flare Blitz
Swords Dance
Roost
This was in the format but it doesnt work, it says No (or invalid) paste
pls help

Talonflame (F) Flyinium Z
EVs: 252 Atk / 4 Def / 252 Spe
Ability: Gale Wings
Jolly Nature

Brave Bird
Flare Blitz
Swords Dance
Roost

Try this, it worked for me though the image doesnt appear

Talonflame (F) Flyinium Z
EVs: 252 Atk / 4 Def / 252 Spe
Ability: Gale Wings
Jolly Nature

Brave Bird
Flare Blitz
Swords Dance
Roost

https://pokepast.es/bb34bffbc69e3a7f

It doesn't work for me, i copied that text and it doesnt work

Did you see the link I posted too? Try copying it from there

Try paste as plain text

got it to work, ty :P

Hey @Kaiu24, thanks for helping this person out!


added program that uses android widgets using table layout

added program that uses android widget with table layout

added a program that uses android widget with table layout


Incorrect Japanese translation

This page and the child pages for eDiscovery has lot of incorrect/inconsistent Japanese translation for custodian management.
Japanese customers cannot understand correctly about the product. Especially "non-custodial" is translated into 6 patterns as far as I found. Each of those translated word has totally different meaning For ex. custodian: "カストディアン" "保管担当者"
custodial: "保管"
non-custodial: "非 親権" "非カストディアル" "非カストディアン" "非保管" "非親権" "非管理"

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

ID: 562b6b1d-b0fd-0d65-9db8-37df67bd7035
Version Independent ID: 92c4403b-0d6b-88aa-74f4-ba3b7640ad00
Content: Microsoft Purview eDiscovery solutions - Microsoft Purview (compliance)
Content Source: microsoft-365/compliance/ediscovery.md
Service: o365-seccomp
GitHub Login: @robmazz
Microsoft Alias: robmazz

@tiburd Please help us in resolving this issue. Thanks

Thank you for submitting this localization issue.
I submitted a translation bug: 240347
I'm closing this issue because the Global Services team will handle it from here.
cc: @yogkumgit


3x3 NashEqFinder

Hello, I hope you're well, I just wanted to know if you have a 3x3 NashEqFinder, cause I've tried to do it myself but i keep getting errors and i don't know what's the problem exactly.
If you can provide it that would be great or if you can help me do it, i would really appreciate it.
Have a nice day.

Hey Hicham , I can help you make the 3x3 version but are you looking for the pure strategies NE or the mixed one ?
Best,

just the pure one, i need it before 1 PM if you can help.
Thanks.

I think the GUI would be a bit complicated to be done before 1PM If you need the command line version I can try to provide a solution indeed

Hey, I've just released the 3x3 command line version you can find it here, please fill free to contribute for any bugs (they may be there 🪲) or any question ! see this code