RSMP (Formerly SRBWE, SWE) links to deleted github/spacedock pages.

Mod: https://forum.kerbalspaceprogram.com/topic/207196-112x-rsmp-formally-swe/
Correct github page: https://github.com/dangaffa/RSMP
Github/Spacedock that CKAN links to:
https://spacedock.info/mod/2992/RSMP - Remastered Solid Plume Effects [ALL OLD RELEASES OUTDATED!!!]
https://github.com/AdiriKSP/RSMP
I didn't feel like setting up a new spacedock mod page, hope that doesn't cause any issues.

Hey @AdiriKSP, what is the name of the mod? From the alphabet soup in the title I thought StockWaterfallEffects, but that seems to have a completely different set of links.

RSMP is the current name. CKAN has it indexed under a current name which is why I included it. My bad.

But what's the name, not acronym. We need to be able to find it.

The name CKAN has indexed?

Any clue would help, really.

Sorry, the project has gone through a lot of name changes. CKAN should have it indexed under either SRB Waterfall Effects, RSMP, or SRBWE. RSMP is just the name, not an acronym.

SRB Waterfall Effects

Ahh, that's the one! Perfect, thanks.

Yeah, my bad. Thanks a lot

Hey @AdiriKSP, that repo seems to have no releases, so we can't use it. Is that the only source?

I'm asking the owner of the repo to make a release right now. If they cannot I can make a new repo.

OK, let us know if that gets straightened out, and we can re-open this.

Release has been made
https://github.com/dangaffa/RSMP/releases/tag/mainrevs

Are you sure about mainrevs as a version number? That looks pretty weird, and doesn't easily lend it self to predecessor or successor versions.

That is more than likely the final release of this mod ever.

And if it isn't I suppose it can be changed later.

And if it isn't I suppose it can be changed later.

Not really. If it needs to be changed, that should happen now, before it gets added to CKAN. That's why I asked about it.

Numbered release added

The previous release was 0.4. Any chance you could make this easy for everyone else and pick something larger than that instead of 0.0.1 ?

roger, 4.0.1 is the new number

Uhh, negatory, the version number is not changed. This is where it comes from:

Should be fixed

OK, those changes should be on their way to CKAN users now. Thanks for letting us know!


CFP: Add status / metric to signal that Cilium is running with different settings than the ones defined in current ConfigMap

As pointed out in https://github.com/cilium/cilium/issues/27867, the user spent countless hours debugging Cilium because it was not restarted when helm upgrade was performed.
A suggestion to fix this issue would be to present, in cilium status, whenever Cilium is out-of-sync with the upstream Cilium ConfigMap. This should be marked as "Warning" and not required Cilium to be restarted.
If we could present this as a metric, to make sure that all Cilium agents are defined with the same configuration, that would be great as well.

The way I suggest doing this is to take a checksum and expose the checksum as a label. This is how Prometheus handles this for its own config and for alert manager. Then you can alert when there's more than one series in a time window which makes this fairly simple.

How do you guys propose exposing this feature in the cilium-dbg status cli?
Do we present a new section something like:
  ...
 ConfigSettings: OK|Agent settings don't match cilium-config settings. Needs restart.
  ...

Or more detailed:
Config Settings:  Agent settings don't match ciilium-config settings. Needs restart.
   o k1 v1 vs v2
   o k2 vx vs vy
   o ...

Hence giving users more visibility about which config params changed so they can figure out their agent cycling strategy.
Also do we need to expose this at the cilium-cli status level?
Config Settings: Mismatch detected. Agent restart required for:
  o a1
  o a2
  o ...

Thanks for the clarification!

This would be fixed by https://github.com/cilium/cilium/pull/34712. Please feel free to share any feedback.

@aanm @derailed does #34712 achieve the full scope of this CFP? Can we close this?

@aanm @derailed does #34712 achieve the full scope of this CFP? Can we close this?

Oh wow, this is fantastic! @ovidiutirla Can we have some user-facing documentation associated with it and then we can close this GH issue? I would also suggest to add a release-note/major to that PR.

@aanm, would there be interest to enable this by default, currently it's behind a disabled by default flag?

@aanm, would there be interest to enable this by default, currently it's behind a disabled by default flag?

@ovidiutirla I would say so. I didn't review the PR with the implementation but do we need the "ignore-flags-drift-checker" flag?
/cc @marseel do you see any issues in terms of scalability by enabling the metrics by default??

There should be no scalability concerns, the dynamic-config adds one additional watcher for each source used so it can watch but there shouldn't be much churn as the configs are expected to change quite rarely.

/cc Marcel Zięba do you see any issues in terms of scalability by enabling the metrics by default??

metrics cardinality - no, it's a single value metric so no problem here.
As far as I can see, it needs enable-dynamic-config enabled, it would enable one informer per config watched, this is fine I think.
What I find suspicious is this default:
https://github.com/cilium/cilium/blob/71fa658d5cc7c51c0e59331cca02d7b9b84efc4a/pkg/dynamicconfig/cell.go#L52
especially in case of Cilium being deployed in different namespace.
It seems like it should be overridden automatically, but I find it still a bit suspicious 😅

@marseel , the default is not actually used in the OSS, we basically override this with the actual values we get from the init container, https://github.com/cilium/cilium/blob/236bc2eac4c36cff60e0079f06d33816b3344ccc/pkg/option/resolver/resolver.go#L110

the default is not actually used in the OSS, we basically override this with the actual values we get from the init container,

Ahh, I see. So GKE does not have initContainer I assume and then it relies on this default?

The default is to provide some contextual understanding on the template and the expected values, and in case the initContainer is disabled to easily allow overwriting it


[Admin][Translation] fix : use admin locale instead of invoice

Q
A

Branch?
main

Bug fix?
yes

New feature?
no

BC breaks?
no

Deprecations?
no

Related tickets

License
MIT

Fix in Admin Show Invoice : use admin locale instead of invoice

Thank you, Bastien! :tada:


TypeScript. Run array of sagas in parallel.

Actually, we are not using most of typescript features on the project, it's es6 all the way. Nevertheless, typescript compiler is still running and causes the following issue while trying to run sagas in parallel:
Error:(32, 24) TS2345:Argument of type '() => IterableIterator<IterableIterator<TakeEffect<{}>>[]>' is not assignable to parameter of type 'SagaRest'.
  Type 'IterableIterator<IterableIterator<TakeEffect<{}>>[]>' is not assignable to type 'IterableIterator<TakeEffect<any> | PutEffect<any> | RaceEffect | CallEffect | CpsEffect | ForkEff...'.
    Type 'IterableIterator<TakeEffect<{}>>[]' is not assignable to type 'TakeEffect<any> | PutEffect<any> | RaceEffect | CallEffect | CpsEffect | ForkEffect | JoinEffect ...'.
      Type 'IterableIterator<TakeEffect<{}>>[]' is not assignable to type 'Effect[]'.
        Type 'IterableIterator<TakeEffect<{}>>' is not assignable to type 'Effect'.
          Type 'IterableIterator<TakeEffect<{}>>' is not assignable to type 'CancelledEffect'.
            Property 'CANCELLED' is missing in type 'IterableIterator<TakeEffect<{}>>'.

There is a saga:
import { take } from 'redux-saga/effects';
import { SHOW_CONFIRM, HIDE_CONFIRM } from '../actions/constants';

export default function* confirmSaga() {
    while (true) {
        const { resolve, reject } = yield take(SHOW_CONFIRM);
        const { isConfirmed } = yield take(HIDE_CONFIRM);
        isConfirmed ? resolve() : reject();
    }
}

There is a root saga (probably there will be more sagas in project, so, i guess we need this aggregation):
import confirmSaga from './confirmSaga'

export default function* rootSaga() {
    yield [
        confirmSaga()
    ];
};

Configuring the store:
import rootSaga from 'sagas/';
//...
const sagaMiddleware = createSagaMiddleware();
//...
const middlewares = [
//...
  sagaMiddleware
];
//...
sagaMiddleware.run(rootSaga); // <-- this line causes the error

As i mentioned in the code, the run makes typescript compiler fail.
So, for now i run confirmSaga directly and it goes ok:
sagaMiddleware.run(confirmSaga); // <-- ok

but for sure we will add more sagas in future, so the issue is still there

TS typings (same goes for flow) are completely community-driven and not directly implemented by redux-saga author. The library is written in plain javascript.
Would you be willing to correct them and send a PR? Help would be much appreciated.
cc @aikoven

@Andarist thank you for your reply
Sure, i'll give it a try, but unfortunately i have too few experience in TS typings

Typings enforce you to always yield effects, not regular values or promises or generators. To get the most out of them, annotate return type of every saga with SagaIterator:
import {SagaIterator} from "redux-saga";

function* someSaga(): SagaIterator {
  // ...
}

In your particular case you should replace this:
    yield [
        confirmSaga()
    ];

with this:
    yield [
        call(confirmSaga)
    ];

Awesome, thanks!)


Numbers in template_data get replaced by strings

Checklist:

[x] I updated to the latest version available
[x] I cleared the cache of my browser

Release with the issue:
1.3.5
Last working release (if known):
Browser and Operating System:
Android (EMUI 12.0.0) - not tested on other device

Description of problem:

I created a template using three placeholders. When using the card all three options show. After filling in values I get an erroroneous card, because the given number is converted to a string (inserted inside single quotes). This is not happening for the other two values.
Javascript errors shown in the web inspector (if applicable):
value.series[0].max is not a number

Additional information:
Compare template data with replacements.
template: radial-bar
template_data:
  entity: sensor.localhost_cpu_used
  color: green
  max: 100
type: custom:stack-in-card
cards:
  - type: custom:apexcharts-card
    chart_type: radialBar
    series:
      - entity: sensor.localhost_cpu_used
        color: green
        max: '100'
        show:
          legend_value: false
    apex_config:
      plotOptions:
        radialBar:
          offsetY: 0
          startAngle: -108
          endAngle: 108
          hollow:
            size: 70%
          dataLabels:
            name:
              show: false
            value:
              show: false
          track:
            strokeWidth: 80%
            margin: 0
      legend:
        show: false
      chart:
        height: 240
    card_mod:
      style: |
        ha-card {
          border: none;
        }
  - type: custom:mushroom-entity-card
    entity: sensor.localhost_cpu_used
    primary_info: name
    secondary_info: state
    name: CPU usage
    icon_color: green
    layout: vertical
    card_mod:
      style: |
        ha-card {
          margin-top: -90px;
          width: 140px;
          margin-left: auto;
          margin-right: auto;
          border: none;
        }

I'll take a look at this soon!

Okay so I have a new version I'm releasing, v1.4.0.
This will allow default values by changing two things.
First, template_data is now called ll_data. Until v2, I will automatically transition users from template_data to ll_data, so they are interchangeable. This is to make sure I don't overshadow a key some other card may want to use.
Second, a new key of ll_keys can be added. It's type is an array of strings. Each string will be matched against a key in the ll_data object, and if a match is found, the value of that key in ll_data will be put/swapped into the template card with the given key.
If a key is given, and the ll_data has a number type value matched to that key, then the template will now have a number type value
YAML Examples
Template card with default value
type: markdown
count: 6

Card using template and overwriting default value
template: 'template'
ll_data:
    count: 4
ll_keys:
    - count

Should result in the final card
type: markdown
template: 'template'
ll_data:
    count: 4
ll_keys:
    - count
count: 4


Allow to manually merge accounts

[ ] Manually merge accounts
[ ] Manually delete single operations
[ ] Force syncing amount (aka #141 / #190)

Instead of deleting single operations, they could just be "ignored" (duplicates could also be "ignored", as well as operations being split into smaller ones)


test/ci: fix sonarqube run on main

Minor oversight from previous commit. Do not try to fetch PR when running on main branch.

This should hopefully work now on main as well.


Slow in opening with non-fixed height RecyclerView

When opening a Step which inflates a RecyclerView, the opening process is extremely slow. The length of the Form extends slowly and the color turns from white to colorful really slow. In the end, it will be loaded and the height is normal (I remember, because I only fully waited for once).
During testing, I discovered that if the RecyclerView has a fixed height (e.g. 400dp), this problem does not appear at all. As long as the RecyclerView has android:height=match_parent or wrap_content, the problem appears.
I read #64, but it only mentions using match_parent but not wrap_content, and it does not mention the slow problem at all.

To work properly, the animations need to know the expected height of a view beforehand, but getting this height can be tricky when the view to animate is a recyclerview. I will try to reproduce the issue and look for a solution when I have time. Thanks for reporting it!

Hi again, and sorry about the delay.
I tried a few things, but none of them seemed to work properly, so I am afraid that the only solution is to set a fixed height. Have you tried setting setHasFixedSize() on your recyclerview to see if that helps?

Given there hasn't been activity in more than a month, I will close the issue.


[Arc] Quickly using Alias to search sometimes misses keystrokes.

Extension
https://www.raycast.com/the-browser-company/arc
Description
When typing an alias followed by space and then quickly type another key, the key is not registered in Raycast. This happens when you’re quick with your typing. For example, open Raycast => type alias (e g a to search Arc History) => hit space => type ``t. t is not registered. See video and the registered keystrokes using KeyCastr. I’ve also tried it with some other alias for searching Slack conversations and the same behavior happens there. I have a hard time reproducing it using the Search Files extension, though, so not all extensions might be affected.
https://github.com/raycast/extensions/assets/28986412/bbcc2934-deb4-446b-abad-f8285288a58b
Steps To Reproduce

Hit hotkey to open Raycast, in my cast Cmd + Space
Type alias a
Hit space
Type another character, in my case t

The t won't register. Do these steps relatively quickly.
Current Behaviour
No response
Expected Behaviour
No response

I'm seeing this issue as well. I have the arc extension mapped to a global hotkey, and fairly regularly miss the first few keystrokes when I invoke it.


it reduces the size of the image

I uploaded a 7MB size of image and it just reduced the size to 1.8 mb even i selected the full area

Hi,
it is because of jpg compression at the end, I will add more compression options to choose from.
Thank you

@HKTareen you can now do png compression.
please update the package, if the platform is web, don't forget to update worker.js.
Thank you


Charts lines cutting from top and bottom

Charts Environment
Charts version/Branch/Commit Number: 4.1.0
Xcode version:  14.0.1
Swift version: 5.0
Platform(s) running Charts: IOS
macOS version running Xcode: 12.6 Monterey

i have a same problem

Were you able to figure this out?


perf: drop deps to save 4372 bytes gzipped

I am still wondering if we want to get rid of is-function, even though it's small its still overhead and a dependency I don't think we need. We is typeof x === 'function'  all over the place in our codebase.

There is a risk with removing is-function, though. Give that we don't know if people are using our XHR helper since it's exposed. If they are doing something where is-function returns true but just a check with typeof doesn't, it'll start failing. I think it's better to reduce the risk here by keeping is-function, considering it's size.


Advanced Mapping: update platform event listener

Critical Changes
Changes

Handle namespacing of channelName and allow property channelName to accept the full channel name or a platform event name

Issues Closed
New Metadata
Deleted Metadata

**lurch: attach W-035056

Tracking W-035056


Gulp support

It would be useful the possibility to call ng commands vía gulp
OS
Any
Versions.
angular-cli: 1.0.0-beta.16
node: 6.7.0:
Repro steps.
I had created a gulp file and invoked bower packages
The log given by the failure.
This is not a failure. Is a feature
Mention any other details that might be useful.
gulp is a defacto standard for automating things, so a gulp plugin could be things easier :-)

I've used Gulp for years, but my personal impression is that people are walking away from it nowadays in favor of things like npm scripts. For that reason I doubt there is going to be a plugin for Gulp. Also, you can use it with something like gulp-exec.

Can't say we're looking to add such a thing. You can still use gulp of course, and just include calls to ng commands there.


Wifi does not connect

I am a newcomer to the field, I flashed the ESP with the code via Arduino. I made the setting under Settings.h but unfortunately the ESP does not connect to the Wifi after flashing. Can you maybe help me and tell me where exactly I have to set what in the Settings.h tab?

You need to change all the x-es to the actual values in your system: SSID, password, MQTT server IP address, userid and password.

You can leave it as it is. The ESP will just get a dynamic IP address, it will not impact how it works.

First of all, thank you very much for your help. That's exactly how I did it and the esp was flashed without any problems but when I then open the serial monitor there is always WIFI Connecting .............. and that repeats itself again and again. If the esp is flashed, the blue LED also lights up permanently, is that correct?

Yes, the blue is on until it connects to the wifi, and from that point it only flashes when reads the inverter. Can you screenshot the current settings.h file (obviously blurring out the passwords) and the full serial log? Maybe that will give me some ideas on what is going on.

I will take a screenshot of settings.h tomorrow and post here. Thanks again for your help.

Hey, I realised that the code is running. I deleted your code from the computer again. Then I re-downloaded your code again in Arduino opened the x-es replaced and flashed. The ESP now connects to the Wifi. Now I just have to see that I can do it with the broker. Do that with a raspberry and the iobroker but in the data point it only says true. Is there another way to even see if the esp receives data? I connected all this to a Growatt TL-X.

And one more question. Does the Wifi Shine X Stick have to be unplugged?

Check the serial debugger. If it is not able to read the inverter, you get some error messages (like No Response or similar). So if you see no error, the modbus is working.
I think the Shine X plugs into a different port, so you can leave it. I don't have that.

How do I get the serial debugger via wifi? Or leave the esp connected to the pc and then via the serial monitor from Arduino?

Yes, use it connected to the computer and user the serial monitor from Arduino IDE.


ComponentErrorHandlerImpl has unsatisfied reference in 4.0.0 with AEM 6.5

Required Information

AEM Version: 6.5.0
ACS AEM Commons Version: 4.0.0

Expected Behavior
ComponentErrorHandlerImpl  should be running and added in the filter chain.
Actual Behavior
ComponentErrorHandlerImpl has unsatified reference to ModeUtil and isn't active.

Links
http://disq.us/p/205zkxn
https://github.com/Adobe-Consulting-Services/acs-aem-commons/commit/59b165575017da39b61a317d89bb303571149bbc#diff-dc70accb13cbcced9d11c4b1914cf54e

I am unable to reproduce this in a vanilla instance of AEM 6.5 with AEM Commons 4.0.0 - the ModeUtil component registers correctly for me, resulting in this dependency being resolved:

@maurerstefan does this consistently break for you?
@bstopp IIRC you made the ModeUtil, which works in a slightly off manner (its has static methods that access OSGI state IIRC?) Thoughts on why this might be happening?

Well, it has static methods that check the state against the request/current system. The only time it accesses the OSGi is at Component configuration time, as those Runmodes can only be set then. It also is immediate so, this should never be unsatisfied (as ModeUtils has no dependencies).

Yes, it consistently break for me.
I've now tried with a vanilla AEM 6.5 instance. After installing ACS Commons 4.0.0, the component is in state no config:

And the Servlet Filter ComponentErrorHandlerImpl is not in registered/used:

After I configure the ComponentErrorHandlerImpl directly via /system/console/configMgr (just leave the default values) and click Save, the component state changes to unsatisfied (reference):

The Component ModeUtil is always in state active.

Confirmed this is a bug in 4.0.0.
@badvision why was this updated to be a @Reference in https://github.com/Adobe-Consulting-Services/acs-aem-commons/pull/1568 ? It looks like it was part of some mass update - was this intentional?
@bstopp ModeUtil is not an OSGi Service, so this wouldn't work/it's not how it's intended to be used right? Am I missing something?

@davidjgonzalez That is correct. This is a component, but not a service. There's no reason to inject it as it is a true utility. No state, no configuration, just helper methods. (And now that i think about it, probably doesn't need the @ProviderType? )
So I can see why it'd fail - there is no service registered.

I believe I did some refactoring around that to clean things up but might have done that by accident.  I'll have a look.

Thank you @badvision for fixing this.
Is there already a schedule for the next release?

A new release is eminent but I have a stack of pull requests of other fixes that need review.  I might just cut a release this week and let those other PR's go to the next release.

Looks like this hasn't been fixed after all.
ModeUtil is still used like a service in ComponentErrorHandlerImpl.java
@Reference
private ModeUtil modeHelper;

but isn't one:
@ProviderType
@Component(immediate = true)
@SuppressWarnings("squid:S1118")
public final class ModeUtil {

Therefore it's still unsatisfied:

@maurerstefan sorry about this - ill fix it.  #1871 doesn't appear to have anything to do with this issue, so I hope it was just a mix up w/ the issue numbers...?
Attaching the build w/ the fix.. and here's OSGi console now (also removed unused ComponentHelper @Reference, since ModeUtil has effectively replaced that).

acs-aem-commons-content-4.1.1-SNAPSHOT-min.zip

Thanks @davidjgonzalez
With the snapshot version the component is active and the servlet filter registered.

Fixed with https://github.com/Adobe-Consulting-Services/acs-aem-commons/commit/e2ab5a6eb6436a4416a7a88a754d4011e8d619c0.


feat(redis): Redis 定点构造功能 close #305

1、Redis 三种架构（tendis cache 、tendis ssd、tendisplus ）定点数据构造
2、Redis 构造记录销毁（redis、proxy 实例下架，元数据删除、构造记录变更）

 Thank you for your submission! We really appreciate it. Like many open source projects, we ask that you sign our Contributor License Agreement before we can accept your contribution.You have signed the CLA already but the status is still pending? Let us recheck it.


Java FFI: add GC pinning support

Adds a missing features to the Java FFI: pinning references to Nit objects from Java. Both services, ..._incr_ref and ..._decr_ref, are "simple" redirections from Java to the nitni service in C through the JNI.

+1


unable to download from pluzz.francetv.fr error 410

youtube-dl --verbose http://pluzz.francetv.fr/videos/grandeurs_nature_,110282002.html
[debug] System config: []
[debug] User config: []
[debug] Command-line args: ['--verbose', 'http://pluzz.francetv.fr/videos/grandeurs_nature_,110282002.html']
[debug] Encodings: locale UTF-8, fs UTF-8, out UTF-8, pref UTF-8
[debug] youtube-dl version 2<IP_ADDRESS>
[debug] Python version 2.7.6 - Linux-3.13.0-24-generic-x86_64-with-LinuxMint-17-qiana
[debug] Proxy map: {}
[pluzz.francetv.fr] grandeurs_nature_,110282002: Downloading webpage
ERROR: Unable to download webpage: HTTP Error 410: Gone (caused by HTTPError()); please report this issue on https://yt-dl.org/bug . Be sure to call youtube-dl with the --verbose flag and include its complete output. Make sure you are using the latest version; type  youtube-dl -U  to update.
File "/usr/local/bin/youtube-dl/youtube_dl/extractor/common.py", line 226, in _request_webpage
return self._downloader.urlopen(url_or_request)
File "/usr/local/bin/youtube-dl/youtube_dl/YoutubeDL.py", line 1266, in urlopen
return self._opener.open(req, timeout=self._socket_timeout)
File "/usr/lib/python2.7/urllib2.py", line 410, in open
response = meth(req, response)
File "/usr/lib/python2.7/urllib2.py", line 523, in http_response
'http', request, response, code, msg, hdrs)
File "/usr/lib/python2.7/urllib2.py", line 448, in error
return self._call_chain(*args)
File "/usr/lib/python2.7/urllib2.py", line 382, in _call_chain
result = func(*args)
File "/usr/lib/python2.7/urllib2.py", line 531, in http_error_default
raise HTTPError(req.get_full_url(), code, msg, hdrs, fp)

Example URL has expired however another pluzz videos works fine.


Documentation errors

Step 10 should warn the user that the Return URL must be entirely in lowercase, or Apple will complain about "invalid redirect url".

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

ID: 0cc94537-730f-5188-f68d-70a07497ecb6
Version Independent ID: 15aba9bb-6b15-c61a-aaff-48f26db84d70
Content: Set up sign-up and sign-in with an Apple ID - Azure AD B2C
Content Source: articles/active-directory-b2c/identity-provider-apple-id.md
Service: active-directory
Sub-service: b2c
GitHub Login: @msmimart
Microsoft Alias: mimart

@timrhaynes
Thanks for your feedback! We will investigate and update as appropriate.

@timrhaynes
Thank you for pointing this out! I've created a PR to update the documentation and it's currently waiting for the author to review and sign off.
I will now close out this issue. Please allow some time for the author to review and the changes to reflect.
Thank you for your time and patience!

Thanks, James! I don't see your commit or PR, but maybe I'm not looking in the right place? History for the identity-provider-appid.md file only shows this:
Maybe I'm looking at the right file?
ThanksTim
On Monday, July 19, 2021, 01:23:32 PM EDT, James Tran-MSFT<EMAIL_ADDRESS>wrote:

@timrhaynes
Thank you for pointing this out! I've created a PR to update the documentation and it's currently waiting for the author to review and sign off.
I will now close out this issue. Please allow some time for the author to review and the changes to reflect.
Thank you for your time and patience!
—
You are receiving this because you were mentioned.
Reply to this email directly, view it on GitHub, or unsubscribe.

@timrhaynes
Thank you for the follow up on this!
I reached out to my team to review my PR and its been merged.  Please allow some time for the changes to reflect and if you don't see the document update, please let me know.

Thank you for your time and patience!


protobuf adjustment of compliance suite

PR for WIP.

Ok, I think I'm done with this enough to turn it over to you. Let me know what you thoughts are.

Hi @msackman I pulled this down and was able to build and run it. One thing I noticed is that requests aren't being formed properly, I expect the JSON payloads for checkVariantsForExpectedReferenceName() in VariantsSearchIT.java, for example, to maintain their type. The client builds SearchVariantsRequest vReq properly, but what is sent over the wire appears to have Numbers coerced to Strings.
The server received
{u'start': u'50', u'variantSetId': u'YnJjYTE6MWtnUGhhc2Uz', u'end': u'100', u'referenceName': u'ref_brca1'}

When it expected:
{u'start': 50, u'variantSetId': u'YnJjYTE6MWtnUGhhc2Uz', u'end': 100, u'referenceName': u'ref_brca1'}

Note the lack of quotes around the start and end values.
I did a quick experiment to see if this was due to google's protobuf JsonFormat by comparing the results of gson.toJson(vReq) with JsonFormat.printer().print(vReq); which underlies the client conversion.
// gson.toJson(vReq)
{"bitField0_":0,"variantSetId_":"YnJjYTE6MWtnUGhhc2Uz","callSetIds_":[],"referenceName_":"ref_brca1","start_":50,"end_":100,"pageSize_":0,"pageToken_":"","memoizedIsInitialized":1,"unknownFields":{"fields":{}},"memoizedSize":-1,"memoizedHashCode":0}

// JsonFormat.printer().print(vReq);
{
  "variantSetId": "YnJjYTE6MWtnUGhhc2Uz",
  "referenceName": "ref_brca1",
  "start": "50",
  "end": "100"
}

Note that com.google.gson has not wrapped the start and end fields with quotes.
Is this a problem with protobuf's JSON serialization?

@calbach, comments?  This looks like a bug in ProtoBuf Java library.
David Steinberg<EMAIL_ADDRESS>writes:

Hi @msackman I pulled this down and was able to build and run it. One thing I
noticed is that requests aren't being formed properly, I expect the JSON
payloads for checkVariantsForExpectedReferenceName() in VariantsSearchIT.java,
for example, to maintain their type. The client builds SearchVariantsRequest
vReq properly, but what is sent over the wire appears to have Numbers coerced
to Strings.
The server received
{u'start': u'50', u'variantSetId': u'YnJjYTE6MWtnUGhhc2Uz', u'end': u'100', u'referenceName': u'ref_brca1'}
When it expected:
{u'start': 50, u'variantSetId': u'YnJjYTE6MWtnUGhhc2Uz', u'end': 100, u'referenceName': u'ref_brca1'}
Note the lack of quotes around the start and end values.
I did a quick experiment to see if this was due to google's protobuf JsonFormat
by comparing the results of gson.toJson(vReq) with JsonFormat.printer().print
(vReq); which underlies the client conversion.
// gson.toJson(vReq)
{"bitField0_":0,"variantSetId_":"YnJjYTE6MWtnUGhhc2Uz","callSetIds_":[],"referenceName_":"ref_brca1","start_":50,"end_":100,"pageSize_":0,"pageToken_":"","memoizedIsInitialized":1,"unknownFields":{"fields":{}},"memoizedSize":-1,"memoizedHashCode":0}
// JsonFormat.printer().print(vReq);
{
"variantSetId": "YnJjYTE6MWtnUGhhc2Uz",
"referenceName": "ref_brca1",
"start": "50",
"end": "100"
}
Note that com.google.gson has not wrapped the start and end fields with quotes.
Is this a problem with protobuf's JSON serialization?
—
Reply to this email directly or view it on GitHub.*

Ah, I failed to point this out as a wire incompatibility in my PR. This behavior is, however, consistent with the specification: https://developers.google.com/protocol-buffers/docs/proto3#json
My understanding is that the primary reasoning for representing an int64 as a string in JSON is that Javascript cannot losslessly represent an integer greater than 252 due to implementation as a 64 bit float. Our options are:

Accept this as a wire incompatibility.
Switch int64s -> int32 where possible. We would have to ensure this is a reasonable maximum value on a case-by-case basis. In many cases, I think it may not be sufficient, e.g. genomic coordinate I could certainly imagine exceeding a value of 2 billion.

Also one more note on int64/uint64: the spec allows for clients to specify either number or string, i.e. the server should always output a string, but the client may send a number or string.

Ouch.  Since JSON is now considered language neutral, that is
really frustrating that protobuf optimizes for one language.
However, there are no known chromosomes over 1G, although
speculation that they exist.
https://www.biostars.org/p/12560/
uint32 is probably very safe.
Although, if the the protobuf JSON parser handles the
conversions, it's a motivation to not parse by hand ;-)
CH Albach<EMAIL_ADDRESS>writes:

Ah, I failed to point this out as a wire incompatibility in my PR. This
behavior is, however, consistent with the specification: https://
developers.google.com/protocol-buffers/docs/proto3#json
My understanding is that the primary reasoning for representing an int64 as a
string in JSON is that Javascript cannot losslessly represent an integer
greater than 2^52 due to implementation as a 64 bit float. Our options are:

Accept this as a wire incompatibility.
Switch int64s -> int32 where possible. We would have to ensure this is a
reasonable maximum value on a case-by-case basis. In many cases, I think it
may not be sufficient, e.g. genomic coordinate I could certainly imagine
exceeding a value of 2 billion.

—
Reply to this email directly or view it on GitHub.*

@diekhans What about this instance?
https://en.wikipedia.org/wiki/Marbled_lungfish
~p

It is slightly annoying, but I'd probably be more frustrated by a spec which dropped bits of information opaquely in a widely used language such as Javascript, especially when a common use case for protobuf-JSON is certainly consumption by Javascript. Also this is not an official statement, just my understanding.
uint32 sounds a bit too close for comfort for me, but I will concede if there is consensus. For now I will update the PR description to say that int64s are strings.

  I haven't seen
what the maximum chromosome size is for the Marbled lungfish,
or any karyotype information.
Paul Grosu<EMAIL_ADDRESS>writes:

@diekhans What about this instance?
https://en.wikipedia.org/wiki/Marbled_lungfish
~p
—
Reply to this email directly or view it on GitHub.*

CH Albach<EMAIL_ADDRESS>writes:

It is slightly annoying, but I'd probably be more frustrated by a spec which
dropped bits of information opaquely in a widely used language such as
Javascript, especially when a common use case for protobuf-JSON is certainly
consumption by Javascript.

Having it wrong in every language is worse.  We simple can't
have numbers as strings.  This makes all the common use cases
with chromosome coordinates more complex.

Also this is not an official statement, just my understanding.

thanks for educating me

uint32 sounds a bit too close for comfort for me, but I will concede if there
is consensus. For now I will update the PR description to say that int64s are
strings.

BAM representation is 32bit.  There are no known chromosomes
that exceed signed 32bit ints.  As much as I love comparative
genomics, we can't go forward with numbers as strings.

So I don't want to wade into this as I know nothing about genomics. However, a few things are interesting here:

When I turned this over, all the tests against the server were passing. That suggests that the python protobuf3/json is lenient in this way too - it must be accepting strings-as-numbers. Either that or something way more broken/weird was going on for me.
My initial reaction when I saw this issue be reported last night was "ahh, that makes sense, this is the JavaScript-can't-do-integer-maths issue". However, actually checking json.org, there is no suggestion numeric representation needs be constrained by any sort of numeric type - in JSON it appears you are free to directly encode numbers to any size and any precision.
So the issue is simply "what happens on the interpreting side?", and how to make that lossless, and can it be made lossless? If you don't need to do maths with these numbers at all in the browser, I'm wondering whether you can manually parse the JSON in javascript directly - it's just a string anyway, and thus keep numbers as strings there. Thus JavaScript is the only special case, which makes most sense as it's JavaScript that can't do integer maths. If you actually need to do maths on these numbers in the browser then you're sunk anyway - it's going to be hard to have confidence any of that maths will be right.
Actually just using the direct protobuf binary encoding may well be much much easier in the long run...

The really interesting point here, if I understand right, is given that the compliance suite itself is written using protobuf libraries, it effectively can't test all the allowable forms of JSON that a server should accept.
To wit: According to https://developers.google.com/protocol-buffers/docs/proto3#json, an int64 field (such as our start and end fields) should accept either number or string encoded inputs. However, the JSON generated by the compliance suite can only produce string values for this type, as it's internally using the protobuf->JSON libraries.
So, either we re-implement (again!) the compliance suite generating JSON directly - not relying on the protobuf libs - or we accept that there will be server requests acceptable per the schemas + protobuf specifications that just aren't being tested.

One could always have a small set of tests for a few cases of
different int64 encodings.  Doubtful that it is worth the cost
of testing every int64 case.
This could be done with a different encoder, maybe just post
process the JSON.
We will also have to test the binary protobuf encoding, so going
back to printing JSON isn't going to help with that.
Maciek Smuga-Otto<EMAIL_ADDRESS>writes:

The really interesting point here, if I understand right, is given that the
compliance suite itself is written using protobuf libraries, it effectively
can't test all the allowable forms of JSON that a server should accept.
To wit: According to https://developers.google.com/protocol-buffers/docs/proto3
#json, an int64 field (such as our start and end fields) should accept either
number or string encoded inputs. However, the JSON generated by the compliance
suite can only produce string values for this type, as it's internally using
the protobuf->JSON libraries.
So, either we re-implement (again!) the compliance suite generating JSON
directly - not relying on the protobuf libs - or we accept that there will be
server requests acceptable per the schemas + protobuf specifications that just
aren't being tested.
—
You are receiving this because you were mentioned.
Reply to this email directly or view it on GitHub*

In the schemas it states that Avro JSON serialization libraries are used. We don't need to test all the edge cases if we state the same here. https://github.com/ga4gh/schemas/blob/master/doc/source/appendix/json_intro.rst
I would like to suggest that we simply require that Google's serialization is used.

Agree with @david4096 - my point was mostly of theoretical interest. @diekhans good point as well, although the current schemas explicitly specify JSON as the wire format, so compliance can't move over to binary until the schemas do.

We've just updated this PR with the latest changes from master.

I feel like I'm tripping over an old issue here, but I can't get several compliance tests to pass.
The error pattern is always as follows:
com.google.protobuf.InvalidProtocolBufferException: Expect message object but got: ["<some content here>"]
For example for tests like searchReadsWithOneReadGroupIdSucceeds, I get the error: com.google.protobuf.InvalidProtocolBufferException: Expect message object but got: ["60"]
FWIW, the alignments JSON object that I receive as a response from the server for the above test looks as follows:
{"alignments":[{"failedVendorQualityChecks":false,"improperPlacement":false,"fragmentLength":186,"alignedQuality":[15,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,37,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,37,37,37,37,37,37,33,37,37,37,33,33],"numberReads":2,"duplicateFragment":false,"secondaryAlignment":false,"readNumber":1,"readGroupId":"WyJicmNhMSIsInJncyIsIkhHMDAwOTYiLCJTUlIwNjI2MzQiXQ","fragmentName":"HG00096.mapped.ILLUMINA.bwa.GBR.low_coverage.20120522.bam.cram:117428991","alignedSequence":"CAGTCCTGGATAATGGGTTTATGAAAAACACTTTTTCTTCCTTCAGCAAGCAAAATTATTTATGAAGCTGTATGGTTTCAGCAACAGGGAGCAAAGGAAA","id":"WyJicmNhMSIsInJncyIsIkhHMDAwOTYiLCJIRzAwMDk2Lm1hcHBlZC5JTExVTUlOQS5id2EuR0JSLmxvd19jb3ZlcmFnZS4yMDEyMDUyMi5iYW0uY3JhbToxMTc0Mjg5OTEiXQ","alignment":{"mappingQuality":60,"cigar":[{"operationLength":"100","operation":"ALIGNMENT_MATCH","referenceSequence":""}],"position":{"strand":"POS_STRAND","position":"136","referenceName":"ref_brca1"}},"info":{"MQ":["60"],"RG":["SRR062634"],"MD":["100"],"X0":["1"],"X1":["0"],"SM":["37"],"AM":["37"],"XT":["U"],"NM":["0"]},"supplementaryAlignment":false,"nextMatePosition":{"strand":"NEG_STRAND","position":"222","referenceName":"ref_brca1"}}],"nextPageToken":""}

So either my server (that I believe is running the latest protobuf branch) is emitting stale JSON or the compliance suite is somehow being overly picky.
Any help with this would be greatly appreciated.

+1 modulo updating the protobuf version. I'll merge this as soon as it's updated.

I updated the protobuf version. I am a bit unclear about these failures, I saw them when running the tests on intellij, but they pass on the command line (with mvn clean install, and running the ./ctk script). One thing to keep in mind is that the server got a new protobuf version recently so might need to reinstall the dependencies and regenerate the compliance data.

+1 re-tested, works.

+1.


PDF's no longer accepted

I've been using this heavily to generate preview images of PDF documents, which worked great until recently.
Earlier, this worked perfectly:
`https://wsrv.nl/?url=${URL_TO_PDF_DOCUMENT}&output=jpg`;

But now is giving:
{"status":"error","code":404,"message":"Invalid or unsupported image format. Is it a valid image?"}

I couldn't find any reason why this no longer works. Any thoughts?

This seems to be caused by a configuration error after the update to libvips 8.15.0-rc1 (see https://github.com/weserv/rpms/commit/c9c2a9422096c213ceafe23c962d4f1e6aec13dd), which prevented the dynamic modules required for this format from being loaded. It should be fixed now.
I've modified our integration tests to prevent this from happening again, thanks for reporting this!

Awesome! Thank you for the quick fix!


Fix toggle comment not moving caret

Fixes #73367
Fix regression if caret is at the beginning of the line and comment is toggled. Now selection/caret is kept at the beginning only if whole line is selected.

Thanks!


Add Base Images

Allow uploading a Base Image to a Base Image Collection and doing all CRUD operations on it

Pull Request Test Coverage Report for Build d120193868816deb152bb704c8069f9ce31569b8-PR-240

0 of 0   changed or added relevant lines in 0 files are covered.
4 unchanged lines in 2 files lost coverage.
Overall coverage decreased (-0.2%) to 80.261%

Files with Coverage Reduction
New Missed Lines
%

lib/edgehog/base_images.ex
1
96.97%

test/support/fixtures/base_images_fixtures.ex
3
66.67%

Totals

Change from base Build a6acb7238dba45d815c0c0d5ca4cb06dd9f1efcc:
-0.2%

Covered Lines:
923

Relevant Lines:
1150

💛  - Coveralls


Firefox crashing when opening, inconsistent behavior

as far as I understood, by default everything is deactivated?
So what I did is rename css files where I didnt want any change, so they cant be imported.
And for things I want, I remove the "#"
Now I set the use of the CSS in the about:config and Firefox crashes on startup
Edit: ok so the CSS deactivates elements instead of showing them? I am confused, Example:
blank-context.css

context-nagivation (and all other elements) are disabled with "#" and are shown!

context-savepage is enabled without a bookmark and shown

opt_noSendToDevice.css

doesnt seem to change anything, I get this "email image" if I activate or deactiate entries....

Please read the instructions carefully.

Renaming .css files doesn't make sense as the system will search for them and not find them. It's a performance decrease. But you won't recognize the difference anyway, as it will be a few microseconds. If you want to optimize that nontheless, you may remove the corresponding @import line from the userChrome.css.
Do not remove any #.

Remove menu item: Remove /* at the beginning of the line.
Leave menu item: Add /* to the beginning of the line (by default every option is deactivated).

Thank you, new to CSS, used to Python e.g. where the "#" determines active / inactive.
Thanks for this great script! Maybe leave this issue open for other people

No problem, you're welcome.
Other people can also find and comment it when it's closed. No further action needed here.


hover effects

made changes to index.css and MainContainer.css for hover effects

@Ishmeetkaur36 Kindly add the issue number .
Like this
Fixes #Issue_number

Fixes #75


Errors loading schemas

I noticed this error and I wanted to see if you know where it might be coming from.
A bit of background: I have a web api that I hit and returns data, variables and classifications (codes) in a json format. So, my connector expects to load multiple tables. I have implemented a web connector which works correctly on the simulator. When run on tableau desktop (version 10.0.1, trial), I get the following errors:
Either invalid data are present or required fields are empty for class TableInfo. Required fields and respective data types are: { (Name : 'id', Type : QString, IsRequired : true), (Name : 'columns', Type : QVariantList, IsRequired : true), (Name : 'alias', Type : QString, IsRequired : false), (Name : 'description', Type : QString, IsRequired : false), (Name : 'incrementColumnId', Type : QString, IsRequired : false) }.
The error is thrown as "Reporting data source exception. Type='WDCInvalidData' message='...'
This seems to happen only when I am loading more than 2 tables. If I have just one table or 2 I don't get any error and everything works fine. The error I am getting isn't really that descriptive/ helpful. For what I can gather, this error is thrown by Tableau desktop when it's putting the table schemas in place.
Given the fact that my connector works just fine for any number of tables on the simulator and works correctly on Tableau desktop for two tables max, I wonder if this might be a tableau limitation for trial versions.

Hey @gilbert-n, do you notice that it works for any combination of two tables?  I.e. can you load tables A+B, and also B+C, but not A+B+C?
There wouldn't be any limitation because the version is a trial version.
Apologies for the unhelpful error message.  Usually what this means is there is some sort of data type incompatibility or illegal name in the schema.  Can you share your getSchema method?

Hi @lbrendanl,
yes, I tried those cases: A+B, B+C works, but A+B+C+... does not work.
I am including my getSchema method. I will also include a sample json result I get from my API and also the schema json I wrap into the schemaCallback.
Method:
myConnector.getSchema = function (schemaCallback) {
//this block prapares the url's referencing the API that will return the variables/ classifications etc
// ***********************************************************************************
var fullQuery = $("#full_query").val();
var map = parseInputQuery(fullQuery);
var studyUrl = map["studyUrl"];
var varUrl = map["varUrl"];
tableau.log("Getting schema from " + varUrl);
//don't worry about this block. Assume that we have 2 valid urls: studyUrl and varUrl
//***********************************************************************************
	var cols = [];  //main variable table columns
	var classes = [];  //this is an array of arrays of tableInfo containing classifications

	$.get(varUrl, function(result){
		if(result == null){
			tableau.log("No results were found.");
			tableau.abortWithError("No results were found.");
		}

		tableau.log("API result: " + JSON.stringify(result));

		var variables = result.variables;
		var classif = result.classifications;
		var metadata = result.metadata;

		if(variables == null){
			tableau.log("No variables were found. Trying to look under metadata");

			if(metadata == null){
				tableau.log("No metadata available from the result.");
				tableau.abortWithError("No metadata available from the result");
			}

			variables = metadata.variables;
			if(variables == null){
    			tableau.log("No variables were found under metadata. Throwing exception and return");
    			tableau.abortWithError("No variables were found.");
    		}

			classif = metadata.classifications;
			if(classif == null){
				tableau.log("No classifications were found under metadata.");
			}
		}

		//tableau.log(variables);
		var resources = variables.resources;
		if(resources == null){
			tableau.log("No resources were found.");
			tableau.abortWithError("No resources were found.");
		}
		//tableau.log(resources);

		for(var idx = 0; idx < resources.length; idx++){
			var variableObj = resources[idx];
			var _id 			= variableObj.id;
			var _alias 		= variableObj.name;
			var _dataType 	= getDataType(variableObj.storageType);
			var _description = variableObj.label;
			cols.push({id:_id, alias: _alias, dataType: _dataType, description:_description});
			tableau.log(cols[idx].id);
		}

		//Get all classifications
		if(classif != null){
			resources = classif.resources;
			if(resources == null) tableau.log("there is no resources property under classification");
			else{
				var col1 = {id:"value", alias:"Value", dataType:tableau.dataTypeEnum.int, description:"value"};
				var col2 = {id:"label", alias:"Label", dataType:tableau.dataTypeEnum.string, description:"Label"};
				var classCols = [];
				classCols.push(col1); classCols.push(col2);
				for(var idx = 0; idx < resources.length; idx++){
	    			var classObj = resources[idx];
	    			var _id = classObj.id;
	    			var codes = classObj.codes != null? classObj.codes : "";
					var codesVal = JSON.stringify(codes);
					var classInfo = {id:_id, alias:"class_" + _id, columns:classCols, description:codesVal};
	    			classes.push(classInfo);
	    			tableau.log("Classification: " + JSON.stringify(classInfo));
	    		}
			}
		}

		var tableInfo = {id:studyUrl, alias:"study", columns:cols};

		$.get(studyUrl, function(result){
			if(result == null){
				tableau.log("Couldn't get the studyInfo. Now using generic info");

				var tables = [tableInfo];
				for(var idx = 0; idx < classes.length; idx++){
					tables.push(classes[idx]);
					//if(idx >= 0) break; //when we have more than two tables it's not working
				}

				tableau.log("Resulting schema: " + JSON.stringify(tables));
				schemaCallback(tables);
				return;
			}

			var _id = result.id;
			var _alias = result.name;
			if(_id != null) tableInfo.id = _id;
			if(_alias != null) tableInfo.alias = _alias;

			var tables = [tableInfo];
			for(var idx = 0; idx < classes.length; idx++){
				tables.push(classes[idx]);
				//if(idx >= 0) break; //when we have more than two tables it's not working
			}

			tableau.log("Resulting schema: " + JSON.stringify(tables));
			schemaCallback(tables);

		});

	});

};

You can see the sample result from my API at http://jsonformatter.org/852ba9
You can see the sample schema array at http://jsonformatter.org/c6e6b2
Click on the "Format/ Beautify" button to format those objects.
Thanks.

@sdesmond46 any ideas here?   I can't think of anything that would cause getSchema to fail when it has many tables but work for each of those tables independently.

I do have one idea. Sometimes when trying to martial data from the javascript layer over to the C++ layer, we have issues if the same object is referenced more than once in the payload going from javascript to native (this is a component we unfortunately cannot modify).
Could you modify your code which is adding more tables to the tables array (tables.push(classes[idx]);) to serialize and deserialize the table before adding them to the array? This will create all new object for us to send back to the native code. The js code would look like this:
       for(var idx = 0; idx < classes.length; idx++){
            var tableCopy = JSON.parse(JSON.stringify(classes[idx]));
            tables.push(tableCopy);
            // if(idx >= 0) break; //when we have more than two tables it's not working
        }

+1 I had a similar issue in my first WDC and that work-around fixed it

Tried. It works. Thank you


Music Assistant support

I've been trying to get my Theatre playing though Music Assistant, but it doesn't work. It seems like it won't play the stream and instead just continues playing whatever was playing previously as set by another app. I.e. play/pause works, but setting the content stream does not.
I've followed the troubleshooting advice of Music Assistant but alas it didn't help.
Theoretically it should work, according to the developers. Just wondering if anyone's tried this successfully combination successfully and what you had to do to get streams working.
Thanks a lot for this integration. I use it all the time, every day. It's been a game changer.

There was an oversight in the play_media method which has been fixed in version 0.6.3. I could get a Beosound Balance to play Youtube Music so hopefully it will work for your setup.
Glad you're enjoying the integration and thanks for the bug report.

Can confirm this now works flawlessly (as far as I can tell from the first 15 minutes). Thanks a lot!


python37Packages.braintree: 3.55.0 -> 3.56.0

Semi-automatic update generated by https://github.com/ryantm/nixpkgs-update tools. This update was made based on information from https://repology.org/metapackage/python3.7-braintree/versions.
meta.description for python37Packages.braintree is: '"Python library for integration with Braintree"'.
meta.homepage for python37Packages.braintree is: '"https://github.com/braintree/braintree_python"

Checks done (click to expand)

built on NixOS

Warning: a test defined in passthru.tests did not pass

0 of 0 passed binary check by having a zero exit code.

0 of 0 passed binary check by having the new version present in output.

found 3.56.0 with grep in /nix/store/fxhv5ida7jhks4b6q6h0kgyi0vvrp6m4-python3.7-braintree-3.56.0

directory tree listing: https://gist.github.com/38f1fe72e928b88a371c8f5bab81ae2a

du listing: https://gist.github.com/0327db0cda0bc5204f7b1af67a8cf8c1

Rebuild report (if merged into master) (click to expand)

8 total rebuild path(s)
2 package rebuild(s)
2 x86_64-linux rebuild(s)
2 i686-linux rebuild(s)
2 x86_64-darwin rebuild(s)
2 aarch64-linux rebuild(s)
First fifty rebuilds by attrpath
python27Packages.braintree
python37Packages.braintree

Instructions to test this update (click to expand)

Either download from Cachix:
nix-store -r /nix/store/fxhv5ida7jhks4b6q6h0kgyi0vvrp6m4-python3.7-braintree-3.56.0 \
  --option binary-caches 'https://cache.nixos.org/ https://r-ryantm.cachix.org/' \
  --option trusted-public-keys '
  r-ryantm.cachix.org-1:gkUbLkouDAyvBdpBX0JOdIiD2/DP1ldF3Z3Y6Gqcc4c=
  cache.nixos.org-1:6NCHdD59X431o0gWypbMrAURkbJ16ZPMQFGspcDShjY=
  '

(r-ryantm's Cachix cache is only trusted for this store-path realization.)
Or, build yourself:
nix-build -A python37Packages.braintree https://github.com/r-ryantm/nixpkgs/archive/c2adb5d9aa64e464e8d9bc628514d3b01a42ea0d.tar.gz

After you've downloaded or built it, look at the files and if there are any, run the binaries:
ls -la /nix/store/fxhv5ida7jhks4b6q6h0kgyi0vvrp6m4-python3.7-braintree-3.56.0
ls -la /nix/store/fxhv5ida7jhks4b6q6h0kgyi0vvrp6m4-python3.7-braintree-3.56.0/bin

cc @ivegotasthma for testing.

LGTM :+1:


Create flag-less script tests for BCH

This might be a good item to start working on when we build support for the BCH_2019_11 VM. It's also a good thing to do while working on full, per-opcode documentation of the VM.
Basically, for each VM version, there will be two sets of test vectors, one for the block-level validation ("consensus" or "miner"), and one for pre-network rebroadcasting validation ("isStandard" or "strict" in this library). For implementations which use flags, they'll run each list of test vectors using the same set of flags for the full list. As much functionality as possible should be tested using only opcodes, and maybe we'll support other state input for a few cases (e.g. locktime and sequenceNumber). As we get the full VM tested by the new vectors, we can remove the current script_tests.json tests and the hack using script_tests_addendum.json.
Bitcoin ABC will likely continue supporting the existing script_tests.json format, but might also be interested in testing against these new vectors. (CC: @markblundeberg)

Yeah that makes sense on how to do it.
For handling upgrade-dependent tests I'm not sure exactly what to do.
Perhaps this:

list 0: legacy/experimental tests to run on specific flag sets (chosen per-test, as in script_tests.json)
list 1 (long): tests that must pass on all consensus flag sets (pre- and post-upgrade)
list 2 (short): tests to run on pre-upgrade consensus flags only
list 3 (short): tests to run on post-upgrade consensus flags only
list 4,5,6: standardness versions of 1,2,3

As much as possible, tests should be in list 1 since that is the most critical to get right.
When making an upgrade, this could be the process in steps:

Develop unactivated experimental feature on a new script flag, with tests in list 0.
Add activation code for new feature. This means:

Move the new feature tests from list 0 to list 3.
Move some affected tests out from list 1 to list 2.

After the upgrade has passed, perform cleanup:

Move the new feature's tests from list 3 to list 1.
Delete tests from list 2 or move them to list 0 for legacy testing.

Relevant comment from @joshmg in Bitcoin ABC Telegram group:
Would it at all be possible to add unique-identifiers to each test case?  Perhaps just a UUID or something simple.  The problem I'm trying to solve is that I have to meticulously disable particular tests within the vectors for various reasons (usually just non-applicability due to codebase differences)--currently I have to do this by line-number, however inserting a test anywhere but the end of the file obviously makes things a mess.  Perhaps the UUID could just get added as the last "word" to the comments column to keep things innocuous for you guys.  If you guys would be okay with this change then I'll be happy to volunteer to make a PR.

(@joshmg – FYI, you're not alone 😄)

@bitjson @joshmg we might not take care of keeping UUIDs sane though ... is it possible that instead you guys can track by test content instead?
Or even, make your own UUID by hashing the test content :)


Partner users

Due to git difficulties, this replaces: #2505

Resolves #2471
Description
See issue #2471
Guide questions:

What alternative solutions did you consider?

We considered to putting this new feature in the contact info box, but separated it instead.

Dependencies:

Installed gem orderly to ensure that order of invited at and last login was correct.

Type of change

New feature (non-breaking change which adds functionality)

How Has This Been Tested?
Added test (see: spec/system/partner_system_spec.rb).
Screenshots

Before screenshot does not show partner users:

After screenshot does show partner users:

Awesome! Thanks!!

@all-contributors add @markcyen for coding


Server Proxy

Independent server for proxying HTTP & gRPC connections to different gRPC services.


[FEA] Support "online" apply with dask

 Issue by benfred
Tuesday May 26, 2020 at 23:59 GMT
Originally opened as https://github.com/rapidsai/recsys/issues/175

We should support the 'online' apply with the dask multigpu version, so that we can apply statistics computed by dask to the dataloaders.
With the current version, this might have an issue with using the stats computed by the dask Encoder in the Categorify op.

Done with https://github.com/NVIDIA/NVTabular/pull/120


Add more monster info to Monster Finder

👹

Pull content from the Dungeon World GitHub project? Pull monsters from the codex.

Completed as of version 2.0, Bashful Bakunawa.


Make Scholarships behave like Elections

What is meant by this is that Scholarships should have a defined open and close period so that applicants will have time to prepare and submit applications as well as be unable to apply once the date is past.

Completed in d7f3e4e930e2aa950a94ba745c9b5548eebd007b


0.6.1 sam build fails with "Your authorization token has expired. Reauthenticate and try again."

When adding
COPY --from=public.ecr.aws/awsguru/aws-lambda-adapter:0.6.1 /lambda-adapter /opt/extensions/lambda-adapter

sam build fails with
Build Failed
Error: VaporHelloWorld failed to build: invalid from flag value public.ecr.aws/awsguru/aws-lambda-adapter:0.6.1: pull access denied for public.ecr.aws/awsguru/aws-lambda-adapter, repository does not exist or may require 'docker login': denied: Your authorization token has expired. Reauthenticate and try again.

Reverting to
COPY --from=public.ecr.aws/awsguru/aws-lambda-adapter:0.6.0 /lambda-adapter /opt/extensions/lambda-adapter

and I have the build working again.
The command below does not change this behaviour.
aws ecr get-login-password --region eu-central-1 | docker login --username AWS \
--password-stdin<PHONE_NUMBER>93.dkr.ecr.eu-central-1.amazonaws.com

What am I doing wrong ?

Correct login sequence is
aws ecr-public get-login-password --region us-east-1 | docker login --username AWS --password-stdin public.ecr.aws


HIVE-25293: Alter partitioned table with "cascade" option create too many columns records.

What changes were proposed in this pull request?
if partitions was updated with a set of same columns, only create one set of columns and these partitions can share one 'CD_ID'.

Why are the changes needed?

Does this PR introduce any user-facing change?

How was this patch tested?

@kgyrtkirk Could you please review the PR?


Sometimes fail to reconnect after reboot

About 1 time out of 5, when I reboot the ESP32, it fails to automatically reconnect to my (android) phone.  Here are "good" and "bad" log outputs:
Good:
rst:0x10 (RTCWDT_RTC_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
configsip: 0, SPIWP:0xee
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:1
load:0x3fff0030,len:1284
load:0x40078000,len:12836
load:0x40080400,len:3032
entry 0x400805e4
[   262][I][BluetoothA2DPCommon.cpp:207] log_free_heap(): Available Heap: 222708
[   265][I][BluetoothA2DPSink.cpp:139] start(): Device name will be set to 'TenonTech CDX1'
[   274][I][BluetoothA2DPSink.cpp:187] init_i2s(): init_i2s
[   278][I][BluetoothA2DPSink.cpp:189] init_i2s(): init_i2s is_i2s_output
[   377][I][BluetoothA2DPSink.cpp:266] init_bluetooth(): controller initialized
[   682][I][BluetoothA2DPSink.cpp:275] init_bluetooth(): bluedroid initialized
[   757][I][BluetoothA2DPSink.cpp:284] init_bluetooth(): bluedroid enabled
[   758][I][BluetoothA2DPSink.cpp:363] app_task_handler(): app_task_handler, APP_SIG_WORK_DISPATCH sig: 1
[   763][I][BluetoothA2DPCommon.cpp:241] set_scan_mode_connectable(): set_scan_mode_connectable true
[   771][I][BluetoothA2DPSink.cpp:363] app_task_handler(): app_task_handler, APP_SIG_WORK_DISPATCH sig: 1
[   773][I][BluetoothA2DPSink.cpp:487] app_gap_callback(): event: 10
[   780][I][BluetoothA2DPSink.cpp:564] av_hdl_a2d_evt(): A2DP PROF STATE: Init Compl
[   781][I][BluetoothA2DPCommon.cpp:207] log_free_heap(): Available Heap: 119672
[   794][I][BluetoothA2DPSink.cpp:487] app_gap_callback(): event: 10
[   807][I][BluetoothA2DPSink.cpp:487] app_gap_callback(): event: 10
[   818][I][BluetoothA2DPSink.cpp:487] app_gap_callback(): event: 10
[   827][I][BluetoothA2DPSink.cpp:363] app_task_handler(): app_task_handler, APP_SIG_WORK_DISPATCH sig: 1
[   832][I][BluetoothA2DPSink.cpp:650] handle_connection_state(): partner address: f8:1a:2b:e9:cc:8e
[   840][I][BluetoothA2DPSink.cpp:658] handle_connection_state(): A2DP connection state: Connecting, [f8:1a:2b:e9:cc:8e]
[   850][I][BluetoothA2DPSink.cpp:747] handle_connection_state(): ESP_A2D_CONNECTION_STATE_CONNECTING
[   870][W][Wire.cpp:204] begin(): Bus already started in Master Mode.
[  1467][I][BluetoothA2DPSink.cpp:363] app_task_handler(): app_task_handler, APP_SIG_WORK_DISPATCH sig: 1
[  1468][I][BluetoothA2DPSink.cpp:582] handle_audio_cfg(): a2dp audio_cfg_cb , codec type 0
[  1474][I][BluetoothA2DPSink.cpp:594] handle_audio_cfg(): a2dp audio_cfg_cb , sample_rate 44100
[  1482][I][BluetoothA2DPSink.cpp:605] handle_audio_cfg(): configure audio player 21-15-2-35
[  1491][I][BluetoothA2DPSink.cpp:611] handle_audio_cfg(): audio player configured, samplerate=44100
[  1500][I][BluetoothA2DPSink.cpp:363] app_task_handler(): app_task_handler, APP_SIG_WORK_DISPATCH sig: 1
[  1509][I][BluetoothA2DPSink.cpp:650] handle_connection_state(): partner address: f8:1a:2b:e9:cc:8e
[  1518][I][BluetoothA2DPSink.cpp:658] handle_connection_state(): A2DP connection state: Connected, [f8:1a:2b:e9:cc:8e]
[  1528][I][BluetoothA2DPSink.cpp:699] handle_connection_state(): ESP_A2D_CONNECTION_STATE_CONNECTED
[  1537][I][BluetoothA2DPCommon.cpp:241] set_scan_mode_connectable(): set_scan_mode_connectable false
[  1546][I][BluetoothA2DPSink.cpp:1229] bt_i2s_task_start_up(): BtI2STask Started
[  1553][I][BluetoothA2DPSink.cpp:724] handle_connection_state(): i2s_start
[  1560][I][BluetoothA2DPSink.cpp:363] app_task_handler(): app_task_handler, APP_SIG_WORK_DISPATCH sig: 1
[  1569][I][BluetoothA2DPSink.cpp:789] av_hdl_avrc_evt(): AVRC conn_state evt: state 1, [f8:1a:2b:e9:cc:8e]
[  1577][I][BluetoothA2DPSink.cpp:477] app_gap_callback(): ESP_BT_GAP_READ_REMOTE_NAME_EVT stat:0
[  1579][I][BluetoothA2DPSink.cpp:363] app_task_handler(): app_task_handler, APP_SIG_WORK_DISPATCH sig: 1
[  1597][I][BluetoothA2DPSink.cpp:1323] av_hdl_avrc_tg_evt(): AVRC conn_state evt: state 1, [f8:1a:2b:e9:cc:8e]
[  1606][I][BluetoothA2DPSink.cpp:363] app_task_handler(): app_task_handler, APP_SIG_WORK_DISPATCH sig: 1
[  1616][I][BluetoothA2DPSink.cpp:828] av_hdl_avrc_evt(): AVRC remote features 25b
[  1626][I][BluetoothA2DPSink.cpp:479] app_gap_callback(): ESP_BT_GAP_READ_REMOTE_NAME_EVT remote name:Clarks Phone
[  1642][I][BluetoothA2DPSink.cpp:363] app_task_handler(): app_task_handler, APP_SIG_WORK_DISPATCH sig: 1
[  1643][I][BluetoothA2DPSink.cpp:1339] av_hdl_avrc_tg_evt(): AVRC register event notification: 13, param: 0x0
[  1652][I][BluetoothA2DPSink.cpp:1341] av_hdl_avrc_tg_evt(): AVRC Volume Changes Supported
[  1660][I][BluetoothA2DPSink.cpp:363] app_task_handler(): app_task_handler, APP_SIG_WORK_DISPATCH sig: 1
[  1670][I][BluetoothA2DPSink.cpp:836] av_hdl_avrc_evt(): remote rn_cap: count 7, bitmask 0x1e26
[  1678][I][BluetoothA2DPSink.cpp:363] app_task_handler(): app_task_handler, APP_SIG_WORK_DISPATCH sig: 1
[  1687][I][BluetoothA2DPSink.cpp:813] av_hdl_avrc_evt(): AVRC metadata rsp: attribute id 0x1, King
[  1696][I][BluetoothA2DPSink.cpp:363] app_task_handler(): app_task_handler, APP_SIG_WORK_DISPATCH sig: 1
[  1705][I][BluetoothA2DPSink.cpp:813] av_hdl_avrc_evt(): AVRC metadata rsp: attribute id 0x2, TesseracT
[  1715][I][BluetoothA2DPSink.cpp:363] app_task_handler(): app_task_handler, APP_SIG_WORK_DISPATCH sig: 1
[  1724][I][BluetoothA2DPSink.cpp:813] av_hdl_avrc_evt(): AVRC metadata rsp: attribute id 0x4, Sonder
[  1733][I][BluetoothA2DPSink.cpp:363] app_task_handler(): app_task_handler, APP_SIG_WORK_DISPATCH sig: 1
[  1742][I][BluetoothA2DPSink.cpp:813] av_hdl_avrc_evt(): AVRC metadata rsp: attribute id 0x8, 1
[  1751][I][BluetoothA2DPSink.cpp:363] app_task_handler(): app_task_handler, APP_SIG_WORK_DISPATCH sig: 1
[  1760][I][BluetoothA2DPSink.cpp:813] av_hdl_avrc_evt(): AVRC metadata rsp: attribute id 0x10, 1
[  1769][I][BluetoothA2DPSink.cpp:363] app_task_handler(): app_task_handler, APP_SIG_WORK_DISPATCH sig: 1
[  1778][I][BluetoothA2DPSink.cpp:1333] av_hdl_avrc_tg_evt(): AVRC set absolute volume: 75%
[  1786][I][BluetoothA2DPSink.cpp:1273] volume_set_by_controller(): Volume is set by remote controller to 75
[  1796][I][BluetoothA2DPSink.cpp:363] app_task_handler(): app_task_handler, APP_SIG_WORK_DISPATCH sig: 1
[  1805][I][BluetoothA2DPSink.cpp:813] av_hdl_avrc_evt(): AVRC metadata rsp: attribute id 0x1, King
[  1814][I][BluetoothA2DPSink.cpp:363] app_task_handler(): app_task_handler, APP_SIG_WORK_DISPATCH sig: 1
[  1823][I][BluetoothA2DPSink.cpp:813] av_hdl_avrc_evt(): AVRC metadata rsp: attribute id 0x2, TesseracT
[  1832][I][BluetoothA2DPSink.cpp:363] app_task_handler(): app_task_handler, APP_SIG_WORK_DISPATCH sig: 1
[  1841][I][BluetoothA2DPSink.cpp:813] av_hdl_avrc_evt(): AVRC metadata rsp: attribute id 0x4, Sonder
[  1850][I][BluetoothA2DPSink.cpp:363] app_task_handler(): app_task_handler, APP_SIG_WORK_DISPATCH sig: 1
[  1859][I][BluetoothA2DPSink.cpp:813] av_hdl_avrc_evt(): AVRC metadata rsp: attribute id 0x8, 1
[  1868][I][BluetoothA2DPSink.cpp:363] app_task_handler(): app_task_handler, APP_SIG_WORK_DISPATCH sig: 1
[  1877][I][BluetoothA2DPSink.cpp:813] av_hdl_avrc_evt(): AVRC metadata rsp: attribute id 0x10, 1
[  4716][I][BluetoothA2DPSink.cpp:487] app_gap_callback(): event: 13

Bad:
rst:0x10 (RTCWDT_RTC_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
configsip: 0, SPIWP:0xee
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:1
load:0x3fff0030,len:1284
load:0x40078000,len:12836
load:0x40080400,len:3032
entry 0x400805e4
[   262][I][BluetoothA2DPCommon.cpp:207] log_free_heap(): Available Heap: 222708
[   265][I][BluetoothA2DPSink.cpp:139] start(): Device name will be set to 'TenonTech CDX1'
[   274][I][BluetoothA2DPSink.cpp:187] init_i2s(): init_i2s
[   278][I][BluetoothA2DPSink.cpp:189] init_i2s(): init_i2s is_i2s_output
[   374][I][BluetoothA2DPSink.cpp:266] init_bluetooth(): controller initialized
[   693][I][BluetoothA2DPSink.cpp:275] init_bluetooth(): bluedroid initialized
[   768][I][BluetoothA2DPSink.cpp:284] init_bluetooth(): bluedroid enabled
[   769][I][BluetoothA2DPSink.cpp:363] app_task_handler(): app_task_handler, APP_SIG_WORK_DISPATCH sig: 1
[   774][I][BluetoothA2DPCommon.cpp:241] set_scan_mode_connectable(): set_scan_mode_connectable true
[   783][I][BluetoothA2DPCommon.cpp:207] log_free_heap(): Available Heap: 115808
[   783][I][BluetoothA2DPSink.cpp:363] app_task_handler(): app_task_handler, APP_SIG_WORK_DISPATCH sig: 1
[   784][I][BluetoothA2DPSink.cpp:487] app_gap_callback(): event: 10
[   798][I][BluetoothA2DPSink.cpp:564] av_hdl_a2d_evt(): A2DP PROF STATE: Init Compl
[   812][I][BluetoothA2DPSink.cpp:487] app_gap_callback(): event: 10
[   823][I][BluetoothA2DPSink.cpp:487] app_gap_callback(): event: 10
[   826][I][BluetoothA2DPSink.cpp:487] app_gap_callback(): event: 10
[   839][I][BluetoothA2DPSink.cpp:363] app_task_handler(): app_task_handler, APP_SIG_WORK_DISPATCH sig: 1
[   847][I][BluetoothA2DPSink.cpp:650] handle_connection_state(): partner address: f8:1a:2b:e9:cc:8e
[   855][I][BluetoothA2DPSink.cpp:658] handle_connection_state(): A2DP connection state: Connecting, [f8:1a:2b:e9:cc:8e]
[   865][I][BluetoothA2DPSink.cpp:747] handle_connection_state(): ESP_A2D_CONNECTION_STATE_CONNECTING
[   885][W][Wire.cpp:204] begin(): Bus already started in Master Mode.
[ 60838][I][BluetoothA2DPSink.cpp:363] app_task_handler(): app_task_handler, APP_SIG_WORK_DISPATCH sig: 1
[ 60839][I][BluetoothA2DPSink.cpp:650] handle_connection_state(): partner address: f8:1a:2b:e9:cc:8e
[ 60846][I][BluetoothA2DPSink.cpp:658] handle_connection_state(): A2DP connection state: Disconnected, [f8:1a:2b:e9:cc:8e]
[ 60856][I][BluetoothA2DPSink.cpp:661] handle_connection_state(): ESP_A2D_CONNECTION_STATE_DISCONNECTED
[ 60866][I][BluetoothA2DPSink.cpp:1243] bt_i2s_task_shut_down(): BtI2STask shutdown
[ 60873][I][BluetoothA2DPSink.cpp:675] handle_connection_state(): i2s_stop
[ 60880][I][BluetoothA2DPCommon.cpp:241] set_scan_mode_connectable(): set_scan_mode_connectable true

Based on the timestamps, it looks like something times out after a minute.

Hmm, can you double check if this also if you use BluetoothA2DPSinkMinRAM instead BluetoothA2DPSink ?

Much improved!  I may have seen it once in 20 attempts, but not even sure about that one.  Thanks, Phil!

I'm going to have to retract that premature celebration.  I'm still seeing this fairly often.  Is there something else we can tune to make this more aggressive?  The bluetooth in my wife's Honda always reconnects.  The ESP32-based player in my truck still fails to reconnect sometimes.

I suggest that you play around with the delay in BluetoothA2DPSink.cpp on line 686. If an increased value helps I will make the value configurable with a setter method...

As far as I can tell, that code is not being executed.  I added several more log statements:
 if (!end_in_progress) {
            ESP_LOGI(BT_AV_TAG,"try reconnect1");
            if (is_reconnect(a2d->conn_stat.disc_rsn)) {
                ESP_LOGI(BT_AV_TAG,"try reconnect2");
                if (connection_rety_count < try_reconnect_max_count ){
                    ESP_LOGI(BT_AV_TAG,"try reconnect3");
                    ESP_LOGI(BT_AV_TAG,"Connection try number: %d", connection_rety_count);
                    // make sure that any open connection is timing out on the target
                    delay(1000);
                    connect_to_last_device();
                    // when we lost the connection we do allow any others to connect after 2 trials
                    if (connection_rety_count==2) set_scan_mode_connectable(true);

                } else {
                    ESP_LOGI(BT_AV_TAG, "Reconect retry limit reached");
                    if ( has_last_connection() && a2d->conn_stat.disc_rsn == ESP_A2D_DISC_RSN_NORMAL ){
                        clean_last_connection();
                    }
                    set_scan_mode_connectable(true);
                }
            } else {
                set_scan_mode_connectable(true);
            }
        }

And I don't see any of these messages.
Log:
[   263][W][BigRed2.ino:1228] setup(): Tenon Tech, Model CDX1, booting.  Copyright (c) 2022 Tenon Technology.
[   265][I][BluetoothA2DPCommon.cpp:207] log_free_heap(): Available Heap: 222988
[   269][I][BluetoothA2DPSink.cpp:141] start(): Device name will be set to 'CDX1 Vader Black'
[   279][I][BluetoothA2DPSink.cpp:189] init_i2s(): init_i2s
[   283][I][BluetoothA2DPSink.cpp:191] init_i2s(): init_i2s is_i2s_output
[   377][I][BluetoothA2DPSink.cpp:268] init_bluetooth(): controller initialized
[   704][I][BluetoothA2DPSink.cpp:277] init_bluetooth(): bluedroid initialized
[   778][I][BluetoothA2DPSink.cpp:286] init_bluetooth(): bluedroid enabled
[   778][I][BluetoothA2DPSink.cpp:365] app_task_handler(): app_task_handler, APP_SIG_WORK_DISPATCH sig: 1
[   783][I][BluetoothA2DPCommon.cpp:241] set_scan_mode_connectable(): set_scan_mode_connectable true
[   792][I][BluetoothA2DPSink.cpp:365] app_task_handler(): app_task_handler, APP_SIG_WORK_DISPATCH sig: 1
[   792][I][BluetoothA2DPSink.cpp:489] app_gap_callback(): event: 10
[   801][I][BluetoothA2DPSink.cpp:566] av_hdl_a2d_evt(): A2DP PROF STATE: Init Compl

[   801][I][BluetoothA2DPCommon.cpp:207] log_free_heap(): Available Heap: 120724
[   815][I][BluetoothA2DPSink.cpp:489] app_gap_callback(): event: 10
[   822][I][BigRed2.ino:591] run(): LCD addr: 0x27
[   828][I][BluetoothA2DPSink.cpp:489] app_gap_callback(): event: 10
[   832][W][Wire.cpp:204] begin(): Bus already started in Master Mode.
[   838][I][BluetoothA2DPSink.cpp:489] app_gap_callback(): event: 10
[   854][I][BluetoothA2DPSink.cpp:365] app_task_handler(): app_task_handler, APP_SIG_WORK_DISPATCH sig: 1
[   860][I][BluetoothA2DPSink.cpp:652] handle_connection_state(): partner address: f8:1a:2b:e9:cc:8e
[   869][I][BluetoothA2DPSink.cpp:660] handle_connection_state(): A2DP connection state: Connecting, [f8:1a:2b:e9:cc:8e]
[   879][I][BluetoothA2DPSink.cpp:755] handle_connection_state(): ESP_A2D_CONNECTION_STATE_CONNECTING
[  1987][I][BigRed2.ino:891] run(): Master Initialized
[  2045][I][BigRed2.ino:917] run(): Got 51 (BOOT), moving on
[  8046][W][BigRed2.ino:68] state_timeout(): Master - Timed out in state: 7
[  9046][I][BigRed2.ino:891] run(): Master Initialized
[  9081][I][BigRed2.ino:917] run(): Got 51 (BOOT), moving on
[ 10106][I][BigRed2.ino:949] run(): State WAIT_FOR_PLAY_PAUSE: Got msg_stop, sending msg_04
[ 10106][I][BigRed2.ino:964] run(): State: PAUSE
[ 11107][I][BigRed2.ino:1163] run(): LOST BLUETOOTH CONNECTION
[ 60853][I][BluetoothA2DPSink.cpp:365] app_task_handler(): app_task_handler, APP_SIG_WORK_DISPATCH sig: 1
[ 60853][I][BluetoothA2DPSink.cpp:652] handle_connection_state(): partner address: f8:1a:2b:e9:cc:8e
[ 60860][I][BluetoothA2DPSink.cpp:660] handle_connection_state(): A2DP connection state: Disconnected, [f8:1a:2b:e9:cc:8e]
[ 60871][I][BluetoothA2DPSink.cpp:663] handle_connection_state(): ESP_A2D_CONNECTION_STATE_DISCONNECTED
[ 60880][I][BluetoothA2DPSink.cpp:1252] bt_i2s_task_shut_down(): BtI2STask shutdown
[ 60888][I][BluetoothA2DPSink.cpp:677] handle_connection_state(): i2s_stop
[ 60894][I][BluetoothA2DPSink.cpp:683] handle_connection_state(): try reconnect1
[ 60901][I][BluetoothA2DPSink.h:355] is_reconnect(): is_reconnect: false
[ 60908][I][BluetoothA2DPCommon.cpp:241] set_scan_mode_connectable(): set_scan_mode_connectable true

Can you try to find out what the value of a2d->conn_stat.disc_rsn is ?
is_reconnect() seems to return false instead of true...

I can do that tomorrow.  You want that in hex?

Actually, that was already in my logs:
[ 60882][I][BluetoothA2DPSink.cpp:683] handle_connection_state(): try reconnect1.  disc_rsn: 0x0

And what about the 60 second delay before it even attempts the retry code?

Also, I don't want afterNormalDisconnect = true.  If the user initiates the disconnect from the phone, it immediately reconnects!  That's not the desired behavior.  This is for the case where the user shuts off the power to the ESP32 device - I want it to try to reconnect when the power comes back.

It's 1 sec and not 60 seconds and it seems that different partners are reporting different values for disc_rsn for this case: I guess that I need to change the approach. Fortunately I can just extend on the logic that was set in place for the A2DP Source lately...

It's definitely 60 seconds after boot when it first begins the retry logic.

What I'm saying is that when this fails, it's about 60 seconds after it boots before we get into the code with:
if (a2d->conn_stat.state == ESP_A2D_CONNECTION_STATE_DISCONNECTED) {
Note the timestamps in the logs:
[  4113][I][BigRed2.ino:1163] run(): LOST BLUETOOTH CONNECTION
[ 60841][I][BluetoothA2DPSink.cpp:365] app_task_handler(): app_task_handler, APP_SIG_WORK_DISPATCH sig: 1

My log message about "LOST" bluetooth might be a little misleading - we may not have had a connection in the first place.

I managed to get rid of the afterNormalDisconnect logic locally. However I am still struggling that sometimes it takes about a minute to reconnect.  I think I will need some more time to figure out how to address this....

Thanks, Phil.  It does the one-minute thing as it fails to connect on the first try.  Let me know if there's anything I can try on my end.

Am I seeing the same issue, or shall I open a new report?
With a macOS peer, this is 100% reproducible:

reconnect happens fine when the sink device is started
but after a few seconds, there is a disconnect
if I then connect again after that, it stays connected

The disconnect looks like this at log INFO:
[ 18476][I][BluetoothA2DPSink.cpp:364] app_task_handler(): [BT_API] app_task_handler, APP_SIG_WORK_DISPATCH sig: 1
[ 18476][I][BluetoothA2DPSink.cpp:621] handle_audio_state(): [BT_AV] A2DP audio state: Suspended
[ 18483][W][BluetoothA2DPSink.cpp:637] handle_audio_state(): [BT_AV] i2s_stop
[ 18490][I][BluetoothA2DPSink.cpp:364] app_task_handler(): [BT_API] app_task_handler, APP_SIG_WORK_DISPATCH sig: 1
[ 18492][I][BluetoothA2DPSink.cpp:488] app_gap_callback(): [BT_AV] event: 13
[ 18500][I][BluetoothA2DPSink.cpp:793] av_hdl_avrc_evt(): [BT_AV] AVRC conn_state evt: state 0, [00:00:00:00:00:00]
[ 18507][I][BluetoothA2DPSink.cpp:488] app_gap_callback(): [BT_AV] event: 13
[ 18517][I][BluetoothA2DPSink.cpp:364] app_task_handler(): [BT_API] app_task_handler, APP_SIG_WORK_DISPATCH sig: 1
[ 18534][I][BluetoothA2DPSink.cpp:1328] av_hdl_avrc_tg_evt(): [BT_AV] AVRC conn_state evt: state 0, [00:00:00:00:00:00]
[ 18544][I][BluetoothA2DPSink.cpp:364] app_task_handler(): [BT_API] app_task_handler, APP_SIG_WORK_DISPATCH sig: 1
[ 18554][I][BluetoothA2DPSink.cpp:651] handle_connection_state(): [BT_AV] partner address: a4:d1:8c:c5:25:87
[ 18564][I][BluetoothA2DPSink.cpp:659] handle_connection_state(): [BT_AV] A2DP connection state: Disconnected, [a4:d1:8c:c5:25:87]
[ 18575][I][BluetoothA2DPSink.cpp:662] handle_connection_state(): [BT_AV] ESP_A2D_CONNECTION_STATE_DISCONNECTED
[ 18585][I][BluetoothA2DPSink.cpp:676] handle_connection_state(): [BT_AV] i2s_stop
[ 18593][I][BluetoothA2DPSink.h:346] is_reconnect(): [BT_AV] is_reconnect: false
[ 18600][I][BluetoothA2DPCommon.cpp:245] set_scan_mode_connectable(): [BT_AV] set_scan_mode_connectable true

For my use case, I don't want to rely on auto-reconnect for problems like this.  Nothing should interrupt the stream after the initial connect.

I had a closer look and came to the following conclusions. The reconnect to Android seems to be reliable.
The reconnect to IOS works sometimes fast, sometimes it's slow (around 1 minute). The issue seems to be with IOS since it takes that much time to send out the necessary confirmations and the ESP is just waiting for these messages:
I tried the following

send a disconnect just after the startup  to inform the target device that it should be disconnected
reprocess reconnects() if the target device does not react within some defined time
None of this was helping...

FYI, I'm only using Android.
sennt frommy mobile phone with a tinny keybard
On Sun, Jul 3, 2022, 2:51 PM Phil Schatzmann @.***>
wrote:

I had a closer look and came to the following conclusions. The reconnect
to Android seems to be reliable.
The reconnect to IOS works sometimes fast, sometimes it's slow (around 1
minute). The issue seems to be with IOS since it takes that much time to
send out the necessary confirmations and the ESP is just waiting for these
messages:
I tried the following

send a disconnect just after the startup to inform the target device
that it should be disconnected
reprocess reconnects() if the target device does not react within
some defined time
None of this was helping...

—
Reply to this email directly, view it on GitHub
https://github.com/pschatzmann/ESP32-A2DP/issues/248#issuecomment-1173161121,
or unsubscribe
https://github.com/notifications/unsubscribe-auth/AAXS2YCL4MRZH3F7DOK45S3VSHVN5ANCNFSM5ZY6X33A
.
You are receiving this because you authored the thread.Message ID:
@.***>

I committed my latest corrections, but I don't think that they will bring any improvements. The only advise I would have is to make sure that you use the latest ESP IDF/Arduino version.

If you use Arduino you can upgrade the ESP32 version in the board manager.

Yes, I'm on 2.0.3.  I'm not bothered that the first connection attempt sometimes fails - that can happen.  I just wish it didn't take 60 seconds to recognize that.  It would be better if we were notified of the failure after, say, 10 seconds, so we could initiate our retry sooner.

That's exactly what I have have implemented and in my case a retry did not help at all!
It really took the audio source that amount of time to provide a confirmation...

OK,  Let me experiment a little with your latest changes.

Have a look at A2DP_EXPERIMENTAL_RECONNECT_AFTER_IDLE and change the portMAX_DELAY to e.g. 10 seconds

That would be my expected outcome if you don't change portMAX_DELAY to e.g. 10000

I looked, but couldn't find where that was defined?  portMAX_DELAY

void BluetoothA2DPSink::app_task_handler(void *arg)
{
    ESP_LOGD(BT_AV_TAG, "%s", __func__);
    app_msg_t msg;
    while (true) {
        if (!app_task_queue){
            ESP_LOGE(BT_APP_TAG, "%s, app_task_queue is null", __func__);
            delay(100);
        } else if (pdTRUE == xQueueReceive(app_task_queue, &msg, (portTickType)portMAX_DELAY)) {
            ESP_LOGD(BT_APP_TAG, "%s, sig 0x%x, 0x%x", __func__, msg.sig, msg.event);

You would replace portMAX_DELAY with your timeout setting....

OK.  I think I've replicated what you did, with portMAX_DELAY  set at 10000 (10 seconds).  It now attempts to reconnect, but until the  handle_connection_state(): [BT_AV] A2DP connection state: Disconnected, [f8:1a:2b:e9:cc:8e] connection state change event happens, it's doesn't work.  Once we get that event, the reconnect does work.  So that 60 seconds until we get the connection state change event (disconnected) - is that configured somewhere deep in the espressif code?

My understanding would be that this is in the target device and has nothing to do with the ESP32

Maybe.  I found this to be repeatable:

Connect the device as normal.
Power-down the ESP32.  It takes about 10 sec for the phone to notice and show the dropped connection.
If I wait that 10 seconds before I power on the ESP32, it seems to reconnect correctly every time.  (preliminary - more tests needed).
If I do NOT wait that 10 seconds before I power on the ESP32, the initial connection fails (the phone still thinks it's connected).
If I reboot again soon after (LONG before the 60 second timer would have expired), it connects successfully.

So, in general, a simple reboot will always lead to this condition (because we don't wait for the phone to notice).  I think that's new behavior.

The phone knows it's disconnected, and is willing to accept the reconnect before the 60 seconds timeout has elapsed.  Which makes me think that timeout is not in the phone.

Also, If I disable bluetooth on my phone halfway through the 60-second timeout, We still don't see
[ 60951][I][BluetoothA2DPSink.cpp:690] handle_connection_state(): [BT_AV] A2DP connection state: Disconnected
until 60 seconds have elapsed.

You can double check if A2DP_EXPERIMENTAL_DISCONNECT_ON_START is helping.
For me it did not...

Nope.  So I still think the 60 second timeout is somewhere in the ESP code - probably in the espressif code.

If I wait that 10 seconds before I power on the ESP32, it seems to reconnect correctly every time.  (preliminary - more tests needed).

If this is consistent, the best way to deal with this would be to add a 15 second delay after a reconnect restart - before we start the app_work_dispatch queue

Is that stored somewhere in NV ram?  That when we powered down, we were connected to something?

If I set portMAX_DELAY to 10 seconds, a reboot gets us into the bad state, but we eventually do reconnect after 70 seconds.

We only store the partner address to which we send the connect request...

To test I suggest that you add a delay(15000); just before or after
#ifdef A2DP_EXPERIMENTAL_DISCONNECT_ON_START
ESP_LOGW(BT_AV_TAG,"A2DP_EXPERIMENTAL_DISCONNECT_ON_START");
disconnect();
#endif
We can manage the delay configurable....

Also, would be nice to have a2dp_sink.is_connecting();, so I could at least give my users feedback about why nothing is happening.

I'm also pretty certain this is new behavior.  It fails every other reset.  I would have noticed that before.

There used to be a  hard coded 1 second delay which I removed with one of the last commits. I added it back and  with the last commit there is the set_reconnect_delay() method.

Same.  But I think I may have a work-around for my situation.  In the car (but not the lab), I do get advanced warning that the power is going to go down.  So I can issue a disconnect() just before I die.  That should enable a fast reboot.

This is working pretty well for me now, with default settings.  More pressing is #256 .

i can jump in and do testing... i havent really started my project with this yet
but... running just basically this   a2dp_sink.start("MyMusic", true);
and testing with iOS 15.5 on iPhone 11
when i turn off the ESP32, the iPhone picks it up, and of course disconnects and pauses playback
when i apply power to esp32, the iPhone reconnects
i even waited a few mins between power cycle
i have not got any connection failures
im using A2DP code before the july4/5 changes
i can pull the updates, and test too
(not to switch topics here)
any easy way to resume play, if it was playing before? and making sure its from the reconnect
maybe add option to audio resume? or there a simple way?
could we store last play state, like last connection is stored?

Mitch, have you tried a simple reset of the esp32?  Don't wait for the phone to notice, just off and on.
Regarding auto-play, in my system, there's another component (the head unit in the car) that keeps track of that.

ah ok, just quick resets...
I (1172) BT_AV: partner address: 88:64:40:2e:69:b0
I (1182) BT_AV: A2DP connection state: Connecting, [88:64:40:2e:69:b0]
I (1192) BT_AV: ESP_A2D_CONNECTION_STATE_CONNECTING

but iphone isnt reconnected
after some time
W (61162) BT_BTC: BTA_AV_OPEN_EVT::FAILED status: 2
I (61162) BT_API: app_task_handler, APP_SIG_WORK_DISPATCH sig: 1
I (61162) BT_AV: partner address: 88:64:40:2e:69:b0
I (61172) BT_AV: A2DP connection state: Disconnected, [88:64:40:2e:69:b0]
I (61182) BT_AV: ESP_A2D_CONNECTION_STATE_DISCONNECTED
I (61182) BT_AV: BtI2STask shutdown
I (61192) BT_AV: i2s_stop
I (61192) BT_AV: is_reconnect: false
I (61192) BT_AV: set_scan_mode_connectable true

this the issue (im still running code before 7/4 & 7/5 commits)
should i switch to that code for the "improved" reconnect logic?

It's working much better for me now.  I think it's the presumptive disconnect() here that made the difference.

I did some tests today and could not find any reconnect fails. You can reopen the issue if you think it is still not OK.


Grinding Bananas Guidebook Recipe Misleading

Description

Recipe says it gives Nothing, which isn't right at all. Mimes everywhere are silently crying.


Clarification on Minimum Requirements

On README.md,
Requirements
QEMU 2.0 or later
Xen 4.5 and VT enabled host (for Xen support)
should be rewritten as
KVM (QEMU 2.0 or later)
Xen (4.5 or later)
VirtualBox (Mac OS X)

to match what was written at https://github.com/hyperhq/runv

currently the virtualbox is not working now


Remvo "dumprun" functions from various LCD drivers

Summary

It seems that they assume up_putc() and syslog() outputs to the same device. Depending on the system and configurations, it's wrong.

They are wrapped with "#if 0" and unused.

Fixes https://github.com/apache/nuttx/issues/14694
Impact
Testing

[Experimental Bot, please feedback here]
This PR appears incomplete and does not meet the NuttX requirements.  Here's why:

Insufficient Summary: While the summary identifies the problem (up_putc and syslog assumptions), it doesn't clearly state what change is being made.  Are the #if 0 blocks being removed?  Is the code being rewritten to handle different output devices correctly?  How does the fix actually work?

Missing Impact Assessment: The entire "Impact" section is empty.  This is crucial for reviewers to understand the consequences of the change.  Even if the answer is "NO" for most items, it needs to be explicitly stated.  The potential impact on documentation, especially given this involves syslog, should be addressed.

Missing Testing Information: The "Testing" section lacks details.  Which host operating system, compiler, and target architecture were used for testing?  The "Testing logs before change" and "Testing logs after change" sections are empty.  Without these logs, it's impossible to verify the fix's effectiveness.

To make this PR compliant, the author needs to:

Elaborate on the Summary: Explain precisely how the code is being changed to address the issue.  Example: "This PR removes the unused, and potentially incorrect, #if 0 wrapped code that assumed up_putc and syslog target the same device. This prevents potential future misuse and clarifies the codebase."

Complete the Impact Assessment: Address each impact point, even if the answer is "NO."  If documentation changes are needed, explain what those changes are.

Provide Testing Details: Specify the build host and target environments.  Include relevant logs demonstrating the issue before the change and the corrected behavior after the change.  This might include output from both up_putc() and syslog(), showing they now go to the expected destinations.


EM Research Ticket

Description
As we are wrapping up this sprint, we want to do a little ground work to prepare for next semester. In particular, we need a way to  automatically compile online donation information and allow a user to manually input donation information.
As of now, we are unsure about how much work it will involve to automatically retrieve donation information for the nonprofit / individual chapters, and need to plan ahead for next semester. This ticket involves researching about what a possible design might look like, and come up with some concrete steps for its implementation (some tickets that aren't fully fleshed out).
Problem
Right now, Heart of Passion has one bank account they use for managing donations for all the chapters. People can donate via a check, PayPal (I think this is through the form of there website), or alternatives like venmo / the admins of Heart of Passion can manually add some money from other sources.
We want to make it easy for them to categorize the different donations, so that chapters can keep track of their funds, and also keep track of the donors so that they can send thank you notes / follow ups.
They're interested in automating much of the process and they will give us access to the bank account and/or the bank statements. They are open to changing other parts of their process, like the form on their web if we need to integrate anything there.
We would like to see if there is an easy way to automate pulling deposits into the bank account and categorizing them by chapter/type/donor/whatever possible.
A tentative idea right now is to connect to their bank account via some API (Plaid?), and automatically populate an admin screen in the website with each deposit. From there, a Heart of Passion admin can go in and categorize each deposit, assigning them to a specific chapter, and modifying any necessary information.
For this ticket, we want to see if the above idea is possible, what tools we might need to use in order to achieve it (i.e Paypal API, Plaid API, etc), and figure out a VERY ROUGH action plan of the steps needed for developers.
Links
Heart of Passion Donation Site: https://fs19.formsite.com/HeartofPassion/Donate/index.html
Plaid: https://plaid.com/ (
Notes

Don't hesitate to reach out for clarification / help / to get feedback on anything!

Rough Idea: use Plaid to connect to Heart of Passion bank account and populate admin screen with deposits that can be manually sorted on the website
Making a Plaid account

Can make a free account at https://plaid.com/ and obtain API credentials
Access developer keys: https://dashboard.plaid.com/developers/keys
Plaid project and .env example: https://github.com/plaid/quickstart/blob/master/.env.example

How Plaid works

Link: drop-in module that provides secure authentication, allows users to connect bank accounts to Plaid

https://plaid.com/docs/api/tokens/
link_token is supplied to Plaid Link to initialize it and receive a public token
exchange public_token for access_token and item_id (the bank account)
store access_token securely on server, allows access to user financial data without having to log in again

Important Plaid Endpoints

item/get: retrieve information about a user's linked bank account

https://plaid.com/docs/api/items/#itemget

transactions/sync: retrieve user's transaction data

https://plaid.com/docs/api/products/transactions/#transactionssync

link/token/create: creates a Link token to initialize Plaid Link component and provide consent to bank accounts

https://plaid.com/docs/api/tokens/#linktokencreate
other useful token creation endpoints here too

Some resources for linking Plaid and React

https://medium.com/@dereksams/building-a-react-app-with-the-plaid-api-93e45ae61b58
https://carloshernandez-26998.medium.com/how-to-establish-a-link-to-plaids-api-using-reactjs-and-node-js-54ae92db69a2