RFC - DataObject ID Decoupling

Proposal to remove dependency on auto-incrementing Database driven IDs
Motivations

Remove race conditions on inserts / ID dependencies
Inserting and pulling out auto-incrementing IDs can cause race conditions when using distributed architecture, especially with distributed databases
Pre-determined IDs before writing
At the moment, to get an ID you have to write the item to the DB first, this is bad practice as all Models should have an ID at all times; this can also allow us to simplify "unsaved relations" because we'll be able to set a relation on an ID that's not been written yet, allowing us to depend on eventual consistency.
Security: Don't implicitly expose existing IDs
Incrementing IDs are guessable and easy to determine if an ID will exist. As IDs are often used in URLs, they should not be easily guessable
Better database compatibility
We decouple from DB integrations and allow people to define their own ID scheme; our Model shouldn't depend upon the database to work

Impact

Have to either upgrade existing IDs or work with both numeric and UUIDs
Have to fix any is_numeric logic from ID validation / make ID validation a bit more abstract
Stop ordering items by ID to get the inserted order (use Created instead)
Modify isInDB() / exists() methods to not just assume a model exists if it's got an ID (either we need to ping the DB or we need to set a flag on loading from DB / writing) - Perhaps replace isInDB() with isPersisted()?

Approach

Create an "ID Generator" interface
This would have the responsibility of generating and validation IDs so that this is abstracted away and we no longer need to do is_numeric($this->ID) to validate IDs.
Create ID Generators
By default we'd have a UUID generator but we could also have a "legacy" generator. This could be a hybrid that accepts numeric IDs and UUIDs or just a numeric auto-incrementing ID generator.

I like the idea for a few reasons:

a UUID will always be unique, which is good for highly concurrent writes
we can stop having to write models in order to get the ID for it (then do something and write it again later)

One concern would be that SilverStripe URLs will become much longer and less human friendly

One concern would be that SilverStripe URLs will become much longer and less human friendly

Well, an integer is almost as meaningless to a human as a UUID, but URLs in the CMS will become longer, but that's an aesthetics issue and UUIDs are not there for aesthetics, they are there for uniqueness.

I have also realised that we can't actually write an incrementing ID generator in the application layer because we would still need to write a row to the database otherwise we'd always generate the same ID on multiple instantiations. The solution would either be to write the object on construct (a massive overhead) or not support auto-incrementing IDs.
This will have to be SS5 change

Yeah - I guess in the frontend you wouldn't be encouraging the use of IDs in URLs anyway, e.g. blog and CMS pages etc which uses a URL segment

Your ID generator could simply be a table that stores an auto-incrementing ID, hypothetically, if the user really wanted to force integers.

In PostgreSQL you don't even need the table, just the sequence 🙂 .

I can see that UUIDs are useful in some circumstances, and totally support us providing support for them.
However, I dispute whether auto-incrementing IDs are legacy. I would still see auto-incrementing IDs as an effective tool in most cases that don't include a multi-master database.

Pre-determined IDs before writing
At the moment, to get an ID you have to write the item to the DB first, this is bad practice as all Models should have an ID at all times; this can also allow us to simplify "unsaved relations" because we'll be able to set a relation on an ID that's not been written yet, allowing us to depend on eventual consistency.

We have to be extremely careful here that we don't introduce race conditions with this. For example, generating an auto-incrementing ID on the PHP side would be extremely bad practise. Generating a UUID on the PHP side is okay because the chance of collision is very small. Other random identifiers might be acceptably generated on the PHP side, although you would probably need to have a special "ID collision" error case.
So the whole first-write-gets-ID approach will stay with us regardless, unless we drop numeric IDs altogether. You could arguably have the sequence generated separately from the initial record, although in simpler cases – i.e. where you are simply writing a record with no related data – this will slow things down, as you'll now have a separate sequence write and record write. Perhaps these can be optimised?

Better database compatibility
We decouple from DB integrations and allow people to define their own ID scheme; our Model shouldn't depend upon the database to work

I think this is a very small part of such an abstraction and if this is really a goal I would suggest we design that first – a shift from Active Record to more of a Data Mapper. I'm moderately supportive of this: I think it's a great idea I just don't know if it's the most important Big Refactor to be doing. I would support anything that dramatically speeds up GraphQL, tree fetches, or permission checks; maybe it overlaps with that. ;-)

Modify isInDB() / exists() methods to not just assume a model exists if it's got an ID.

This is pretty straightforward; it can be a boolean field that is:

False on new construction
True on construction from DB content
Set to true on write.

The hardest thing is that currently we don't clearly distinguish a construction-from-db-content, although that's only hard because it requires a small API change.

@sminnee Whilst I appreciate what you're saying about numeric IDs (they are effective for non-distributed DBs) the point is that our Model is still (needlessly) coupled to the DB layer in this instance. It also means we continue to have the other problems of guessable IDs (which could prove to be a security vulnerability for applications because providing sequential numeric IDs means it's very easy to determine which IDs do (or have) existed in the past if you know a current valid ID).
I also would not like to support both IDs that can be generated in either the DB side or the application side because this means we'll run a different DB schema depending on the setting of the application (we'd have to switch the column type and the AUTO_INCREMENT setting on the ID column), it would also make it impractical to scale a site (ie: move it from single server to distributed server infrastructure) as it'd require a complete remapping of IDs on every single table.

OK, so in effect we'd drop simple numeric ID generation altogether, and probably shift ID storage to binary(16) fields. The main thing that I'd want to know is whether our developer community is on board with such a shift. It feels a bit like namespacing in that it would be an "eat your vegies" change for a lot of people — seen by some as complicating the developer experience, but acknowledged that it's necessary. However, I'm not sure whether shifting to UUIDs is as necessary as shifting to namespaces, and I'm not sure how developers would respond to ORM that says "no incrementing IDs, only UUIDs" – it might come across as very heavyweight.
If the goal is decoupling the model from the database, then I would be inclined to do that in a more complete manner with a datamapper style abstraction, instead of the current active record. This would allow for both UUID-based and AUTOINCREMENT-based repositories, if we wanted, as this responsibility would lie within the mapper. It would also make DataObject more of a convenience for predefining persistence metadata rather than a base class of everything that can be persisted – it would be easier to persist Plain Old PHP Objects if needs be.
If the goal is to allow for non-incrementing IDs for better multi-master support and security, then I would be more inclined to go with an implementation that supported both auto-increment (MySQL) / sequence (PGSQL) based IDs and PHP-generated UUIDs, and probably by default generating the UUID on first write as we do for auto-increment IDs, to leave that semantics more closely matching the current implementation. A method like initPrimaryKey() could be provided that would be a lot quicker on a UUID implementation but would also work with auto-increment keys. I'm not sure about the speed of UUID generation but it's also not clear if there are downsides to generating them for in-memory "scratchpad" objects.

The main thing that I'd want to know is whether our developer community is on board with such a shift.

Yes, I'd like to know too; though it may be one of those things that only really bothers / affects those that have hit its limitations.
I'm not sure how much developers really notice what ID an object has; how often are IDs hard coded into logic and (if they are) is that a good practice and justification for making them "readable".
As for moving to a complete abstraction with a data-mapper, yes, that would be good, but what I'm looking to do is, over the course of a decent period of time, lay the groundwork that is required for that rather than trying to do it all in one go. There seems to be a little bit of incremental working going into the framework that is using #6632 as it's motivation.
I recently outlined a few "blockers" that would stop us even getting onto that (one of which is a datamapper/proper abstraction layer between our objects and the persistence layer).
tl;dr I'm out to make incremental improvements to a higher end goal over a single massive change that will ship all as one. Part of that is because of time constraints but part of it is also because one huge PR like that is very difficult to keep up to date with the velocity that the framework has at the moment. As long as each individual change is an improvement then that should be fine.

PS: I'm trying to get sign off for the individual areas I'll need to address to make #6632 a reality, a datamapper is a step change ahead of where I'd be starting when laying the groundwork for it

That being the case I would probably do this, which should be 4-appropriate change.

Abstract ID management into some kind of service that can be set per type, as well as having a project default
Provide an explicit DataObject::initPrimaryKey() method, whose API expectations allows for the possibility of a write(), that is always called before the first write but may be called earlier by project code if desired.
There will be a bunch of other methods to figure out for the service. It will need to augmentDatabase() in some way, as well as validate IDs, assign IDs to a DataObject, etc
Note that assigning an ID to a DataObject will probably need to be void assignIdTo($dataObject) rather than getIdFor($dataObject) to allow for an auto-incrementing option.
Build auto-incrementing and UUID-based implementations of this. Set auto-incrementing as the default. Provide docs for switching to UUID for some models in yaml, for custom models in PHP, or for a whole project.
Refactor SS4 internal code to use the new service, so that switching to UUID doesn't break anything.

This will basically create the situation where we can support UUIDs without dropping auto-increments, in SS4, which will be a good way of determining how feasible it is to go UUID-only in the future.

A conversation around this has just developed in https://github.com/dnadesign/silverstripe-elemental/pull/429 - in the context of writing (assumed) IDs into unit tests, in the manner that we know how the system works and have control over the data per test case. This works well, although does litter the unit test with magic numbers a little.
The case was brought up that assuming IDs is bad in that if the ID were to ever change (e.g. this RFC), that would mean there is needless refactoring within the test. My response was as follows:

However I'd like to also point out that while I can agree that one should code to an abstraction rather than an implementation, in order to switch the IDs out to e.g. UUID there would need to be much more work than simply altering these tests - all ID's are currently typed as Integers, and GraphQL is strongly typed. It is not simply tests that would break.
E.g. the GraphQL around this currently expects an Integer as an ID. Ok so if we change that by having the core update the integer type globally for all GraphQL operations... but then what to do about the case of the invalid ID 0 currently being used to denote "at the start" in this particular mutation? (as opposed to the default undefined being "at the end") Things are never quite so clear cut, and while the burden of maintenance can be lessened, it'll never be gone.

The crux of it is that changing to UUID (strings) would be far more burdensome than simply causing some fast and fancy-free coded tests to fail. IDs are intended to be an abstraction, and for the most part are throughout the application suite. However there are a number of cases where they're not... strongly typed GraphQL is one that immediately springs to mind... and I'm not sure I'd label the code within as "technical debt" in that it's not poor code as a assumptive test is - although it would immediately become such upon a conversion to UUID.
Not to say it can't be done (I support it), but there is a much larger consideration to be had than simply the coupling of the model and storage layers (and the storage layer particularly to MySQL over others).

I like the idea of an IdProvider, this could help abstract ID handling cleanly.
GraphQL has a specific ID type for IDs, and is treated as a String - a non-readable String, rather than INT. So I think switching UUID should be trivial for this part.
I can see the switch to UUID will need a bit of refactor in react component prop-type expectations though, I can find a few places where it expects a "number" but it's really an "id"

Good reminder about the front-end impact of any such change, Chris :-) 👍

Sounds pretty good to me! I think it’d be worth having a mini vote on the class and namespace naming though, it has the potential so have a lot of Providers in it

Yeah potentially there's an IdProvider sub-namespace? One thing I wondered is whether the interface should be in the parent namespace, though, mainly for brevity, but also because I wince every time I write use SilverStripe\Core\Injector\Injector. ;-)

I think there's some confusion here: the AutoIncrementIdProvider should behave as close to the current behaviour as possible, should be the default, and these two facts mean that this can be introduced in 4.x.
Specifically, I'd imagine something like:

AutoIncrementIdProvider::augmentTable() would add an autoincrementing ID to the table
AutoIncrementIdProvider::augmentSQL() would select "ID"
AutoIncrementIdProvider::generateId($dataObject) would perform an initial write on the dataobject, this possibility would be stated in the interface spec.

Conversely:

UuidIdProvider::augmentTable() would add a binary(16) to the table
AutoIncrementIdProvider::augmentSQL() would select something like HEX("ID") AS "ID"
AutoIncrementIdProvider::generateId($dataObject) would generate a UUID without a DB write

It's probable that the final code pushes more responsibility to relevant DBField implementations, so we'd have a DBUuid class that UuidIdProvider makes the most use of.

To respond to your comments:

I'm wondering if this is an area where we should just be opinionated and provide UUIDs without an ability to easily override it.

I disagree with this for a number of reasons:

It's not clear that moving to UUIDs are in all or even most users' interests. It may be true but "betting the farm" on this is clearly a weaker approach than allowing it as an option and seeing the results of that experiment.
We'd have to embargo this feature until 5, which delays it by a couple of years & creates a lot more risk about getting the system right the first time.
"Being opinionated" as a justification less weight when we're in the midst of changing our opinions. ;)

Unless we had some kind of dedicated persistence storage for the ID increment-er

We've got a tried & true solution for this: autoincrementing columns. No need to change this.

which is really gross and undermines the objective of being able to run SS projects on distributed hardware.

SilverStripe has run for more than a decade without this feature as-is, so any argument that continuing to support the current behaviour is going to be impractical is on shaky ground.
My expectation would be that those teams running a distributed database would be strong recommended to use the UuidIdProvider, as would anyone who doesn't want to carry the pre-emptive write of the AutoIncrementIdProvider. UuidIdProvider would therefore have advantages, as well as the disadvantages of longer, less meainingful IDs.
By the time we're releasing SS5, we can get some real data about how popular the UUID provider has been and what kind of issues people have run into making use of it. Then we can decide whether to:

Make UUID default
Deprecated AutoIncrement
Delete AutoIncrement entirely (which should probably be preceded by deprecating it in a future 4.x release)

Potentially stating the obvious after reading everything above, but:

Modify isInDB() / exists() methods to not just assume a model exists if it's got an ID (either we need to ping the DB or we need to set a flag on loading from DB / writing) - Perhaps replace isInDB() with isPersisted()?

This may also  be a good place to mention that ->exists() should point to ->isInDB() (or ->isPersisted() if refactored) on the root DataObject for consistency as well, since ->exists() really does rely on the same underlying logic anyway, regardless of what that implementation ultimately entails. Preferably this would happen in 4.x but I notice this is one of the few places both methods are mentioned together in an open/active issue 😄
That said, a quick point on that API nomenclature: It's also worth noting that we should probably disambiguate the meaning of ->isInDB() since I think one of the issues tied up in the multi-column index in #6819 (fixed in #8831) was the fact that the ID was always written even with a particular value (e.g. 0 if it was new for that record) which may be fine on the base record but ->isInDB() on a descendant instance $child->isInDB() in memory mid-write operation will return true even though ChildObject's table hasn't actually been written to (and thus not actually entirely in the DB), which makes it confusing.
Maybe this could mean refactoring ->isInDB() (or ->isPersisted()) to determining that a unique ID has been generated, e.g. ->hasUniqueID() or simply ->hasID()? 🤔 That would also help folks like me reading the fixes like the one in #8831 understand why that fix actually worked with a slightly more semantically accurate API. I think it would also mesh well with @sminnee's point about moving toward Data Mapper / GraphQL friendly data persistence, since in abstract, we're more concerned that we now have a unique ID to work with rather than exactly how it gets persisted (i.e. the more specific but less accurate naming of "Is it in DB yet? Ok then I must have an ID now..." expectation, which may not necessarily hold depending on your underlying DBAL or how you're generating ID's).

FYI: Added separate issue (#9352) to address my concern from the previous comment above regarding the redundancy of ->exists() and ->isInDB().


docs(config) document Rule.resolve

This is the missing configuration i mentioned on the #3197
Although to completely close the issue we need to figure our where to add the documentation on the getResolve resolver method. Currently its not on webpack.js.org and not on https://github.com/webpack/enhanced-resolve
I guess i could be tracked in #3197 and future prs

Nice example, thanks!


ext_authz: ensure both raw body/body will be used for http authorization request

Commit Message: ext_authz: ensure both raw body/body will be used for http authorization request
Additional Description:
To close #27220
Risk Level: Low.
Testing: unit.
Docs Changes: n/a.
Release Notes: added.
Platform Specific Features: n/a.

/assign @ggreenway

Has merge conflict
/wait

friendly ping @ggreenway 😸


problem_on_unmodified_line not working as intended

Hi -- thanks for the great tool! As a disclaimer, I already took a look at #240 and #638
I'm using overcommit 0.53.0. This is my .overcommit.yml:
verify_signatures: false

PreCommit:
  ALL:
    problem_on_unmodified_line: warn
  Pycodestyle:
    enabled: true
#    on_fail: warn
  Pydocstyle:
    enabled: true
#    on_fail: warn
  Pyflakes:
    enabled: true
#    on_fail: warn
  Pylint:
    flags: ['--config', 'layer-platform/.pylintrc']
    enabled: true
#    on_fail: warn
  Hadolint:
    enabled: true
#    on_fail: warn
  BranchNameValidation:
    enabled: true
    command: './custom-git-hooks/branch-name-validation'
PrePush:
  CircleCIValidation:
    enabled: true
    command: './custom-git-hooks/circleci-validation'
    required_executable: 'circleci'
    install_command: 'brew install circleci'
    include: '.circleci/config.yml'
  TerraformFormatting:
    enabled: true
    command: './custom-git-hooks/terraform-formatting'
    required_executable: 'terraform'
    install_command: 'brew install terraform'
    include: '**/*.tf'

I just added the problem_on_unmodified_line: warn line. My expectation is that errors for the lines I did not modify would be shown as warnings. However, that's not the case:
$ git commit -am "test"
Running pre-commit hooks
Run BranchNameValidation.......................[BranchNameValidation] OK
Analyze with pyflakes......................................[Pyflakes] OK
Analyze with pycodestyle................................[Pycodestyle] FAILED
Errors on modified lines:
/Users/cihat/layer/backend/layer-platform/backend/components/component.py:453:121: E501 line too long (134 > 120 characters)
Errors on lines you didn't modify:
/Users/cihat/layer/backend/layer-platform/backend/components/component.py:509:121: E501 line too long (131 > 120 characters)
/Users/cihat/layer/backend/layer-platform/backend/components/component.py:522:121: E501 line too long (141 > 120 characters)
/Users/cihat/layer/backend/layer-platform/backend/components/component.py:587:121: E501 line too long (124 > 120 characters)
/Users/cihat/layer/backend/layer-platform/backend/components/component.py:599:121: E501 line too long (141 > 120 characters)
/Users/cihat/layer/backend/layer-platform/backend/components/component.py:602:121: E501 line too long (147 > 120 characters)

Analyze docstrings with pydocstyle.......................[Pydocstyle] OK
Analyze with Pylint..........................................[Pylint] OK

✗ One or more pre-commit hooks failed

I have already committed my .overcommit.yml changes:
$ git status
On branch cihat/fix-overcommit
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
	modified:   layer-platform/backend/components/component.py

no changes added to commit (use "git add" and/or "git commit -a")

$ git show
d03c7b0581fbe5064978ca220a91c314ad06e0fc (HEAD -> cihat/fix-overcommit) Overcommit update

.overcommit.yml

18
 verify_signatures: false

 PreCommit:
   ALL:
     problem_on_unmodified_line: warn
   Pycodestyle:
     enabled: true
     on_fail: warn
 #    on_fail: warn
   Pydocstyle:
     enabled: true
     on_fail: warn
 #    on_fail: warn
   Pyflakes:
     enabled: true
     on_fail: warn
 #    on_fail: warn
   Pylint:
     flags: ['--config', 'layer-platform/.pylintrc']
     enabled: true
     on_fail: warn
 #    on_fail: warn
   Hadolint:
     enabled: true
     on_fail: warn
 #    on_fail: warn
   BranchNameValidation:
     enabled: true
     command: './custom-git-hooks/branch-name-validation'

problem_on_unmodified_line: ignore works as intended.
Any ideas?

What happens if you fix the error on the modified line? Do you still get a FAILED status? Or does it then change to WARN?

Before I fix the error on the modified line:

After I fix the error on the modified line:

So, I think the issue is that the errors on unmodified lines in first image should be yellow and shown as maybe "Warnings on lines you didn't modify:"

Apologies for the delay in response. Missed this in my notifications.
Overcommit has two classes of hook results: FAILED and WARNING; and two classes of issues/messages that can be reported within a hook: Error and Warning. The problem_on_unmodified_line setting allows you to "downgrade" what would otherwise be a FAILED hook to a WARNING if any Errors were reported on lines you did not modify. This is beneficial since if someone else commits something which would cause your local checks to fail, your local hook run will still pass with WARNING as long as you didn't modify those lines.
I would like to suggest that the wording remain as-is for this reason. These are still "errors", but the hook treats them as a final status reported of WARNING since they are on unmodified lines.
As for making the errors on on modified lines appear as yellow: will leave this open as a feature request. Thanks for the feedback!


Online demo?

Hi-
Just found this from the reflux ticket. Looks really good and I'll be keen to watch your learnings.
Question - does this lend itself to an online demo, or is that a pain because of the server component? Would like to add to react.rocks, like to have tangible demos for people to play with.

@winkler1, @hpaul: Demo app is online here: http://react-spa.herokuapp.com/. Thanks for the suggestion.

Added automatic deployment from travis to heroku as well. On every commit of this repo, if the build succeeds it's automatically deployed to the heroku app.

nice!
On Tue, Jan 6, 2015 at 7:51 AM, Wilbert van de Ridder <
<EMAIL_ADDRESS>wrote:

Added automatic deployment from travis to heroku as well. On every commit
of this repo, if the build succeeds it's automatically deployed to the
heroku app.
—
Reply to this email directly or view it on GitHub
https://github.com/WRidder/react-spa/issues/4#issuecomment-68861264.

--
http://twitter.com/#!/winkler1
Co-organizer, ReactJS Boston http://www.meetup.com/ReactJS-Boston/

Are you on twitter? ... adding to react.rocks, want to mention author if so.

@winkler1 Yep, see @techwuppet


Redirect loop UserPassesTestMixin

When i return False and user is logged in, it is entering a redirect loop with the login page

Can you provide a code example that reproduces the problem?

from django.views import TemplateView
from braces.views import UserPassesTestMixin
class SomeUserPassView(UserPassesTestMixin, TemplateView):
def test_func(self, user):
return (some condition evaluated)
I am just following the docs to try this one.

Overriding no_permissions_fail() and setting my redirects explicitly there fixed this issue, at least for me. By default it is redirecting to login_url (as any other child of AccessMixin).
def no_permissions_fail(self, request=None):
        if request.user.is_authenticated():
            messages.add_message(request, messages.ERROR, 'Some error.')
            return redirect(reverse('some_url'))
        else:
            return super(SomeUserPassView, self).no_permissions_fail(request)

I was going to suggest overriding no_permissions_fail. I just noticed in the documentation there is no mention of this method and no examples. I'll add an issue to add docs for that.


Add closing tag in include.

Fixes #260

Hopefully I got all the ones on this page.

New Gerrit review created for change 541f219237c47ab159a7bc36172044d503cd0c08: https://gerrit.sqlalchemy.org/c/sqlalchemy/mako/+/3777

looks great, thanks

Gerrit review https://gerrit.sqlalchemy.org/c/sqlalchemy/mako/+/3777 has been merged. Congratulations! :)


docs: Added DocVersionRedirector to "Using WXT" section

Adding DocVersionRedirector. If you have a few moments, would love a quick look at the code and any feedback on how I'm using WXT.

Cool project! I checked it out, everything looks good except for the background entrypoint, the browser.runtime.onInstalled should go inside the main function of defineBackground.
https://github.com/leos/DocVersionRedirector/blob/147481ab1b206cae3c36aad06dd04ec96e19b3fb/src/entrypoints/background.ts#L3-L6
I would actually expect your build to crash, including a side-effect like that in an entrypoint - if you keep adding code outside the main function, you'll eventually run into #336. For example, notice how all the code is inside the main function in these background scripts:

https://github.com/aklinker1/github-better-line-counts/blob/2454214c2026628639f2d7ac9063ba42f4b8a18e/src/entrypoints/background.ts
https://github.com/wxt-dev/wxt/blob/50e8c86ce993347425b953bfd472f36e1f15e90b/demo/src/entrypoints/background.ts
https://github.com/anime-skip/player/blob/f07125a19341fac635967a793d16d1611e7bc44a/apps/extension/src/entrypoints/background.ts

Otherwise it's looking good! I don't use react much, hows the developer experience developing a react-based extension with WXT? HMR working correctly?

Connected to this discussion, is there a discord/slack/gitter for wxt? It may make it a bit easier to communicate about the extension (although, you may not want to do it in chat :-) ).

I've hesitated creating a discord because I don't like being overrun with notifications lol. But I need to do it now that WXT has almost hit 2k stars.

Do I need to also do the same for unlisted scripts?

Neither of those files are unlisted scripts. Unlisted scripts are JS/TS files in the entrypoints directory that aren't content scripts or background scripts.
https://wxt.dev/entrypoints/unlisted-scripts.html
Unlisted scripts are scripts you inject dynamically, usually by adding a script block to the page from a content script. Those scripts run in the page's context, and have access to more information about the website. In your case, helper files or utils aren't considered unlisted scripts. So you don't need defineUnlistedScript for those.

I've hesitated creating a discord because I don't like being overrun with notifications lol. But I need to do it now that WXT has almost hit 2k stars.

No worries - do what works best for you!

Neither of those files are unlisted scripts. Unlisted scripts are JS/TS files in the entrypoints directory that aren't content scripts or background scripts.

I see. I think I had to add that because those files weren't being packaged into the build w/o defineUnlistedScript. Let me try removing it and see what happens.

Everything works great without defineUnlistedScript, thanks again!

As long as you import them, they'll be bundled into the final output. They may not showup as separate files or have the same file name, but if you're importing them, they'll be there.


[Doc issue][Domain name has extra letter "c" in it]

Acrolinx Scorecards
We currently enforce a minimum score of 80.
Click the scorecard links for each article to review the Acrolinx feedback on grammar, spelling, punctuation, writing style, and terminology:

Article
Score
Issues
Scorecard
Processed

msteams-platform/concepts/build-and-test/deep-links.md
94
20
link
:white_check_mark:

More info about Acrolinx
Use the Acrolinx extension, or sidebar, in Visual Studio Code to check spelling, grammar, style, tone, clarity, and key terminology when you're creating or updating content. For more information, see Use the Visual Studio Code extension to run Acrolinx locally.

Docs Build status updates of commit f7b71b0:
:white_check_mark: Validation status: passed

File
Status
Preview URL
Details

msteams-platform/concepts/build-and-test/deep-links.md
:white_check_mark:Succeeded
View

For more details, please refer to the build report.
Note: Broken links written as relative paths are included in the above build report. For broken links written as absolute paths or external URLs, see the broken link report.
For any questions, please:Try searching the docs.microsoft.com contributor guidesPost your question in the Docs support channel


Phoebemirman/ch13799/expired market says expires on market trading

https://app.clubhouse.io/augur/story/13799/expired-market-says-expires-on-market-trading-page

Pull Request Test Coverage Report for Build 837

0 of 0   changed or added relevant lines in 0 files are covered.
No unchanged relevant lines lost coverage.
Overall coverage remained the same at 65.504%

Totals

Change from base Build 836:
0.0%

Covered Lines:
3480

Relevant Lines:
4809

💛  - Coveralls

Pull Request Test Coverage Report for Build 837

0 of 0   changed or added relevant lines in 0 files are covered.
No unchanged relevant lines lost coverage.
Overall coverage remained the same at 65.504%

Totals

Change from base Build 836:
0.0%

Covered Lines:
3480

Relevant Lines:
4809

💛  - Coveralls


(Bug) Example doesn't work.

Describe the bug The example given out, in examples/demo.ts doesn't function properly - Returning an error upon running.
To Reproduce:

Execute deno run -r https://raw.githubusercontent.com/Im-Beast/deno_tui/main/examples/demo.ts
See error

Full Log of Error
pk ~ > deno run -r https://raw.githubusercontent.com/Im-Beast/deno_tui/main/examples/demo.ts
Download https://raw.githubusercontent.com/Im-Beast/deno_tui/main/examples/demo.ts
Download https://raw.githubusercontent.com/Im-Beast/deno_tui/main/src/canvas.ts
Download https://raw.githubusercontent.com/Im-Beast/deno_tui/main/src/components/box.ts
Download https://raw.githubusercontent.com/Im-Beast/deno_tui/main/src/components/button.ts
Download https://raw.githubusercontent.com/Im-Beast/deno_tui/main/src/components/checkbox.ts
Download https://raw.githubusercontent.com/Im-Beast/deno_tui/main/src/components/combobox.ts
Download https://raw.githubusercontent.com/Im-Beast/deno_tui/main/src/components/frame.ts
Download https://raw.githubusercontent.com/Im-Beast/deno_tui/main/src/components/label.ts
Download https://raw.githubusercontent.com/Im-Beast/deno_tui/main/src/components/progress_bar.ts
Download https://raw.githubusercontent.com/Im-Beast/deno_tui/main/src/components/slider.ts
Download https://raw.githubusercontent.com/Im-Beast/deno_tui/main/src/components/textbox.ts
Download https://raw.githubusercontent.com/Im-Beast/deno_tui/main/src/keyboard.ts
Download https://raw.githubusercontent.com/Im-Beast/deno_tui/main/src/mouse.ts
Download https://raw.githubusercontent.com/Im-Beast/deno_tui/main/src/theme.ts
Download https://raw.githubusercontent.com/Im-Beast/deno_tui/main/src/tui.ts
Download<EMAIL_ADDRESS>Download https://raw.githubusercontent.com/Im-Beast/deno_tui/main/src/ansi_codes.ts
Download https://raw.githubusercontent.com/Im-Beast/deno_tui/main/src/component.ts
Download https://raw.githubusercontent.com/Im-Beast/deno_tui/main/src/components/view.ts
Download https://raw.githubusercontent.com/Im-Beast/deno_tui/main/src/utils/numbers.ts
Download https://raw.githubusercontent.com/Im-Beast/deno_tui/main/src/events.ts
Download https://raw.githubusercontent.com/Im-Beast/deno_tui/main/src/types.ts
Download https://raw.githubusercontent.com/Im-Beast/deno_tui/main/src/utils/strings.ts
Download https://raw.githubusercontent.com/Im-Beast/deno_tui/main/src/utils/typed_event_target.ts
Download https://raw.githubusercontent.com/Im-Beast/deno_tui/main/src/utils/async.ts
Download https://raw.githubusercontent.com/Im-Beast/deno_tui/main/src/utils/combined_async_iterator.ts
Download https://raw.githubusercontent.com/Im-Beast/deno_tui/main/src/utils/sorted_array.ts
Download https://raw.githubusercontent.com/Im-Beast/deno_tui/main/src/key_reader.ts
Download<EMAIL_ADDRESS>Download<EMAIL_ADDRESS>Download<EMAIL_ADDRESS>Download<EMAIL_ADDRESS>error: Uncaught TypeError: Deno.consoleSize is not a function
    size: await Deno.consoleSize(Deno.stdout.rid),
                     ^
    at https://raw.githubusercontent.com/Im-Beast/deno_tui/main/examples/demo.ts:30:22

Desktop (please complete the following information):

OS: Fedora Linux 36
Terminals tested: alacritty, and st
Deno version:deno 1.24.2 (release, x86_64-unknown-linux-gnu)
v8 <IP_ADDRESS>
typescript 4.7.4

You forgot to add --unstable flag to deno
You should run:
deno run --unstable https://raw.githubusercontent.com/Im-Beast/deno_tui/main/examples/demo.ts

It's mentioned in the README, please read it before filing an issue


[feat] : Smart contract

including smart contracts into master

Try adding isDeleted boolean option and commit it in this PR. If you are not able to do it, then anyways I will merge this PR


feat(L2): ethereum_rust_l2 CLI scaffolding

Ethereum Rust L2 CLI
Table of Contents

Introduction
How to install
Commands

config
stack
wallet
autocomplete

Examples

config

Adding a configuration
Editing exiting configuration interactively
Deleting existing configuration interactively
Setting a configuration interactively

stack

Initializing the stack
Restarting the stack

How to install
Running the command below will install the ethereum_rust_l2 binary in your system.
cargo install --path .

Commands
Usage: ethereum_rust_l2 <COMMAND>

Commands:
  stack         Stack related commands.
  wallet        Wallet interaction commands. The configured wallet could operate both with the L1 and L2 networks. [aliases: w]
  config        CLI config commands.
  autocomplete  Generate shell completion scripts.
  help          Print this message or the help of the given subcommand(s)

Options:
  -h, --help     Print help
  -V, --version  Print version

[!IMPORTANT]
Most of the CLI interaction needs a configuration to be set. You can set a configuration with the config command.

config
CLI config commands.

Usage: ethereum_rust_l2 config <COMMAND>

Commands:
  edit     Edit an existing config.
  create   Create a new config.
  set      Set the config to use.
  display  Display a config.
  list     List all configs.
  delete   Delete a config.
  help     Print this message or the help of the given subcommand(s)

Options:
  -h, --help  Print help

stack
Stack related commands.

Usage: ethereum_rust_l2 stack <COMMAND>

Commands:
  init      Initializes the L2 network in the provided L1. [aliases: i]
  shutdown  Shutdown the stack.
  start     Starts the stack.
  purge     Cleans up the stack. Prompts for confirmation.
  restart   Re-initializes the stack. Prompts for confirmation.
  help      Print this message or the help of the given subcommand(s)

Options:
  -h, --help  Print help

wallet

[!NOTE]
This command is a work in progress. It requires basic L2 functionality to be implemented.

Wallet interaction commands. The configured wallet could operate both with the L1 and L2 networks.

Usage: ethereum_rust_l2 wallet <COMMAND>

Commands:
  balance            Get the balance of the wallet.
  deposit            Deposit funds into some wallet.
  finalize-withdraw  Finalize a pending withdrawal.
  transfer           Transfer funds to another wallet.
  withdraw           Withdraw funds from the wallet.
  address            Get the wallet address.
  private-key        Get the wallet private key.
  help               Print this message or the help of the given subcommand(s)

Options:
  -h, --help  Print help

autocomplete
Generate shell completion scripts.

Usage: ethereum_rust_l2 autocomplete <COMMAND>

Commands:
  generate  Generate autocomplete shell script.
  install   Generate and install autocomplete shell script.
  help      Print this message or the help of the given subcommand(s)

Options:
  -h, --help  Print help

Examples
config
Adding a configuration

Editing exiting configuration interactively

Deleting existing configuration interactively

Setting a configuration interactively

stack
Initializing the stack

Restarting the stack

Looks good, the code has a solid structure to build upon.

Thanks! Examples were fixed.


"bluetooth-central" background mode error on iOS

Hello,
I am having an error when the phone starts to scan for devices on iOS. It would crash the app and throw the exception in Xcode console as follow
Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'State restoration of CBCentralManager is only allowed for applications that have specified the "bluetooth-central" background mode'
terminating with uncaught exception of type NSException

Here is the full logs

I have put the NSBluetoothAlwaysUsageDescription into Info.plist.
Am I missing anything here to have the Bluetooth module working?
Thanks.

Solved the problem by adding the properties below
	<key>NSBluetoothAlwaysUsageDescription</key>
	<string>The app uses bluetooth to find, connect and transfer data between different devices</string>
	<key>NSBluetoothPeripheralUsageDescription</key>
	<string>The app uses bluetooth to find, connect and transfer data between different devices</string>
	<key>UIBackgroundModes</key>
	<array>
		<string>bluetooth-central</string>
	</array>


Couldn't make it work

Error is as following
> Sensio\Bundle\DistributionBundle\Composer\ScriptHandler::clearCache

  [Symfony\Component\Debug\Exception\ContextErrorException]
  Warning: date_default_timezone_get(): It is not safe to rely on the system'
  s timezone settings. You are *required* to use the date.timezone setting or
   the date_default_timezone_set() function. In case you used any of those me
  thods and you are still getting this warning, you most likely misspelled th
  e timezone identifier. We selected the timezone 'UTC' for now, but please s
  et date.timezone to select your timezone.

cache:clear [--no-warmup] [--no-optional-warmers] [-h|--help] [-q|--quiet] [-v|vv|vvv|--verbose] [-V|--version] [--ansi] [--no-ansi] [-n|--no-interaction] [-e|--env ENV] [--no-debug] [--] <command>

Script Sensio\Bundle\DistributionBundle\Composer\ScriptHandler::clearCache handling the symfony-scripts event terminated with an exception

  [RuntimeException]
  An error occurred when executing the "'cache:clear --no-warmup'" command:

    [Symfony\Component\Debug\Exception\ContextErrorException]

    Warning: date_default_timezone_get(): It is not safe to rely on the syste
  m'
    s timezone settings. You are *required* to use the date.timezone setting
  or
     the date_default_timezone_set() function. In case you used any of those
  me
    thods and you are still getting this warning, you most likely misspelled
  th
    e timezone identifier. We selected the timezone 'UTC' for now, but please
   s
    et date.timezone to select your timezone.

  cache:clear [--no-warmup] [--no-optional-warmers] [-h|--help] [-q|--quiet]
  [-v|vv|vvv|--verbose] [-V|--version] [--ansi] [--no-ansi] [-n|--no-interact
  ion] [-e|--env ENV] [--no-debug] [--] <command>

install [--prefer-source] [--prefer-dist] [--dry-run] [--dev] [--no-dev] [--no-custom-installers] [--no-autoloader] [--no-scripts] [--no-progress] [--no-suggest] [-v|vv|vvv|--verbose] [-o|--optimize-autoloader] [-a|--classmap-authoritative] [--apcu-autoloader] [--ignore-platform-reqs] [--] [<packages>]...

Set up timezone in your php.ini config file:
date.timezone = UTC

or any supported timezone instead of UTC: http://php.net/manual/en/timezones.php

@billchenxi if you configure the dat.timezone PHP setting as explained by @bocharsky-bw, this problem should be gone. So I'm closing this issue as fixed, but if you have any other problem, please reopen it. Thanks!


Fix coverage reporting

Issue is #98.

coverage: 72.015% (+0.6%) from 71.465% when pulling deca8b000af8ce5ed109db8eb3104ff43a88b8e2 on 98.coveralls into fa870986889f9a9b637afd2e180bf79bb3637f96 on main.


Fix filtering artifact for non-color images

Problem: we apply filtering before we apply the color map. This means large changes in depth images produce unexpected colors when interpolating. A similar problem occurs for label maps.
Solution: use nearest filtering for depth images and label maps.
An alternative solution is to apply the color maps before filtering, but that is far more expensive, and likely not worth it.
Before:

After:

Checklist

[x] I have read and agree to Contributor Guide and the Code of Conduct
[x] I've included a screenshot or gif (if applicable)

nearest filtering for depth images and label maps

Seems like the best approach for these either way


Revert "Emag works as laws board for syndicate lawset on AI (#637)"

About the PR
Feature was added on goob with AI. Now, game have Antimov lawboard, so we don't need this because it's too OP and makes antimov useless.
:cl:

remove: EMAG no longer works as Syndicate lawboard for AI upload.

Summary by CodeRabbit

New Features

Updated Emag entity with new LimitedCharges and AutoRecharge components for enhanced functionality.

Changes

Removed the SiliconLawProvider component from EmagUnlimited, streamlining its structure.

antimov is completely different from syndicate lawset

antimov is completely different from syndicate lawset

I know, but anyway this feature is too OP for nukies and traitors. AI will 100% work with them, emag is cheaper than antimov and emag is more useful than antimov.
It was made when AI got merged on Goob to allow AI works with antags, but now it's just overpowered feature.

this might be a mald pr

this might be a mald pr

okay, what mald pr even means???

add a syndicate lawset board to the uplink then, don't just remove things, replace them, move them around, etc.

add a syndicate lawset board to the uplink then, don't just remove things, replace them, move them around, etc.

I made this feature to add something when we didn't have anything... Now, we just don't need it, antimov works fine.

Mald pr

Now, we just don't need it, antimov works fine.

traitor lawset can be used as antimov but not vice versa, you cant tell the ai to keep you alive at all costs since that would violate law 1 for example

yall he made the original pr.

This is a good PR thank you for fixing this issue I too thought 60 tc for an entire crew death was op.


React to render nested components page crashes after 35 seconds

Describe your problem and - if possible - how to reproduce it
In the Chrome browser the challenge was complete and I had gone back to review.
The page is continuously loading, and after about 35 seconds I receive a popup that the page is not responding to exit or wait.  Clicking Exit crashes the page immediately.  Clicking Wait crashes the page in a few more seconds.
Challenge shows the code incorrectly and cannot be reset, no button response, no editor response.  TypeOfFood class should have Fruits component but says TypeOfFood instead.
Redid challenge in Firefox 60.0.2 and challenge worked.  Code is absent when looking back however.
In Chrome previous code still locked in and cannot be reset.
Add a Link to the page with the problem
https://learn.freecodecamp.org/front-end-libraries/react/use-react-to-render-nested-components/
Tell us about your browser and operating system

Browser Name: Chrome
Browser Version: Version 67.0.3396.87 (Official Build) (64-bit)
Operating System: macOS High Sierra

If possible, add a screenshot here

The challenge is working fine in Chrome Version  67.0.3396.87, Windows 10.

And FreeCodeCamp doesn't save your code for challenges. It only saves the code for projects.
Can you please check again and tell us if you are still facing this issue?

Same problem.
Chrome Version 68.0.3440.106 (Official Build) (64-bit)
macOS Sierra 10.12.6

@RyanHaire Could you check if there is any error in the browser console?

Similar if not the same problem, input the correct code and click run tests, and the page just breaks. It is crashing because Chrome pauses execution of the main thread to stop itself from running out of memory.

Works fine for me as of now. @urbanware if it's fixed for you, please close the issue

@urbanware, @baliomega, @RyanHaire, @carbonkitten  Can we get you to test this challenge on our beta site which incorporates many fixes to the React challenges?
Thank you.


How to change range on Y axis

I have 2 kind of data. Value2 goes from 0 to 220, so range on X axis is fine.
But on Y axis, it's from 107 to 105, so really small changes.
How to make Y axis more detailed, so changes are more visible?
This is the current code:
AAChartModel *aaChartModel= AAObject(AAChartModel)
    .chartTypeSet(AAChartTypeLine)
    .titleSet(@"")
    .categoriesSet(speedIntArray)
    .yAxisTitleSet(@"")
    .colorsThemeSet(@[@"#15A3FE",@"#FE7620"])
    .seriesSet(@[
            AAObject(AASeriesElement)
            .nameSet(@"Value 1")
            .dataSet(heightArray)
            ,
            AAObject(AASeriesElement)
            .nameSet(@"Value 2")
            .dataSet(speedIntArray)])
    .markerRadiusSet(@1);
    AAItemStyle *aaItemStyle = AAObject(AAItemStyle)
    .colorSet(@"#ffffff")
    .cursorSet(@"pointer")
    .fontSizeSet(@"12px")
    .fontWeightSet(AAChartFontWeightTypeThin);
    AAOptions *aaOptions = [AAOptionsConstructor configureChartOptionsWithAAChartModel:aaChartModel];
    aaOptions.legend.itemStyle = aaItemStyle;
    [_aaChartView aa_drawChartWithOptions:aaOptions];

Maybe you need to change the chart to a dual Y-axis chart.

@AAChartModel how? I don't see any AAChartType like this.
Can you help me with some code snippet?

https://github.com/AAChartModel/AAChartKit/issues/759

What effect are you looking for? Can you provide a screenshot of the design draft?

This is how it looks now, I just need the background to be another color :)

- (void)configureTheOptionsJsonStringWithAAOptions:(AAOptions *)aaOptions {
    if (_isClearBackgroundColor) {
        aaOptions.chart.backgroundColor = @"rgba(0,0,0,0)";
    }

    if (_clickEventEnabled == true) {
        aaOptions.clickEventEnabled = true;
        [self configurePlotOptionsSeriesPointEventsWithAAOptions:aaOptions];
    }
    if (_mouseOverEventEnabled == true) {
        aaOptions.touchEventEnabled = true;
        if (_clickEventEnabled == false) {//避免重复调用配置方法
            [self configurePlotOptionsSeriesPointEventsWithAAOptions:aaOptions];
        }
    }

    _optionJson = [AAJsonConverter pureOptionsJsonStringWithOptionsInstance:aaOptions];
}

The key content
   if (_isClearBackgroundColor) {
        aaOptions.chart.backgroundColor = @"rgba(0,0,0,0)"; // set the chart be clear color
    }

If you just want to change chart bacckgroundColor, do not use
_aaChartView.isClearBackgroundColor = YES;

I have removed "isClearBackground" property, and manually set:
   aaaOptions.chart.backgroundColor = @"rgba(25,25,35,1)";
But it's still white

You can also see the sample in the demo

https://github.com/AAChartModel/AAChartKit/issues/771

In this example, the background color is set to @"#191E40".
    AAChart *aaChart = AAChart.new
    .backgroundColorSet(@"#191E40");

It works with this code sample:
 AAChart *aaChart = AAChart.new
    .backgroundColorSet(@"#191923");

    AAOptions *aaaOptions = AAOptions.new
    .chartSet(aaChart)
    .titleSet(aaTitle)
    .xAxisSet(aaXAxis)
    .yAxisSet((id)@[yAxisOne,yAxisTwo])
    .tooltipSet(aaTooltip)
    .seriesSet(aaSeries)
    ;

    [_aaChartView aa_drawChartWithOptions:aaaOptions];

Only issue I have now is that it flashes from white to set background color before animation, even I setup everything in "initWithFrame", early in life cycle...

You can also see the sample in the demo

Support Double Y Axes And Column Line Mixed Chart(双Y轴柱形曲线混合图) #771

In this example, the background color is set to @"#191E40".
    AAChart *aaChart = AAChart.new
    .backgroundColorSet(@"#191E40");

Is there a possibility to add 3rd Y axis and to set proper scaling on that?
When I added 3rd Y axis parameter, it uses scaling from second Y axis and because of that, resolution is small.


Error in Cairo Program Execution: AddressNotRelocatable Issue in PR #1551

Describe the bug
Hello @fmoletta, I've come across an issue with your PR #1551 in the cairo1-run environment.
When running the command cargo run ../cairo_programs/cairo-1-programs/with_input/tensor_test.cairo --layout all_cairo --args '[2 2 2 4 1 2 3 4]', an error occurs:
Error: VirtualMachine(Memory(AddressNotRelocatable))

The Cairo program used is as follows:
#[derive(Copy, Drop)]
struct Tensor {
    shape: Span<u32>,
    data: Span<u32>
}

fn main(tensor: Tensor) -> u32 {
    *tensor.data.at(0)
}

Notably, when the Tensor is initialized inside the main function instead of being passed as an argument, the program runs without issues:
#[derive(Copy, Drop)]
struct Tensor {
    shape: Span<u32>,
    data: Span<u32>
}

fn main() -> u32 {
    let tensor = Tensor {
    shape: array![2, 2].span(),
    data: array![1, 2, 3, 4].span(),
    };
    *tensor.data.at(0)
}

Moreover, when I modify the main function to simply return the passed Tensor, like this:
fn main(tensor: Tensor) -> Tensor {
    tensor
}

It works correctly, which suggests that the argument passing mechanism for structs is functioning well.
What version/commit are you on?
Current Version/Commit: Branch cairo-1-input-args

Hello! a fix  related to this problem was recently merged in the cairo repo, I already applied it to our mirrored code in PR #1551. Running cargo run ../cairo_programs/cairo-1-programs/tensor.cairo --layout all_cairo --args  '[2 2] [1 2 3 4]' should now work. (Note: the Tensor struct consists of two spans, so we need to input two separate arrays, --args '[2 2 1 2 3 4]' will not work)

Thank you a lot, it's working well !


Add qps flag

ref #517
Signed-off-by: kouki<EMAIL_ADDRESS>

Please add a metric for counting the requests to API servers.

rest_client_requests_total{namespace="moco-system"} is already exists.


Fix issues with  options

What
In some cases we get exception no block given. It should fix it.

Too fast I was going to suggest that we drop default -> in favour of default: & eval: -> and maintain default: -> and deprecate it soon


Using own data

Loading data...
{'NEU': 2442, 'POS': 738, 'NEG': 1390}
['NEU', 'POS', 'NEG']
#train_data: 2277
#dev_data: 587
#test_data: 777
Starting training service, overall process number:  1
Train epoch 0 ...
Process  0  start service.
Train batch 0 : F1= 0.9047619047619047 , time= 6.834511995315552
Train batch 50 : F1= 0.9473684210526316 , time= 5.462005853652954
Process Process-2:
Traceback (most recent call last):
File "/usr/lib/python3.7/multiprocessing/process.py", line 297, in _bootstrap
self.run()
File "/usr/lib/python3.7/multiprocessing/process.py", line 99, in run
self._target(*self._args, **self._kwargs)
File "/content/ASTE-RL/TrainProcess.py", line 138, in worker
acc, cnt, tot, loss = workProcess(model, datas, sample_round, mode, device, sentiments, test)
File "/content/ASTE-RL/TrainProcess.py", line 25, in workProcess
preoptions, pre_aspect_actions, pre_opinion_actions, device, sentiments)
File "/usr/local/lib/python3.7/dist-packages/torch/nn/modules/module.py", line 1102, in _call_impl
return forward_call(*input, **kwargs)
File "/content/ASTE-RL/Model.py", line 156, in forward
posvs[y], bot_bert_cls, self.opinionvector(actionb), wordinbot[y],
IndexError: index 96 is out of bounds for dimension 0 with size 96
Please Help.

I have not used this repo yet, just going to use it soon. From the error it seems an out of bound of the data - word vector it is processing.


Where to download?

GUI looks good. How can we test?

You can run it in visual studio code, make sure you install the necessary libraries, when you say transcript output, the model you choose will be downloaded automatically. The last time I ran it, it was working correctly, if it doesn't work, you can give me feedback and I'll try to do my best.

Thanks for your quick response.
Unfortunately I haven't used visual studio code. I thought maybe there was an .exe file.
Regards

Since there is too much size for the exe file, I could not upload it here because it does not allow the file size, all I can offer is to use visual studio code or a similar runner.

Ok understand

thank you for your understanding


Convenience assignment operator (=) not working for injected implementation of Property on interface that extends Named

I have the following build.gradle:
interface ToolSetup {
    Property<File> getArgsFile()
}

extensions.add('toolSetup', ToolSetup)

toolSetup {
    argsFile = file('run/some_tool/xrun_files.f')
}
println toolSetup.argsFile.get()

interface NamedToolSetup extends ToolSetup, Named {
}

extensions.add('toolSetups', project.container(NamedToolSetup))

toolSetups {
    someTool {
        argsFile = file('run/some_tool/xrun_files.f')
    }
    someOtherTool {
        argsFile = file('run/some_other_tool/xrun_files.f')
    }
}

Gradle can inject an implementation for the ToolSetup interface and I can use it as an extension. in the Groovy DSL, the = is also present.
If I try to configure multiple toolSetups, I have to put them in a named container. I created the NamedToolSetup interface for this purpose. If I try to do the same assignment using = under the container I get:

Cannot set the value of read-only property 'argsFile' for object of type NamedToolSetup$Inject.

It seems that the required method to support the = operator is not being injected in this context.
I use Gradle 7.4.2. I also tried it in 7.6 and I get the same error.

I also tried to add a single NamedToolSetup as an extension and configure that:
extensions.add('namedToolSetup', project.objects.named(NamedToolSetup, 'dummy'))

namedToolSetup {
    argsFile = file('run/some_tool/xrun_files.f')
}

I get a similar error:

Cannot set the value of read-only property 'argsFile' for dummy of type NamedToolSetup$Impl.

Instead of NamedToolSetup$Inject it says NamedToolSetup$Impl. I mention it, because it seems like there is some slightly different code handling the decoration in this case.

I did some more digging again. I noticed from https://stackoverflow.com/a/75104097/1334062 that using project.objects.domainObjectContainer()) (like they are doing) instead of project.container(NamedToolSetup) (like I am doing) makes the error go away. The following both work:
extensions.add('toolSetupsWithNames', project.objects.domainObjectContainer(ToolSetupWithName))

toolSetupsWithNames {
    someTool {
        argsFile = file('run/some_tool/xrun_files.f')
    }
    someOtherTool {
        argsFile = file('run/some_other_tool/xrun_files.f')
    }
}

and
extensions.add('toolSetups', project.objects.domainObjectContainer(NamedToolSetup))

toolSetups {
    someTool {
        argsFile = file('run/some_tool/xrun_files.f')
    }
    someOtherTool {
        argsFile = file('run/some_other_tool/xrun_files.f')
    }
}

I'll switch to using projects.objects.domainObjectContainer() in my code. I would probably save people a lot of debug effort if these were also fixed, though. There seem to be two underlying issues:

the implementation injected using project.object.named()
the implementation injected using project.container()


Fix the path to the so files

The externalNativeBuild command no longer places the *.so files in
src/main/libs/
Use the build folder instead.
GearVRf-DCO-1.0-Signed-off-by: Rahul Rudradevan
<EMAIL_ADDRESS>

@deepakrawat22 could you confirm if this works?

so files are getting copied.


Link to docker compose dependency

I got an error /bin/sh: docker-compose: command not found when following these instructions without the docker dependency, but it wasn't mentioned anywhere.

I'll rebase it to develop tomorrow since our PRs now should target that branch. :)

Thanks @momack2 !


Google store address not working?

The url just redirect to github ,not the google chrome store. Not submitting to the store?
Maybe consider the firefox extension store? It's free of charge

Yesterday NotionX 1.0.0 had been submitted to addons.mozilla.org and Chrome Web Store.Now it's pending to be reviewed and signed.
This process could take a few extra hours and up to a couple of days. Due to disruptions caused by the COVID-19 pandemic, it may take up to a week.

FireFox approved🎉， Link, Download


Updated the CONTRIBUTION.md file to be more specific on how to start up the project.

Awesome, but next time do create an issue first and have it assigned to you before  a PR. Also, don't forget to star the repo, Thank you!


fix build

I confirm that this contribution is made under the terms of the license found in the root directory of this repository's source tree and that I have the authority necessary to make this contribution on behalf of its copyright owner.

Codecov Report
Base: 98.25% // Head: 98.25% // No change to project coverage :thumbsup:

Coverage data is based on head (55e1245) compared to base (2d55a32).
Patch has no changes to coverable lines.

Additional details and impacted files
@@           Coverage Diff           @@
##             main     #288   +/-   ##
=======================================
  Coverage   98.25%   98.25%
=======================================
  Files           3        3
  Lines         172      172
=======================================
  Hits          169      169
  Misses          2        2
  Partials        1        1

Help us with your feedback. Take ten seconds to tell us how you rate us. Have a feature suggestion? Share it here.

:umbrella: View full report at Codecov.
:loudspeaker: Do you have feedback about the report comment? Let us know in this issue.


Click eventListener seems to be conflicting with the MouseDown eventlistener

I can drag the ribbon, but clicking the ribbon instead goes to the github page, and does not trigger 'onRibbonClick()'.
After trying to use the .click event trigger to open a second form that does not have the icon showing, I figured out the .click event is conflicting with the .mousedown/.mouseup events.
Going to try assigning a new event that has nothing to do with mouse captures as a backup way to resolve my issue, but leaving this here as a "head's up" about the eventListener conflicts. :)

www.jaggloballearning.com/