root should be first argument to factory, not require

require breaks if it's given an object instead of string.

:+1:

thnks! v4.4.0 out the door

fixes https://github.com/Pomax/react-onclickoutside/issues/54

This seems to break Babel 5 environments though. I'm using webpack 1.12.2 with babel 5.8.29 and got the below error.
It is a breaking change and you should consider supporting both imports or updating to 5.0.0 asap as it breaks packages like: https://github.com/Hacker0x01/react-datepicker/issues/237
can't execute file: /Users/Greyson/XXX/bin/server.js
    error given was: AssertionError: path must be a string
    at Module.require (module.js:365:3)
    at require (module.js:385:17)
    at registeredComponents (/Users/Greyson/XXX/node_modules/react-datepicker/node_modules/react-onclickoutside/index.js:26:30)
    at Object.<anonymous> (/Users/Greyson/XXX/node_modules/react-datepicker/node_modules/react-onclickoutside/index.js:31:2)
    at Module._compile (module.js:435:26)
    at Module._extensions..js (module.js:442:10)
    at require.extensions.(anonymous function) (/Users/Greyson/XXX/node_modules/babel-core/lib/api/register/node.js:214:7)
    at /Users/Greyson/XXX/node_modules/webpack-isomorphic-tools/babel-transpiled-modules/tools/require hacker.js:219:64
    at webpack_isomorphic_tools.require (/Users/Greyson/XXX/node_modules/webpack-isomorphic-tools/babel-transpiled-modules/index.js:340:11)
    at /Users/Greyson/XXX/node_modules/webpack-isomorphic-tools/babel-transpiled-modules/index.js:297:18
    at Object._module3.default._extensions.(anonymous function) [as .js] (/Users/Greyson/XXX/node_modules/webpack-isomorphic-tools/babel-transpiled-modules/tools/require hacker.js:206:17)
    at Module.load (module.js:356:32)
    at Module._load (module.js:311:12)
    at Function.module._load (/Users/Greyson/XXX/node_modules/piping/lib/launcher.js:32:16)
    at Module.require (module.js:366:17)
    at require (module.js:385:17)

same issue facing here with path must be a string

I might not have time to do this before flying back home on Sunday, so for the moment pegging the version is probably going to be required.


Scrolling banner on arcade.makecode.com moves too fast

The new banner looks great, but there's not enough time to digest the images before they swap to another, and the swap itself is jarringly fast.
Here are some common pitfalls with banner carousels as published by a Senior UX Designer at Google.  Let's guard against these:
_- A carousel’s design and frequent movement can make people think it’s an ad, leading them to ignore it.

Moving elements can negatively impact accessibility, especially for those with motor skill issues
Many people can have a hard time reading all the text before a slider advances
Since each slides’ content is only visible some of the time, content may easily be missed

And maybe most importantly: people expect control over their UIs. Taking that control away can ruin an otherwise lovely experience._
Ideally, we should aim to eventually have a pause button, but until then, slowing the speed of the automatic swap (and slowing the transition) should take care of most of the above :)

Also, I think it would be helpful to show a little animated stopwatch in the corner, so users know when to expect the swap. It could be integrated into the pause button.

@jwunderl can we reduce the speed?

Lets not add new things at the last moment for this release. Lets just reduce the speed for now.


move uncleanShutdown error to NIOSSLError

uncleanShutdown was previously on OpenSSLError (now renamed to NIOSSLError). This PR moves the case back to NIOSSLError from BoringSSLError.

@swift-nio-bot test this please


Rendering round corner in a zero sized element raises a ZeroDivide error

It raises an error.
an example with ToSandbox class >> example_BasicComboBox
https://user-images.githubusercontent.com/435221/230668298-e1fa2a14-0363-43a5-be08-092dbef4a471.mov

The fix corresponds to Bloc's repo. I pushed a commit there that seems to close this issue.

Yes, this should be fixed, same as https://github.com/pharo-graphics/Alexandrie/issues/28


revised the wrong and unclear wording in Service concept

replaced the wrong and unclear explanation in Service concept along with examples around the 4 values for the .spec.type field in Service.
fixed issue #41173

Hi @sftim , I have done the necessary changes by taking your suggestions into account, please take a look at it.

Hello @tengqm , thanks for pointing that out, by 'nested structure', I mean that the Kubernetes Service API is designed in a way where one service type builds upon the previous one. For instance, type: NodePort includes the capabilities of type: ClusterIP and adds additional features on top of it. This design allows for more flexibility and control in service exposure. The existing description gave an impression that this nested structure is a hard requirement rather than an inherent part of Kubernetes Services API design. My proposed change aims to clear that misinterpretation.

Hi @sftim @tengqm ,
I've made the changes by taking all the suggestions into account.
Please take a look.
Thanks are a lot for your patience and guidance!

closing this PR as the issue has been resolved by #42198


Crash inapp message

SDK version: 3.6.3
**Environment:**Production
Are logs available?
Fatal Exception: java.util.ConcurrentModificationException:
at java.util.ArrayList$Itr.next(ArrayList.java:860)
at io.customer.messaginginapp.gist.presentation.GistSdk.handleGistError$messaginginapp_release(GistSdk.kt:228)
at io.customer.messaginginapp.gist.presentation.GistView.error(GistView.kt:138)
at io.customer.messaginginapp.gist.presentation.engine.EngineWebView$setupTimeout$1.run(EngineWebView.kt:98)
at java.util.TimerThread.mainLoop(Timer.java:562)
at java.util.TimerThread.run(Timer.java:512)
Describe the bug
Crash but user without any inapp message (not deployed on our automations)
To Reproduce
no idea
Expected behavior
no cash

Thank you for reaching out and sharing the details. We apologize for the inconvenience caused by the crash. Based on the stack-trace you've provided, we're actively working on a fix. You can expect this issue to be resolved in an upcoming release. We appreciate your patience and cooperation.

Great !
No problem that was only crashing for few users but we like inapp messages so we prefer to keep it and have 0 crash :)

Thank you for your understanding and continued support! I'm excited to inform you that the issue has been fixed in version 3.6.5. Please don't hesitate to reach out if there's anything else we can assist you with.


Add crypto adapters and domains attach support(DO NOT MERGE)

@bjzhangl may you please add snip code in sample for the new function as @jiangphcn mentioned, thanks!

@bjzhangl may you please add snip code in sample for the new function as @jiangphcn mentioned, thanks!

Sure.

@huoqifeng @jiangphcn i add sample code, please help review.

Thanks! @bjzhangl


Nuget package?

Title says it all. This project of yours could easily prevent me from the boilerplate of spinning up my own ecs. The icing on the cake would be nuget for automatic updates as you continue to improve the library here :).

Will be easier to submodule this at first :P
The API might drastically change overtime as i learn more and more about making performant code in C# (and how to automate nuget packaging stuff) but you're free to help!

I'd love to help out, believe you me.
Unfortunately, university kicked back off so my time is once again spoken for until late May.


Support the continueAfterTimeout parameter

Implements support for the continueAfterTimeout parameter mentioned in #29 by adding a new optional argument to the aurora_data_api.connect() function called continue_after_timeout. This argument is passed to the AuroraDataAPIClient and AuroraDataAPICursor and is used inside the cursor to add an additional execute_arg.
The corresponding unit test is skipped if an environment variable TEST_CONTINUE_AFTER_TIMEOUT is not True (it is considered False if it does not exist) to make it an opt-in test. The unit test is also skipped if using_mysql because the implementation uses the pg_sleep() function that does not exist in MySQL. An implementation of this test for MySQL could be added. I could not add it because I do not have an Aurora MySQL DB that I can access easily.

Thanks!


Sporadic failures right after start

I am experiencing such failures for a long time:
===>   pari-2.9.4,2 depends on file: /usr/local/libdata/pkgconfig/x11.pc - found
===>   Returning to build of pari-2.9.4,2
===>   pari-2.9.4,2 depends on package: perl5>=5.24<5.25 - not found
make[1]: getcwd: No such file or directory.
===>   pari-2.9.4,2 depends on package:  - not found
===>   USE_PACKAGE_DEPENDS_ONLY set - not building missing dependency from source
*** Error code 1

Re-running it usually succeeds.
This usually/always happens when another instance of poudriere, for a different jail, is also starting at the same time.

Closing due to no activity or repros.


Timeout in HTTP::Server spec with preview_mt

Some HTTP::Server specs occasionally time out in CI after reaching the 15 second timout.
Example:

HTTP::Server #bind fails after listen (Duration (p95):  11ms, 98% success rate)
HTTP::Server #listen fails after listen (Duration (p95):  7ms, 99% success rate)
HTTP::Server doesn't raise on accept after close #2692  (Duration (p95):  8s, 99% success rate)

Stats from https://app.circleci.com/insights/github/crystal-lang/crystal/workflows/nightly_release/tests?branch=master
We could consider increasing the timeout similar to #13043. But that would just be ignoring the symptoms. It really shouldn't take that long to execute these specs. The 95-percentile of the duration being several orders of magnitude below the timeout confirms that.
Maybe there is some kind of deadlock or perhaps all available threads are saturated for such a long time. It's flaky. We need to investigate what's actually going on and figure out what can be done to improve this.

This is easily reproduced on local. During some run I either get an infinite hang (strace shows repeated epoll_wait) or a libevent warn about a bad file descriptor... which is reminiscent of #2692 that is quoted in one of the reported failing spec.
Indeed, this is a race condition induced by MT: we're listening and closing a server from different fibers that happen to be run on different threads, and are no longer synchronized, so a spec suddenly closes a server while it's being started, ...

This is hard to fix properly. So far only adding a few sleep 0.001 avoids the issue :disappointed:


"spawn ENAMETOOLONG" when searching in large workspaces

VSCode Version: code-oss-dev 1.16.0 (9066eedcf7597779e3a710bf997d0d9f8748d597)
OS Version: Windows_NT x64 10.0.15063

I have a rather large .code-workspace file with 81 sub-directories. When I try to use find in files in that workspace, it fails with a spawn ENAMETOOLONG error:

Steps to reproduce:

Clone this repository.
Open the workspace file.
Try to search for anything.

@Gama11 how long is the path that you clones the repository in?

It's C:\HaxeToolkit\haxe\lib\flixel-demos\git, so not that long.

I was wondering how many folders people would add to a workspace 😁 - this generates a really long command, but there are some easy things I can do to make it shorter. Thanks for the report!

Works now. :)

Excellent! It's still theoretically possible to run in to this, although it will be a lot harder now. But please let me know if you see it again.

I'm seeing this error, on Windows 1.17.2.

Oh, i deleted the .vscode directory and the problem went away. if you want me to try and recover a copy, to reproduce the problem I can, else I am happy now :)

I am guessing that you had a ton of search.exclude entries in your workspace settings. This should be very difficult to hit without a multiroot workspace, so I'm curious what the settings were.

I used the ignore-gitignore package to add files from .gitignore to vscode's ignore list. It turns out that package recursively searches the current directory for .gitignore, and I'm in a project with a bunch of subprojects.
This ended up adding 2,700 lines to settings.json.

If you want, I can give you instructions to get exactly the project I'm using, it's open source and on github.

This ended up adding 2,700 lines to settings.json.

Yeah that would do it. I understand the problem, I'm not going to do anything about it right now.
You can avoid searching in .gitignore'd files by expanding the search viewlet details and toggling the "Use Ignore Files" button


refactor(sdk-metrics-base): add ObservableRegistry and hoist invocations

Which problem is this PR solving?
This PR add support for the spe changes introduced in https://github.com/open-telemetry/opentelemetry-specification/pull/2361.
Blocked on:

[x] https://github.com/open-telemetry/opentelemetry-js/pull/2821
[ ] https://github.com/open-telemetry/opentelemetry-specification/issues/2408

Fixes https://github.com/open-telemetry/opentelemetry-js/issues/2782
Short description of the changes

Add ObservableRegistry to call all async callbacks at once.
Add support for registering multiple async callbacks to one single async instrument.
Fix callbacks associated with one instrument may be invoked multiple times when the instrument is mapped with views to multiple metrics.

Type of change

[x] New feature (non-breaking change which adds functionality)

How Has This Been Tested?

[x] MeterSharedState.collect on async instruments

Checklist:

[x] Followed the style guidelines of this project
[x] Unit tests have been added
[x] Documentation has been updated

Does this depend on another PR?

@dyladan: Does this depend on another PR?

It depends on one statement in https://github.com/open-telemetry/opentelemetry-specification/pull/2363:

Every currently registered Callback associated with an instrument MUST
be evaluted exactly once during collection prior to reading data for
that instrument.

However, I think the depended statement in https://github.com/open-telemetry/opentelemetry-specification/pull/2363 is unlikely to change (as the spec PR is mainly focused on multi-instrument callbacks). To get async instruments to work correctly with views, the problem that callbacks associated with one instrument are invoked multiple times during a single collection is outstanding and needs to be fixed by this PR.
Maybe we should proceed with this PR?

However, I think the depended statement in open-telemetry/opentelemetry-specification#2363 is unlikely to change (as the spec PR is mainly focused on multi-instrument callbacks). To get async instruments to work correctly with views, the problem that callbacks associated with one instrument are invoked multiple times during a single collection is outstanding and needs to be fixed by this PR.
Maybe we should proceed with this PR?

I would proceed with it. I agree the statement is unlikely to change. Even if it does change, it is unlikely to become a complete contradiction and they would likely only tweak wording.

@open-telemetry/javascript-approvers this is ready for review, PTAL :D


Cannot Initiate Purchase or Subscription

I came across your library the other day because I need to update my billing library and yours seemed to be straight forward.   I'm able to receive callbacks with product info ie. pricing and product ids, but when I initiate billingConnector.purchase or .subscribe neither go anywhere.  Checked all cases as well,  even copied your logic to a T & the only thing I can seem to get working is getting the info.
Hope to get some help, thank you.

Hey,
Show me your code and also in the logcat search for BillingConnector and show me what it prints when you are initiating the purchase method.

Same problem.
Device : Asus Android 6.0.1
I get subscription information, but the Pay bottom sheet  does not open.

08-19 13:55:28.945 15278-15278/? D/BillingConnector: Billing service: connecting...
08-19 13:55:28.948 15278-15278/? D/BillingConnector: Billing client is not ready because no connection is established yet
08-19 13:55:28.948 15278-15278/? D/BillingConnector: Billing client is not ready yet
08-19 13:55:28.951 11081-11094/? I/Finsky: [8077] hiv.a(16): com.zuuchat.sohbet: Account from first account - [8GS2edzg9SgBTrGEahKWtTiBs8wHPYKIiNIidUt0FEY]
08-19 13:55:28.951 11081-11094/? I/Finsky: [8077] hiv.a(65): Billing preferred account via installer for com.zuuchat.sohbet: [8GS2edzg9SgBTrGEahKWtTiBs8wHPYKIiNIidUt0FEY]
08-19 13:55:28.953 11081-11093/? I/Finsky: [8076] hiv.a(16): com.zuuchat.sohbet: Account from first account - [8GS2edzg9SgBTrGEahKWtTiBs8wHPYKIiNIidUt0FEY]
08-19 13:55:28.954 11081-11093/? I/Finsky: [8076] hiv.a(65): Billing preferred account via installer for com.zuuchat.sohbet: [8GS2edzg9SgBTrGEahKWtTiBs8wHPYKIiNIidUt0FEY]
08-19 13:55:28.955 15278-15892/? D/BillingConnector: Billing service: connected
08-19 13:55:28.959 11081-11184/? I/Finsky: [8122] hiv.a(16): com.zuuchat.sohbet: Account from first account - [8GS2edzg9SgBTrGEahKWtTiBs8wHPYKIiNIidUt0FEY]
08-19 13:55:28.960 11081-11184/? I/Finsky: [8122] hiv.a(65): Billing preferred account via installer for com.zuuchat.sohbet: [8GS2edzg9SgBTrGEahKWtTiBs8wHPYKIiNIidUt0FEY]
08-19 13:55:28.964 11081-11094/? I/Finsky: [8077] hiv.a(16): com.zuuchat.sohbet: Account from first account - [8GS2edzg9SgBTrGEahKWtTiBs8wHPYKIiNIidUt0FEY]
08-19 13:55:28.964 11081-11094/? I/Finsky: [8077] hiv.a(65): Billing preferred account via installer for com.zuuchat.sohbet: [8GS2edzg9SgBTrGEahKWtTiBs8wHPYKIiNIidUt0FEY]
08-19 13:55:28.979 15278-15894/? D/BillingConnector: Query SKU Details: data found
08-19 13:55:28.979 15278-15894/? D/BillingConnector: Subscriptions support check: success
08-19 13:55:28.980 15278-15278/? D/BillingConnector: Product fetched: subscription_h1
08-19 13:55:28.982 11081-11093/? I/Finsky: [8076] hiv.a(16): com.zuuchat.sohbet: Account from first account - [8GS2edzg9SgBTrGEahKWtTiBs8wHPYKIiNIidUt0FEY]
08-19 13:55:28.983 11081-11093/? I/Finsky: [8076] hiv.a(65): Billing preferred account via installer for com.zuuchat.sohbet: [8GS2edzg9SgBTrGEahKWtTiBs8wHPYKIiNIidUt0FEY]
08-19 13:55:28.985 15278-15278/? D/BillingConnector: Product price: ₺34,99
08-19 13:55:28.989 15278-15894/? D/BillingConnector: Query SUBS Purchases: the list is empty
08-19 13:55:28.997 11081-11184/? I/Finsky: [8122] hiv.a(16): com.zuuchat.sohbet: Account from first account - [8GS2edzg9SgBTrGEahKWtTiBs8wHPYKIiNIidUt0FEY]
08-19 13:55:28.998 11081-11184/? I/Finsky: [8122] hiv.a(65): Billing preferred account via installer for com.zuuchat.sohbet: [8GS2edzg9SgBTrGEahKWtTiBs8wHPYKIiNIidUt0FEY]
08-19 13:55:28.999 15278-15895/? D/BillingConnector: Query IN-APP Purchases: the list is empty
08-19 13:55:29.007 2035-4493/? D/VirtualKeyBackLightService: full screen state = false
08-19 13:55:29.019 15278-15893/? D/BillingConnector: Query SKU Details: data not found. Make sure SKU ids are configured on Play Console
I get an output like that in logcat.
public static final List SUBSCRIPTION_IDS = Arrays.asList("subscription_h1", "subscription_m3", "subscription_m6", "subscription_m1");
billingConnector = new BillingConnector(activity, config.LICENSE_KEY)
.setNonConsumableIds(Arrays.asList("product_nonconsumable"))
.setConsumableIds(Arrays.asList("product_consumable"))
.setSubscriptionIds(config.SUBSCRIPTION_IDS)
.autoAcknowledge()
.autoConsume()
.enableLogging()
.connect();
"product_nonconsumable, product_consumable"
Normally these products are not available in the store. I saw that something should not be left blank. That's why I wanted to write it so that it would not be empty.

That's the same error I get I'm on Oreo Samsung A71, I'm glad others are experiencing this and I'm not going crazy!  I've been staying up late hours trying to even debug the billing library & trying my own methods.  Still nothing!  I'll share my logic later today it's 7am here just having my first coffee.

I think it's related to #9.
@blackseapps please remove .setNonConsumableIds(Arrays.asList("product_nonconsumable")) and .setConsumableIds(Arrays.asList("product_consumable")) to see if it's working, and also make sure that the SKUs from .setSubscriptionIds(config.SUBSCRIPTION_IDS) are configured correctly on Play Console and don't use other ids that aren't available in Play Console.

I'm going to share my .java file one second while I upload it

https://drive.google.com/file/d/1XulClBS8xWVlaz6LizEEhcWm6Aabmnky/view?usp=drivesdk

I think it's related to #9.
@blackseapps please remove .setNonConsumableIds(Arrays.asList("product_nonconsumable")) and .setConsumableIds(Arrays.asList("product_consumable")) to see if it's working, and also make sure that the SKUs from .setSubscriptionIds(config.SUBSCRIPTION_IDS) are configured correctly on Play Console and don't use other ids that aren't available in Play Console.

I've done all of this I'm even able to get the price of the subscription but when I subscribe to the subscription the bottom dialog doesn't pop up nor does it seem like anything occurs according to the logs

Billing service: connecting...
08-19 14:55:25.131 27985-27985/? D/BillingConnector: Billing client is not ready because no connection is established yet
08-19 14:55:25.131 27985-27985/? D/BillingConnector: Billing client is not ready yet
08-19 14:55:25.134 25096-25222/? I/Finsky: [8707] hiv.a(16): com.zuuchat.sohbet: Account from first account - [8GS2edzg9SgBTrGEahKWtTiBs8wHPYKIiNIidUt0FEY]
08-19 14:55:25.135 25096-25222/? I/Finsky: [8707] hiv.a(65): Billing preferred account via installer for com.zuuchat.sohbet: [8GS2edzg9SgBTrGEahKWtTiBs8wHPYKIiNIidUt0FEY]
08-19 14:55:25.139 25096-25106/? I/Finsky: [8648] hiv.a(16): com.zuuchat.sohbet: Account from first account - [8GS2edzg9SgBTrGEahKWtTiBs8wHPYKIiNIidUt0FEY]
08-19 14:55:25.140 25096-25106/? I/Finsky: [8648] hiv.a(65): Billing preferred account via installer for com.zuuchat.sohbet: [8GS2edzg9SgBTrGEahKWtTiBs8wHPYKIiNIidUt0FEY]
08-19 14:55:25.141 27985-28429/? D/BillingConnector: Billing service: connected
08-19 14:55:25.151 25096-25221/? I/Finsky: [8706] hiv.a(16): com.zuuchat.sohbet: Account from first account - [8GS2edzg9SgBTrGEahKWtTiBs8wHPYKIiNIidUt0FEY]
08-19 14:55:25.152 25096-25221/? I/Finsky: [8706] hiv.a(65): Billing preferred account via installer for com.zuuchat.sohbet: [8GS2edzg9SgBTrGEahKWtTiBs8wHPYKIiNIidUt0FEY]
08-19 14:55:25.167 27985-28430/? D/BillingConnector: Query SKU Details: data found
08-19 14:55:25.168 27985-28430/? D/BillingConnector: Subscriptions support check: success
08-19 14:55:25.175 25096-25203/? I/Finsky: [8694] hiv.a(16): com.zuuchat.sohbet: Account from first account - [8GS2edzg9SgBTrGEahKWtTiBs8wHPYKIiNIidUt0FEY]
08-19 14:55:25.176 25096-25203/? I/Finsky: [8694] hiv.a(65): Billing preferred account via installer for com.zuuchat.sohbet: [8GS2edzg9SgBTrGEahKWtTiBs8wHPYKIiNIidUt0FEY]
08-19 14:55:25.179 25096-25107/? I/Finsky: [8649] hiv.a(16): com.zuuchat.sohbet: Account from first account - [8GS2edzg9SgBTrGEahKWtTiBs8wHPYKIiNIidUt0FEY]
08-19 14:55:25.180 25096-25107/? I/Finsky: [8649] hiv.a(65): Billing preferred account via installer for com.zuuchat.sohbet: [8GS2edzg9SgBTrGEahKWtTiBs8wHPYKIiNIidUt0FEY]
08-19 14:55:25.183 27985-28432/? D/BillingConnector: Query SUBS Purchases: the list is empty
08-19 14:55:25.183 27985-28431/? D/BillingConnector: Query IN-APP Purchases: the list is empty
08-19 14:55:25.639 335-401/? I/ThermalEngine: Sensor:pa_therm1:40000 mC
08-19 14:55:25.761 25096-25148/? D/PaySecureElementClient: Felica app not found; returning isSecureElementAvailable = false!
08-19 14:55:25.764 2035-5913/? D/PackageSettings: getInstallerPackageName package com.zuuchat.sohbet ask for installer name.
08-19 14:55:25.769 25096-25240/? I/Finsky: [8711] hba.run(29): Skipping a request to /bulkAcquire since cache has all the records.
billingConnector = new BillingConnector(activity, config.LICENSE_KEY)
.setSubscriptionIds(config.SUBSCRIPTION_IDS)
.autoAcknowledge()
.autoConsume()
.enableLogging()
.connect();
    billingConnector.subscribe(activity, subscriptionId);

https://ibb.co/GVwDnrk

@DNAMobileApplications in your InappPurchasesActivity you are setting the subscription id to "eatmybutt" then you are trying to subscribe to "sku_1" which obviously can't work. Please change billingConnector.subscribe(InappPurchasesActivity.this, "sku_1"); to billingConnector.subscribe(InappPurchasesActivity.this, "eatmybutt"); ("eatmybutt" should be the SKU id from Play Console).

@blackseapps from the logcat the BillingConnector is working correctly, I guess it's a problem with the id you are passing to the .subscribe method. Please call that method on a specific id, like:  billingConnector.subscribe(activity, "subscription_h1");

@blackseapps from the logcat the BillingConnector is working correctly, I guess it's a problem with the id you are passing to the .subscribe method. Please call that method on a specific id, like:  billingConnector.subscribe(activity, "subscription_h1");

not working.

package com.zuuchat.sohbet.utils.payments;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
import android.widget.Toast;
import androidx.annotation.NonNull;
import com.zuuchat.sohbet.ui.config.config;
import org.jetbrains.annotations.NotNull;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import games.moisoni.google_iab.BillingConnector;
import games.moisoni.google_iab.BillingEventListener;
import games.moisoni.google_iab.models.BillingResponse;
import games.moisoni.google_iab.models.PurchaseInfo;
import games.moisoni.google_iab.models.SkuInfo;
public class PaymentsAndroid {
BillingConnector billingConnector;
//list for example purposes to demonstrate how to manually acknowledge or consume purchases
private final List<PurchaseInfo> purchasedInfoList = new ArrayList<>();

//list for example purposes to demonstrate how to synchronously check a purchase state
private final List<SkuInfo> fetchedSkuInfoList = new ArrayList<>();

private Activity activity;

public PaymentsAndroid(Activity activity, String subscriptionId) {
    this.activity = activity;
    init(activity, subscriptionId);
    requestSubscription(subscriptionId);
}

private void init(Activity activity, String subscriptionId) {

    billingConnector = new BillingConnector(activity, config.LICENSE_KEY)

            .setSubscriptionIds(Arrays.asList("subscription_m1"))
            .autoAcknowledge()
            .autoConsume()
            .enableLogging()
            .connect();

    billingConnector.subscribe(activity, "subscription_m1");

    billingConnector.setBillingEventListener(new BillingEventListener() {
        @Override
        public void onProductsFetched(@NonNull List<SkuInfo> skuDetails) {
            String sku;
            String price;

            for (SkuInfo skuInfo : skuDetails) {
                sku = skuInfo.getSku();
                price = skuInfo.getPrice();

                if (sku.equalsIgnoreCase(subscriptionId)) {
                    //TODO - do something
                    Log.d("BillingConnector", "Product fetched: " + sku);
                    Toast.makeText(activity, "Product fetched: " + sku, Toast.LENGTH_SHORT).show();

                    //TODO - do something
                    Log.d("BillingConnector", "Product price: " + price);
                    Toast.makeText(activity, "Product price: " + price, Toast.LENGTH_SHORT).show();
                }

                //TODO - similarly check for other ids

                fetchedSkuInfoList.add(skuInfo); //check "usefulPublicMethods" to see how to synchronously check a purchase state
            }
        }

        @Override
        public void onPurchasedProductsFetched(@NonNull List<PurchaseInfo> purchases) {
            String sku;

            for (PurchaseInfo purchaseInfo : purchases) {
                sku = purchaseInfo.getSku();

                if (sku.equalsIgnoreCase(subscriptionId)) {
                    //TODO - do something
                    Log.d("BillingConnector", "Purchased product fetched: " + sku);
                    Toast.makeText(activity, "Purchased product fetched: " + sku, Toast.LENGTH_SHORT).show();
                }

            }
        }

        @Override
        public void onProductsPurchased(@NonNull List<PurchaseInfo> purchases) {
            String sku;
            String purchaseToken;

            for (PurchaseInfo purchaseInfo : purchases) {
                sku = purchaseInfo.getSku();
                purchaseToken = purchaseInfo.getPurchaseToken();

                if (sku.equalsIgnoreCase(subscriptionId)) {
                    //TODO - do something
                    Log.d("BillingConnector", "Product purchased: " + sku);
                    Toast.makeText(activity, "Product purchased: " + sku, Toast.LENGTH_SHORT).show();

                    //TODO - do something
                    Log.d("BillingConnector", "Purchase token: " + purchaseToken);
                    Toast.makeText(activity, "Purchase token: " + purchaseToken, Toast.LENGTH_SHORT).show();
                }

                //TODO - similarly check for other ids

                purchasedInfoList.add(purchaseInfo); //check "usefulPublicMethods" to see how to acknowledge or consume a purchase manually
            }
        }

        @Override
        public void onPurchaseAcknowledged(@NonNull PurchaseInfo purchase) {
            /*
             * Grant user entitlement for NON-CONSUMABLE products and SUBSCRIPTIONS here
             *
             * Even though onProductsPurchased is triggered when a purchase is successfully made
             * there might be a problem along the way with the payment and the purchase won't be acknowledged
             *
             * Google will refund users purchases that aren't acknowledged in 3 days
             *
             * To ensure that all valid purchases are acknowledged the library will automatically
             * check and acknowledge all unacknowledged products at the startup
             * */

            String acknowledgedSku = purchase.getSku();

            if (acknowledgedSku.equalsIgnoreCase(subscriptionId)) {
                //TODO - do something
                Log.d("BillingConnector", "Acknowledged: " + acknowledgedSku);
                Toast.makeText(activity, "Acknowledged: " + acknowledgedSku, Toast.LENGTH_SHORT).show();
            }
        }

        @Override
        public void onPurchaseConsumed(@NonNull PurchaseInfo purchase) {
            /*Callback after a purchase is consumed*/

            /*
             * CONSUMABLE products entitlement can be granted either here or in onProductsPurchased
             * */

            String consumedSku = purchase.getSku();

            if (consumedSku.equalsIgnoreCase(subscriptionId)) {
                //TODO - do something
                Log.d("BillingConnector", "Consumed: " + consumedSku);
                Toast.makeText(activity, "Consumed: " + consumedSku, Toast.LENGTH_SHORT).show();
            }
        }

        @Override
        public void onBillingError(@NonNull @NotNull BillingConnector billingConnector, @NonNull @NotNull BillingResponse response) {
            switch (response.getErrorType()) {
                case CLIENT_NOT_READY:
                    //TODO - client is not ready yet
                    break;
                case CLIENT_DISCONNECTED:
                    //TODO - client has disconnected
                    break;
                case SKU_NOT_EXIST:
                    //TODO - sku does not exist
                    break;
                case CONSUME_ERROR:
                    //TODO - error during consumption
                    break;
                case ACKNOWLEDGE_ERROR:
                    //TODO - error during acknowledgment
                    break;
                case ACKNOWLEDGE_WARNING:
                    /*
                     * This will be triggered when a purchase can not be acknowledged because the state is PENDING
                     * A purchase can be acknowledged only when the state is PURCHASED
                     *
                     * PENDING transactions usually occur when users choose cash as their form of payment
                     *
                     * Here users can be informed that it may take a while until the purchase complete
                     * and to come back later to receive their purchase
                     * */
                    //TODO - warning during acknowledgment
                    break;
                case FETCH_PURCHASED_PRODUCTS_ERROR:
                    //TODO - error occurred while querying purchased products
                    break;
                case BILLING_ERROR:
                    //TODO - error occurred during initialization / querying sku details
                    break;
                case USER_CANCELED:
                    //TODO - user pressed back or canceled a dialog
                    break;
                case SERVICE_UNAVAILABLE:
                    //TODO - network connection is down
                    break;
                case BILLING_UNAVAILABLE:
                    //TODO - billing API version is not supported for the type requested
                    break;
                case ITEM_UNAVAILABLE:
                    //TODO - requested product is not available for purchase
                    break;
                case DEVELOPER_ERROR:
                    //TODO - invalid arguments provided to the API
                    break;
                case ERROR:
                    //TODO - fatal error during the API action
                    break;
                case ITEM_ALREADY_OWNED:
                    //TODO - failure to purchase since item is already owned
                    break;
                case ITEM_NOT_OWNED:
                    //TODO - failure to consume since item is not owned
                    break;
            }
        }

    });
}

public void requestSubscription(String subscription) {

}

}
/**

api_url = config.APIPATH + "getter=googleplaypay&subview=2&arg1=" +
config.ANDROIDID + "&arg2=0&arg3=0" +
"&SecurtyKey=" + config.SECURTY_KEY + "&arg11=" + config.KID;
new ServiceStubAsyncTask(ActivityPay.this, ActivityPay.this).execute();
*/

@blackseapps from the logcat the BillingConnector is working correctly, I guess it's a problem with the id you are passing to the .subscribe method. Please call that method on a specific id, like:  billingConnector.subscribe(activity, "subscription_h1");

I've tried that, this still does not work.  I've even tried updating the app on the Play Store & still no success.  I've tried even non-consumable/consumable items .purchase the ID that doesn't work.  I've tried purchasing IDs that I've been using for the last 2 years using the old method too, that still doesn't work.  I'm not sure what else is causing this not to work.

I think it's related to #9.
@blackseapps please remove .setNonConsumableIds(Arrays.asList("product_nonconsumable")) and .setConsumableIds(Arrays.asList("product_consumable")) to see if it's working, and also make sure that the SKUs from .setSubscriptionIds(config.SUBSCRIPTION_IDS) are configured correctly on Play Console and don't use other ids that aren't available in Play Console.

I've done all of this I'm even able to get the price of the subscription but when I subscribe to the subscription the bottom dialog doesn't pop up nor does it seem like anything occurs according to the logs

BillingConnector'danlogcat @blackseapps düzgün çalışıyor, sanırım yönteme ilettiğiniz kimlikle ilgili bir sorun .subscribe. Lütfen bu yöntemi aşağıdaki gibi belirli bir kimlikte arayın: billingConnector.subscribe(activity, "subscription_h1");

Bunu denedim, bu hala çalışmıyor. Uygulamayı Play Store'da güncellemeyi bile denedim ve hala başarılı olamadım. Sarf malzemesi olmayan/tüketilebilir öğeleri bile denedim. çalışmayan kimliği satın alın. Son 2 yıldır kullandığım kimlikleri de eski yöntemle satın almayı denedim, yine işe yaramadı. Bunun çalışmamasına başka neyin sebep olduğundan emin değilim.

the problem continues for me.

I solved the problem :) I will share the details soon

@moisoni97 @DNAMobileApplications
The problem is. It's actually very simple, but for some reason I just realized it. Since Billing Connection is an asynchronous operation, the connection must be prepared first.
PaymentsAndroid paymentsAndroid = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
paymentsAndroid = new PaymentsAndroid(this);
}
After
@Override
protected void onCreate(Bundle savedInstanceState) {
paymentsAndroid = new PaymentsAndroid(this);
btn_pay1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
            paymentsAndroid.requestSubscription(config.SUBSCRIPTION_HAFTALIK);
        }
    });

}
The request should be fired when the connection is established. That is all :)

Also. It should be used like this. Otherwise, there may be such an error.
Attempt to invoke interface method 'void games.moisoni.google_iab.BillingEventListener.onProductsFetched(java.util.List)' on a null object reference
private void connect(Activity activity) {
billingConnector = new BillingConnector(activity, config.LICENSE_KEY)
.setSubscriptionIds(config.SUBSCRIPTION_IDS)
.autoAcknowledge()
.autoConsume()
.enableLogging()
.connect();
    billingListener(config.SUBSCRIPTION_IDS.get(0));  //should also be added here
}

billingListener(String subscription){
billingConnector.setBillingEventListener(new BillingEventListener() {
....
}
}
public void requestSubscription(String subscription) {
billingListener(subscription);
billingConnector.subscribe(activity, subscription);
}

Yes, .subscribe or .purchase methods should be called only after the BillingConnector has successfully initialized.
@DNAMobileApplications does this work for you?

@DNAMobileApplications in your InappPurchasesActivity you are setting the subscription id to "eatmybutt" then you are trying to subscribe to "sku_1" which obviously can't work. Please change billingConnector.subscribe(InappPurchasesActivity.this, "sku_1"); to billingConnector.subscribe(InappPurchasesActivity.this, "eatmybutt"); ("eatmybutt" should be the SKU id from Play Console).

Hey I've done that & it still doesn't work can I send a screen recording here?

Do I need to upload this version of my app to the Play Store perhaps for it to work?

As long as you have your app published on Play Console there is no need to upload another version, it's should work. The library is working, it's something with your code, if you are able to receive info about the products it must work if you call the .subscribe method on the correct SKU id. Send me again your Billing Activity and a screenshot with the SKU ids from Play Console.

Sending you the link for the java and screenshot one sec.
On Thu., Aug. 19, 2021, 5:35 p.m. Moisoni Ioan, @.***>
wrote:

As long as you have your app published on Play Console there is no need to
upload another version, it's should work. The library is working, it's
something with your code, if you are able to receive info about the
products it must work if you call the .subscribe method on the correct
SKU id. Send me again your Billing Activity and a screenshot with the SKU
ids from Play Console.
—
You are receiving this because you were mentioned.
Reply to this email directly, view it on GitHub
https://github.com/moisoni97/google-inapp-billing/issues/15#issuecomment-902264032,
or unsubscribe
https://github.com/notifications/unsubscribe-auth/AVH4PSIUS2R5XBR7SUOOS3TT5V2IRANCNFSM5CLA3O2Q
.
Triage notifications on the go with GitHub Mobile for iOS
https://apps.apple.com/app/apple-store/id1477376905?ct=notification-email&mt=8&pt=524675
or Android
https://play.google.com/store/apps/details?id=com.github.android&utm_campaign=notification-email
.

https://drive.google.com/file/d/1Y4UksGFvl3xifMYbAEDGC8fc0a-uTapS/view?usp=drivesdk

If it helps I also tried Program Towns billing example & that example gives me an error Client not Ready.  So not sure what I am missing maybe it's a Google Play error which I hope isn't the case because I want this app released by September the latest but it only requires a subscription for it to be available.  I'll give anyone credit for supporting this and figuring out what's going on!

@DNAMobileApplications
package com.zuuchat.sohbet.utils.payments;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.os.AsyncTask;
import android.util.Log;
import android.widget.Toast;
import androidx.annotation.NonNull;
import com.zuuchat.sohbet.ActivityMain;
import com.zuuchat.sohbet.HttpConnectionService;
import com.zuuchat.sohbet.data.db.database;
import com.zuuchat.sohbet.data.db.login;
import com.zuuchat.sohbet.ui.config.config;
import org.jetbrains.annotations.NotNull;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import games.moisoni.google_iab.BillingConnector;
import games.moisoni.google_iab.BillingEventListener;
import games.moisoni.google_iab.models.BillingResponse;
import games.moisoni.google_iab.models.PurchaseInfo;
import games.moisoni.google_iab.models.SkuInfo;
public class PaymentsAndroid {
BillingConnector billingConnector;
//list for example purposes to demonstrate how to manually acknowledge or consume purchases
private final List<PurchaseInfo> purchasedInfoList = new ArrayList<>();

//list for example purposes to demonstrate how to synchronously check a purchase state
private final List<SkuInfo> fetchedSkuInfoList = new ArrayList<>();

private Activity activity;
private String sku;
private String api_url;
private JSONArray restulJsonArray;
private int success;

public PaymentsAndroid(Activity activity) {
    this.activity = activity;
    connect(activity);
}

private void connect(Activity activity) {
    billingConnector = new BillingConnector(activity, config.LICENSE_KEY)
            .setSubscriptionIds(config.SUBSCRIPTION_IDS)
            .autoAcknowledge()
            .autoConsume()
            .enableLogging()
            .connect();

    billingListener(config.SUBSCRIPTION_IDS.get(0));
}

private void billingListener(String subscription) {
    billingConnector.setBillingEventListener(new BillingEventListener() {
        @Override
        public void onProductsFetched(@NonNull List<SkuInfo> skuDetails) {
            String sku;
            String price;

            for (SkuInfo skuInfo : skuDetails) {
                sku = skuInfo.getSku();
                price = skuInfo.getPrice();

                if (sku.equalsIgnoreCase(subscription)) {
                    //TODO - do something
                    // Log.d("BillingConnector", "Product fetched: " + sku);
                    // Toast.makeText(activity, "Product fetched: " + sku, Toast.LENGTH_SHORT).show();

                    //TODO - do something
                    // Log.d("BillingConnector", "Product price: " + price);
                    // Toast.makeText(activity, "Product price: " + price, Toast.LENGTH_SHORT).show();
                }

                //TODO - similarly check for other ids

                fetchedSkuInfoList.add(skuInfo); //check "usefulPublicMethods" to see how to synchronously check a purchase state
            }
        }

        @Override
        public void onPurchasedProductsFetched(@NonNull List<PurchaseInfo> purchases) {
            String sku;

            for (PurchaseInfo purchaseInfo : purchases) {
                sku = purchaseInfo.getSku();

                if (sku.equalsIgnoreCase(subscription)) {
                    //TODO - do something
                    // Log.d("BillingConnector", "Purchased product fetched: " + sku);
                    //Toast.makeText(activity, "Purchased product fetched: " + sku, Toast.LENGTH_SHORT).show();
                }

            }
        }

        @Override
        public void onProductsPurchased(@NonNull List<PurchaseInfo> purchases) {
            String sku;
            String purchaseToken;

            for (PurchaseInfo purchaseInfo : purchases) {
                sku = purchaseInfo.getSku();
                purchaseToken = purchaseInfo.getPurchaseToken();

                if (sku.equalsIgnoreCase(subscription)) {
                    //TODO - do something
                    //   Log.d("BillingConnector", "Product purchased: " + sku);
                    //    Toast.makeText(activity, "Product purchased: " + sku, Toast.LENGTH_SHORT).show();

                    //TODO - do something
                    // Log.d("BillingConnector", "Purchase token: " + purchaseToken);
                    //  Toast.makeText(activity, "Purchase token: " + purchaseToken, Toast.LENGTH_SHORT).show();
                    Toast.makeText(activity, "success", Toast.LENGTH_SHORT).show();

                }

                //TODO - similarly check for other ids

                purchasedInfoList.add(purchaseInfo); //check "usefulPublicMethods" to see how to acknowledge or consume a purchase manually
            }
        }

        @Override
        public void onPurchaseAcknowledged(@NonNull PurchaseInfo purchase) {
            /*
             * Grant user entitlement for NON-CONSUMABLE products and SUBSCRIPTIONS here
             *
             * Even though onProductsPurchased is triggered when a purchase is successfully made
             * there might be a problem along the way with the payment and the purchase won't be acknowledged
             *
             * Google will refund users purchases that aren't acknowledged in 3 days
             *
             * To ensure that all valid purchases are acknowledged the library will automatically
             * check and acknowledge all unacknowledged products at the startup
             * */

            String acknowledgedSku = purchase.getSku();

            if (acknowledgedSku.equalsIgnoreCase(subscription)) {
                //TODO - do something
                //Log.d("BillingConnector", "Acknowledged: " + acknowledgedSku);
                // Toast.makeText(activity, "Acknowledged: " + acknowledgedSku, Toast.LENGTH_SHORT).show();
            }
        }

        @Override
        public void onPurchaseConsumed(@NonNull PurchaseInfo purchase) {
            /*Callback after a purchase is consumed*/

            /*
             * CONSUMABLE products entitlement can be granted either here or in onProductsPurchased
             * */

            String consumedSku = purchase.getSku();

            if (consumedSku.equalsIgnoreCase(subscription)) {
                //TODO - do something
                // Log.d("BillingConnector", "Consumed: " + consumedSku);
                // Toast.makeText(activity, "Consumed: " + consumedSku, Toast.LENGTH_SHORT).show();
            }
        }

        @Override
        public void onBillingError(@NonNull @NotNull BillingConnector billingConnector, @NonNull @NotNull BillingResponse response) {
            switch (response.getErrorType()) {
                case CLIENT_NOT_READY:
                    //TODO - client is not ready yet
                    break;
                case CLIENT_DISCONNECTED:
                    //TODO - client has disconnected
                    break;
                case SKU_NOT_EXIST:
                    //TODO - sku does not exist
                    break;
                case CONSUME_ERROR:
                    //TODO - error during consumption
                    break;
                case ACKNOWLEDGE_ERROR:
                    //TODO - error during acknowledgment
                    break;
                case ACKNOWLEDGE_WARNING:
                    /*
                     * This will be triggered when a purchase can not be acknowledged because the state is PENDING
                     * A purchase can be acknowledged only when the state is PURCHASED
                     *
                     * PENDING transactions usually occur when users choose cash as their form of payment
                     *
                     * Here users can be informed that it may take a while until the purchase complete
                     * and to come back later to receive their purchase
                     * */
                    //TODO - warning during acknowledgment
                    break;
                case FETCH_PURCHASED_PRODUCTS_ERROR:
                    //TODO - error occurred while querying purchased products
                    break;
                case BILLING_ERROR:
                    //TODO - error occurred during initialization / querying sku details
                    break;
                case USER_CANCELED:
                    //TODO - user pressed back or canceled a dialog
                    break;
                case SERVICE_UNAVAILABLE:
                    //TODO - network connection is down
                    break;
                case BILLING_UNAVAILABLE:
                    //TODO - billing API version is not supported for the type requested
                    break;
                case ITEM_UNAVAILABLE:
                    //TODO - requested product is not available for purchase
                    break;
                case DEVELOPER_ERROR:
                    //TODO - invalid arguments provided to the API
                    break;
                case ERROR:
                    //TODO - fatal error during the API action
                    break;
                case ITEM_ALREADY_OWNED:
                    //TODO - failure to purchase since item is already owned
                    break;
                case ITEM_NOT_OWNED:
                    //TODO - failure to consume since item is not owned
                    break;
            }
        }

    });
}

public void requestSubscription(String subscription) {
    billingListener(subscription);
    billingConnector.subscribe(activity, subscription);
}

}
PayScreenActivity.java
PaymentsAndroid paymentsAndroid = null;
paymentsAndroid = new PaymentsAndroid(this);
    btn_pay1.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            paymentsAndroid.requestSubscription(config.SUBSCRIPTION_HAFTALIK);
        }
    });

If it still doesn't work, you should sign the app and try it.

If it still doesn't work, you should sign the app and try it.

https://play.google.com/store/apps/details?id=dnamobileapplications.ca.posprintimages

I uploaded the app again to Google play I'll refund you if you can get it,  long press the Test Commands button to see unlock button.   Please let me know if unlock works

Maybe I'll just make the app paid idk why the heck I'm able to get the information but cannot call .purchase or .subscribe on either of my IDs did you get yours to work @blackseapps ?

@DNAMobileApplications try this:
package dnamobileapplications.ca.posprintimages;

import androidx.appcompat.app.AppCompatActivity;
import androidx.annotation.*;
import android.app.*;
import android.os.*;
import android.view.*;
import android.view.View.*;
import android.widget.*;
import android.content.*;
import android.content.res.*;
import android.graphics.*;
import android.graphics.drawable.*;
import android.media.*;
import android.net.*;
import android.text.*;
import android.text.style.*;
import android.util.*;
import android.webkit.*;
import android.animation.*;
import android.view.animation.*;
import java.util.*;
import java.util.regex.*;
import java.text.*;
import org.json.*;
import java.util.ArrayList;
import android.widget.LinearLayout;
import android.widget.Button;
import android.view.View;
import games.moisoni.google_iab.*;
import com.android.billingclient.*;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.DialogFragment;
import androidx.annotation.NonNull;
import games.moisoni.google_iab.BillingConnector;
import games.moisoni.google_iab.BillingEventListener;
import games.moisoni.google_iab.enums.PurchasedResult;
import games.moisoni.google_iab.enums.SupportState;
import games.moisoni.google_iab.models.BillingResponse;
import games.moisoni.google_iab.models.PurchaseInfo;
import games.moisoni.google_iab.models.SkuInfo;

public class InappPurchasesActivity extends AppCompatActivity {

	private BillingConnector billingConnector;
	private String price = "";

	private LinearLayout linear1;
	private Button button1;

	@Override
	protected void onCreate(Bundle _savedInstanceState) {
		super.onCreate(_savedInstanceState);
		setContentView(R.layout.inapp_purchases);
		initialize(_savedInstanceState);
		initializeLogic();
	}

	private void initialize(Bundle _savedInstanceState) {
		linear1 = (LinearLayout) findViewById(R.id.linear1);
		button1 = (Button) findViewById(R.id.button1);
	}

	private void initializeLogic() {
		List<String> subscriptionids = new ArrayList<>();
		subscriptionids.add("eatmybutt");

		billingConnector = new BillingConnector(InappPurchasesActivity.this, "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxnxS+B1LpQKkFCR2i/Hue7rRhYz5/yggePWBMyPXPke9N9lFN6yj4nJtOJIYNVmoGpIkiY4bQWwg7Q4kPUS/yZEqtdCjpkl+tTCS7YzNkbqLn9E+BxDWPwQZ9FAvtrk56QvxOJv3YyQHwu0Bk8sAT94Z7cSSLen54hywf0GRU7XvGK77cuWSIlJ+yAc3oMUYMBpo8iny9YP659ry06CrUr1k4nawciToJszW4ZUcnJLKPBh+7tA0VFJKibzlpjSPLJVQpyaVrUlKJlsr6lV0L+hMyM9Dr8L31JtsgpD1V7l4cfqmhFHSBdLX/xm584OiDejPQkw08lo33tuOk0loDwIDAQAB")
		.setSubscriptionIds(subscriptionids)
		.autoAcknowledge()
		.enableLogging()
		.connect();

		billingConnector.setBillingEventListener(new BillingEventListener() {
			@Override
			public void onProductsFetched(@NonNull List<SkuInfo> skuDetails) {
				//*Provides a list with fetched products*/
				//It will fetch product
				SketchwareUtil.showMessage(getApplicationContext(), "fetched");
				for (SkuInfo skuInfo : skuDetails) {
					price = skuInfo.getPrice();
					//onProductFetched
					button1.setText(price);
				}
			}
			@Override
			public void onPurchasedProductsFetched(@NonNull List<PurchaseInfo> purchases) {
				/*Provides a list with fetched purchased products*/
				SketchwareUtil.showMessage(getApplicationContext(), "purchase fetched");
				//onPurchasedProductFetched
			}
			@Override
			public void onProductsPurchased(@NonNull List<PurchaseInfo> purchases) {
				/*Callback after a product is purchased*/
				SketchwareUtil.showMessage(getApplicationContext(), "purchased");
				//onProductPurchased
			}
			@Override
			public void onPurchaseAcknowledged(@NonNull PurchaseInfo purchase) {
				//*Callback after a purchase is acknowledged*/
				SketchwareUtil.showMessage(getApplicationContext(), "acknowledge");
				//onProductAcknowledge
			}
			@Override
			public void onPurchaseConsumed(@NonNull PurchaseInfo purchase) {
				//*Callback after a purchase is consumed*/
				SketchwareUtil.showMessage(getApplicationContext(), "Purchase Consumed");
				//onPurchasedConsumed
			}
			@Override
			public void onBillingError(@NonNull BillingConnector billingConnector, @NonNull BillingResponse response) {
				switch(response.getErrorType()) {
					case CLIENT_NOT_READY:
					SketchwareUtil.showMessage(getApplicationContext(), "Billing error: App not available on Google Play.");
					break;
					case CLIENT_DISCONNECTED:
					SketchwareUtil.showMessage(getApplicationContext(), "Ahhhhhh");
					break;
					case SKU_NOT_EXIST:
					SketchwareUtil.showMessage(getApplicationContext(), "No Sku");
					break;
					case CONSUME_ERROR:
					SketchwareUtil.showMessage(getApplicationContext(), "Consume Error");
					break;
					case ACKNOWLEDGE_ERROR:
					SketchwareUtil.showMessage(getApplicationContext(), "Acknowledge Error");
					break;
					case ACKNOWLEDGE_WARNING:
					SketchwareUtil.showMessage(getApplicationContext(), "Acknowledge Warning");
					break;
					case FETCH_PURCHASED_PRODUCTS_ERROR:
					SketchwareUtil.showMessage(getApplicationContext(), "Fetch product error");
					break;
					case BILLING_ERROR:
					SketchwareUtil.showMessage(getApplicationContext(), "Biling Error");
					break;
					case USER_CANCELED:
					SketchwareUtil.showMessage(getApplicationContext(), "User Cancel");
					break;
					case SERVICE_UNAVAILABLE:
					SketchwareUtil.showMessage(getApplicationContext(), "Service Unavailable");
					break;
					case BILLING_UNAVAILABLE:
					SketchwareUtil.showMessage(getApplicationContext(), "Billing Unavailable");
					break;
					case ITEM_UNAVAILABLE:
					SketchwareUtil.showMessage(getApplicationContext(), "Item Unavailable");
					break;
					case DEVELOPER_ERROR:
					SketchwareUtil.showMessage(getApplicationContext(), "Dev Error");
					break;
					case ERROR:
					SketchwareUtil.showMessage(getApplicationContext(), "Error");
					break;
					case ITEM_ALREADY_OWNED:
					SketchwareUtil.showMessage(getApplicationContext(), "Item owned");
					break;
					case ITEM_NOT_OWNED:
					SketchwareUtil.showMessage(getApplicationContext(), "Not owned");
					break;
				}
			}
		});

		button1.setOnClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View _view) {
				SketchwareUtil.showMessage(getApplicationContext(), "Trying to subscribe");
				billingConnector.subscribe(InappPurchasesActivity.this, "eatmybutt");
			}
		});
	}

	@Override
	protected void onActivityResult(int _requestCode, int _resultCode, Intent _data) {
		super.onActivityResult(_requestCode, _resultCode, _data);
		switch (_requestCode) {

			default:
			break;
		}
	}

	@Deprecated
	public void showMessage(String _s) {
		Toast.makeText(getApplicationContext(), _s, Toast.LENGTH_SHORT).show();
	}

	@Deprecated
	public int getLocationX(View _v) {
		int _location[] = new int[2];
		_v.getLocationInWindow(_location);
		return _location[0];
	}

	@Deprecated
	public int getLocationY(View _v) {
		int _location[] = new int[2];
		_v.getLocationInWindow(_location);
		return _location[1];
	}

	@Deprecated
	public int getRandom(int _min, int _max) {
		Random random = new Random();
		return random.nextInt(_max - _min + 1) + _min;
	}

	@Deprecated
	public ArrayList<Double> getCheckedItemPositionsToArray(ListView _list) {
		ArrayList<Double> _result = new ArrayList<Double>();
		SparseBooleanArray _arr = _list.getCheckedItemPositions();
		for (int _iIdx = 0; _iIdx < _arr.size(); _iIdx++) {
			if (_arr.valueAt(_iIdx))
			_result.add((double)_arr.keyAt(_iIdx));
		}
		return _result;
	}

	@Deprecated
	public float getDip(int _input) {
		return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, _input, getResources().getDisplayMetrics());
	}

	@Deprecated
	public int getDisplayWidthPixels() {
		return getResources().getDisplayMetrics().widthPixels;
	}

	@Deprecated
	public int getDisplayHeightPixels() {
		return getResources().getDisplayMetrics().heightPixels;
	}
}

I figured out that it was to do with my manifest thanks for all your help!


GPU enabled taks

I would like to have GPU enabled Slicer CLI tasks and would like to know how to pass additional flags for the task Docker container, as per official Docker guideline (or nvidia-docker), you need to specify either --gpus flag (Native Docker) or --runtime (nvidia-docker). I saw that there is CNNCellDetection example CLI which uses GPUs, but DSA part is not explained there, how to enable it. Can you elaborate on that? When I run a GPU-enabled task, I get from torch:
RuntimeError: Found no NVIDIA driver on your system. Please check that you have an NVIDIA GPU and installed a driver
Additionally, I would also like to know how to pass environment variables to the CLI worker Docker container. I would like that on DSA setup, certain ENV variables are passed and also passed along to running tasks (e.g. cloud access credentials, API keys, etc.), which should not be hardcoded.

I think that the problem is in Girder Worker Docker container nvidia/GPU support check:
https://github.com/girder/girder_worker/blob/master/girder_worker/docker/tasks/__init__.py#L74
https://github.com/girder/girder_worker/blob/e635acedb50d78d48de227bad7cc2bf7376810cf/girder_worker/docker/nvidia.py#L1
It seems like you need to have LABEL com.nvidia.volumes.needed=nvidia_driver present in the image for the Girder Worker to add Nvidia runtime to the runtime. It seems also that Nvidia stopped using this label in recent images so nvidia runtime is then not assigned. I dont know how Nvidia now recognized the same stuff, but the label is absent now.
I also saw that you added support in Girder Worker for new (19.03+) native Docker support for the GPUs, but according to the implementation (check the link below), you still need the above LABEL to be present, to even consider it. With the new native support, there is no need to have runtime="nvidia", just --gpus [all, or an ID] flag. I think that the current implementation for the GPU support in Girder Worker is thus not OK. Can you elaborate how should one use the new native GPU support (--gpus)? I don't think it's possible currently, despite the comments.
https://github.com/girder/girder_worker/blob/master/girder_worker/docker/tasks/__init__.py#L88

Adding the LABEL com.nvidia.volumes.needed=nvidia_driver should make the gpu device request get invoked, even if that label doesn't do any good otherwise.  Alternately, you can pass device_requests as part of the job arguments.  I think this is a list of dictionaries where each entry has values such as listed in the DeviceRequest class in https://github.com/docker/docker-py/blob/master/docker/types/containers.py#L155 .

Yes, I will do that now -> add LABEL. You need to be careful then though, that you need nvidia-docker2 in order to have support for the runtime=nvidia flag. I think that GPU usage needs a bit more documentation and refactoring to be up-to-date :)
For the new API (--gpus), I will try, but you will still need to have LABEL present in your image, just to enter the IF section needed to run the container:
https://github.com/girder/girder_worker/blob/master/girder_worker/docker/tasks/__init__.py#L88
I will be using GPUs a lot together with Girder, so I am more than happy to test the things out when needed. We can keep this issue open until then.

We'd welcome improvements, either in the code or the docs.
I know that some others have run GPU code (for instance https://github.com/SarderLab/Histo-cloud), though I don't know the specifics of what they did to get GPU access.

Thanks @manthey, I will do PR on docs, when I figure everything out. Thank you also for the Histo-cloud reference. They have solved it exactly in the same manner - by adding LABEL:
https://github.com/SarderLab/Histo-cloud/blob/main/Dockerfile#L11

@manthey do you have any suggestions for the 2nd part of the question, about how to pass "secrets" into CLI task container (e.g. API keys). Given that the task container is executed through Docker SDK. Good enough would be that certain ENV variables from the local env are passed to this executed CLI. Docker secrets (through Docker Compose) are probably again not feasible, given that the container is run through the SDK. Can I achieve that without modifying the gider worker code? I saw kwargs parameter, but don't know how to pass ENVs through it via standard DSA deployment.

I had a very similar idea. Currently, I resorted to using Girder Collections and Items key-value metada. Basically, I have added metadata key-value pairs to the task. I then only need to pass API URL and Girder API token through task UI and the task then gets ENV variables programmatically through API calls. This is the current solution, as I have plenty of ENV variables and need to expose only Girder credentials as such. This is still not optimal as I added default value to the token, for the pathologists not to copy always their API key.
I will test it out, when available and give you feedback! Thanks!

@manthey You mentioned that API URL and Token are auto-populated and passed to the task. I saw this description also in Slicer CLI Web repo readme description. It doesn't work for me. The input boxes are empty - I have tried leaving out default part also.
  <parameters advanced="true">     Girder API URL and Key     <description>A Girder API URL and token for Girder client</description>     <string>       <name>girderApiUrl</name>       <longflag>api-url</longflag>       Girder API URL       <description>A Girder API URL (e.g., https://girder.example.com:443/api/v1)</description>       <default></default>     </string>     <string>       <name>girderToken</name>       <longflag>token</longflag>       Girder API Token       <description>A Girder token</description>       <default></default>     </string>   </parameters>

The girderApiUrl and girderToken fields are auto-populated if left blank.  You should be able to use them inside the cli like so (here there is another string input of itemId):
    gc = girder_client.GirderClient(apiUrl=args.girderApiUrl)
    gc.setToken(args.girderToken)

    annotations = gc.get(f'annotation', parameters=dict(limit=100, offset=0, itemId=args.imageId))
    pprint.pprint(annotations)

This, for instance, is using an xml spec that looks like
<?xml version="1.0" encoding="utf-8"?>
<executable>
  <category>Sample</category>
  <title>Girder Client - Fetch Annotation</title>
  <description>Summarize annotations associated with a whole slide image.</description>
  <version>0.1.0</version>
  <license>Apache 2.0</license>
  <contributor>David Manthey (Kitware)</contributor>
  <parameters>
    <description>General parameters</description>
    IO
    <string>
      <name>imageId</name>
      <index>0</index>
      imageId
      <description>An image ID</description>
    </string>
  </parameters>
  <parameters advanced="true">
    Girder API URL and Key
    <description>A Girder API URL and token for Girder client</description>
    <string>
      <name>girderApiUrl</name>
      <longflag>api-url</longflag>
      Girder API URL
      <description>A Girder API URL (e.g., https://girder.example.com:443/api/v1)</description>
      <default></default>
    </string>
    <string>
      <name>girderToken</name>
      <longflag>girder-token</longflag>
      Girder Token
      <description>A Girder token</description>
      <default></default>
    </string>
  </parameters>
</executable>

There needs to be a convenient way to pass a Girder ID for an item, file, or other resource and/or a convenient way to pass a specific annotation or set of annotations as a json file.  This would require some work in the slicer_cli_web library.  One idea would be, to pass a resource ID rather than the file itself, we'd add a flag to the item/file/folder fields with a boolean of "as GirderID" or something similar.  For annotations, we could easily pass ALL annotations (since there is no UI to pick which ones), or specify an annotation by name (pass any annotations whose name match a regex, for instance) or recentness (pass the last modified annotation), or a combination of these (the most recent annotation whose name matches a regex).
Feel free to create issues in the slicer_cli_web repo for these and comment on what you think would work well for your use case.

Great @manthey the problem was probably that I was using:

from histomicstk.utils.girder_convenience_utils import connect_to_api

With girder_client it works now, though I have a new problem:

annotations = gc.get(f'annotation', parameters=dict(limit=100, offset=0, itemId=args.imageId))

returns:

girder_client.HttpError: HTTP error 401: GET http://girder:8080/api/v1/annotation?itemId=6188cb40c7173b56342476a2
Response text: {"message": "Read access denied for item 6188cb40c7173b56342476a2 (user None).", "type": "access"}

This probably means that auto-generated token does not have proper rights to get annotations properly. I guess that there is some bug in the REST call for the annotations, it should list annotations only with read rights only (I don't know what are the default permissions for auto-generated tokens). The auto-generated token works OK for the default bbox ROI though.

The above problem with regards to read access and sometimes also "you need to be logged in" is that majority of the API calls have @access.user and thus do not work solely with the token in the CLI task. I have resorted to adding @access.token to some of the @access.user API calls that I need from the CLI (e.g. listing CLIs api call requires users permissions, which I think is not needed and the token only should also be enabled.
TODO: @manthey maybe a revision is needed on the access rights for the API calls (e.g. listing CLIs etc.) that currently require user logged in. Some of them might be changed to @access.token or even @access.public.

I think you are right that some of the access needs to be changed to @access.token.    Have you had to modify any access points in the core of Girder?  Or only in large_image and histomicsui?

I have only modified it in slicer_cli_web to be able to list tasks - the use case is for example that you store pre-trained models in the task as an additional file, or metadata and you need to access it then in the task. Probably there are more that would be useful to have under token availability only. I had some problems also with obtaining existing annotations for a particular slide, even if just the annotations from the same user. But don't know if those are on Girder.


Add Twine Labs as an airflow user

Hi all. Adding Twine Labs to the official users list. Didn't want to pollute the issue tracker since other users were added without referencing a specific ticket. PR meets all other contribution guidelines (description, tests, commits, documentation, code quality).

Codecov Report

Merging #3287 into master will not change coverage.
The diff coverage is n/a.

@@          Coverage Diff           @@
##           master   #3287   +/-   ##
======================================
  Coverage    75.9%   75.9%
======================================
  Files         197     197
  Lines       14702   14702
======================================
  Hits        11159   11159
  Misses       3543    3543

Continue to review full report at Codecov.

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


Add discovery of Harvester options

This adds an opts field to HarvestSource for storing serialized options that get passed to the harvester.  For example, a list of sets for an OAI harvester.
Krikri::Harvester.expected_opts has been added to help client code know what options to get from the user to store in HarvestSource.  See the comment below for that method.
OAIHarvester has also been changed to take 'uri' as an option instead of 'endpoint', to bring it inline with the HarvestSource model, which has a 'uri' field, not an 'endoint' field.
The next step, assuming this goes over well, is to make an Event that can read the opts in a HarvestSource and determine the right strategy for enqueueing jobs for the relevant harvester, e.g. do one harvest job for the whole harvest, or iterate over sets, using the same URI each time, etc.

I'm good with this in general (I haven't read the code closely yet, but it looks good at a glance).
OAIHarvester has also been changed to take 'uri' as an option instead of 'endpoint', to bring it inline with the HarvestSource model, which has a 'uri' field, not an 'endoint' field.
I'm wondering about the importance of this. It suggests that you are thinking to couple the HarvestSource fields and their names pretty tightly to Harvester.  My philosophy would be to keep the dependency loose and strictly a dependency of HarvestSource on some portion of the Harvester interface.
Maybe rather than trying to sync the field names, an approach that generates the HarvestSource form from the options presented by the relevant Harvester is a good idea?
(I could be reading too much into this change...)

I just figured that uri is / has been used more commonly elsewhere, and I didn't want anyone to look at this argument as being different in some way.  It's mostly consistency for its own sake here.  The term uri would be appropriate for a file-based harvester as well as a networked one, and we can count on every harvester having this argument.  We would therefore avoid momentary confusion with the OAIHarvester if someone used to reading uri has to look at endpoint and wonder why it's different.
BTW, the trick really is the loose coupling, and why I'm taking the creation of the ingestion event slowly.  There are all of these different harvesters that will work in different ways, and HarvestSource has to be generic, and the opts value has to be considered carefully.
As you suggest, yes, I think the HarvestSource should be filled in based on the fields that the particular Harvester says it wants.  I've added that opts field for anything that's not uri, just because uri is the one thing that I think is universal for all harvesters.  I think that opts will be a JSON string.

I think this looks good as well, pending any other feedback from @no-reply. I think my one point for discussion, picking up on Tom's earlier comment, would be to think about how to set up the opts for harvester-type-specific Krikri::Harvester subclasses. For example, if there are notions that just relate to Krikri::Harvesters::OAIHarvester, would/could those be relegated to an oai key in the hash?

Perhaps, yes, I hadn't thought of an oai key per se, but I have a branch I'm about to push that shows part of the approach I'm thinking of for harvester-specific details.

This looks good to me. With the clarification in @markbreedlove's comment, it looks like our thinking about this is aligned.
I'll look at the newer branch in a bit; pending anything coming out of that, I don't have a strong opinion about the structure of the ops hash.  @anarchivist can you say something about the benefit of a top-level oai key vs. a flatter structure?

@no-reply I don't have a strong opinion about the structure per se, but having some mechanism for namespacing these harvester-specific options might be preferable.

I'll see how it works with an oai key.  I think that would make it more clear.

OK, i've added that oai key.

This looks good to me. Squashy, squashy?


Fix BYTE statistics on platforms with unsigned 'char'

ORC's BYTE type is signed, but the library used char type for calculating min/max values. It broke in ARM builds.

(Trying to upstream this: https://github.com/apache/orc/pull/1947 )


Unit Ambiguity in QOS Adaptive Policy Configuration

The QOS adaptive policy configuration can be set in either IOPS/GB or IOPS/TB. Currently, Harvest only publishes the value of this configuration, without specifying the unit. We should address this by converting all values to TB (which is the default) or another consistent unit.

verified in 24.05 release branch at commit 74dcf38a872d2c38e633664314e0acc5b9f8d76b,
From Ontap,

Consider for bbbbb and mnop named whose value converted from GB to TB.
From Prometheus,


Fix save action redirect url

WHY
BEFORE - What was wrong? What was happening before this PR?
Undefined variable $redirectUrl

"exception": "[object] (ErrorException(code: 0): Undefined variable $redirectUrl at /vendor/backpack/crud/src/app/Library/CrudPanel/Traits/SaveActions.php:360)

I looked at backpack 4.1, this bug is also present there. It's surprising that no one paid attention to him for so many years.  :)

Hey @makss thanks for the PR.
I wouldn't say it's a bug per se, it does not yield unexpected results. If you provide the "expected" redirect key.
We should had either make redirect a required field for the save actions or set it with a default value like you did here I agree with you, we let that mutant escape by only covering the happy path.
I think your approach is reasonable, so I am merging it as is.
Thanks again.
🙏


A new organization for this repository

Hi @serilog/reviewers-azure-table-storage 👋
Via https://github.com/serilog/serilog/issues/1627 - we're unbundling the serilog organization to help distribute the effort involved in managing the various Serilog sub-projects. The serilog organization will now only manage the fundamental sinks and other packages that the rest of the ecosystem builds upon.
If this package is actively maintained, it can be moved to a new organization managed by the maintainers. Otherwise, it can move to the serilog-archive parking lot, from where we hope a new community-run fork might spring from in the future 🌷 .
Let me know if you're a maintainer and keen to continue this project under a new org; otherwise, I'll shuffle things around and move this one to the archive.
Thanks!

If it gets moved to serilog-contrib, I'd be willing to help be a maintainer.  I think serilog-contrib is the best location for discoverability and to remain available as maintainers come and go.

very looking forward as #82 sitting there for ages.
Company wants to remove the deperated WindowsAzure.Storage packages.

I'd be in as well if help is needed @nblumhardt

Thanks for all the offers of help, we'll see what can be figured out 👍

Alrighty folks! I'll move this and serilog-sinks-azuretablestorage to serilog-contrib (both have active contributors), and get maintenance kicked back off over there. 👍

@nblumhardt Awesome, thanks for moving.  However, I don't have access.   Maybe I need to be added to the serilog-contrib org?
Once i get access, i'll get started on cleaning up.   I'll update the build to use github actions.
thanks again

Thanks for the note @pwelter34 - I'm just in the process of confirming with @augustoproiete how we should set teams up over there in contrib, I'll drop a note on this thread when it's ready to go.

I'm sorry it's taken so long. @pwelter34 @ThomasPe you should both now have received invitations to become maintainers in this repository. I'm keen to get the ball rolling and can help out with bits and pieces in the short term :-)
A good course of action might now be to close this ticket, and open a new one with a "get the ball rolling again" checklist, including things like reviewing/merging open PRs, triaging issues, and getting CI set up in the new org.
Sound like a plan? 😎

Sounds great, thanks so much for making this happen. Should I start with creating a new ToDO issue?
How will we handle CD, I assume we can continue update the available NuGet package? Then we would need an access token to set up an action. But this is probably a discussion for the new topic as well. :)

Creating the new TODO issue sounds like the way to go :+1:
I've just done some work setting up Serilog.Sinks.ApplicationInsights in serilog-contrib, using GitHub Actions for CI. It would be fairly easy to copy Build.ps1 and .github over from that repository to get things rolling, here.
I've added a NuGet API key now to this repository's secrets, as NUGET_API_KEY, which the Actions setup I mentioned above will be able to consume.

I'll get the build going.  I'll also merge in the PR for Azure.Data.Tables.  We can assess from there.

New build has been created
bummed the version to 7.0
beta nuget packages are published to github feed
add target for .net 6
cleaned up all build warnings and errors
add issue for features in version 7.0

Awesome :-) Guess it's time to close this, then!


Attempting to modify the version in any way when HEAD is currently pointing to a tag should cause the build to fail

Existing behavior is confusing since calling any of the bump tasks or pre-release tasks when HEAD is pointing to a tag is a NOP. There is no feedback as to why the version-number is not modified and remains the same as the tag. Instead, the build should fail saying that it is not possible to modify the version number without making changes.

Fixed.


Added new example.

Added a new example that will demonstrate how one can access data lazily and recursively using GroupDocs.Assembly for .NET.

Updated Examples.


test

wip

The hack script needs to be fixed but I did see a diff present when running the following:
$ rm -rf staging/*/vendor
$ git status
	deleted:    staging/operator-lifecycle-manager/vendor/github.com/operator-framework/api/crds/operators.coreos.com_catalogsources.yaml
	deleted:    staging/operator-lifecycle-manager/vendor/github.com/operator-framework/api/crds/zz_defs.go
	deleted:    staging/operator-lifecycle-manager/vendor/github.com/operator-framework/api/pkg/manifests/bundleloader.go
	deleted:    staging/operator-lifecycle-manager/vendor/github.com/operator-framework/api/pkg/operators/v1alpha1/catalogsource_types.go
	deleted:    staging/operator-lifecycle-manager/vendor/modules.txt

Looks like the commits might've introduced some nested vendor changes. Not too sure whether that's the culprit here.

Closing as the OLM unit check is now back online.


Responsive design on report page

Primary notes

On smaller screens, the 8 text inputs turn into 1 singular
Issue #44 was created by new changes
Issue #26 still applies to new input as well as old
Margin above single input is probably too large

Secondary Notes

Color of confirm button on errorModal was changed to match theme of site
Minor error message changes

Bypassing branch protections because nothing should break


Refactor timer widget

Pull Request
What type of PR is this? (check all applicable)

[x] Refactor
[x] Feature
[ ] Bug Fix
[ ] Optimization
[ ] Documentation Update

Description
Abstract the timer widget into a separate node on the timer laptop communicating over ros with a simpler widget. This allows the global timer to be displayed on multiple places across both guis.
Related Tickets & Documents
Closes #111

Currently failing the linter because the linter is wrong


wslbridge error: failed to start backend process

When i start a fedora-terminal, then i got the following error:
/bin/wslbridge: Exit 1.
wslbridge error: failed to start backend process
note: bash.exe output: Fehler: 0x80070040

I use wsltty-<IP_ADDRESS>
Kind regards.
Gérald

What do you mean by "fedora-terminal"? Did you install Fedora yourself? Can you run bash.exe or wsl.exe directly from command prompt?
Try this. Find the folder where you install Fedora. Open the rootfs folder.

I think my Problem depends on the issue discussed here:
https://github.com/Microsoft/WSL/issues/3304#issuecomment-398489972
Workaround doesn't fix my Problem.

WSL team will not help with your problem because Fedora isn't available in Windows Store.  Also this issue isn't related with wslbridge.
I installed Fedora and its's working fine. But dnf and rpm don't work. If you share your procedure how you installed it'l be helpful. You didn't answer my question. Did you try to run bash.exe or wsl.exe? Did you delete the resolv.conf file?


Worker Runtim

In your siteConfig --> app settings, you're missing the runtime:
{
"name": "FUNCTIONS_WORKER_RUNTIME",
"value": "[parameters('runtime')]"
}

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

ID: a1ba8817-3e01-7e84-6c71-b98b131f2927
Version Independent ID: a7703386-9e83-1075-72ef-f9e63f3dc4de
Content: Automate resource deployment for a function app in Azure Functions
Content Source: articles/azure-functions/functions-infrastructure-as-code.md
GitHub Login: @ggailey777
Microsoft Alias: glenga

@MouthOfMadness Thanks for the feedback! We are currently investigating and will update you shortly.

Hi @MouthOfMadness
Runtime doesn't appear to be a required setting so the samples would still work: https://docs.microsoft.com/en-us/azure/templates/Microsoft.Web/2018-02-01/sites#siteproperties-objec
We will now proceed to close this thread. If there are further questions regarding this matter, please reopen it and we will gladly continue the discussion.

This was a great article, but I couldn't get it to run without the runtime configured when deployed through devops.  I was able to figure this out by creating a function app through the portal and then going into Kudo and doing a file compare to see what was missing.

@MouthOfMadness Interesting, I tried this sample without the runtime specific settings and was able to create the resources as expected. if you're able to share steps that reproduces that issue, let us know and we'll clarify with product team.

Ahh, here’s the difference the example documentation is different than the git json file.
The git json file includes the runtime whereas there’s no mention of it in the documentation:
{
          "name": "FUNCTIONS_WORKER_RUNTIME",

          "value": "[variables('functionWorkerRuntime')]"

        }

From: Mike Urnun<EMAIL_ADDRESS>Sent: Saturday, February 23, 2019 12:01 AM
To: MicrosoftDocs/azure-docs<EMAIL_ADDRESS>Cc: James Mattern<EMAIL_ADDRESS>Mention<EMAIL_ADDRESS>Subject: Re: [MicrosoftDocs/azure-docs] Worker Runtim (#25064)
EXTERNAL EMAIL
@MouthOfMadnesshttps://github.com/MouthOfMadness Interesting, I tried this samplehttps://github.com/Azure/azure-quickstart-templates/blob/master/101-function-app-create-dynamic/azuredeploy.json without the runtime specific settings and was able to create the resources as expected. if you're able to share steps that reproduces that issue, let us know and we'll clarify with product team.
—
You are receiving this because you were mentioned.
Reply to this email directly, view it on GitHubhttps://github.com/MicrosoftDocs/azure-docs/issues/25064#issuecomment-466620452, or mute the threadhttps://github.com/notifications/unsubscribe-auth/Ab4Q-lv3iOOW-0qmOIrRyay8q0l-WlOjks5vQNkjgaJpZM4a-H0P.

@MouthOfMadness I think that this automation article may be out of date. I'll get someone to take a look at it. @mike-urnun-msft we can reopen this issue in the meantime.


HLS.js

Hello, i discover this awesome software integrated in many iptv players : HLS.js is a JavaScript library that plays HLS in browsers with support for MSE, it will be great to integrate this tool to our beloved Iptvnator, thank you !
https://github.com/video-dev/hls.js#player-integration

IPTVnator uses this library under the hood 👍

Awesome !! 💯 🥇


Analyze Vulnerability Scan

@udosson has provided a vulnerability scan of our docker container:
https://github.com/IDunion/indy-node-container/blob/main/minutes/clair-report-indy-node-slim-buster.json
We should at least check the 8 critical/high severity issues

Hey,
we could use trivy for Continous Scanning and compare it.

fyi: https://github.com/IDunion/indy-node-container/security/code-scanning?query=ref%3Arefs%2Fpull%2F12%2Fmerge

current scan results: https://github.com/IDunion/indy-node-container/security/code-scanning

IMO this can be closed. Running trivy with --unfixed results in 0 CVEs. See also #21


plugin set

have plugin set (a plugin set has many plugin, a plugin can show in different set)
with this plugin set, we can choose different when we are developing different language (such as php, react, react-native, etc...)
sometimes I don't wan't to activate which one or two plugin that can cause side effect, so I come up with this plugin set idea
hope you guys can make it happen

thank you.
my question is same as
Hope to have a plugin manager (#65123)
regards


Unapproved but successful workflows should show as green

Problem to Solve
A CI workflow which reaches an approval step, where approval is not given, is indicated as pending (orange). This is misleading as it gives the impression that tests have not passed. Approval is only given when releasing, so this problem is very common.
Current Workaround
Inspect the pending flag to see how far the workflow progressed
Proposed Solution
Use a custom approval system

Solved by #85


Refactor TrainingJobRouteDecisionInfo test to use KNNTestCase

Description
Recently, we have seen that TrainingJobRouteDecisionInfoTransportActionTests has been having failures on Windows (for example: https://github.com/jmazanec15/k-NN-1/actions/runs/7415192445/job/20177850505). The failures are related to an unintialized cluster state tryiing to be accessed after calling training. Still not sure why the cluster state is null after the test starts, but this does not have anything to do with the test itself.
Most likely, the flakiness is the result of state sharing that happens with KNNSingleNodeTestCase. KNNSingleNodeTestCase inherits from OpenSearchSingleNodeTestCase which will start a node as a part of running each test. OpenSearchSingleNodeTestCase is unnecessary for this test case where we just want to validate that a transport action can read the correct job count on the node. This change refactors the class to use mocks and a lighter weight base class, KNNTestCase. In general, we should always prefer KNNTestCase over KNNSingleNodeTestCase.
Issues Resolved
#1368
Check List

[X] New functionality includes testing.

[X] All tests pass

[X] Commits are signed as per the DCO using --signoff

By submitting this pull request, I confirm that my contribution is made under the terms of the Apache 2.0 license.
For more information on following Developer Certificate of Origin and signing off your commits, please check here.

Waiting for k-NN build to be completed.


Don't trust non-empty Iterables used as values in spread arguments

On JS, the following anomalies occur:
    object lyingIterable satisfies {Integer+} {
        iterator() => emptyIterator;
    }
    [Integer, Integer+] seq = [1, *lyingIterable];
    print(seq); // [1] (but type indicates at least two elements!)
    Integer x = seq[1];
    print(x); // <null>
    [Integer+] ints = [*lyingIterable];
    print(ints); // []
    Integer i = ints.first;
    print(i); // <null>

On the JVM (and mostly on Dart), class cast exceptions head off the unsoundness at runtime. But, should all backends standardize on explicit checks to make sure expressions don't result in [] where [T+] is expected?

Some related issues: #5866 ({finished}), #1651 (func(*lyingiterable)).


Interpolation update

Changes introduced:

One can now provide a list of custom dates to the interpolation
Updated unit tests for interpolation (no mask used before)
Created a real-life example of a test patch, all existing tests should now be updated to use it, potentially it can be updated if there is some missing info
Fixed some bugs in the interpolation if two dates are too close together

I'll clean this up and rebase on a clean develop


Errors when executing owncloud blueprint

Note: These blueprints can pass one time then fail for 10 times
First Example
g8client__main:
    url: 'gig.demo.greenitglobe.com'
    login: '****'
    password: '****'
    account: 'john'

vdc__main5:
    g8client: 'main'
    description: 'des'
    location: 'be-conv-2'

blueowncloud__bc:
    vdc: 'main5'
    datadisks:
       - 1000
       - 1000
    domain: 'owndomain.com'

*TRACEBACK*********************************************************************************
Traceback (most recent call last):
  File "/opt/jumpscale8//lib/JumpScale/core/processmanager/ProcessManagerFactory.py", line 195, in start
    res = self.method(**self.args)
  File "/tmp/actions/os.ssh.ubuntu/install.py", line 31, in action
    executor.cuisine.ssh.authorize("root", sshkey.model.data.keyPub)
  File "/opt/jumpscale8/lib/JumpScale/tools/cuisine/CuisineSSH.py", line 137, in authorize
    d = self._cuisine.user.check(user, need_passwd=False)
  File "/opt/jumpscale8/lib/JumpScale/tools/cuisine/CuisineUser.py", line 85, in check
    _, d, _ = self._cuisine.core.run("getent passwd | egrep '^%s:' ; true" % (name))
  File "/opt/jumpscale8/lib/JumpScale/tools/cuisine/CuisineCore.py", line 1033, in run
    if "cygwin" in self.uname:
  File "/opt/jumpscale8/lib/JumpScale/tools/cuisine/CuisineCore.py", line 1251, in uname
    self._uname = self._executor.execute("uname -a", showout=False)[1].lower()
  File "/opt/jumpscale8/lib/JumpScale/tools/executor/ExecutorSSH.py", line 173, in execute
    rc, out, err = self.sshclient.execute(cmds2, die=die, showout=showout)
  File "/opt/jumpscale8//lib/JumpScale/clients/ssh/SSHClient.py", line 251, in execute
    ch = self.transport.open_session()
  File "/opt/jumpscale8//lib/JumpScale/clients/ssh/SSHClient.py", line 179, in transport
    "Could not connect to %s:%s" % (self.addr, self.port))
JSExceptions.RuntimeError: ERROR: Could not connect to :2200 ((type:runtime.error)

******************************************************************************************

Second Example

g8client__env1:
url: 'du-conv-3.demo.greenitglobe.com'
#    url: 'gig.demo.greenitglobe.com'
login: ''
password: ''
account: 'thabeta'
vdc__myspaceboc2:
g8client: 'env1'
location: 'du-conv-3'
#location: 'be-conv-2'
blueowncloud__oc1:
domain: 'supercloud.com'
vdc: myspaceboc2
datadisks:
- 1000
- 1000
Error of job: node.docker!owncloud (install):
*TRACEBACK*********************************************************************************
Traceback (most recent call last):
  File "/opt/jumpscale8//lib/JumpScale/clients/ssh/SSHClient.py", line 207, in client
    j.do.loadSSHKeys(self.key_filename)
  File "/opt/jumpscale8/lib/JumpScale/InstallTools.py", line 2121, in loadSSHKeys
    keysloaded = [self.getBaseName(item) for item in self.listSSHKeyFromAgent()]
  File "/opt/jumpscale8/lib/JumpScale/InstallTools.py", line 2188, in listSSHKeyFromAgent
    self._loadSSHAgent()
  File "/opt/jumpscale8/lib/JumpScale/InstallTools.py", line 2317, in _loadSSHAgent
    "Could not start ssh-agent, something went wrong,\nstdout:%s\nstderr:%s\n" % (result, err))
RuntimeError: Could not start ssh-agent, something went wrong,
stdout:
stderr:bind: Address already in use
unix_listener: cannot bind to path: /root/sshagent_socket

First issue means you never got an ip. That's an openvcloud issue. Please confirm that's the case?

@rkhamis For first issue: not sure that the connection error because the vm didn't get ip.. but even if this is the case, usually the first vm in deployed cloudspace takes time to take ip .. so i think this should be handled in ays_jumpscale .. however you can check with @grimpy

Another issue:
Error of job: node.ovc!bc (install):
*TRACEBACK*********************************************************************************
Traceback (most recent call last):
  File "/opt/jumpscale8//lib/JumpScale/core/processmanager/ProcessManagerFactory.py", line 195, in start
    res = self.method(**self.args)
  File "/tmp/actions/node.ovc/install.py", line 84, in action
    ssdSize=disk_args.ssdSize)
TypeError: add_disk() got an unexpected keyword argument 'ssdSize'

******************************************************************************************

@john-kheir you need to use be-g8-4 or du-conv-3. These are the updated envs.

@rkhamis for last issue you are right

2nd issue happened again.
Error of job: fs.g8osfs!fuse (install):
*TRACEBACK*********************************************************************************
Traceback (most recent call last):
  File "/opt/jumpscale8//lib/JumpScale/clients/ssh/SSHClient.py", line 207, in client
    j.do.loadSSHKeys(self.key_filename)
  File "/opt/jumpscale8/lib/JumpScale/InstallTools.py", line 2119, in loadSSHKeys
    self._loadSSHAgent()
  File "/opt/jumpscale8/lib/JumpScale/InstallTools.py", line 2317, in _loadSSHAgent
    "Could not start ssh-agent, something went wrong,\nstdout:%s\nstderr:%s\n" % (result, err))
RuntimeError: Could not start ssh-agent, something went wrong,
stdout:
stderr:bind: Address already in use
unix_listener: cannot bind to path: /root/sshagent_socket

Note: The ssh-agent problem seems that it is fixed and that is good.
NO NEED TO ADD SSH_AUTH_SOCK to env
more than 1 ssh-agent, will kill all
load ssh agent

However still the connection error occurs
*TRACEBACK*********************************************************************************
Traceback (most recent call last):
  File "/opt/jumpscale8//lib/JumpScale/core/processmanager/ProcessManagerFactory.py", line 195, in start
    res = self.method(**self.args)
  File "/tmp/actions/tidb/install.py", line 8, in action
    cuisine.apps.tidb.start()
  File "/opt/jumpscale8/lib/JumpScale/tools/cuisine/JSCuisine.py", line 70, in apps
    self._apps = apps(self._executor, self)
  File "/opt/jumpscale8/lib/JumpScale/tools/cuisine/apps/apps.py", line 10, in __init__
    base.__init__(self, executor, cuisine)
  File "/opt/jumpscale8//lib/JumpScale/tools/cuisine/CuisineFactory.py", line 89, in __init__
    exec(do)
  File "<string>", line 1, in <module>
  File "/opt/jumpscale8/lib/JumpScale/tools/cuisine/apps/CuisinePortal.py", line 14, in __init__
    self.portal_dir = j.sal.fs.joinPaths(self._cuisine.core.dir_paths["appDir"], "portals/")
  File "/opt/jumpscale8/lib/JumpScale/tools/cuisine/CuisineCore.py", line 234, in dir_paths
    env = self.getenv()
  File "/opt/jumpscale8/lib/JumpScale/tools/cuisine/CuisineCore.py", line 215, in getenv
    _, out, _ = self._cuisine.core.run("printenv", profile=False, showout=False, replaceArgs=False)
  File "/opt/jumpscale8/lib/JumpScale/tools/cuisine/CuisineCore.py", line 1033, in run
    if "cygwin" in self.uname:
  File "/opt/jumpscale8/lib/JumpScale/tools/cuisine/CuisineCore.py", line 1251, in uname
    self._uname = self._executor.execute("uname -a", showout=False)[1].lower()
  File "/opt/jumpscale8/lib/JumpScale/tools/executor/ExecutorSSH.py", line 173, in execute
    rc, out, err = self.sshclient.execute(cmds2, die=die, showout=showout)
  File "/opt/jumpscale8//lib/JumpScale/clients/ssh/SSHClient.py", line 251, in execute
    ch = self.transport.open_session()
  File "/opt/jumpscale8//lib/JumpScale/clients/ssh/SSHClient.py", line 179, in transport
    "Could not connect to %s:%s" % (self.addr, self.port))
JSExceptions.RuntimeError: ERROR: Could not connect to :2201 ((type:runtime.error)

Another new issue occured
Error of job: node.docker!owncloud (install):
*TRACEBACK*********************************************************************************
Traceback (most recent call last):
  File "/opt/jumpscale8//lib/JumpScale/core/processmanager/ProcessManagerFactory.py", line 195, in start
    res = self.method(**self.args)
  File "/tmp/actions/node.docker/install.py", line 26, in action
    code, _, err = cuisine.core.run('cd {} && docker-compose up -d'.format(base))
  File "/opt/jumpscale8/lib/JumpScale/tools/cuisine/CuisineCore.py", line 1061, in run
    raise j.exceptions.RuntimeError('%s, %s' % (cmd, err))
JSExceptions.RuntimeError: ERROR: cd /var/dockers/owncloud && docker-compose up -d, bash: docker-compose: command not found
 ((type:runtime.error)

******************************************************************************************

Error of job: node.docker!tidb (install):
*TRACEBACK*********************************************************************************
Traceback (most recent call last):
  File "/opt/jumpscale8//lib/JumpScale/core/processmanager/ProcessManagerFactory.py", line 195, in start
    res = self.method(**self.args)
  File "/tmp/actions/node.docker/install.py", line 26, in action
    code, _, err = cuisine.core.run('cd {} && docker-compose up -d'.format(base))
  File "/opt/jumpscale8/lib/JumpScale/tools/cuisine/CuisineCore.py", line 1061, in run
    raise j.exceptions.RuntimeError('%s, %s' % (cmd, err))
JSExceptions.RuntimeError: ERROR: cd /var/dockers/tidb && docker-compose up -d, bash: docker-compose: command not found
 ((type:runtime.error)

******************************************************************************************

GOOD JOB :D
Software Version
Verified on du-conv-2