Specify Flow and Sender attributes and related Receiver parameter constraints

Replaces #10 based on latest approach of NMOS Stream Mappings activity group.
Depends on https://github.com/AMWA-TV/nmos-parameter-registers/pull/43.
Specifies the use of the following new Flow attributes and related Receiver parameter constraints

profile and urn:x-nmos:cap:format:profile
level and urn:x-nmos:cap:format:level
sublevel_bpp and urn:x-nmos:cap:format:sublevel_bpp
bit_rate and urn:x-nmos:cap:format:bit_rate

Specifies the use of the following new Sender attributes and related Receiver parameter constraints

bit_rate and urn:x-nmos:cap:transport:bit_rate, i.e. including the transport overhead
st2110_21_sender_type and urn:x-nmos:cap:transport:st2110_21_sender_type

To be reviewed by @AMWA-TV/nmos-architecture-review group as well as the activity group.

Bringing the various comment discussions together, as I think there's only two concerns outstanding...
Regarding the Flow sublevel_bpp:

The consensus seems to be that it must indicate the codestream sublevel, not the encoding target compression ratio.
The Full sublevel would be indicated by bpc * number of components.
Since sublevels are defined at integer values, the value should be integer not floating point.
The related Receiver parameter constraint can indicate supported ranges using min/max.
The downside is that tighter decoder constraints on bpp cannot be represented. For example, VSF TR-08 Capability Sets range of 1.5 - 4 bpp. Is this acceptable?

Regarding whether to allow the profile, level and sublevel_bpp attributes to be omitted:

I think we wanted to basically REQUIRE the Flow to include the profile, level and sublevel_bpp attributes so that the Controller is guaranteed to have something to check any Receiver parameter constraints against. (This was intentionally more 'aggressive' than the RFC 9134 is about the equivalent SDP format-specific parameters.)
Therefore I thought we could indicate that omitting any of these attributes means the stream could be Unrestricted in that aspect, rather than e.g. defining an Unrestricted enumeration value.
However, if the consensus is that omission means simply unindicated, then we are downgrading the REQUIREMENT to a strong RECOMMENDATION, and we need to specify more clearly how a Controller should behave if a Receiver specifies a constraint but the Flow doesn't have the parameter.

Bringing the various comment discussions together, as I think there's only two concerns outstanding...
Regarding the Flow sublevel_bpp:

The consensus seems to be that it must indicate the codestream sublevel, not the encoding target compression ratio.
The Full sublevel would be indicated by bpc * number of components.
Since sublevels are defined at integer values, the value should be integer not floating point.
The related Receiver parameter constraint can indicate supported ranges using min/max.
The downside of an integer value is that tighter decoder implementation/license constraints on bpp cannot be directly represented. For example, VSF TR-08 Capability Sets range of 1.5 - 4 bpp. Is this acceptable?

I don't believe this will be a problem, but I cannot speak for all implementers. I suppose implementers will license at sublevel boundaries, and not at arbitrary selecte bpp's.

Regarding whether to allow the profile, level and sublevel_bpp attributes to be omitted:

I think we wanted to basically REQUIRE the Flow to include the profile, level and sublevel_bpp attributes so that the Controller is guaranteed to have something to check any Receiver parameter constraints against. (This was intentionally more 'aggressive' than the RFC 9134 is about the equivalent SDP format-specific parameters.)

This would be very 'agressive' indeed.

Therefore I thought we could indicate that omitting any of these attributes means the stream could be Unrestricted in that aspect, rather than e.g. defining an Unrestricted enumeration value.
However, if the consensus is that omission means simply unindicated, then we are downgrading the REQUIREMENT to a strong RECOMMENDATION, and we need to specify more clearly how a Controller should behave if a Receiver specifies a constraint but the Flow doesn't have the parameter.

My opinion is indeed that omitting would mean 'unknown'/'not indicated' and that the Controller can only do a best effort at making a decision. I agree that a strong recommendation is the preferred way. Would it be an idea to allow controllers to reject when not specified (omitted) (without making it a hard requirement)?

I always lean toward using requirements than recommending anything. Requirements improve interoperability, while recommendations bring zero value because people can, and will, omit the information.
In this case, I would assume that a sender that encodes the stream itself would be able to provide all the information. However, if the sender is a sort of a gateway, that receives an already encoded stream, which SDP does not signal the information, then we would have a problem. The workaround here could be for the gateway to extract the information from the bitstream, but that not only would require the gateway to understand JPEG XS (even if only enough to parse the headers), it would not be possible in case the stream hadn't started yet.
Having said all this, I think I have to admit that we should recommend, not require, whatever is not required to be in the SDP.

Replying to @tbr:

Would it be an idea to allow controllers to reject when not specified (omitted) (without making it a hard requirement)?

Unfortunately, BCP-004-01 does not currently cover the case where a Parameter Constraint cannot be evaluated because the target parameter is not available. I think this is an oversight.
I believe that the Parameter Constraint Target section ought to say:

When the target parameter is not available, the Parameter Constraint cannot be evaluated.

In the Behaviour: Controllers section, it currently says:

When a Controller cannot evaluate any of the Parameter Constraints in a Constraint Set, that Constraint Set SHOULD be considered to be satisfied, but the Controller MAY distinguish this case for a user.

Probably this ought to say instead:

When a Controller cannot evaluate any of the Parameter Constraints in a Constraint Set, that Constraint Set SHOULD be considered to be satisfied.
If the only satisfied Constraint Sets use one or more Parameter Constraints that cannot be evaluated, the Controller SHOULD distinguish this case for a user.

@pedro-alves-ferreira I think you make a very useful comment here. I didn't think of the example you described.
I believe it is perfectly doable to require that a sender also specifies profile and level for XS, but the issue starts with sublevel as an integer. In that case there would be no way to indicate Unrestricted (unless we propose for example a ridiculous large integer value to signal that, e.g. 65535).
As I explained before, I think the ultimate decision here should be guided by the experts of NMOS (and not by me as XS and RFC9134 expert).

I believe it is perfectly doable to require that a sender also specifies profile and level for XS, but the issue starts with sublevel as an integer. In that case there would be no way to indicate Unrestricted (unless we propose for example a ridiculous large integer value to signal that, e.g. 65535).

Hmm... surely if we do decide that we can REQUIRE a sender to indicate profile/level/sublevel for JPEG XS, then we can define that sublevel_bpp being omitted implies Unrestricted? It's only if we make it optional/(strongly) recommended that the meaning of omission is unclear.

@garethsb That sounds correct yes. Let's break things up:

profile: can be required, and omission could indicate Unrestricted.
level: can be required, and omission could indicate Unrestricted.
sublevel: when integer, we can already signal 2, 3, 4, 6, 9 and 12, as well as the Full (will be bpc * num_comps). Omission could indicate Unrestricted.

In general, you could say: omitting profile/'level/sublevel means Unrestricted for the respective attribute. Otherwise it MUST be specified.

Right. That's what I hoped when I made the suggestion in https://github.com/AMWA-TV/bcp-006-01/pull/12#discussion_r891080014.
However...
I agree we need to answer how to implement an NMOS gateway like @pedro-alves-ferreira mentioned. Asking the gateway to process the codestream seems unrealistic. And if it omits these attributes, it would be saying this is an Unrestricted stream.
How does that play with Receiver caps? If a Receiver says its decoder is constrained to particular enumerated profiles, would we want the Receiver or a Controller decide it cannot be connected to a Sender of such a Flow?
Or do we prefer to allow that the attribute can be omitted, but state that this indicates that it may be an Unrestricted stream, and follow the rules I proposed in https://github.com/AMWA-TV/bcp-006-01/pull/12#issuecomment-1149711818 about parameter constraints that cannot be evaluated because the target parameter is unavailable, i.e. the Controller MAY allow the connection but MAY/SHOULD warn the user in this case?
I.e. instead of "omission implies Unrestricted", we have "Unrestricted is indicated by omission, but omission can also mean just unknown"

"Regarding whether to allow the profile, level and sublevel_bpp attributes to be omitted"
As I understand this is referring to Flow's properties, not Receiver Capabilities. Flow properties describe a stream/essence, they do not describe what a Sender is capable of ... So the question is, do we want to require a Sender to describe such aspects of a JPEG-XS stream?
AKAIK all these three attributes are OPTIONAL in an SDP transport file as per the jxsv specification. So as previously mentioned, a Receiver consuming such a stream may not know without decoding the stream what those values could be, if at all possible.
A JPEG-XS Flow not having all these properties may be missing information that a Controller would require, which may result in issuing a warning to the User. It is then recommended that a Sender, encoding an essence to JPEG-XS provide all the Flow information in order to prevent those warnings and provide a better User experience. ... but it cannot be required. We could state that if those attributes are present in the SDP transport file they MUST also be present in the associated Flow.
If the profile, level and sublevel_bpp are not required to be present in a Flow, there is still the issue of the JPEG-XS Unrestricted sublevel. We cannot count on the absence of the sublevel_bpp property to indicate unrestricted but we could indicate that any value above Full is unrestricted. As we know that Full is the sum of bpc of all components, any value larger becomes Unrestricted.
I think that something not specified in a Flow should not mean unrestricted. Market forces will make sure that devices will properly specify their Flows when possible.
The Receiver Capabilities side of this story shall follow the rules of BCP-004-01.

"Regarding whether to allow the profile, level and sublevel_bpp attributes to be omitted"
As I understand this is referring to Flow's properties, not Receiver Capabilities. Flow properties describe a stream/essence, they do not describe what a Sender is capable of ... So the question is, do we want to require a Sender to describe such aspects of a JPEG-XS stream?
AKAIK all these three attributes are OPTIONAL in an SDP transport file as per the jxsv specification. So as previously mentioned, a Receiver consuming such a stream may not know without decoding the stream what those values could be, if at all possible.

When we wrote the RFC 9134, we decided to make as many parameters as possible optional. The reason was mainly to allow the RFC to be used in as many applications and implementations (other than SMPTE ST 2110) as possible, not restricting it too much by adding mandatory things. What I want to say is that the RFC declares them optional, but common sense for implementers would be to supply them. The SDP example of VSF TR-08 does this too.

A JPEG-XS Flow not having all these properties may be missing information that a Controller would require, which may result in issuing a warning to the User. It is then recommended that a Sender, encoding an essence to JPEG-XS provide all the Flow information in order to prevent those warnings and provide a better User experience. ... but it cannot be required. We could state that if those attributes are present in the SDP transport file they MUST also be present in the associated Flow.
If the profile, level and sublevel_bpp are not required to be present in a Flow, there is still the issue of the JPEG-XS Unrestricted sublevel. We cannot count on the absence of the sublevel_bpp property to indicate unrestricted but we could indicate that any value above Full is unrestricted. As we know that Full is the sum of bpc of all components, any value larger becomes Unrestricted.

That's certainly a way to do it, but it becomes convoluted (in my opinion). We also proposed that not specifying sublevel would indicate that it might/can be Unrestricted, or something else. For real Unrestricted XS content, there's not much difference in practice, because not many decoders will accept Unrestricted streams (it's simply too risky). So, not specifying it (omitting) means the controller doesn't know what it is, but in the end the Receiver will see exactly what is in the stream. Point I'm trying to make is that Unrestricted will probably never be used in the market (and it's mostly only used for closed ecosystems and testing purposes). Unrestricted just doesn't make sense in a standardized environment like NMOS (and even Full is probably not useful).

I think that something not specified in a Flow should not mean unrestricted. Market forces will make sure that devices will properly specify their Flows when possible.

That's indeed what the last state of proposal was heading to: not specified would mean: "unknown, can be anything, including Unrestricted".

The Receiver Capabilities side of this story shall follow the rules of BCP-004-01.

To me it seems evident that receivers explicitly mention their capabilities. Any receiver that can handle Unrestricted can basically handle anything.

Thanks, @alabou, @pedro-alves-ferreira and @tbr for the helpful discussion.
I think the conclusion is that all three Flow attributes, string profile and level and integer sublevel_bpp, will be "strongly RECOMMENDED" unless a value is unrestricted, in which case that attribute  MUST be omitted.
On the Receiver side, the equivalent parameter constraints will be RECOMMENDED. Following the BCP-004-01 rules, a decoder that supports an unrestricted value can be explicitly indicated by including the parameter constraint and omitting enum keyword for the string attributes or omitting enum and maximum for the integer sublevel.
When evaluating constraint sets, a restricted parameter constraint cannot be evaluated against an unspecified Flow attribute and therefore does not prevent a constraint set being satisfied. However, a Controller SHOULD inform the User in this case if possible.
Good enough?!

Merged in activity group call on 22 June.


Conflict with MRTK and Azure Storage For Unity Package

Describe the bug
Importing the AzureStorageForUnity.package into a Unity Project with Mixed Reality Toolkit creates Compiler errors. If you remove the dll that comes with the AzureStorageForUnity.package you get errors because it references strong named Newtonsoft.Json assembly references for <IP_ADDRESS> and Mixed Reality Toolkit Package forces <IP_ADDRESS>.
To reproduce
Make a Unity Project in Unity 2020.3.x
Import Mixed Reality Toolkit from Microsoft Using the MRTK Feature Discovery Tool
Notice you have no errors after completing setup
Import AzureStorageForUnity.package
Notice Compiler Errors from Newtonsoft.Json.dll conflicts.
"Assets\MRTK.Tutorials.AzureCloudServices\Scripts\Dtos\ImageElement.cs(7,10): error CS0433: The type 'JsonPropertyAttribute' exists in both 'Newtonsoft.Json, Version=<IP_ADDRESS>, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed' and 'Newtonsoft.Json, Version=<IP_ADDRESS>, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed'"
Can't remove the .dll that is included with the MRTK Package Manager because it's managed by unity's package system. If remove or modify the .dll that comes with the AzureStorageForUnity.package then you get the following compiler error.
"Assembly 'Assets/Azure Storage/Plugins/Microsoft.WindowsAzure.Storage.dll' will not be loaded due to errors:
Microsoft.WindowsAzure.Storage references strong named Newtonsoft.Json Assembly references: <IP_ADDRESS> Found in project: <IP_ADDRESS>.
Assembly Version Validation can be disabled in Player Settings "Assembly Version Validation"
Issue arose from following the tutorial at this location:
https://docs.microsoft.com/en-us/learn/modules/azure-cloud-services-tutorials/3-exercise-azure-cloud-services-for-hololens-2
Expected behavior
Azure Storage for Unity Package works with same Newtonsoft Package as MRTK.
Your setup (please complete the following information)

See reproduction steps

Target platform (please complete the following information)

HoloLens 2

Additional context
If anyone from MRTK could find for me the MSFT product owner for Azure Storage for Unity Package I will log a bug there, but I could not find it so I am logging it here in the hopes that it can begin to be resolved.

Mixed Reality Toolkit Package forces <IP_ADDRESS>

Do you know where this dependency is coming from? Where's the DLL in the package structure? I'm not aware of MRTK 2.x having a Newtonsoft.Json dependency.

Good point Keveleigh. You are correct, it appears that Newtonsoft Json is a default package included in Unity even in empty projects that I can not remove. My default unity template includes MRTK and nothing else, so I mistakenly thought this was part of MRTK. But it's not. It's part of any new unity project. It doesn't show up in the package manager so I can't remove it from there and it is a package so deleting it just means unity remakes it once I load the project back up, doesn't even show up in the package manifest.
So not an MRTK issue at all. But entirely an AzureStorageForUnity package bug. Sorry about that. Still if anyone could point me to where I can log a bug with the right team I would appreciate it. We would like to explore what the tutorial seems to offer, but can't due to this issue.


DRILL-6076: Reduce the default memory from a total of 13GB to 5GB

Reduce minimum memory requirements from 13GB to <= 5GB
For this, the default need to be changed as follows:

Allocation
Current
New

Heap
4GB
1GB

Direct
8GB
3GB

CodeCache
1GB
512MB

MaxPermSize
512MB
512MB (Ignored if JDK8+)

Total
13.5GB
5GB

Total (JDK8+)
13GB
4.5GB

I propose that we return to this after Drill 2.0 and the probably ValueVector overhaul.


Correcting Az CLI sytnax

@weeyin83 : Thanks for your contribution! The author, @tfitzmac, has been notified to review your proposed change.

@weeyin83 - thanks for suggesting this change. I do not see the --tags parameter in my version of Azure CLI. I using version 2.0.31. Which version are you using to see this parameter?


Allow the service to run on multiple instances

In https://github.com/hypothesis/checkmate/issues/1 we specified a single large instance to simplify the deployment and MVP.
This isn't really going to do long term, so we should make sure the service can run with a proper distributed architecture:
Tasks

[x] Add celery to the instances
[x] Add tasks for any sync jobs
[x] Add configuration to h-periodic to call the tasks
[x] Remove the local alternatives to this
[x] Attempt to tune the sizes and deployments to the traffic we see (we have two of the smallest instances we can, and it's totally overkill)

Done (mostly as work to get URLHaus working)


Allow BMO_SETUP to be disabled

This allows BMO_SETUP to be configurably disabled if it is set to false outside of the Makefile

recheck

recheck

recheck


Moving code for cache functions to utils file

[ ] I added CHANGELOG entry for this change.
[ ] Change is not relevant to the end user.

Changes
Moved code pertaining to the LRU Cache in the handler to a separate file for code clarity and to prevent conflicts upstream. This is a fast follow on https://github.com/databricks/thanos/pull/40
Verification
I used the same testing process as in the original pull request.

Can you paste the command of running the new unit test?


Warning message of "count_A1" was not set

Hello,
Thanks for sharing this package. I'm trying to use it, and when I run either the example codes (https://sibreg.readthedocs.io/en/master/tutorial.html) or run impute_runner.py using my own data, I encountered the following warning. I guess this may not affect the result, but I would like to double check with you.
Thank you very much!
Here is the warning message:
/.local/lib/python3.8/site-packages/pysnptools-0.4.11-py3.8-linux-x86_64.egg/pysnptools/snpreader/bed.py:45: FutureWarning: 'count_A1' was not set. For now it will default to 'False', but in the future it will default to 'True'
  warnings.warn("'count_A1' was not set. For now it will default to 'False', but in the future it will default to 'True'", FutureWarning)

PS: there's a typo in your installation instruction on the main Github page 'python setupy.py install' should be python setup.py install
Josh

Hi Josh,
Thanks for your email and feedback. The warning message is not important --
it is a warning from Pysnptools which is used to read .bed files, but it
doesn't affect the outcome.
Please let me know if you have any other feedback.
Alex.
On Thu, 16 Jul 2020 at 07:49, Josh<EMAIL_ADDRESS>wrote:

Hello,
Thanks for sharing this package. I'm trying to use it, and when I run
either the example codes (
https://sibreg.readthedocs.io/en/master/tutorial.html) or run
impute_runner.py using my own data, I encountered the following warning.
I guess this may not affect the result, but I would like to double check
with you.
Thank you very much!
Here is the warning message:
/.local/lib/python3.8/site-packages/pysnptools-0.4.11-py3.8-linux-x86_64.egg/pysnptools/snpreader/bed.py:45: FutureWarning: 'count_A1' was not set. For now it will default to 'False', but in the future it will default to 'True'
warnings.warn("'count_A1' was not set. For now it will default to 'False', but in the future it will default to 'True'", FutureWarning)
PS: there's a typo in your installation instruction on the main Github
page 'python setupy.py install' should be python setup.py install
Josh
—
You are receiving this because you are subscribed to this thread.
Reply to this email directly, view it on GitHub
https://github.com/AlexTISYoung/SNIPar/issues/1, or unsubscribe
https://github.com/notifications/unsubscribe-auth/ABQQS6LS5LJC7B7BHEANENLR34HPFANCNFSM4O4MJNSA
.

Ok, thanks!


Consider adding a bot to help maintain minor dependency bumps

Maybe something like https://github.com/marketplace/renovate? @roblafeve what do you think?

I love this. Do it.

@blaketarter I've added it to this repo. Not sure what the next steps are from here. Let me know 👍

@roblafeve Awesome I'll work on getting it configured!


CB-8311 - Ranger authorizer should be enabled for datahub clusters

Describe the change you are making here!
CB-5949 Adds ranger authorization support for requests flowing through Knox. This only works for SDX cluster and not for DistroX clusters. This is because the logic to enable ranger authorizer checks if Ranger is installed and ranger is not installed on DistroX clusters but rather installed in SDX cluster. This PR proposes eliminating condition that checks whether ranger is installed on the cluster. By default all public cloud clusters have Ranger installed so this change will not affect any functionality.
Testing
This patch was locally tested (tested to see that the topology file is generated correctly)

@moresandeep can you please rebase your branch on top of master?

@moresandeep can you please rebase your branch on top of master?

Sure, just rebased my changes.


SVProgressHUD crash

[AppDelegate window]: unrecognized selector sent to instance 0x7fae1170f3d0 2016-06-20 16:20:02.331  App[36148:4829956] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[AppDelegate window]: unrecognized selector sent to instance 0x7fae1170f3d0' *** First throw call stack: (     0   CoreFoundation                      0x00000001099c2d85 __exceptionPreprocess + 165     1   libobjc.A.dylib                     0x0000000109436deb objc_exception_throw + 48     2   CoreFoundation                      0x00000001099cbd3d -[NSObject(NSObject) doesNotRecognizeSelector:] + 205     3   CoreFoundation                      0x0000000109911b17 ___forwarding___ + 487     4   CoreFoundation                      0x00000001099118a8 _CF_forwarding_prep_0 + 120     5   App                           0x0000000105b9857e __27+[SVProgressHUD sharedView]_block_invoke + 126     6   libdispatch.dylib                   0x000000010a5b63eb _dispatch_client_callout + 8     7   libdispatch.dylib                   0x000000010a5a1d68 dispatch_once_f + 543     8   App                           0x0000000105b984d8 +[SVProgressHUD sharedView] + 136     9   App                           0x0000000105b98f37 +[SVProgressHUD showWithStatus:] + 55     10  App                           0x00000001059f9d6d -[ApplicatoinInfoView copyUgdid] + 253     11  UIKit                               0x0000000107fdab28 _UIGestureRecognizerSendTargetActions + 153     12  UIKit                               0x0000000107fd719a _UIGestureRecognizerSendActions + 162     13  UIKit                               0x0000000107fd5197 -[UIGestureRecognizer _updateGestureWithEvent:buttonEvent:] + 843     14  UIKit                               0x0000000107fdd655 ___UIGestureRecognizerUpdate_block_invoke898 + 79     15  UIKit                               0x0000000107fdd4f3 _UIGestureRecognizerRemoveObjectsFromArrayAndApplyBlocks + 342     16  UIKit                               0x0000000107fcae75 _UIGestureRecognizerUpdate + 2634     17  UIKit                               0x0000000107b5748e -[UIWindow _sendGesturesForEvent:] + 1137     18  UIKit                               0x0000000107b586c4 -[UIWindow sendEvent:] + 849     19  UIKit                               0x0000000107b03dc6 -[UIApplication sendEvent:] + 263     20  UIKit                               0x0000000107add553 _UIApplicationHandleEventQueue + 6660     21  CoreFoundation                      0x00000001098e8301 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 17     22  CoreFoundation                      0x00000001098de22c __CFRunLoopDoSources0 + 556     23  CoreFoundation                      0x00000001098dd6e3 __CFRunLoopRun + 867     24  CoreFoundation                      0x00000001098dd0f8 CFRunLoopRunSpecific + 488     25  GraphicsServices                    0x000000010bf61ad2 GSEventRunModal + 161     26  UIKit                               0x0000000107ae2f09 UIApplicationMain + 171     27  App                           0x0000000105a0377f main + 111     28  libdyld.dylib                       0x000000010a5ea92d start + 1 ) libc++abi.dylib: terminating with uncaught exception of type NSException
I'm running on cocoapods 1.0.1 can you help with this issue??

Try to clean build folder first

Resolve this by removing derived data and resetting simulator.
P.S.: Next time reformat the crashlog so it is readable.

@jfk056 . It will work for you.
var window: UIWindow?

Add this line in AppDelegate

Hi @mehulparmar4ever
Your comment helped run it. However, the frame of SVProgressHUD/IHProgressHUD is the top left corner of the screen.
What could be the reason?
What could be the solution, other than manually setting up the frame?

Hi @iampushpinder ,
#Try 1:
Go to SceneDelegate.swift file and open below method & add one line of code to update window of scene. So, Your problem will resolved.

    var window: UIWindow?
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
        // Use this method to optionally configure and attach the UIWindow `window` to the provided UIWindowScene `scene`.
        // If using a storyboard, the `window` property will automatically be initialized and attached to the scene.
        // This delegate does not imply the connecting scene or session are new (see `application:configurationForConnectingSceneSession` instead).
        guard let _ = (scene as? UIWindowScene) else { return }
        (UIApplication.shared.delegate as! AppDelegate).window = window
    }

#TRY 2
Use this type of code in your app-delegate. It means you have to set proper navigation

_In AppDelegate.swift file,_
    var window: UIWindow?
func navigateToTabBar() {
        let tabController = Constants_Feez.mainStoryboard.instantiateViewController(withIdentifier: "tabController")
        self.window?.rootViewController = tabController

        // A mask of options indicating how you want to perform the animations.
        let options: UIView.AnimationOptions = .transitionCrossDissolve

        // The duration of the transition animation, measured in seconds.
        let duration: TimeInterval = 0.3

        // Creates a transition animation.
        // Though `animations` is optional, the documentation tells us that it must not be nil. ¯\_(ツ)_/¯
        guard let window = self.window else {
            return
        }

        UIView.transition(with: window, duration: duration, options: options, animations: {}, completion:
        { completed in
            // maybe do something on completion here
        })
    }

    func navigateToSignUp() {
        let tabController = Constants_Feez.mainStoryboard.instantiateViewController(withIdentifier: "signUpProcess")
        self.window?.rootViewController = tabController

        // A mask of options indicating how you want to perform the animations.
        let options: UIView.AnimationOptions = .transitionCrossDissolve

        // The duration of the transition animation, measured in seconds.
        let duration: TimeInterval = 0.3

        // Creates a transition animation.
        // Though `animations` is optional, the documentation tells us that it must not be nil. ¯\_(ツ)_/¯
        guard let window = self.window else {
            return
        }

        UIView.transition(with: window, duration: duration, options: options, animations: {}, completion:
        { completed in
            // maybe do something on completion here
        })
    }

Hi @iampushpinder ,
#Try 1:
Go to SceneDelegate.swift file and open below method & add one line of code to update window of scene. So, Your problem will resolved.

    var window: UIWindow?
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
        // Use this method to optionally configure and attach the UIWindow `window` to the provided UIWindowScene `scene`.
        // If using a storyboard, the `window` property will automatically be initialized and attached to the scene.
        // This delegate does not imply the connecting scene or session are new (see `application:configurationForConnectingSceneSession` instead).
        guard let _ = (scene as? UIWindowScene) else { return }
        (UIApplication.shared.delegate as! AppDelegate).window = window
    }

#TRY 2
Use this type of code in your app-delegate. It means you have to set proper navigation

_In AppDelegate.swift file,_
    var window: UIWindow?
func navigateToTabBar() {
        let tabController = Constants_Feez.mainStoryboard.instantiateViewController(withIdentifier: "tabController")
        self.window?.rootViewController = tabController

        // A mask of options indicating how you want to perform the animations.
        let options: UIView.AnimationOptions = .transitionCrossDissolve

        // The duration of the transition animation, measured in seconds.
        let duration: TimeInterval = 0.3

        // Creates a transition animation.
        // Though `animations` is optional, the documentation tells us that it must not be nil. ¯\_(ツ)_/¯
        guard let window = self.window else {
            return
        }

        UIView.transition(with: window, duration: duration, options: options, animations: {}, completion:
        { completed in
            // maybe do something on completion here
        })
    }

    func navigateToSignUp() {
        let tabController = Constants_Feez.mainStoryboard.instantiateViewController(withIdentifier: "signUpProcess")
        self.window?.rootViewController = tabController

        // A mask of options indicating how you want to perform the animations.
        let options: UIView.AnimationOptions = .transitionCrossDissolve

        // The duration of the transition animation, measured in seconds.
        let duration: TimeInterval = 0.3

        // Creates a transition animation.
        // Though `animations` is optional, the documentation tells us that it must not be nil. ¯\_(ツ)_/¯
        guard let window = self.window else {
            return
        }

        UIView.transition(with: window, duration: duration, options: options, animations: {}, completion:
        { completed in
            // maybe do something on completion here
        })
    }

@mehulparmar4ever thanks bro u saved me. great job.

let appDelegate = UIApplication.shared.delegate as! AppDelegate
appDelegate.window = self.window this would work if  the frame of SVProgressHUD/IHProgressHUD is the top left corner of the screen.

Hi @iampushpinder ,
#Try 1:
Go to SceneDelegate.swift file and open below method & add one line of code to update window of scene. So, Your problem will resolved.

    var window: UIWindow?
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
        // Use this method to optionally configure and attach the UIWindow `window` to the provided UIWindowScene `scene`.
        // If using a storyboard, the `window` property will automatically be initialized and attached to the scene.
        // This delegate does not imply the connecting scene or session are new (see `application:configurationForConnectingSceneSession` instead).
        guard let _ = (scene as? UIWindowScene) else { return }
        (UIApplication.shared.delegate as! AppDelegate).window = window
    }

#TRY 2
Use this type of code in your app-delegate. It means you have to set proper navigation

_In AppDelegate.swift file,_
    var window: UIWindow?
func navigateToTabBar() {
        let tabController = Constants_Feez.mainStoryboard.instantiateViewController(withIdentifier: "tabController")
        self.window?.rootViewController = tabController

        // A mask of options indicating how you want to perform the animations.
        let options: UIView.AnimationOptions = .transitionCrossDissolve

        // The duration of the transition animation, measured in seconds.
        let duration: TimeInterval = 0.3

        // Creates a transition animation.
        // Though `animations` is optional, the documentation tells us that it must not be nil. ¯\_(ツ)_/¯
        guard let window = self.window else {
            return
        }

        UIView.transition(with: window, duration: duration, options: options, animations: {}, completion:
        { completed in
            // maybe do something on completion here
        })
    }

    func navigateToSignUp() {
        let tabController = Constants_Feez.mainStoryboard.instantiateViewController(withIdentifier: "signUpProcess")
        self.window?.rootViewController = tabController

        // A mask of options indicating how you want to perform the animations.
        let options: UIView.AnimationOptions = .transitionCrossDissolve

        // The duration of the transition animation, measured in seconds.
        let duration: TimeInterval = 0.3

        // Creates a transition animation.
        // Though `animations` is optional, the documentation tells us that it must not be nil. ¯\_(ツ)_/¯
        guard let window = self.window else {
            return
        }

        UIView.transition(with: window, duration: duration, options: options, animations: {}, completion:
        { completed in
            // maybe do something on completion here
        })
    }

Thanks! Saved a lot of time for me.


To consider pkg cutout

Description
To consider pkg cutout as bitbank api client  for go.

The package was cut out
https://github.com/bmf-san/bitbankgo


Fix trailing slash

Hi @florian-lefebvre, I believe I have found a fix for #24.
The problem was only ever happening on the root of a locale without a trailing slash.
F.ex. http://localhost:4322/fr.
So I remove the trailing slash in the middleware.

Funnily enough I think this caused #38 😆

Yeah that's likely, if you find how to fix it I take it :laughing:


Issue with /cfg on Multi-Server networks

GP Example: /cfg guardian enter-claim any true
If I do /lp user DeathVirus parent add guardian Pixelmon it won't let me enter the claim  (http://prntscr.com/efzror)
if I do /lp user DeathVirus parent add guardian (No server argument) it will (http://prntscr.com/efzrtm)
Brought this up in the discord, Phit was able to replicate the issue.

lp verbose when entering the claim https://gist.github.com/phit/b703a8e1065bb37f71edd64a3d2522b7
lp check returns false when inside the claim http://i.imgur.com/EAysjtR.png


Disable participation query after first answer

You've recently added this question when we start up nuxt servers
NuxtJS collects completely anonymous data about usage.
  This will help us improving Nuxt developer experience over the time.
  Read more on https://git.io/nuxt-telemetry

? Are you interested in participation? (Y/n)

I selected yes. Then the following day start my server and I'm asked again. This is very annoying, please fix.

It should be fixed, otherwise you can always set it in your nuxt.config.js:
export default {
  telemetry: true // or false
}

It does work for me. I launch nuxt directly inside a express by calling app.use(nuxt.render) as in this example:
https://github.com/svitekpavel/nuxtjs-express-typescript
I worked around it by adding NUXT_TELEMETRY_DISABLED=1 or  NUXT_TELEMETRY_ENABLED=1 in my package.json script entries.

@Atinux @JR-Utily
I tried your options and my program goes into an eternal loop with these messages:
PS ...> npm run dev

><EMAIL_ADDRESS>dev
> cross-env NODE_ENV=development NUXT_TELEMETRY_DISABLED=1 nodemon api/index.js --watch server

[nodemon] 2.0.19
[nodemon] to restart at any time, enter `rs`
[nodemon] watching path(s): server
[nodemon] watching extensions: js,mjs,json
[nodemon] starting `node api/index.js`
i Preparing project for development                                                                                19:38:50
i Initial build may take a while                                                                                19:38:50
i Preparing project for development                                                                                19:38:51
i Initial build may take a while                                                                                19:38:51
i Preparing project for development                                                                                19:38:51
i Initial build may take a while                                                                                19:38:51
i Preparing project for development                                                                                19:38:51
i Initial build may take a while                                                                                19:38:51
i Preparing project for development                                                                                19:38:51
i Initial build may take a while                                                                                19:38:51
i Preparing project for development                                                                                19:38:51
i Initial build may take a while                                                                                19:38:51
i Preparing project for development
...

How do I fix this and solve the issue?

Incidentally, when using npm, if you select n, it just keeps asking you. This is on a fresh  npx nuxi init <project> install today. Did that, cd'd into the project dir, and did npm install. I can post this elsewhere if this isn't the right spot.
ubuntu 22.04 on windows 11 WSL
node 19.3.0
npm 9.2.0
nuxi 3.0.0
nuxt 3.0.0
@nuxt/telemetry 2.1.8

me@host:~/kairios/front-end$ npm install
npm WARN deprecated<EMAIL_ADDRESS>Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility
npm WARN deprecated<EMAIL_ADDRESS>This package has been deprecated and is no longer maintained. Please use @rollup/plugin-terser
npm WARN deprecated<EMAIL_ADDRESS>Please use @jridgewell/sourcemap-codec instead

> postinstall
> nuxt prepare

Nuxi 3.0.0                                                                                11:37:30
                                                                                11:37:31
ℹ Nuxt collects completely anonymous data about usage.                                                                                11:37:31
  This will help us improve Nuxt developer experience over time.
  Read more on https://github.com/nuxt/telemetry

                                                                                11:37:31
? Are you interested in participating? (Y/n)                                                                                11:37:31
                                                                                11:37:31

                                   11:37:31
                                                                                11:37:38
? Are you interested in participating? (Y/n) n                                                                                11:37:38
                                                                                11:37:38

                                    11:37:38
                                                                                11:37:42
? Are you interested in participating? (Y/n) nn                                                                                11:37:42
                                                                                11:37:42

                                     11:37:42
                                                                                11:37:45
? Are you interested in participating? (Y/n) n                                                                                11:37:45
                                                                                11:37:45

                                    11:37:45
                                                                                11:37:46
? Are you interested in participating? (Y/n) nn                                                                                11:37:46
                                                                                11:37:46

                                     11:37:46

{ I did ctrl+c at this point }

npm ERR! code 130
npm ERR! path /home/phil/kairios/front-end
npm ERR! command failed
npm ERR! command sh -c nuxt prepare

npm ERR!


Wallet actor does not follow ADR006

Wallet actor has a connection to electrum via BDK
If that connection fails, we should restart the wallet through a supervisor
For that, the actor-design needs to follow the RAII pattern outlined in ADR006

This should fix https://github.com/itchysats/itchysats/issues/797.

This project is unmaintained


CA Certificate identifier default

In #182 this was updated to be rds-ca-2019. Unfortunately in GovCloud, there is a single option and it is for rds-ca-2017.
This should handle selecting the 2019 version for non-govcloud and 2017 for govcloud.
Screenshot from console:

Pretty sure I missed a configuration var in this. So unlikely to be an issue.


Raport logo will now work offline 🖼✈

Hi!,
it's me again....
I changed logo to be downloaded and parsed into base64 during raport generation so the raport will also work offline 😎
I also added an exception for raport if curl couldnt be generated (i had this issue with testing my localhost)

Hey,
It will be better to embed the base64 right into the HTML template so it's always just part of the code instead of downloading it I think.

That's the change :D

I mean i wnated the logo to be changeable but i can also make ot hardcoded if you want, or make it as a flag. For exaple flag -l / --logo is present the logo will be downloaded istead of hardcoded. What do you think?

Done 🥳

I can also move it to seperate file like logo.py so the utils wont look so messy...


diaPasef: No objects to concatenate

Describe the bug
When analyzing phospho-enriched diaPASEF data using a Spectronaut TSV spectral library, AlphaDIA fails with "No objects to concatenate" error during the search. The analysis works for Orbitrap QEHF-X data with similar libraries but fails specifically for diaPASEF data. This is the case on the "main" and "development" branch (v1.8.2.) I've already tried the solutions from previous discussions on this issue, but they haven't resolved the problem.
To Reproduce
AlphaDIA_Log_Tims_diaPasef_NO_OBJ_TO_CONCAT_ERROR.txt
config_yaml.txt
test.spectronaut.csv
system:
Linux thestral 6.1.0-21-amd64 1 SMP PREEMPT_DYNAMIC Debian 6.1.90-1 (2024-05-03) x86_64 GNU/Linux

Thank you for submitting the bug! This should be addressable quickly.
Searching large libraries is currently not a supported use case and it might take some time to search though.

@GeorgWa
Thank you for your response.
I have some follow-up questions to better understand the limitations:

Could you clarify what constitutes a "large" library in this context? My current library contains approximately 5 million target precursors.

I've successfully used larger libraries with non-timsTOF PaSEF data in the past (50M-20M target precursors). Does this mean those results might be unreliable since searching large libraries isn't a supported use case?


chrome policy update

Hi im following this tutorial
according to tutorial here is my config

here is my policies.json @ /opt/neko-rooms/data/templates/policies.json
  "HomepageLocation": "my def domain",   "AutoFillEnabled": false,   "AutofillAddressEnabled": false,   "AutofillCreditCardEnabled": false,   "BrowserSignin": 0,   "DefaultNotificationsSetting": 2,   "DeveloperToolsAvailability": 2,   "EditBookmarksEnabled": false,   "FullscreenAllowed": true,   "IncognitoModeAvailability": 1,   "SyncDisabled": true,   "AutoplayAllowed": true,   "BrowserAddPersonEnabled": false,   "BrowserGuestModeEnabled": false,   "DefaultPopupsSetting": 2,   "DownloadRestrictions": 0,   "VideoCaptureAllowed": false,   "AllowFileSelectionDialogs": false,   "PromptForDownloadLocation": true,   "BookmarkBarEnabled": false,   "PasswordManagerEnabled": false,   "URLBlacklist": [   ],   "ExtensionInstallForcelist": [       "lpcaedmchfhocbbapmcbpinfpgnhiddi;https://clients2.google.com/service/update2/crx",       "cjpalhdlnbpafiamejdnhcphjbkeiagm;https://clients2.google.com/service/update2/crx",       "fjoaledfpmneenckfbpdfhkmimnjocfa;https://clients2.google.com/service/update2/crx"   ],   "ExtensionInstallWhitelist": [       "lpcaedmchfhocbbapmcbpinfpgnhiddi",       "cjpalhdlnbpafiamejdnhcphjbkeiagm",       "fjoaledfpmneenckfbpdfhkmimnjocfa"   ],   "ExtensionInstallBlacklist": [       "*"   ] }
iv manually copied same file to /opt/neko-rooms/data/faik which is my room name. for some reason it wasnt auto created
here is my .env
NEKO_ROOMS_EPR=59000-59100
NEKO_ROOMS_TRAEFIK_DOMAIN=neko.oemnavigations.net
NEKO_ROOMS_TRAEFIK_ENTRYPOINT=websecure
NEKO_ROOMS_TRAEFIK_NETWORK=neko-rooms-traefik
NEKO_ROOMS_TRAEFIK_CERTRESOLVER=lets-encrypt
NEKO_ROOMS_NEKO_IMAGES=m1k1o/neko:firefox m1k1o/neko:chromium m1k1o/neko:google-chrome m1k1o/neko:vlc m1k1o/neko:xfce m1k1o/neko:tor-browser
NEKO_ROOMS_MOUNTS_WHITELIST="/home /media /opt/neko-rooms/data/templates/ /etc/opt/chrome/policies/managed/policies.json"
here is my docker-compose.yml
version: "3.5"
networks:
default:
attachable: true
name: "${NEKO_ROOMS_TRAEFIK_NETWORK}"
services:
traefik:
image: "traefik:2.4"
restart: "unless-stopped"
environment:
- "TZ"
ports:
- target: 80
published: 80
protocol: "tcp"
mode: "host"
- target: 443
published: 443
protocol: "tcp"
mode: "host"
volumes:
- "/var/run/docker.sock:/var/run/docker.sock:ro"
- "./traefik.yml:/etc/traefik/traefik.yml:ro"
- "./usersfile:/usersfile:ro"
- "./acme.json:/acme.json"
- "./config:/config"
neko-rooms:
image: "m1k1o/neko-rooms:latest"
restart: "unless-stopped"
environment:
- "NEKO_ROOMS_STORAGE_ENABLED=true"
- "NEKO_ROOMS_STORAGE_INTERNAL=/data"
- "NEKO_ROOMS_STORAGE_EXTERNAL=/opt/neko-rooms/data"
env_file:
- ".env"
volumes:
- "/var/run/docker.sock:/var/run/docker.sock"
- "/opt/neko-rooms/data:/data"
labels:
- "traefik.enable=true"
- "traefik.http.services.neko-rooms-frontend.loadbalancer.server.port=8080"
- "traefik.http.routers.neko-rooms.entrypoints=${NEKO_ROOMS_TRAEFIK_ENTRYPOINT}"
- "traefik.http.routers.neko-rooms.rule=Host(${NEKO_ROOMS_TRAEFIK_DOMAIN})"
- "traefik.http.routers.neko-rooms.tls=true"
- "traefik.http.routers.neko-rooms.tls.certresolver=${NEKO_ROOMS_TRAEFIK_CERTRESOLVER}"
- "traefik.http.routers.neko-rooms.middlewares=basicauth@file"
PROBLEM
if you see in config iv removed the default policy page and file path restriction from .docker folder. im trying to let users download a file to my file system. aditionally i want to add my own set of extensions in the force install extensions. but for some reason its still picking up default policies.
any help is appreciated

hi. thanks for reply. im aware of white list. did that for testing.
yeah it was a mistake here. verified the file and its ok. but i thought for a second and questioned my self.
as for the policy path. im not native to linux. i was fiddling with paths. actually the path you gave above gives me an error like this

thanks for the reply

Sounds like you are mounting directory to a file. And it does not seem to be valid path /opt/neko-rooms/data/rooms/rrr1 seems like a private path not template you wanted to use. Can you check if thats correct?


Rendering bug on small spans in large spans

While using miette, I found a small but significant rendering bug in rendering arrows. The picture below shows what it looks like:

Of course, I can't just give you just that image to go on, so I made a minimal example:
#[derive(Error, Debug, Diagnostic)]
#[error("oops!")]
#[diagnostic(severity(Error))]
struct MyBad {
    #[source_code]
    src: NamedSource,
    #[label("big")]
    big: SourceSpan,
    #[label("small")]
    small: SourceSpan,
}
let err = MyBad {
    src: NamedSource::new("issue", "\
if true {
    a
} else {
    b
}"),
    big: (0, 32).into(),
    small: (14, 1).into(),
};
let out = fmt_report(err.into());
println!("Error: {}", out);

This prints:
r#"  × oops!
   ╭─[issue:1:1]
 1 │ ╭─▶ if true {
 2 │ │╭▶     a
   · ││    ┬
   · ││    ╰── small
 3 │ │   } else {
 4 │ │       b
 5 │ ├─▶ }
   · ╰──── big
   ╰────
"#

while I expected it to print:
r#"  × oops!
   ╭─[issue:1:1]
 1 │ ╭─▶ if true {
 2 │ │       a
   · │       ┬
   · │       ╰── small
 3 │ │   } else {
 4 │ │       b
 5 │ ├─▶ }
   · ╰──── big
   ╰────
"#

As you can see, this looks a bit like a test, which is exactly what I wrote and contributed as a pull request so the bug is reproducible. See #316.

I ended up also fixing the butg in #316 , the failing test I contributed now passes :)


Fix InsertStmt reAnalyze bug

SQL1:
insert into A
select
     cis_poi_id,
     cis_flag,
     cis_flag_id,
     dt,
     aor_id,
     aor_type,
     aor_id_last
from (
      select dt,
             cis_flag,
             cis_poi_id,
             1 as cis_flag_id,
             aor_id,
             1 as aor_type,
             1 as aor_id_last
        from B
       where dt in (20180710, 20180711)
     ) t
where t.dt=20180711 ;

SQL2:
insert into mart_waimai.dim_cis_poi_aor_change_d
select
     cis_poi_id,
     cis_flag,
     cis_flag_id,
     dt,
     aor_id,
     aor_type,
     aor_id_last
from (
      select dt,
             cis_flag,
             cis_poi_id,
             1 as cis_flag_id,
             1 as aor_id,
             1 as aor_type,
             1 as aor_id_last
        from topic_contest_poi_info_dd
       where dt between 20180710 and 20180711
     ) t
where t.dt=20180711 ;

The only difference for SQL1 and SQL2 is InPredicate and BetweenPredicate. The SQL1 will success , but the SQL2 will failed.
The cause is BetweenPredicate will Rewrite, but InsertStmt doesn't support rewrite.
The InsertStmt should support rewrite and we should simplify the code logic in StmtExecutor.

Update this commit.


Admob crashing on Amazon

I'm making a build for Amazon after a long time and the Admob plugin is crashing upon calling admob.init
I'm setting target app store to Amazon and running on a Fire tablet.
Stack trace:
ERROR: Runtime error
java.lang.NoClassDefFoundError: Failed resolution of: Lcom/google/android/gms/ads/RequestConfiguration$Builder;
Java Stack Trace:
plugin.admob.LuaLoader$Init.invoke(LuaLoader.java:563)
com.ansca.corona.JavaToNativeShim.nativeRender(Native Method)
com.ansca.corona.JavaToNativeShim.render(JavaToNativeShim.java:205)
com.ansca.corona.Controller.updateRuntimeState(Controller.java:364)
com.ansca.corona.graphics.opengl.CoronaGLSurfaceView$CoronaRenderer.onDrawFrame(CoronaGLSurfaceView.java:434)
com.ansca.corona.graphics.opengl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:1625)
com.ansca.corona.graphics.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.java:1380)
stack traceback:
[C]: in function 'init'
?: in function 'initialize'
?: in function '?'
?: in function '_listener'
?: in function '?'
?: in function <?:189>
Stack trace on Crashlytics:
Non-fatal Exception: java.lang.Exception: ?:0: attempt to index field '?' (a nil value)
at plugin.firebaseCrashlytics.LuaLoader$init$1.invoke(LuaLoader.java:225)
at com.ansca.corona.CoronaEnvironment.invokeLuaErrorHandler(CoronaEnvironment.java:434)
at com.ansca.corona.NativeToJavaBridge.callInvokeLuaErrorHandler(NativeToJavaBridge.java:306)
at com.ansca.corona.JavaToNativeShim.nativeRender(JavaToNativeShim.java)
at com.ansca.corona.JavaToNativeShim.render(JavaToNativeShim.java:205)
at com.ansca.corona.Controller.updateRuntimeState(Controller.java:364)
at com.ansca.corona.graphics.opengl.CoronaGLSurfaceView$CoronaRenderer.onDrawFrame(CoronaGLSurfaceView.java:434)
at com.ansca.corona.graphics.opengl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:1625)
at com.ansca.corona.graphics.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.java:1380)

Admob is not supported on Amazon due to Google Mobile Services not part of Fire OS.

Do you know exactly since when? Because I have a working version of my app on the Amazon store currently downloadable displaying Admob ads. Last updated in 2019.
Apparently it works if you include Google Play Services bundled into the app as a dependency.
Do you have any idea of how Google Services was included back then or if I use a very old version of the Admob plugin it would work?
I tried force including plugin.gpgs.v2 or plugin.gpgs on the buildsettings but it doesn't help.

If you have a device to try it on I can suggest a fix. Download this file into your AndroidResources. See how it goes.

Hi Vlad, yes it worked! Not crashing and ads being displayed. Thanks

Going to go ahead and close this since support is added in the newest verison of admob plugin


every_n_val_epochs -> every_n_epochs

What does this PR do?
Deprecate every_n_val_epochs in favor of every_n_epochs
Part of #7724
Does your PR introduce any breaking changes ? If yes, please list them.
None
Before submitting

[x] Was this discussed/approved via a GitHub issue? (not for typos and docs)
[x] Did you read the contributor guideline, Pull Request section?
[x] Did you make sure your PR does only one thing, instead of bundling different changes together?
[x] Did you make sure to update the documentation with your changes? (if necessary)
[x] Did you write any new necessary tests? (not for typos and docs)
[x] Did you verify new and existing tests pass locally with your changes?
[x] Did you update the CHANGELOG? (not for typos, docs, test updates, or internal minor changes/refactorings)
[x] Did you list all the breaking changes introduced by this pull request?

PR review

[x] Is this pull request ready for review? (if not, please submit in draft mode)
[x] Check that all items from Before submitting are resolved
[x] Make sure the title is self-explanatory and the description concisely explains the PR
[x] Add labels and milestones (and optionally projects) to the PR so it can be classified

Hello @carmocca! Thanks for opening this PR.

In the file pytorch_lightning/callbacks/model_checkpoint.py:

Line 294:13: W503 line break before binary operator

Do see the Hitchhiker's guide to code style

@carmocca why is every_n_epochs along with a boolean flag to save on train epoch end preferable to supporting two flags like every_n_val_epochs and every_n_train_epochs?
The latter allows us to adjust the checkpoint frequency separately for training and validation. The mutual exclusion check is something we could address in the callback implementation.

@ananthsub Is your question in the context that the user can set both save_on_train_epoch_end and save_on_validation_end? The current design only has the former which acts as a exclusive boolean already. So it is natural that the every_n_epochs flags follows the same pattern.
If there is a need to specify both, I think two ModelCheckpoint instances should be created. One with each boolean value, but not different flags.
Also this is seems better to avoid user confusion about the flag differnce

@carmocca it's more that as a user, users need to now know about the default behavior of save_on_train_epoch_end which is less explicit

When reading the code, there's ambiguity around ModelCheckpoint(every_n_epochs=...). Users need to check the default value for save_on_train_epoch_end to know when exactly end of epoch checkpoints are being saved
Same goes for writing the code: Users need to set either ModelCheckpoint(every_n_epochs=...) or ModelCheckpoint(every_n_epochs=..., save_on_train_epoch_end)which is less consistent thanModelCheckpoint(every_n_train_epochs=...)orModelCheckpoint(every_n_val_epochs=...)`

there's ambiguity around ModelCheckpoint(every_n_epochs=...). Users need to check the default value for save_on_train_epoch_end to know when exactly end of epoch checkpoints are being saved

You could also make a similar argument that the user would need to know if save_on_train_epoch_end=True is set with every_n_train_epochs=... or save_on_train_epoch_end=False is set with every_n_val_epochs=...

which is less consistent thanModelCheckpoint(every_n_train_epochs=...)orModelCheckpoint(every_n_val_epochs=...)`

Are you saying every_n_train_epochs would implicitly set save_in_train_epoch_end=True and the opposite for every_n_val_epochs?


add logs command to turbo CLI

Adds a 'logs' command providing the ability to review replay logs and hashes of previously-run tasks
Addresses dcherman's request from #822
I have been learning golang along the way so any feedback is appreciated!

Replay logs of most recently run tasks sorted by task execution:

List all hashes found in cache folder:

Replay logs of specific task hashes:

Replay last run's logs sorted by task duration from longest to shortest:

Replay last run's logs sorted by task start time and showing all metadata:

As list:

Related to #822
TODO:

[x] Add sort by start and end time

[x] Start time uses the time value used for calculating duration in run.go
[x] End time is calculated on demand from start + duration
[x] If --all, default sort to start time instead of alnum

[x] Refactor --list-format: rename to --include-metadata and allow multiple

[x] If --list, output as csv with header. Otherwise, output as info log at end of replay, one line per requested metadata point

[x] Include remote logs unnecessary because remote logs are fetched during run and it is impractical to fetch all remote logs just for this

I am liking this idea :)

@chelkyl can you say more about your use case for this command? I think we would like to avoid having hashes leak into the UX to the extent possible, so maybe there is another way to address the particular content you are interesting in replaying?

@gsoltis This command was to address dcherman's comment. The original request was for some way to view the logs that were hidden if you run with --output-logs=new-only. Over time, I expanded the scope to add some very minor task history querying capability, restrict output to the hashes you specify, show more data about the tasks, sort the output, and format the output.
I would understand if this isn't a compelling use case!

I can definitely see the utility in getting the logs for tasks that were run. I think the challenge is going to be in finding a good way to address them.
I like the idea of tracking recent runs. That could tie in nicely with eventual better management of the cache. I also like the idea of supplying the same arguments to turbo logs that were supplied to turbo run, along with the particular tasks of interest (web#build, api#test, etc.) to replay those logs, or an appropriate message on a cache miss.

Agreed! The hash seemed to be the best solution, especially because the cached log folders are named by their hash.
However, it would be great to support task names (in addition to hashes?), since I could include task globbing.
How do you think task names support should be implemented? My initial thought is to add another file like the last run log that is just a JSON file mapping task name to hash that is only added to during turbo run.

I think having each turbo run produce a manifest would be a good idea, and I think @nathanhammond was interested in something like that as well. Maybe the way to go about this is to start an RFC for what that file should look like, and then the logs command would read those to find log files?

Heya @chelkyl! @gsoltis is 100% correct about my opinion. I believe that each run should produce a unique identifier that can be used to go back and look up what happened. Conceptually, turbo run => ID => look up individual task logs and caches. In my imagination all of the identifiers would be opaque hashes, possibly excepting some (ignored) portion of the identifier for the run that encodes the start time, or a specified name. (Time would only be for monotonic sorting on a single box, not for absolute time. Any name would just be a human-readable prefix/suffix. Both would be ignored by the program.)

I see! I hadn't even considered uniquely identifying, storing, and isolating each turbo run call.
How would the id hash be generated? Would it be a hash on all of the tasks or their hashes for that run?

@chelkyl If we aren't using it for a cache hit, which I think we wouldn't be, you could use a uuid. A nice-to-have feature would be something easily time-sortable.

This one's looking a little stale, folks. Seeing as we're nearly complete with our Rust port, I'm going to close this out as this would shortly end up being deleted code if it were to land.


Add Support for Swaps

User has requested the following:

Track pancakeswap pair prices (similar to https://medium.com/@tokentools)
They will be renting a BSC node, need to plug their RPC endpoint into the bot for retrieving data

This is going to be amazing!

Fetch data from: https://nodereal.io/api-marketplace/pancakeswap-graphql

This has been moved to a dedicated repository (bot) where only decentralized exchanges will be tracked.
Work in progress: https://github.com/hschickdevs/Telegram-DeFi-Price-Alerts


will this code be executed?

in tree.insertChild, will this code be executed? if will please tell me the condition.
 `else { // catchAll
		if end != max || numParams > 1 {
			panic("catch-all routes are only allowed at the end of the path in path '" + fullPath + "'")
		}

		if len(n.path) > 0 && n.path[len(n.path)-1] == '/' {
			panic("catch-all conflicts with existing handle for the path segment root in path '" + fullPath + "'")
		}

		// currently fixed width 1 for '/'
		fmt.Println(offset, i, end, "else")
		i--
		if path[i] != '/' {
			panic("no / before catch-all in path '" + fullPath + "'")
		}

		n.path = path[offset:i]

		// first node: catchAll node with empty path
		child := &node{
			wildChild: true,
			nType:     catchAll,
			maxParams: 1,
		}
		n.children = []*node{child}
		n.indices = string(path[i])
		n = child
		n.priority++

		// second node: node holding the variable
		child = &node{
			path:      path[i:],
			nType:     catchAll,
			maxParams: 1,
			handle:    handle,
			priority:  1,
		}
		n.children = []*node{child}

		return
	}`

It will be inserted every time you insert a catch-all parameter.

thanks i got it


Question: predicted value will change a lot if I add constant or multiply constant to the features

Hi there,
I'm working on a regression problem with lightGBM 2.2.3, and I encountered a weird issue:
If I add a constant or multiply a positive constant to all features, the predicted value would also change a lot. This doesn't make sense to me given that objective = regression; boosting_type = gbdt; no lambda_l1 or lambda_l2。
In my opinion, the above operation shouldn't impact the histogram, the split point; also if we plug in the sum_gradient / (sum_hessian + lambda) formula, the leaf value shouldn't change either.
Any thoughts would be greatly appreciated!

Thanks very much for using LightGBM!
Can you please provide a reproducible example, some self-contained code that maintainers could run to understand exactly what you are doing? Without that, you are asking us to guess what your code is doing (for example, you are asking us to guess what "a lot" means), which will delay the time it takes to resolve this issue and pull maintainers' limited attention away from other parts of the project.
I think your expectation is correct, that scaling your features should generally not be required, but there are many caveats to that and I can't give a more specific answer without seeing your specific code.

Hi @aBeginner666, thanks for using LightGBM. LightGBM will discretize the features before training. With feature values being added to or multiplied by a constant, the discretization process can be influenced, but a big change in the prediction values is not expected. Could you please provide an example to demonstrate your case? Thanks.

Hi James/Shiyu,
Thanks a lot for providing info. Please see the below toy code, the real application has more weird distributions of features.
It seems that if I get rid of the rounding, the issue would disappear; and if I use rounding, and scale the feature down a bit, though the MSE didn't change much, the Y_pred would change considerably in terms of percentage. I think roudning would cause some slight change, e.g., 1% or 5%, but it doesn't make sense to me if Y_pred could change like 50%. Thanks!
np.random.seed(1234)
Y = (np.random.rand(1000000) - 0.5) / 1000.
X = np.random.rand(1000000, 100)
X_train = X[:800000]
Y_train = Y[:800000]
X_test = X[800000:]
Y_test = Y[800000:]
params = {
'task': 'train',
'boosting_type': 'gbdt',
'objective': 'regression',
'num_threads': 10,
'verbose': -1
}
lgb_train = lgb.Dataset(np.round(X_train, 7), Y_train)
gbm = lgb.train(params, lgb_train)
Y_pred = gbm.predict(np.round(X_test, 7))
print("MSE: ", np.mean(np.power(Y_pred - Y_test, 2)))
lgb_train2 = lgb.Dataset(np.round(X_train / 10., 7), Y_train)
gbm2 = lgb.train(params, lgb_train2)
Y_pred2 = gbm2.predict(np.round(X_test  / 10., 7))
print("MSE: ", np.mean(np.power(Y_pred2 - Y_test, 2)))
print("Diff pct: ", np.round((Y_pred - Y_pred2) / Y_pred2 * 100, 2))

Thanks very much, taking a look at this right now.
By the way, I've edited your comment to use code formatting from GitHub, so it is easier to read. In case you are not familiar with how to do this on GitHub, please see https://docs.github.com/en/github/writing-on-github/getting-started-with-writing-and-formatting-on-github/basic-writing-and-formatting-syntax.

Ok @aBeginner666 , I believe I know what's happening here!
Running a modified version of the code you provided, with the latest version of lightgbm installed from master (as of the most recent commit, https://github.com/microsoft/LightGBM/commit/ec1debcee84e6b02f749282d9a501021370e74a9), I was able to reproduce the behavior you observed, where the predictions differ by a larger amount in percentage terms.
code (click me)
import numpy as np
import lightgbm as lgb

random_seed = 1234
total_rows = 10_000
train_rows = 8_000

np.random.seed(random_seed)

Y = (np.random.rand(total_rows) - 0.5) / 1000.
X = np.random.rand(total_rows, 100)
X_train = X[:train_rows]
Y_train = Y[:train_rows]
X_test = X[train_rows:]
Y_test = Y[train_rows:]

params = {
      'task': 'train',
      'boosting_type': 'gbdt',
      'objective': 'regression',
      'num_threads': 10,
      'verbose': 1,
      'random_state': random_seed,
      'deterministic': True
}

# no scaling
lgb_train = lgb.Dataset(np.round(X_train, 7), Y_train)
gbm = lgb.train(params, lgb_train)
Y_pred = gbm.predict(np.round(X_test, 7))
print("MSE: ", np.mean(np.power(Y_pred - Y_test, 2)))

# divide all features by 10
lgb_train2 = lgb.Dataset(np.round(X_train / 10., 7), Y_train)
gbm2 = lgb.train(params, lgb_train2)
Y_pred2 = gbm2.predict(np.round(X_test / 10., 7))
print("MSE: ", np.mean(np.power(Y_pred2 - Y_test, 2)))

# multiply all features by 10
lgb_train3 = lgb.Dataset(np.round(X_train * 10., 7), Y_train)
gbm3 = lgb.train(params, lgb_train3)
Y_pred3 = gbm3.predict(np.round(X_test * 10., 7))
print("MSE: ", np.mean(np.power(Y_pred3 - Y_test, 2)))

percent_differences = np.round((Y_pred - Y_pred2) / Y_pred2 * 100, 2)
print("Percentage differences (X divided by 10)")
print("  * median: ", np.median(percent_differences))
print("  * max: ", np.max(percent_differences))

percent_differences = np.round((Y_pred - Y_pred3) / Y_pred3 * 100, 2)
print("Percentage differences (X multiplied by 10)")
print("  * median: ", np.median(percent_differences))
print("  * max: ", np.max(percent_differences))

print("preds")
print(Y_pred)
print(Y_pred2)
print(Y_pred3)

logs (click me)

[LightGBM] [Warning] Auto-choosing col-wise multi-threading, the overhead of testing was 0.007233 seconds.
You can set force_col_wise=true to remove the overhead.
[LightGBM] [Info] Total Bins 25500
[LightGBM] [Info] Number of data points in the train set: 8000, number of used features: 100
[LightGBM] [Info] Start training from score 0.000000
MSE:  8.705721326032536e-08
[LightGBM] [Warning] Auto-choosing col-wise multi-threading, the overhead of testing was 0.005217 seconds.
You can set force_col_wise=true to remove the overhead.
[LightGBM] [Info] Total Bins 25500
[LightGBM] [Info] Number of data points in the train set: 8000, number of used features: 100
[LightGBM] [Info] Start training from score 0.000000
MSE:  8.709472033060872e-08
[LightGBM] [Warning] Auto-choosing col-wise multi-threading, the overhead of testing was 0.005125 seconds.
You can set force_col_wise=true to remove the overhead.
[LightGBM] [Info] Total Bins 25500
[LightGBM] [Info] Number of data points in the train set: 8000, number of used features: 100
[LightGBM] [Info] Start training from score 0.000000
MSE:  8.790623469039183e-08
Percentage differences (X divided by 10)

median:  -49.239999999999995
max:  682289.33
Percentage differences (X multiplied by 10)
median:  -46.1
max:  22608.09
preds
[-9.31665080e-05  6.60082757e-05 -7.63524038e-05 ... -2.54900077e-05
7.03237727e-05  3.45117887e-05]
[-1.00656321e-04  2.93146381e-05 -4.54363906e-05 ... -2.08277483e-05
1.51643736e-05  3.52420326e-05]
[-6.57935839e-05  1.56461275e-05  1.14967903e-05 ... -3.86299056e-05
-7.78827875e-06  3.34326779e-05]

I think that I see the issue. Your use of rounding in the example code is what is causing this difference. When I remove rounding, the predictions are identical regardless of multiplying or dividing features by a constant.
code (click me)
import numpy as np
import lightgbm as lgb

random_seed = 1234
total_rows = 10_000
train_rows = 8_000

np.random.seed(random_seed)

Y = (np.random.rand(total_rows) - 0.5) / 1000.
X = np.random.rand(total_rows, 100)
X_train = X[:train_rows]
Y_train = Y[:train_rows]
X_test = X[train_rows:]
Y_test = Y[train_rows:]

params = {
      'task': 'train',
      'boosting_type': 'gbdt',
      'objective': 'regression',
      'num_threads': 10,
      'verbose': 1,
      'random_state': random_seed,
      'deterministic': True
}

# no scaling
lgb_train = lgb.Dataset(X_train, Y_train)
gbm = lgb.train(params, lgb_train)
Y_pred = gbm.predict(X_test)
print("MSE: ", np.mean(np.power(Y_pred - Y_test, 2)))

# divide all features by 10
lgb_train2 = lgb.Dataset(X_train / 10., Y_train)
gbm2 = lgb.train(params, lgb_train2)
Y_pred2 = gbm2.predict(X_test / 10.)
print("MSE: ", np.mean(np.power(Y_pred2 - Y_test, 2)))

# multiply all features by 10
lgb_train3 = lgb.Dataset(X_train * 10., Y_train)
gbm3 = lgb.train(params, lgb_train3)
Y_pred3 = gbm3.predict(X_test * 10.)
print("MSE: ", np.mean(np.power(Y_pred3 - Y_test, 2)))

percent_differences = np.round((Y_pred - Y_pred2) / Y_pred2 * 100, 2)
print("Percentage differences (X divided by 10)")
print("  * median: ", np.median(percent_differences))
print("  * max: ", np.max(percent_differences))

percent_differences = np.round((Y_pred - Y_pred3) / Y_pred3 * 100, 2)
print("Percentage differences (X multiplied by 10)")
print("  * median: ", np.median(percent_differences))
print("  * max: ", np.max(percent_differences))

print("preds")
print(Y_pred)
print(Y_pred2)
print(Y_pred3)

logs (click me)

[LightGBM] [Warning] Auto-choosing col-wise multi-threading, the overhead of testing was 0.007441 seconds.
You can set force_col_wise=true to remove the overhead.
[LightGBM] [Info] Total Bins 25500
[LightGBM] [Info] Number of data points in the train set: 8000, number of used features: 100
[LightGBM] [Info] Start training from score 0.000000
MSE:  8.790842276184981e-08
[LightGBM] [Warning] Auto-choosing col-wise multi-threading, the overhead of testing was 0.005851 seconds.
You can set force_col_wise=true to remove the overhead.
[LightGBM] [Info] Total Bins 25500
[LightGBM] [Info] Number of data points in the train set: 8000, number of used features: 100
[LightGBM] [Info] Start training from score 0.000000
MSE:  8.790842276184981e-08
[LightGBM] [Warning] Auto-choosing col-wise multi-threading, the overhead of testing was 0.015088 seconds.
You can set force_col_wise=true to remove the overhead.
[LightGBM] [Info] Total Bins 25500
[LightGBM] [Info] Number of data points in the train set: 8000, number of used features: 100
[LightGBM] [Info] Start training from score 0.000000
MSE:  8.790842276184981e-08
Percentage differences (X divided by 10)

median:  0.0
max:  -0.0
Percentage differences (X multiplied by 10)
median:  0.0
max:  -0.0
preds
[-6.57937326e-05  1.56459788e-05  1.14966416e-05 ... -3.86300542e-05
-7.78842743e-06  3.34325292e-05]
[-6.57937326e-05  1.56459788e-05  1.14966416e-05 ... -3.86300542e-05
-7.78842743e-06  3.34325292e-05]
[-6.57937326e-05  1.56459788e-05  1.14966416e-05 ... -3.86300542e-05
-7.78842743e-06  3.34325292e-05]

So said another way, you are losing some information by rounding, and that makes the results not quite comparable to each other because the training data in the different cases are genuinely different, not just scaled versions of the same data.
round(x / 10, 7) is not the same as round(x, 7) / 10.
x = 5.123456789

round(x / 10, 7)
# 0.5123457

round(x, 7) / 10
# 0.5123456799999999

These differences matter for totally-random data.
To confirm that multiplying all features by a constant does not change the predictions, you could also try the sample code below using scikit-learn's make_regression(), which generates features that are correlated with the target.
code (click me)
import numpy as np
import lightgbm as lgb
from sklearn.datasets import make_regression
from sklearn.model_selection import train_test_split

random_seed = 1234

total_rows = 10_000
train_rows = 8_000

X, Y = make_regression(n_samples=total_rows, n_features=10, n_informative=10, random_state=random_seed)
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.2, random_state=random_seed)

params = {
      'task': 'train',
      'boosting_type': 'gbdt',
      'objective': 'regression',
      'num_threads': 10,
      'verbose': 1,
      'random_state': random_seed,
      'deterministic': True
}

# no scaling
lgb_train = lgb.Dataset(X_train, Y_train)
gbm = lgb.train(params, lgb_train)
Y_pred = gbm.predict(X_test)
print("MSE: ", np.mean(np.power(Y_pred - Y_test, 2)))

# divide all features by 10
lgb_train2 = lgb.Dataset(X_train / 10., Y_train)
gbm2 = lgb.train(params, lgb_train2)
Y_pred2 = gbm2.predict(X_test / 10.)
print("MSE: ", np.mean(np.power(Y_pred2 - Y_test, 2)))

# multiply all features by 10
lgb_train3 = lgb.Dataset(X_train * 10., Y_train)
gbm3 = lgb.train(params, lgb_train3)
Y_pred3 = gbm3.predict(X_test * 10.)
print("MSE: ", np.mean(np.power(Y_pred3 - Y_test, 2)))

percent_differences = np.round((Y_pred - Y_pred2) / Y_pred2 * 100, 2)
print("Percentage differences (X divided by 10)")
print("  * median: ", np.median(percent_differences))
print("  * max: ", np.max(percent_differences))

percent_differences = np.round((Y_pred - Y_pred3) / Y_pred3 * 100, 2)
print("Percentage differences (X multiplied by 10)")
print("  * median: ", np.median(percent_differences))
print("  * max: ", np.max(percent_differences))

print("preds")
print(Y_pred)
print(Y_pred2)
print(Y_pred3)

logs (click me)

[LightGBM] [Warning] Auto-choosing col-wise multi-threading, the overhead of testing was 0.001190 seconds.
You can set force_col_wise=true to remove the overhead.
[LightGBM] [Info] Total Bins 2550
[LightGBM] [Info] Number of data points in the train set: 8000, number of used features: 10
[LightGBM] [Info] Start training from score -1.374656
MSE:<PHONE_NUMBER>790313
[LightGBM] [Warning] Auto-choosing col-wise multi-threading, the overhead of testing was 0.000671 seconds.
You can set force_col_wise=true to remove the overhead.
[LightGBM] [Info] Total Bins 2550
[LightGBM] [Info] Number of data points in the train set: 8000, number of used features: 10
[LightGBM] [Info] Start training from score -1.374656
MSE:<PHONE_NUMBER>790313
[LightGBM] [Warning] Auto-choosing col-wise multi-threading, the overhead of testing was 0.000596 seconds.
You can set force_col_wise=true to remove the overhead.
[LightGBM] [Info] Total Bins 2550
[LightGBM] [Info] Number of data points in the train set: 8000, number of used features: 10
[LightGBM] [Info] Start training from score -1.374656
MSE:<PHONE_NUMBER>790313
Percentage differences (X divided by 10)

median:  0.0
max:  0.0
Percentage differences (X multiplied by 10)
median:  0.0
max:  0.0
preds
[  19.257067   -180.82426361 -247.06530127 ...<PHONE_NUMBER>6 -259.54477204
21.74138345]
[  19.257067   -180.82426361 -247.06530127 ...<PHONE_NUMBER>6 -259.54477204
21.74138345]
[  19.257067   -180.82426361 -247.06530127 ...<PHONE_NUMBER>6 -259.54477204
21.74138345]

Wow, thanks for such well written and informative reply! Def appreciate it!
After some thought, I totally agree with your analysis above, and rounding indeed lost some info, particulalrly for random generated data. What surprised me is that it can actually cause such significant diff in y. Here's my logic: 1. though rounding lost some info/precision in the feature, it seldom change the order of the feature value (since every entry is truncated). -> 2. the sorting and the split point shouldn't change much either -> 3. the grad and hess shouldn't change much, thus the leave values shouldn't either; -> 4. the y pred should be close. I beilieve there are some flaws in my logic, as well as some lightGBM behavior that I'm not aware of yet.
Any idea to the cause of this sensitivity or good way to handle it? I think this sensitivity is problem-dependent, as I was working with a very noisy project. I tried to reduce learning rate and increase num_boost_round and seems help a bit but not much. Kindly let me know if there are some behaviors that you think is related to it (e.g., discretization, sampling, etc.) and I will try. Otherwise I think that's the best I can do for now. ;) Thank again!

I think the unexpected behavior is largely due to there's no useful signals in the features in the example above. In other words, the features contains only noise. In that case, each feature will have similar split gains, and even a small disturbance can cause significant changes in the trained models.
In the following example, if we change the label to the sum of all features, the difference between round to 5 and 7 decimals will be small.
import numpy as np
import lightgbm as lgb

num_data = 1000000
num_train_data = num_data // 5 * 4
num_feature = 10

np.random.seed(1234)
X = np.random.rand(num_data, num_feature)
X_train = X[:num_train_data]
Y_train = np.sum(X_train, axis=1)
X_test = X[num_train_data:]
Y_test = np.sum(X_test, axis=1)

params = {
        'task': 'train',
        'boosting_type': 'gbdt',
        'objective': 'regression',
        'num_threads': 10,
        'verbose': -1
}

X_train_7 = np.round(X_train, 7)
X_train_5 = np.round(X_train, 5)
X_test_7 = np.round(X_test, 7)
X_test_5 = np.round(X_test, 5)

lgb_train = lgb.Dataset(X_train_7, Y_train)
gbm = lgb.train(params, lgb_train)
Y_pred = gbm.predict(X_test_7)
print("MSE: ", np.mean(np.power(Y_pred - Y_test, 2)))

lgb_train2 = lgb.Dataset(X_train_5, Y_train)
gbm2 = lgb.train(params, lgb_train2)
Y_pred2 = gbm2.predict(X_test_5)
print("MSE: ", np.mean(np.power(Y_pred2 - Y_test, 2)))

diff_pct = np.round((Y_pred - Y_pred2) / Y_pred2 * 100, 2)
print("Diff pct: ", diff_pct)
print("Diff pct abs max: ", np.max(np.abs(diff_pct)))
print("Diff pct abs mean: ", np.mean(np.abs(diff_pct)))
print("Diff pct abs median: ", np.median(np.abs(diff_pct)))

which gives the following output
MSE:  0.00818904045355593
MSE:  0.008461063430555667
Diff pct:  [ 1.8  -0.95 -3.08 ... -1.34 -0.51  1.41]
Diff pct abs max:  12.78
Diff pct abs mean:  1.7339807499999997
Diff pct abs median:  1.43


Add style for "hamburger" (3 bar) menu in mobile view

add some IDs to elements of the main navigation
add styles for mobile view (up to 768px wide) for collapsing the menu
items into a "hamburger" menu

Closes: #166
Open issues
Integration of CSS file into the theme
The path and the inclusion of the hamburger-menu.css file are obviously wrong.
I would appreciate hints, how to do it properly within the build workflow of the theme. (tbh: I would prefer, if someone else would do this)
Social links replaced by hamburger menu button
The change hides the social buttons in the mobile view, since their position (top right corner) is occupied by the hamburger menu button.
But maybe hiding these icons should be optional (i.e. customized in the user's CSS) - thus maybe .top-social-container { display: none; } should be removed from the CSS file.
But the new CSS class top-social-container (or a different name) should stay in order to allow layout changes for all social links at once (this is impossible right now).
Bar color
Currently the color of the three bars is hard-coded:
.main-menu-icon:after {
  background: lightblue;
}

The above works well for a dark background.
I have no idea, how this could be done dynamically according to the configured color styling of the theme. Assigning the body_classes CSS classes to the icon would not work, since the bars are visible via their background color (not the foreground color).
Maybe someone has an idea for a better solution?

Maybe an example visualization helps ...
Hamburger menu collapsed

Hamburger menu expanded

Hi @sumpfralle I'm sorry for that huge gap between your response and mine. We're trying and reach PR 0 and styling PRs were not prioritized.
We have some concerns about the Hamburger implementation such as this one as we cannot make it accessible without adding some JS layer. Avoiding JS being the main motivation behind a CSS only approach, this kind of beats the purpose.
Also while this proof of concept relies on more css rules, we'd rather use the tachyon utility class library the theme is built with. But this would mean rework of several template files and risk confusing upgrading users.
I think your customization of the theme brings great value and users wanting to benefit from it should use it, but I don't favor it being built in Ananke until we reach a critical release (Ananke 3) which will be able to break from current design and implementation.
Again thanks for your suggestion and sorry for not addressing it sooner 🙏


Bad Request For Permission Synchronisation

When trying to synchronise permissions from the admin panel, I get the following error

KeycloakClientError at /admin/django_keycloak/realm/
400 Client Error: Bad Request for url: https://DOMAIN/auth/realms/REALM/protocol/openid-connect/token

The service account has the appropriate permissions and client credentials grant type is activated
Keycloak version is 12.0.4

Seems to be related to 'scope': 'realm-management openid'. This scope isn't available, at least in the latest version of keycloak. Work around was to just create this scope and add it to client then it worked.


Errors with modules and in some code files Example: import btc.txn

Looks like you've done a lot of work with this code. Just wanted to  let you know that there are numerous issues. To start, there are issues with the modules. For instance when using SendMoney.py get this:
File "SendMoney.py", line 42, in
import btc.txn
File txn.py line 35, in  from . import script
File script.py, line 38  in  from btc import utils, btc.utils
There are numerous syntax errors. For instance,  with btc.utils.

There could be a couple of reasons for that:

use python --version to determine your Python version. I use Python 3, depending on your setup and Linux distribution, you might have to use python3 explictly instead of python
you will also get errors when some libraries, like ecdsa, are not installed. If that happens, make sure to use pip3 to install
and of course you need to execute the script from within the directory where it is located

I just checked out a fresh version and did run the script successfully using Python3, so most likely this is the problem. Please try that again
Of course, you also need a bitcoind running and listening on port 18332, with sufficient balance - please see the instructions in this and this post on my blog for which the code was originally written (not sure if you came from there.....)

Closing this as not reproduced


WPS Note

What you have posted is not related to Azure Storage Explorer. If you do have an Azure Storage Explorer related issue, please update your issue description.


Destroy all user http sessions if all user tokens will be revoked

Moved from https://github.com/osiam/auth-server/issues/11:
@dacrome wrote:
In a single application use case it makes sense to trigger a global user logout by revoke all tokens and simultaneously destroy all http sessions on the auth-server. This can be done by adding the destruction of the http sessions if all user tokens will be revoked.

We should rather add a /logout endpoint.

As we will migrate to JWT, this issue is obsolete.


Separate in-code name/version from pyproject.toml

Pull Request Test Coverage Report for Build<PHONE_NUMBER>

12 of 12 (100.0%)  changed or added relevant lines in 5 files are covered.
No unchanged relevant lines lost coverage.
Overall coverage decreased (-0.005%) to 83.494%

Totals

Change from base Build<PHONE_NUMBER>:
-0.005%

Covered Lines:
7466

Relevant Lines:
8942

💛  - Coveralls


bug: Turbo Image not Caching Firebase Storage Image

What's happening?
React Native Turbo Image is not caching Firebase Storage Image  when I kill the app the image reload again and it is working perfectly on the other image source like wall haven and some random images from the google.

Top 2 images aren't caching they are loading again and again when I turned off the internet it won't load at all until I kill the app with wifi to be turned on
Reproduceable Code
import {SafeAreaView, Text} from 'react-native';
import TurboImage from 'react-native-turbo-image';
function App(): React.JSX.Element {
  return (
    <SafeAreaView style={{flex: 1, backgroundColor: 'white'}}>
      <Text style={{fontSize: 20}}>
        Default React Native Turbo Image Github
      </Text>
      <TurboImage
        resizeMode="cover"
        source={{
          uri: 'https://github.com/duguyihou/react-native-turbo-image/assets/9347790/7955aa00-0b53-44d1-88bd-9b5e320db21e',
        }}
        style={{width: 100, height: 100}}
      />
      <Text style={{fontSize: 20}}>Firebase Image with is not caching</Text>
      <TurboImage
        resizeMode="cover"
        source={{
          uri: 'https://firebasestorage.googleapis.com/v0/b/fitso-app.appspot.com/o/Product%2FEnwflneArUSkOAcbFSii1X3ZPzf2_1729582749600.jpg?alt=media&token=c9bab6e2-28d6-4da8-bdab-b86563978f05',
        }}
        style={{width: 100, height: 100}}
      />
      <Text style={{fontSize: 20}}>Random Image WAllhaven</Text>
      <TurboImage
        resizeMode="cover"
        source={{
          uri: 'https://w.wallhaven.cc/full/6d/wallhaven-6d8gy6.png',
        }}
        style={{width: 100, height: 100}}
      />
      <Text style={{fontSize: 20}}>Random Image letsenhance</Text>

      <TurboImage
        resizeMode="cover"
        source={{
          uri: 'https://letsenhance.io/static/8f5e523ee6b2479e26ecc91b9c25261e/1015f/MainAfter.jpg',
        }}
        style={{width: 100, height: 100}}
      />
      <Text style={{fontSize: 20}}>Random Image letsenhance</Text>

      <TurboImage
        resizeMode="cover"
        source={{
          uri: 'https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcS-C_UAhXq9GfuGO452EEzfbKnh1viQB9EDBQ&s',
        }}
        style={{width: 100, height: 100}}
      />
    </SafeAreaView>
  );
}

export default App;

Relevant log output
I cannot find any relevant log

Device
iPhone 15 - IOS 17.5
TurboImage Version
^1.21.0
Can you reproduce this issue in the TurboImage Example app?
Yes, I can reproduce the same issue in the Example app

@hamzasaleem2397

I tested the first image. It works well on my side. From the Charles, I can see it only fetch image once. After I kill the app and reopen the page, no extra api call, which means the image is cached in disk. Can you provide a reproducer if you still encounter this issue?

https://github.com/user-attachments/assets/5b61b989-1e61-4964-ae8d-335ad353e1a5

TurboImage set urlCache to CachePloicy by default. The max-age in your Firebase Storage Image is 0, which means it won't be cached. That's why the last image have disk cache. Can you try dataCache? It will ignore cache-control

Thank you for your time. You are correct—I checked the GitHub URL on Charles, and there is no extra API call. After trying different cache policies, the Firebase image now seems to work fine. However, when I close the app and turn off Wi-Fi, the image does not display, so there may be an issue with fetching from the cache.

@hamzasaleem2397

I killed the app and turned off the wi-fi, the image shows. Can you provide a reproducer?
btw, the image size is quite large. It takes more time to load it.

https://github.com/user-attachments/assets/761095e2-7774-4861-9b3b-f06e8832cb0d

@duguyihou

After using cache Policy firebase image is working as expected.
I was talking about this image https://github.com/duguyihou/react-native-turbo-image/assets/9347790/7955aa00-0b53-44d1-88bd-9b5e320db21e  not showing when I kill the app.
I am aware about the size thanks you reminding.

and I have checked the cache Policy a month ago it wasn't working with firebase url now its seems to be working

@hamzasaleem2397
I see. Thanks for letting me know. It is the image url issue. I will update it later.
https://github.com/user-attachments/assets/8a254739-f733-4afe-bf03-0eaa9998ae70


Allow tests API to accept an html element

Hello,
Is it possible to allow the tests APIs to allow an html element in addition of a CSS selector ?
const element = document.querySelector(...);
setFlatpickrDate(element);

I use ember-cli-page-object that uses Jquery selectors internally. So they are not compatible with the tests helpers in this library.
I used findOne(...).flatpickrInput._flatpickr.setDate(date ?? new Date(), true); as a fix.  But i would be nice to have a more convenient API.
I can do a PR if needed.
Thank you

@AmauryD sorry for the huge delay on this. If you would like to open a PR, I would be glad to accept it!

@AmauryD sorry for the huge delay on this. If you would like to open a PR, I would be glad to accept it!

No problem ! Thank's for your reply. I just made the PR.

merged


Windows Terminal font does not render smooth when connected to external 4K monitor

Windows Terminal version
1.11.3471.0
Windows build number
10.0.19044.1586
Other Software
running fish shell, version 3.3.1 with omf agnoster.
here's the screenshot when connected to the external 4K monitor

here's the screenshot of the same visual when not connected to the external 4K monitor

settings page

Steps to reproduce
When connected to an external 4K monitor, fonts don't render smoothly.  Without the external 4K monitor, they look just fine.
Expected Behavior
expected to see smoother font rendering
Actual Behavior
distorted rendering

@N0AGI Sorry! This seems to have fallen off our radar. Does this issue still occur for you?

Yes, the last time I checked 2 weeks ago.
Get Outlook for iOShttps://aka.ms/o0ukef

From: Leonard Hecker @.>
Sent: Wednesday, October 12, 2022 4:37:33 PM
To: microsoft/terminal @.>
Cc: Nagi Punyamurthula @.>; Mention @.>
Subject: Re: [microsoft/terminal] Windows Terminal font does not render smooth when connected to external 4K monitor (Issue #12718)
@N0AGIhttps://github.com/N0AGI Sorry! This seems to have fallen off our radar. Does this issue still occur for you?
—
Reply to this email directly, view it on GitHubhttps://github.com/microsoft/terminal/issues/12718#issuecomment-1276762320, or unsubscribehttps://github.com/notifications/unsubscribe-auth/AR4CXYTJ3L7AYTLFB7CRARDWC4VR3ANCNFSM5RBZEI2A.
You are receiving this because you were mentioned.Message ID: @.***>

Which version are you using? What GPU is the 4K monitor connected to?
Could you try to enable "AtlasEngine" in the "Rendering" settings if it isn't enabled yet?

Hi @N0AGI. Have you tried the suggestions @lhecker proposed above? Also, what's your display scaling set to for this monitor?

Resolution: Native
Scaling: 100%
alacritty renders fonts smoothly, its a windows terminal problem.

This issue has been closed for a while. If you'd like to report that this hasn't been resolved, can you please include more details about your system? For instance, Windows Terminal version, whether AtlasEngine is disabled in the Rendering settings, your GPU model, your driver version, etc.


earthly: 0.6.23 -> 0.7.6

Description of changes
Changelog

Added myself as a maintainer since I'm using this software on a daily basis and can help
Re-enabled checks
removed shellrepeater as it does not exist anymore
updated ldflags according to the upstream Earthfile that takes the platform into consideration
disabled CGO as per upstream Earthfile
moved buildtags to tags
specified subPackages that we're compiling here (upstream Earthfile does the same)

Things done

Built on platform(s)

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

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

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

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

[ ] (Package updates) Added a release notes entry if the change is major or breaking
[ ] (Module updates) Added a release notes entry if the change is significant
[ ] (Module addition) Added a release notes entry if adding a new NixOS module

[ ] Fits CONTRIBUTING.md.

looked too late, linking the previous, different MR still waiting for reviews, not sure which one we'd like to keep: https://github.com/NixOS/nixpkgs/pull/224335

This pull request has been mentioned on NixOS Discourse. There might be relevant details there:
https://discourse.nixos.org/t/prs-ready-for-review/3032/2298


Update New Relic gem to support distributed tracing

Summary
This updates the New Relic gem to use a version that supports distributed tracing.
/domain @Betterment/test_track_core
/platform @samandmoore

<<domainlgtm
not sure if we care to explicitly add a provision to the Gemfile that says we want newrelic_rpm >= 5.3 to make sure someone doesn't accidentally regress this to a version that doesn't have DT? i think that maybe i'm being too sensitive to that very tiny risk.

<<platformlgtm too