Use rel=canonical to point to the latest version

Uses the same mechanism as #74, but for a very different purpose.
A common problem using docs.rs is that it's hard to find the latest version of the docs from Google. We mitigate this by having a 'go to latest version' button, but if you land on a search result halfway down the page, the header bar isn't shown. A possible way to get better results is to abuse rel=canonical to point to /:crate/latest/:path so it will be picked up by Google.
It'd be feasible to put rel=canonical in the <head> since we inject styles there already.
#74 should be implemented before this to avoid telling Google we are more canonical than the original documentation.

Linking https://github.com/rust-lang/docs.rs/issues/1120 as related. I'll note that the "go to latest version" link is part of the menu bar, which is pinned to the top of the browser window, so it's always visible even when mid-page. On mobile it's just a yellow triangle with no link, which is a bit confusing.

Another thought on this: Right now, even if you click "go to latest version," you'll get a redirect to a page with an explicit version in the URL. I think before working with rel=canonical, which is hard to see if it's working, it would be beneficial to make it so the latest link for each crate (e.g. https://docs.rs/ureq/latest/ureq/) doesn't redirect to a specific version, but loads a copy of the latest docs for that crate. That way each crate's docs have a stable URL that can gradually accumulate ranking. I suspect Google will never consider a URL canonical if it always redirects somewhere else.

Make it so the latest link for each crate (e.g. https://docs.rs/ureq/latest/ureq/) doesn't redirect to a specific version, but loads a copy of the latest docs for that crate

I'm really hesistant to do this, that will mean the caching from CloudFront is wrong and won't be invalidated when a new crate is published.

We could do a CloudFront invalidation of /{crate}/latest/* every time a new version is published.

Here's the pricing on that, which seems reasonable: https://aws.amazon.com/cloudfront/pricing/

No additional charge for the first 1,000 paths requested for invalidation each month. Thereafter, $0.005 per path requested for invalidation.

And from https://aws.amazon.com/blogs/aws/simplified-multiple-object-invalidation-for-amazon-cloudfront/:

An invalidation path that includes the “*” character incurs the same charge as one that does not.

By the way, this approach would help with another developer experience issue: For crates I use a lot, I often find them by opening a new Chrome tab and typing a few characters of the name, then selecting them from the history portion of the Omnibox. Right now that takes me to a specific version - but it becomes outdated once a new version is released, requiring an extra click to get to the latest version. And because Omnibox scores by number of visits, it can take a while before the latest version is the top choice. If most user navigations go to the "latest" URL, their autocomplete suggestions are more usable.

Right, but it also means that links to docs.rs/:crate/latest/module/x.html can break silently when a new version is published. I guess people can still use a specific version if they want to, though? I'd want to first fix the bug where clicking on the version number takes you to the root of the crate instead of the page you were on.

Those links should be mostly stable across semver minor and patchlevel revisions, since removing or renaming an item would be an API break.

latest doesn't care about patch versions though - it always goes to the latest version that's not a pre-release.
I'm not saying we shouldn't do this, but we should take some care to make sure it doesn't make the user experience worse.

latest doesn't care about patch versions though - it always goes to the latest version that's not a pre-release.

Yep, that makes sense. To flesh out the idea more: The "stable" URL for any given major version could be like docs.rs/:crate/v2/module/x.html (representing the latest release within that major version), with docs.rs/:crate/latest redirecting to to /:crate/vX, where X is the latest major version.
Another approach would be to not worry about major/minor versions, and offer permalink icons next to all internal anchors. The permalink would go to whatever the latest version is at that moment in time. This is similar to what GitHub does when you highlight a specific line of code and it offers a permalink in the ... menu to the left.

This is similar to what GitHub does when you highlight a specific line of code and it offers a permalink in the ... menu to the left.

OMG I'm so mad, I've been doing that by scrolling to the top, opening the commit in a new tab, and pasting the commit in place of master. That's so much better!
Yeah, opt-in permalinks sound like the right way to do this.

OMG I'm so mad, I've been doing that by scrolling to the top, opening the commit in a new tab, and pasting the commit in place of master. That's so much better!

Yay, so glad to have introduced you to this! There's even a keyboard shortcut: y.

I also think opt-in permalink is better.

Is this really a valid use of rel="canonical"? My interpretation of the RFC is that "duplicative" content would be materially the same, which different versions of modules or types aren't, really.
A wild suggestion as an outsider - what if docs.rs/crate was always the latest version, and docs.rs/archive/<crate>/<ver> was where every version was published? Then one could use robots.txt to exclude /archive from search engines. Granted it's occasionally useful to locate outdated type names via a search engine. My opinion is the trade-off would be worth it.

I agree rel="canonical" is not quite the right fit for this, and I like the idea of docs.rs/<crate> always being the latest version. I don't think it's necessary to exclude older versions via robots.txt. As you mention, it can be useful to have old versions searchable. And I think search engines will quickly learn that docs.rs/<crate> is the "most important" URL for <crate>.

I'm really hesistant to do this, that will mean the caching from CloudFront is wrong and won't be invalidated when a new release is published.

I was looking at the caching story here, and I think we actually wouldn't need to change anything. Looking at https://docs.rs/ureq/2.1.0/ureq/, for instance: that URL itself (i.e. the HTML page) doesn't have a Cache-Control header and consistently returns x-cache: Miss from cloudfront. So the HTML pages aren't being cached today; the same would be true if there was a single "latest" URL.
For subresources - almost everything is per-rustdoc-version, not per-crate-version. That's all cached, and its caching won't be affected. The one exception is search-index{...}.js. That's per-crate-version, but also has a unique URL for each crate version. For example, https://docs.rs/ureq/2.1.0/search-index-20210324-1.53.0-nightly-07e0e2ec2.js. And since the URL for the search index is part of the HTML page, it will get updated correctly on new builds and doesn't need to worry about caching.

Hi,  Id just like to add my 2 cents
On the Part of the page with Versions the previous versions link href could have rel="nofollow" or "noindex nofollow" that would indicate that they are not popular.
Also as far as I know to add rel="canonical" to the latest version is just a hint to search engines, so it should not break anything.
A similar issue was first reported in 2013 https://github.com/rust-lang/rust/issues/9461 (and is still open)
I believe implementing this would improve the users experience, ie you get to see the latest documentation by default.
Also, it would reduce the load on the server as users wouldn't land on one page only to click on the link to the latest version of the documentation.  (Also you would reduce the load of bots indexing outdated documentation)
Thanks

I'd like to propose renaming this issue to "make latest version top result in search engines." The original proposal was to use rel=canonical for this purpose, but from subsequent research I think that won't work. The overall goal is findability from search engines.

This is done! See also #1438.


BUG: extending existing bounding box

When I extend a bounding box that has already been made by dragging the left side I can extend the box off the image.  on the top, bottom or right side of the bounding box does not pass the edge of the image.

Is it the master or dev branch? We rebuild the tagging engine for the new version of VoTT.

Yeah, it should be fixed in dev.


Seek and volume does not work in IE

There is a known issue with the onChange event on range inputs: https://github.com/facebook/react/issues/3096.
This is preventing the volume and seek from working in IE.
Consider an alternative solution.

Sorry to re-opening this bug.
There is still a bug with volume control even with the latest version of the react ("react-html5video": "2.2.0", "react-dom": "15.6.1", "react": "15.5.3") in IE11/Edge Windows 7.
The cause of this issue is -webkit-appearance: slider-vertical; in input[type="range"] which does not work as expected in IE11/Edge ( it is still horizontal instead of vertical). So if we change it to something like this transform: rotate(-90deg) translateY(-20px) translateX(17px); height: 4px; width: 40px;  for IE11/Edge it would work as expected.


What would it take to support thumbnails in Finder.app?

This is already fixed in https://github.com/yllan/JXLook/pull/18. @yllan Can you release a new version?

Duplicate of #5

Please release a new version.


Allow Composer to dynamically find a port to mount the server to

Currently, Composer is set to run on port 5000, which can cause it to fail if the user's machine is using that port for anything else.
Composer should dynamically find an open port and mount the server using that port.

addressed via https://github.com/microsoft/BotFramework-Composer/issues/2770


Update ember-cli 1.13.7 to 2.5.1

Just jumping through the hoops to upgrade ember-cli. Addressed a local build issue (which I presume was related to npm3 incompatibility).

Thanks for doing this!

@chrislopresto should be g2g!


Immediate feedback on drill down

When you first arrive your search is pinned to  "document-category: annotation"
i) I always find 'document category' a slightly none obvious description (it isn't a document category is it?)
ii) I usually  (or often) want to search on gene products, not annotations, but I can't work out how to get rid of this filter.
iii) taxon. I think the taxon view should be populated by the species with the most EXPERIMENTAL annotations rather than any annotation.  I want to see the major models here as these are the most popular species to search on.
iv) The buttons are a bit large (it doesn't quite look as slick as the existing filter menu  somehow). Also, why do they need to look differnt?
v)
I filtered on process and pombe. I see this:

It isn't obvious why there are component annotations here?
So I decide to look at the annotations.
It isn't super obvious  how to access annotations. The link is  are a bit hidden at the bottom of the popup.

Here:
Is ontology ID space  GO necessary here (or should be deprioritised)
Could "Retrieve annotations" be at the top?
Could default text be smaller? Make it a bit more compact?
Then, I get to this page:

...and I really have no idea what I am looking at here.
What are the 1726 annotations  linked to 'component' in the original search. Thats what I was trying to establish, but these are process annotations.....very confused

Will test some more when i know what I'm looking at.

This is a different ticket elsewhere, dealing with better text in the selected filter box
For the drill-down, I'd prefer to pick either annotations of gene products for the time being; later on, we might be able to make it toggleable
Assuming we are looking at annotations, one could select the evidence filter first and then select taxon; other than that (ans the other item about the general filter), there will be no way to make something like that work in the near term
We are currently bridging two different tool sets, without the resources necessary to finish it off before this release; there is a ticket open about this already

For the other parts, you added the process filter and then clicked through "cellular_component"; I'd assume the remainder exist due to cross-ontology connection.
For the location of the of the data retrieval, I will see what I can do there.

I prefer gene products as default.
For (3), I expect this is a global request. I agree that the current data-driven ordering is not always perfect. But I think a fix will need to wait to 2.5. I will make a note in #247 so we don't forget this though

Two votes for gps--I'll switch that over.

For me, you have dealt with everything in this ticket except why I see the component terms. I now understand why it happens but I think its bad to do this here.
So take the first annotation in my 'component' results.
signal transduction involved in yada yada
http://www.ebi.ac.uk/QuickGO/GTerm?id=GO:0072480#term=ancchart
This is getting a 'component annotation, because within the ontology this term is linked to 'intracellular'.
These links are currently incomplete, but this process term just happens to have one. It all process terms had their between ontology links established then, if I filter on process I would  see
biological process 12070
cellular component 12070
(or the gene product count once you switch).
This makes the ontology aspect filter pointless. If I filter on process, I only want process.
If I'm interested in component too, I would not use the filter.
Its even less obvious why I see MFs (because MFs are 'small processes'. This must be via some 'regulates' relationship which is even more difficult to justify)
@cmungall  do you get me?

Okay, almost done, but there are enough comments here I want to clarify the final actions:

Do we keep this display over annotations (and keep the evidence filter) or switch to gene products (and lose evidence filter)?
If we we stay on annotation, do we keep aspect, remove it, or replace it with something more clear (e.g. direct or inferred annotation)?

@ValWood agreed, it's logical but really confusing, I commented on this here: https://github.com/geneontology/amigo/issues/163#issuecomment-202979080 (sorry about all the drilldown tickets Seth, we're all just stoked to see it and can't contain ourselves!). Anyway, looks like aspect filtering is now gone on tomadachi.
Not sure I totally understand the choices, but I think the most logical that is possible within the current golr framework is toggling between:

entity counts. Facets: taxon
annotation counts. Facets: taxon, evidence

If it's easier to be uniform, then taxon only is fine. If it's easier to have no toggle, then 1. only is fine for 2.4
Note that dd_browse on tomadachi currently says "Nothing to filter" under organism, but I expect that is to do with the issue you and @hdietze are working on.

Okay, so we'll convert to bioentity no matter what, and then time willing let the user select to use annotations instead; aspect gone.
For the last part there, that will not be populated until the next load, but it's really cool.

No type or source for gene product filters?

Type yes,
Source (as in DB prefix) is a bit of a legacy no need for it here, we
have taxon
On 31 Mar 2016, at 19:53, kltm wrote:

No type or source for gene product filters?

You are receiving this because you were mentioned.
Reply to this email directly or view it on GitHub:
https://github.com/geneontology/amigo/issues/332#issuecomment-204221489

I'm still not sure why you can't have aspect filter with different behavior. I often want to browse the annotations of a single aspect.
I don't understand why, if you filter on process, logically you still need to show component or function totals (even if there are inter ontology links, even if inferred annotations are there, I specified that I only wanted process totals).


Toast: outline stats on screen after toast dismissed

Bug report
Happens on iPhone
Current Behavior

Oh snap, I raised this with the team last night. @benoitgrelard looks like this issue needs to be moved to the website repo.

@jjenzz I'm seeing this on our Toast implementation as well, so I'm not sure that it should live on the Radix site repo. Unless I'm doing something wrong... which is entirely possible ;-).

@tmilewski since the radix primitives are packaged without styles the intention is that consumers would handle styling, however, this one is a bit of a grey area. I'm not sure whether this is something primitives should handle or not but I'm not on the team anymore so perhaps @benoitgrelard or @andy-hook can help.
For now, you should be able to add outline: none to the Toast.Viewport.

I agree it should be dealt with at the app level I think, so I'll move the issue to the website repo for now.


Update windows-autopatch-prerequisites.md

Article just wrote that F3 was a eligible license. As there are multiple F3 licenses available, I assume that it is the Microsoft 365 F3 which grants the eligibility for autopatch.

Why

Closes #[Issue Number]

Changes

@JrndD  Thanks for your feedback. We're updating this article soon. Thank you!


Add Explorer.DataFrame.slice(df, range)

Implementation should be a matter of:
take(df, Enum.slice(0..n_rows(df), range))

Oh maybe we should support this in DF.take/2 instead but supporting it in slice is closer to Elixir's Enum.


asciicast/load slow for casts with big dimensions

Using asciicast/load via load-asciicast I noticed some asciicasts take very long to parse. Two examples users of svg-term-cli raised, both with relatively high width/height properties.

cast
width
height
size
render time

156787
208
58
29K
145s

156579
155
43
59K
> 300s

Source: https://github.com/marionebl/svg-term-cli/issues/15

Forcing the screen buffer size down decreases parsing time:

cast
width
height
size
render time

156787
80
25
29K
5s

156838
80
25
28K
5s

156579
80
25
59K
11s

This is interesting. I don't have a clue what's going on there. Thanks @marionebl for making awesome comparison table 👍  It will definitely help debugging this.

I think it might be an issue with large files in general. It seems like asciicast/load uses a lot of memory. When trying to render this cast
https://asciinema.org/a/thqQQnk2QGEcx3N5hv9MGiSwl
which is 165K, loading the cast crashed with an out of heap memory exception after a while. Increasing the memory by running:
node --max-old-space-size=8096 ~/.nvm/versions/node/v8.9.4/bin/svg-term --in=trepl --out examples/trepl.svg --window

the process quickly consumed around 3 GB of ram and finished loading in a way shorter time. It seems that the default heap size is too small for loading these types of files (or asciicast/load uses too much memory :))

It is simply very long when you click in the progress bar. It would be great to improve this :)

asciicast/load loads all the screencast to memory, causing out of memory problem:
https://github.com/marionebl/svg-term/issues/13
It's not good when over 2GB of memory is required for loading only 1.6MB of screencast.
asciinema v2 supports streaming.
Is there a method different from asciicast/load that gives each frame one by one?

This function uses a lot of mem in some cases indeed. It's from the old, no longer supported, version of the player though.
Better to just parse it in JS,it's actually very simple. For inspiration see driver/asciicast.js


decode JWT helper function

Is your feature request related to a problem? Please describe.
I'm always frustrated when i need to decode JWT, explicit checking and typing result.
Describe the solution you'd like
A one line function to decodeJWT with some options for verifying payload.
  async decodeJWT<CredentialType>(jwt: string, verifyOptions?: VerifyOptions) : DecodeJWTResult {
    // check signature
    // decode payload
    // check payload against verifyOptions
    // If this is a VP, decode all underlying VCs
  }

types
Add some type help, you probably already have better types for this. Should have a type-guard to determine if one is working with a VP or VC.
type DecodeJWTResult = VerifiableCrendentialPayload | VerifiablePresentationPayload

type VC =  {
  "@context":  Array<string>
  "type": Array<string>
  sub: string,
  nbf: string
  iss: string
  aud: Array<string>
}
interface VerifiableCrendentialPayload extends VC {
  credentialSubject: Record<string, any>
  ...
}

interface VerifiablePresentationPayload extends VC {
  verifiableCredential/* ("s?") */: VerifiableCrendentialPayload[]
  ...
}

Generic CredentialType
Able to pass in expected credential subject type which types into the credential subject of VC( or VCs of VP). Should type as a Partial(?) if we cant check the value against type at runtime.
verifyOptions
I find this verify helpers easy to work with: https://github.com/auth0/node-jsonwebtoken#jwtverifytoken-secretorpublickey-options-callback

algorithms: List of strings with the names of the allowed algorithms. For instance, ["HS256", "HS384"].
audience: if you want to check audience (aud), provide a value here. The audience can be checked against a string, a regular expression or a list of strings and/or regular expressions.

Eg: "urn:foo", /urn:f[o]{2}/, [/urn:f[o]{2}/, "urn:bar"]

complete: return an object with the decoded { payload, header, signature } instead of only the usual content of the payload.
issuer (optional): string or array of strings of valid values for the iss field.
jwtid (optional): if you want to check JWT ID (jti), provide a string value here.
ignoreExpiration: if true do not validate the expiration of the token.
ignoreNotBefore...
subject: if you want to check subject (sub), provide a value here
clockTolerance: number of seconds to tolerate when checking the nbf and exp claims, to deal with small clock differences among different servers
maxAge: the maximum allowed age for tokens to still be valid. It is expressed in seconds or a string describing a time span vercel/ms.

Eg: 1000, "2 days", "10h", "7d". A numeric value is interpreted as a seconds count. If you use a string be sure you provide the time units (days, hours, etc), otherwise milliseconds unit is used by default ("120" is equal to "120ms").

clockTimestamp: the time in seconds that should be used as the current time for all necessary comparisons.
nonce: if you want to check nonce claim, provide a string value here. It is used on Open ID for the ID Tokens. (Open ID implementation notes)

Another option to say something about expected credential data would also be helpful. Throws if data is not present in the VC. Maybe this is possible to do with CredentialType as mentioned above.
If one send a VP with VCs, we want to check each VC against this options. Maybe a developer could optionally provide an map of verifyOptions {vpOptions: VerifyOptions, vcOptions: VerifyOptions}
Also, we sometimes need to check that the issuer of VP is the same as subject in credential, maybe this can be passed as a verifyOption.
Describe alternatives you've considered
Implementing it on our own, using

https://github.com/decentralized-identity/did-jwt/blob/ee8dbb45a5012e8c2b682aeb990f4e9dc1a7a6a4/src/JWT.ts#L176
https://github.com/auth0/node-jsonwebtoken#jwtverifytoken-secretorpublickey-options-callback

thanks for the suggestion!
This seems connected to the generalized verification API (#375)

Did a very simple, naive and dirty example here for testing:
  async decodeJWT(jwt: string, verifyOptions?: Partial<VerifyOptions>) {
    try {
      await this.verifyJWT(jwt);
      const payload = JSON.parse(Buffer.from(jwt.split('.')[1], 'base64').toString()) as JwtPayload;
      const errors = [];
      try {
        const isVP = 'vp' in payload && payload.vp.type.includes('VerifiablePresentation');
        if (verifyOptions.requireVerifiablePresentation && !isVP) {
          throw Error('JWT is not a VerifiablePresentation, expected a JWT with vp property and VerifiablePresentation in vp.types ');
        }
        if (verifyOptions.decodeCredentials) {
          if (!Array.isArray(payload.vp.verifiableCredential)) errors.push(`JWT vp.verifiableCredential was ${typeof payload.vp.verifiableCredential}, expected Array`);
          const decodedVerifiableCredentials = await Promise.all(
            payload.vp.verifiableCredential.map(async (subJWT) => {
              try {
                // Decode sub credential with overridden options,
                // REVIEW Is it correct to make sure VP issuer is subject of VC?
                const decoded = await this.decodeJWT(subJWT, {
                  ...verifyOptions,
                  decodeCredentials: false,
                  audience: undefined,
                  subject: payload.vp.iss,
                  requireVerifiablePresentation: false,
                });
                return decoded;
              } catch (error) {
                errors.push(`Error decoding subcredential: ${error.message}. \nSubcredential was: \n${Buffer.from(subJWT.split('.')[1], 'base64').toString()}`);
              }
            }),
          );
          payload.vp.jwts = decodedVerifiableCredentials;
        }
      } catch (error) {
        errors.push(`JWT was a Verifiable Presentation, error while decoding subcredential: ${error.message}`);
      }

      if (verifyOptions) {
        if (verifyOptions.audience) {
          if (typeof payload.aud === 'string') {
            if (payload.aud !== verifyOptions.audience) errors.push(`JWT audience was ${payload.aud}, expected ${verifyOptions.audience}`);
          } else if (Array.isArray(payload.aud)) {
            if (!payload.aud.includes(verifyOptions.audience)) errors.push(`JWT audience was ${payload.aud.join(' | ')}, expected one of ${verifyOptions.audience}`);
          } else {
            throw Error(`JWT .aud expected string or Array, got ${typeof payload.aud}`);
          }
        }
        if (verifyOptions.issuer) {
          if (typeof payload.iss !== 'string') throw Error(`JWT issuer expected string, got ${typeof payload.iss}`);
          if (typeof verifyOptions.issuer === 'string') {
            if (payload.iss !== verifyOptions.issuer) errors.push(`JWT issuer was ${payload.iss}, expected ${verifyOptions.issuer}`);
          } else if (Array.isArray(verifyOptions.issuer)) {
            if (!verifyOptions.issuer.includes(payload.iss)) errors.push(`JWT issuer was ${payload.iss}, expected one of ${verifyOptions.issuer.join(' | ')}`);
          } else {
            errors.push(`verifyOptions.issuer was ${typeof verifyOptions.issuer}, expected Array or string`);
          }
        }
        if (verifyOptions.subject) {
          if (payload.sub !== verifyOptions.subject) errors.push(`JWT subject was ${payload.sub}, expected ${verifyOptions.subject}`);
        }
      }
      if (errors.length > 0) throw Error(errors.join('.\n'));
      return payload;
    } catch (error) {
      console.log('Cant decode JWT => ', error.message);
      throw error;
    }
  }
}

types
export interface VerifyOptions {
  audience: string;
  complete: boolean;
  issuer: string | string[];
  ignoreExpiration: boolean;
  ignoreNotBefore: boolean;
  subject: string;
  decodeCredentials: boolean;
  requireVerifiablePresentation: boolean;
}

export interface JwtPayload {
  [key: string]: any;
  iss?: string;
  sub?: string;
  aud?: string | string[];
  exp?: number;
  nbf?: number;
  iat?: number;
  jti?: string;
}


Circle CI support

Any chance you'll add in support for Circle CI?

This system is generic enough that you should be able to set it up with any CI server. Namely just run the runlighthouse.js script against a staged URL or fire up a local server and test agains that.
https://github.com/ebidel/lighthouse-ci#auditing-github-pull-requests
https://github.com/ebidel/lighthouse-ci#running-your-own-ci-server

Thanks Eric!
process.env.TRAVIS_PULL_REQUEST_SLUG is of course not available in CircleCI, so repoSlug.split('/')[0] will throw an error.

Ah yes :) Thanks for keeping me honest. TBH, I haven't used Circle CI before. If changes are minimal, I'd be happy to take a PR that adds support. The other thing you could do is take runlighthouse.js as a starter and adapt it to CircleCI.

Haha, no problem! I’ll take a look in the morning and see how minimal the change would be to add that flag. If it’s a small update, I’ll send a PR- otherwise I’ll just fork and run.

Thanks! I'd also like to understand the changes. Maybe you can help list them here if the change becomes too much?

Is there a fork or any documentation on getting this up and running on CircleCI?

Did somebody already make it work for Circle CI? Any guidance on how to do it or implementing would be appreciated.

I created an example repo for lighthouse+circleci integration—maybe it will help some folks here.
repo: https://github.com/zgreen/lighthouse-circleci-example
blog post: https://offbyone.tech/lighthouse-circleci

@zgreen thank you for your example repo! however, it seems the blogpost is not available atm (404), do you have it available somewhere else?

Hmm, the link seems to work for me. Note that it should be https://offbyone.tech/lighthouse-circleci and not https://offbyone.tech/lighthouse-circleci/, looks like my blog isn't handling trailing slashes properly 🙃

@zgreen the trailing slash didn't make a difference for me but it seems to be a browser issue since it works for me in Safari but not in Chrome. Thanks anyway, time to read! 🤓

@tinovyatkin Did you manage to get the comments on the PR, using circleci?

@jakeleboeuf @kanolato
lighthouse-keeper is the new lighthouse bot that supports multiple CIs as well as detecting differences between PR branch and master branch. You should check it out!


Because a simple concat would be too easy!

https://github.com/facebookresearch/dino/blob/d2f3156bb34c32ae54312de7fe4e31580f12ff7f/eval_linear.py#L211-L212
whyyyyyy :rofl:
I'm poking fun, so feel free to ignore me and just close the issue, but am also wondering if there's a genuine reason to do this, or it's just "eh, this happened, whatever"?
(if it's not clear, a simple concat would do abc + def = abcdef, while this results in adbecf. It won't change any results, but it matters to me because I'm loading the DINO weights into a jax codebase.)

eh, this happened, whatever :p

More seriously, it comes from a former version of my code. I had changed to a much more simple concat in the public release but I realized when you opened the other issue on ViT-B/8 linear weights that the linear weights were as a result not compatible with the "abcdef" format.
I could then either manually modify the linear weights or modify the linear eval code accordingly and I lazily chose the second option...
See https://github.com/facebookresearch/dino/commit/d2f3156bb34c32ae54312de7fe4e31580f12ff7f

oh, in this case I'm very glad that you realized it when adding the weight, because I may have never figured this out!
In any case, this was fun :) Thanks for your support, I rate 10/10!


Separate logic into classes

Separate Users/Groups/etc into classes.  Then write a wrapper class (facade) to expose the backwards compatible CodeIgniter API.

Closing this in favor of separate todos.


feat(sys): add sys_available_parallelism

We could deprecate sys_get_processor_count in favor of sys_available_parallelism.

Why is this name more useful? I like the naming from num_cpus.

I don't feel strong on this, but the reasoning behind Rust naming it like this (https://github.com/rust-lang/rust/issues/74479#issuecomment-910143466, https://github.com/rust-lang/rust/pull/89324) makes sense to me:
For the user, it is important to know how many threads they can spawn to make use of the available concurrency of the system. It is not relevant to how many physical CPU cores or hyperthreads or hardware threads this maps.


[test] Add slurm check for dom xfer

Sometimes the xfer partition is down on dom and nobody notices, so I extended the HostnameCheck test and the CSCS configuration.

Codecov Report

Merging #2437 (0ec41da) into master (cecfe44) will not change coverage.
The diff coverage is n/a.

@@           Coverage Diff           @@
##           master    #2437   +/-   ##
=======================================
  Coverage   85.69%   85.69%
=======================================
  Files          56       56
  Lines       10510    10510
=======================================
  Hits         9007     9007
  Misses       1503     1503

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 cecfe44...0ec41da. Read the comment docs.

@lucamar Is the failure on Pilatus expected?


JS - change CLASS_REFERENCE regex to also accept numbers and underscore

fixes #3252
Hey @joshgoebel! How does this look?
Let me know if this needs any changes! Thanks

Adding a markup test for this case totest/markup/javascript/class would be a good idea.

What do you think? @joshgoebel
Thank you for your quick reviews!

I appreciate the quick fix, but is this correct? /\b[A-Z][a-z0-9_]+([A-Z][a-z0-9_]+)*/
There are a few problems that I can see here:

there's this assumption that all classes must start with an uppercase, so new myClass() won't work. Is this on purpose?
it's also assuming that it must be followed by a lowercase. So new CSSThing() won't work.
it's also missing $, which is a valid character for JS class name (think JQuery's $), but really: new my$c  is valid JS.
it's also missing $ and _ as valid initial characters. new _X() or new $X(). For the $ you probably need to remove the \b.
Unless I'm missing something about grouping, the first + is wrong and the (....+)* could be replaced by *.

I think those points above could be addressed with something like /[a-zA-Z\$_][a-zA-Z\$_0-9]*/
It's also missing unicodes, but this may be a bit beyond the scope of this change. This stack overflow answer has a complete solution, but not what highlight.js needs, because builtins seem to be cleared up before).

there's this assumption that all classes must start with an uppercase, so new myClass() won't work. Is this on purpose?

This is a heuristic rule, not an absolute one.  Uppercase classes is a hugely common convention, but a lowercase symbol could be anything. That said if someone wanted to add a mode specifically for new blah, that would be ok.  But this rule cannot be expanded because we'd have too many false positively.

it's also assuming that it must be followed by a lowercase. So new CSSThing() won't work.

This should indeed be taken into account.  So we need a few more markup tests.

it's also missing $, which is a valid character for JS class name (think JQuery's $), but really: new my$c is valid JS.

This seems an edge case and same problem as first point, false positives.

it's also missing $ and _ as valid initial characters. new _X() or new $X(). For the $ you probably need to remove the \b.

Ditto.
Unless I'm missing something about grouping, the first + is wrong and the (....+)* could be replaced by *.
Good point, but the whole thing may need to be slightly rethought now to handle cases like CSSHandler... so

@rbrishabh You need to actually run the test suite, and update the test expectations also, etc... see our docs for building and testing.  Now we also need to add test for class names like ASTParser... Perhaps something like [A-Z][A-Za-z0-9_]+ ?

Sure! I can look into this later today!

hey @joshgoebel! How does this look now?

I'm still looking for an updated test/markup/javascript/class.expect.txt  but don't see it... if you want to let HLJS update the tests for you (and confirm them by inspection) there is a line you can uncomment in test/markup/index to do this. (just uncomment it and run the markup tests once to write out the new expectations)

Ping.

hi! I have a busy schedule and cant keep up with this now! Please feel free to continue it from here. I can close it for now

Thanks anyways!  It'll be here if anyone needs to reference it when there is time to pick this back up.


Run Deploy Target with DEPLOY_COMMIT

Which issue this PR addresses:

Fixes a bug when running make deploy as part of Deploying an int-like Development RP and it fails on pulling unknown aro image error (USER=razo) as follows.
Writing manifest to image destination ++ docker pull razoaro.azurecr.io/aro:v20240614.00 Trying to pull razoaro.azurecr.io/aro:v20240614.00... Error: initializing source docker://razoaro.azurecr.io/aro:v20240614.00: reading manifest v20240614.00 in razoaro.azurecr.io/aro: manifest unknown: manifest tagged by "v20240614.00" is not found '. More information on troubleshooting is available at https://aka.ms/VMExtensionCSELinuxTroubleshoot.
It was also mentioned on Slack thread.
What this PR does / why we need it:

The PR is checking FULL_RP_DEV env value to decide which commit value to use when running the RP and GWY deployment. When the env is set use always use COMMIT, otherwise use VERSION which can be COMMIT/TAG.

When the current commit also includes a git tag (e.g., commit c87a7bed3 has a tag v20240614.00), then following an int-like RP deployment we set the VERSION var to be TAG and not COMMIT.  The env-int file sets the ARO image based on the commit, and later when we push it to the ACR then it uses this env var ARO_IMAGE.
Therefore, on make deploy we normally use the commit as the version that would match the pushed aro image (and probably other places), and when we don't then we try to pull a missing image from the user ACR and fail on pulling an unknown aro image.

References:

TAG - https://github.com/Azure/ARO-RP/blob/master/Makefile#L2
When TAG isn't empty set VERSION as TAG - https://github.com/Azure/ARO-RP/blob/master/Makefile#L24-L28
ARO_IMAGE - https://github.com/Azure/ARO-RP/blob/master/env-int.example#L9
Deploy target - https://github.com/Azure/ARO-RP/blob/master/Makefile#L102

Test plan for issue:
None

Is there any documentation that needs to be updated for this PR?
None

How do you know this will function as expected in production?
I have applied it manually, and it resolved the issue.

Since the VERSION of Makefile is also used in different places, then this current fix could be a potential workaround and not a full fix.
I also don't know whether it will affect any other jobs/workflows.
Other solutions to consider could be:

Modify the env-int.example file to set ARO_IMAGE tag similarly to how it is done in the Makefile
Modify the Makefile always to use the commit over a tag for VERSION var.

/azp run ci, e2e

/azp run ci, e2e

/azp run ci, e2e

/azp run ci,e2e


Not working with WSL

I use wsl for my dev environment & when I am starting the websocket server it is not working

Can you give some more details about the issue?

if fails to connect to the websocket port

Closed as there were given too little informations.

Hey,
If someone ever runs into this issue.
Make sure to check the 'Resource monitor' app in Windows and check if there's any apps listening on port 6001 in the network tab.
On my end it turned out Windows firewall was blocking this port. Once I turned off the firewall the listening port show up in the Resource monitor.
I'm sure there's a way to add an exception to Windows firewall, I just ended up turning it off.
Hope this helps anyone!

same here with laravel 9 sail on windows 10 wsl


Extract fcrepo-camel-webapp to fcrepo4-labs

Resolves: https://jira.duraspace.org/browse/FCREPO-1691

@yinlinchen can you rebase this PR against the master branch?

Resolved with: https://github.com/fcrepo4-exts/fcrepo-camel-toolbox/commit/fbe58bd8d52267919b0df4319ab55fe26062fdc1


$ObjMapi, $ObjMap and $TupleMap allow invalid writes

Example 1:
type A = $ObjMapi<{ FOO: null }, <K>(k:K) => K>
declare var a: A;

(a.FOO : 'FOO'); // ok
(a.FOO : 'BAR'); // error
a.FOO = 'BAR'; // no error

Example 2:
type A = $ObjMap<{ FOO: null }, <K>(k:K) => 'FOO'>
declare var a: A;

(a.FOO : 'FOO'); // ok
(a.FOO : 'BAR'); // error
a.FOO = 'BAR'; // no error

Example 3:
type A = $TupleMap<[mixed, mixed], <K>(k:K) => 'FOO'>
declare var a: A;

(a[0] : 'FOO'); // ok
(a[0]: 'BAR'); // error
a[0] = 'BAR'; // no error

See: https://github.com/gcanti/flow-runtime/issues/11
/cc @gcanti

This is pretty bad for libraries like validated or flow-runtime which rely on $ObjMap in order to build and extract a static type from a runtime value representing a schema.
/cc @andreypopp

This affects only setting properties and literal assignment:
var a: A = { FOO: 'BAR' }; // no error

but:
declare var b: { FOO: 'BAR' };
var a: A = b; // an error

and:
type A = $ObjMap<{ FOO: null }, <K>(k:K) => 'FOO'>

declare var b: { FOO: number };
var a: A = b; // an error

but:
declare var b: { FOO: string };
var a: A = b; // no error

You're right, this is a problem. The cause in the implementation is that we use the existing mechanism for function calls to perform the mapping. This is convenient, but inherits an unfortunate behavior:
declare function f(): string;
var x = f();
if (true) x = 0; // cond. assign to avoid definite assignment refinement
(x: void); // errors: number|string ~> void

Calling a function returns a new, open tvar with the function return type as a lower bound. This doesn't prevent more lower bounds from flowing in, but all inflowing lower bounds are checked against any uses, so it's not totally unsound.
Just explaining this behavior, not excusing it. We should work to make the generate type more precise, because unlike function calls, these types come from annotations where people rightfully expect to establish an exact constraint, not just the lower bound side of one.

@samwgoldman I though it was the case, but how does it explain this:
type A = $ObjMapi<{ FOO: null }, <K>(k:K) => K>
declare var a: A;

(a.FOO : 'FOO'); // ok
a.FOO = 'BAR'; // no error, a.FOO should 'FOO' | 'BAR'
(a.FOO : 'FOO'); // error

That's caused by definite assignment analysis. On that line the value is definitely BAR. Wrap in a conditional or otherwise havoc the refinements to get the union.

Hey, just wanted to see if there were any plans for this. Would be pretty cool to have this working properly!

It should be fixed on Flow 0.55 but wasn't released yet.

These bugs were fixed a couple versions back. Sorry for not closing this sooner 😊

This is a great news, thanks @calebmer


Fix issue with args to find

I was getting "find: myfile.rb: unknown option" whenever there was a file of the right type in the current directory.

hey, sorry for the colossal (two-year) delay in responding. I discovered the same need and made the same change last year in ba300a96f5c5388625a26fbbb3fd5474019fba97.


Issue #180 changes not appearing on npm install kafka-node

Hi Team,
Today i noticed issue #180 changes were not seems to be appeared in kafka-node. after looking in to the myProject/node_module/kafk-node, supprisingly ../lib/client.js missed code related to #180 . it shouldn't happen. could you check ASAP. its very urgent as we are moving to production soon.
Thanks
Sampath

Did you reinstall it with npm?

@haio
Yes. I reinstalled multiple times. #180 changes were not there in 0.2.24 version.
When i install latest version of kafka-node i.e. 0.2.25, intermittently #180 changes are appearing( i did multiple npm install kafka-node)...
i tried with delete require['kafka-node'] to make sure not to fetch module from cache. but issue still exists.

@lsampathreddy I have seen the same issue! The publish time of version 0.2.24 is 2015-03-20T09:29:19.533Z, I can't figure out why the changes is not in this version. You should use<EMAIL_ADDRESS>

Thanks for your response @haio
Was it a npm repo issue? i'm sure i saw #180 changes in 0.2.24 and i tested it couple of days back. but then later i saw changes these were missing in 0.2.24 version... it sounds weird but i'm clueless

It's strange for me too, just can't reproduce it.

Close.


DDFA.PY file Realted

u_base, w_shp, w_exp what is this three variable in utils/ddfa.py

I got the answer


Release 1.0

@kwirkykat Whenever the next release window is, we're happy to take this one out of preview now and make it 1.0. Thanks!

This change is

Codecov Report

:exclamation: No coverage uploaded for pull request base (master@32b0105). Click here to learn what that means.
The diff coverage is 100%.

@@          Coverage Diff           @@
##             master    #7   +/-   ##
======================================
  Coverage          ?   93%
======================================
  Files             ?     3
  Lines             ?   172
  Branches          ?     0
======================================
  Hits              ?   160
  Misses            ?    12
  Partials          ?     0

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 32b0105...ac31c7b. Read the comment docs.

@BrianFarnhill Sweet! Thanks! Release is this Wednesday (3/8)


can not work on centos vms

I have two vms, both are Centos 7, and they are running on my laptop. For the first vm, the hostname is calico-01, the  second vm hostname is calico-02, ip address for each vm is: calico-01: <IP_ADDRESS>, calico-02:<IP_ADDRESS>, they can ping each other. Then I installed docker 1.6 on both vms, and also installed calicoctl on both vms. Also the etcd in running at calico-01. I tried to test calico with steps below:
start calicoctl service on each vm
on calico-01 vm:
[root@calico-01 tony]# calicoctl node
No IP provided. Using detected IP: <IP_ADDRESS>
Calico node is running with id: f26471e12586db980939031998ddcc21739c6e1d4b11b49aa847670427b6236b

on calico-02 vm:
[root@calico-02 ~]# calicoctl node
No IP provided. Using detected IP: <IP_ADDRESS>
Calico node is running with id: 4999282bacdc7374638f65a11acefc7d3e2f99b92c161c8d2328fc6271f9199b

start containers on each vm
on calico-01 vm:
[root@calico-01 tony]# docker run --net=none --name workload-A -tid busybox
dec56c307ea971db79e92bdf5e02d5005cf73ed18668334455cd9eb6cac72f6c
[root@calico-01 tony]# docker run --net=none --name workload-B -tid busybox
1d13983093325e4b04991ec3f26b1f34dbe22f1f74fb1a3dfafbc57ac9d2efec

on calico-02 vm:
[root@calico-02 ~]# docker run --net=none --name workload-C -tid busybox
e40afd75906c0b03c5161e2f0d456831835f9de9df7fe58ceb221b849717fa61
[root@calico-02 ~]# docker run --net=none --name workload-D -tid busybox
77c964a7ce392fad229c00571e31c33f040514caf54d3e168f477a12a0810136

assign ip address to containers:
on calico-01 vm:
[root@calico-01 tony]# calicoctl container add workload-A <IP_ADDRESS>
IP <IP_ADDRESS> added to workload-A
[root@calico-01 tony]# calicoctl container add workload-B <IP_ADDRESS>
IP <IP_ADDRESS> added to workload-B

on calico-02 vm:
[root@calico-02 ~]# calicoctl container add workload-C <IP_ADDRESS>
IP <IP_ADDRESS> added to workload-C
[root@calico-02 ~]# calicoctl container add workload-D <IP_ADDRESS>
IP <IP_ADDRESS> added to workload-D

create profiles on one vm
on calico-01 vm:
[root@calico-01 tony]# calicoctl profile add A_C
Created profile A_C
[root@calico-01 tony]# calicoctl profile add B_D
Created profile B_D

add profile to containers
on calico-01 vm:
[root@calico-01 tony]# calicoctl container workload-A profile append A_C
Profile(s) A_C appended.

[root@calico-01 tony]# calicoctl container workload-B profile append B_D
Profile(s) B_D appended.

on calico-02 vm:
[root@calico-02 ~]# calicoctl container workload-C profile append A_C
Profile(s) A_C appended.

[root@calico-02 ~]# calicoctl container workload-D profile append B_D
Profile(s) B_D appended.

Then I test the network on calico-01 vm:
[root@calico-01 tony]# docker exec workload-A ping -c 4 <IP_ADDRESS>
PING <IP_ADDRESS> (<IP_ADDRESS>): 56 data bytes

--- <IP_ADDRESS> ping statistics ---
4 packets transmitted, 0 packets received, 100% packet loss

and the kernel IP route table on each vm is:
calico-01:
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         <IP_ADDRESS>   <IP_ADDRESS>         UG    1024   0        0 eno16777736
<IP_ADDRESS>      <IP_ADDRESS>         <IP_ADDRESS>     U     0      0        0 docker0
<IP_ADDRESS>     <IP_ADDRESS>         <IP_ADDRESS> UH    0      0        0 caliaa4e48ea892
<IP_ADDRESS>     <IP_ADDRESS>         <IP_ADDRESS> UH    0      0        0 calibceb8594892
<IP_ADDRESS>   <IP_ADDRESS>         <IP_ADDRESS>   U     0      0        0 eno16777736

calico-02:
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         <IP_ADDRESS>   <IP_ADDRESS>         UG    1024   0        0 eno16777736
<IP_ADDRESS>      <IP_ADDRESS>         <IP_ADDRESS>     U     0      0        0 docker0
<IP_ADDRESS>     <IP_ADDRESS>         <IP_ADDRESS> UH    0      0        0 calic708228a892
<IP_ADDRESS>     <IP_ADDRESS>         <IP_ADDRESS> UH    0      0        0 calice30d6c4892
<IP_ADDRESS>   <IP_ADDRESS>         <IP_ADDRESS>   U     0      0        0 eno16777736

I am wondering what's the problem? anyone knows?

Hi @AdoHe,  As a first step, could you run calicoctl status on each node and paste in the output.

@robbrockbank I run calicoctl status after the calicoctl node, and on both vms, I got such result:
calico-node container is running. Status: Up About a minute
Running felix version 1.2.0

IPv4 BGP status
Unable to connect to server control socket (/etc/service/bird/bird.ctl): Connection refused

IPv6 BGP status
Unable to connect to server control socket (/etc/service/bird6/bird6.ctl): Connection refused

I think cause is clearly: there is no such socket file created on my vm. is this problem related with some kernel module missing? I did run calicoctl checksystem before I run other containers, but no mistakes return.

So it looks like bird is failing to run. Can you run calicoctl diags and send us the result?

Hi @AdoHe,
Did you manage to run the calicoctl diags comands on the hosts.  If you do manage to run this, you could upload the diags to transfer.sh or similar and post the link here, or let me know if you'd rather send in a PM.
If you don't manage to gather the diags, we'll try and repro in house as soon as we can.
Rob

I just tried to repro this problem on centos 7 but didn't hit any issues.
[calico@localhost ~]$ ./calicoctl version
0.10.0-dev
[calico@localhost ~]$ ./calicoctl status
calico-node container is running. Status: Up About a minute
Running felix version 1.2.1

IPv4 BGP status
+--------------+-----------+-------+-------+------+
| Peer address | Peer type | State | Since | Info |
+--------------+-----------+-------+-------+------+
+--------------+-----------+-------+-------+------+

IPv6 BGP status
+--------------+-----------+-------+-------+------+
| Peer address | Peer type | State | Since | Info |
+--------------+-----------+-------+-------+------+
+--------------+-----------+-------+-------+------+

@tomdee @robbrockbank sorry about reply so late. I tried calicoctl 0.4.9, it is ok. Later I will try to reproduce this issue and provide more information.

Hi @AdoHe,
Was 0.4.9 the first version that you found in which it started working?  Did you try all of the later versions?
I'm just wondering if it would be possible for you to find the most recent version that it works for CentOS so I can see what changed in the next release.
We also released a v0.12.0 today - perhaps that may resolve the issue.
Rob

@robbrockbank I will try later version as soon as I can. And I will give you more feedback.

@AdoHe Hi - did you ever manage to see if this was working for you?

@robbrockbank I tried v0.12.0, it is ok. I think we can close this issue.


Convert agents list to side scrolling

I want to place the ubiquity connections on a second line below the agents list. So before we get there we need to convert the agent list to a side scrolling list. Up to @broham89 if we need an arrow for scrolling left/right or how we indicate that scrolling is possible.

Closed by https://github.com/samtecspg/articulate/commit/b16ccc01fcb35bbe91d828d5d55703933bb1b0d8


Incorrect data for AN and PM draw on 2016-05-31

The draw number for AN was 15740 (it should be 15140) and the draw number for PM was 15741 (it should be 15140).

Seems as though NLCB corrected their error, so the correct and incorrect results are present. To fix I deleted the incorrect results.
DELETE FROM results WHERE draw=15740;
DELETE FROM results WHERE draw=15741;


Fix extra warning about low keys on wallet encryption

When wallet is encrypted keypool is flushed which triggers warnings and autobackup. Since wallet demands user to restart wallet and will not continue any operation this doesn't really make much sense (autobackup should be created on next start anyway) and could confuse user. This commit is kind of workaround for the issue - we'll be warning and creating autobackups only if mixing is in running and we force mixing to be stopped in case of keepool regeneration.

utACK https://github.com/dashpay/dash/pull/946/commits/5d62e4fc819e4aada3c50de24de34a187bf6d98b


React.createClass is deprecated

Can you fix that?
React.createClass is deprecated and will be removed in version 16. Use plain JavaScript classes instead.
Best!

Yes, merging a fix today.

Fixed in v1.5.0

Thanks :)
2017-04-15 14:27 GMT+02:00 Joachim<EMAIL_ADDRESS>
Fixed in v1.5.0
—
You are receiving this because you authored the thread.
Reply to this email directly, view it on GitHub
https://github.com/fisshy/react-scroll/issues/201#issuecomment-294290311,
or mute the thread
https://github.com/notifications/unsubscribe-auth/AF0rx17do-KwRb-YJDv0uHN5TIulXzFcks5rwLewgaJpZM4M-L3J
.


PHP 8.0.0

the most important changes for support of new PHP 8.0.0.

Thanks for the contribution / Díky za příspěvěk 👍

Thanks for your contribution! CMS 3.x is in "Limited Support", which is defined as "Critical bugfixes and critical security fixes" (https://www.silverstripe.org/software/roadmap/). Talking to some other maintainers, we don't see PHP 8 support as fitting this description, especially since CMS 3.x will be EOL before PHP 7.x runs out of support - so you can still run sites securely on a compatible version of PHP.
That being said, we do acknowledge that some community members might be interested in maintaining PHP 8 support for CMS 3.x. The easiest option for this would be a fork (with some clear caveats about its usage). Keep in mind that you would have to keep this fork up to date with security releases in the CMS 3.7 release line.
The maintainers and some core committers discussed the option to create a 3.8.x-dev release line for PHP 8 compatibility purposes, and not perform any stable releases on there (to avoid setting expectations around support we can't meet with our current resources). Most people weren't keen on this, since it increases our support commitments: We would need to forward port any security and critical bugfixes to this branch, and would become the default owners of any follow up work and regressions introduced by these changes.
Do you think a fork would be feasible for you to maintain? Do you have plans to also check and fix other common modules such as silverstripe/cms to work with PHP 8, and test this in continuous integration? If there was a well maintained fork, we'd be happy to direct community members into this direction.
/cc @silverstripe/core-team

FWIW I'm fine with merging this, but I don't think we'll ever do another release of SS3. If you want to use this PHP8 support, you use the dev branch, and deal with all the connotations around using a dev branch. I don't really think we even need to create a 3.8.x-dev branch. Just hit the merge button as is - the change is unbreaking from the looks of things anyway.
I think it's pretty clear now that we don't support SS3. And it's pretty easy to hit the "saved replies > SS3" button when people raise issues/requests.
Forking framework is a good option if you want to create and manage stable releases yourself for proper Composer constraints.

Hello,
thank you for the swift reply.
I maintain many quite big projects (www.typotheque.com, fontstand.com, elefont.info, ...) created on SilverStripe framework 3.x and is very complicated to change it to 4.x version.
My oldest project on SilverStripe 3 framework is about 8 years old and it is still in active development.
Therefore I will create my own fork for SilverStripe 3.8 with PHP8 support, of course I will try to support it and maintain.
But for now I don't have any experiences with supporting/managing community projects, but I am open for this new oportunity.
I think there is lot of developers which need to use SilverStripe 3 on their old projects.

I maintain many quite big projects (www.typotheque.com, fontstand.com, elefont.info, ...) created on SilverStripe framework 3.x and is very complicated to change it to 4.x version.

Happy to help volunteer some my time and expertise to get your upgrades finished if this is the main reason you're not on the supported version rather than seeing people resurrect older release lines and the implications that brings. So far haven't found a project that couldn't be upgraded! Drop me any details<EMAIL_ADDRESS>

Thanks for understanding @odraska! I'm going to close this PR since we're not intending to merge it. Once you've got a fork up and running (with some clear expectation setting in the README), you're welcome to post it here. We could add a note to https://docs.silverstripe.org/en/4/getting_started/server_requirements/ about this option.


Breakpoints crash/hang debugger

Similar to the report https://github.com/linkedin/dexmaker/issues/100, but a different flavor.
When running with:
androidTestImplementation 'com.linkedin.dexmaker:dexmaker-mockito-inline:2.25.1'
Any tests under debug crash if they have any breakpoints set.  If I switch to:
androidTestImplementation 'org.mockito:mockito-android:2.13.0'
Breakpoints work fine.  However, I'm looking to use the ability to mock final methods, so I'm hoping to get dexmaker-mockito-inline working correctly with the debugger.
This is running on real Android 9 hardware (Samsung Galaxy Tab A - 2019).  It hangs the tablet is such a way that the easiest way to get it out of that state is to reboot the whole tablet.
Here is my build.gradle for the app:
apply plugin: 'com.android.application'

android {
    compileSdkVersion 28
    defaultConfig {
        applicationId "com.hcs.android.orconnect"
        minSdkVersion 24
        targetSdkVersion 28
        // The versionCode and versionName are defined in the top level (android) build.gradle file.
        versionCode versionValue
        versionName versionString
        testInstrumentationRunner "com.hcs.android.orconnect.junit.CustomTestRunner"
        multiDexEnabled true
        setProperty("archivesBaseName", "ORConnect-$versionName")
    }
    signingConfigs {
        config {
            storeFile file("$System.env.KEYSTORE_ANDROID")
            storePassword "$System.env.KEYPASSWORD_ANDROID"
            keyAlias "$System.env.KEYALIAS_ANDROID"
            keyPassword "$System.env.KEYPASSWORD_ANDROID"
            storeType "jks"
        }
    }
    buildTypes {
        release {
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            signingConfig signingConfigs.config
        }
    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
    adbOptions {
        timeOutInMs 600000  // 10 minutes
    }
    packagingOptions {
        // Google's Speech-to-Text API doesn't know how to package its own stuff, so...
        exclude 'META-INF/INDEX.LIST'
        exclude 'META-INF/DEPENDENCIES'
    }
}

dependencies {
    implementation 'com.android.support:appcompat-v7:28.0.0'
    implementation 'com.android.support.constraint:constraint-layout:1.1.3'
    implementation 'com.android.support:support-v4:28.0.0'
    implementation 'com.android.support:design:28.0.0'
    implementation ('net.java.dev.jna:jna:4.2.2')
    implementation project(':ORCService')
    implementation project(':ORCCommon')
    implementation project(':annotations')
    implementation files('../../../../lib/findBugs-2.0.2/annotations.jar')
    annotationProcessor project(':annotations')
    implementation project(':falcon') // Supports screenshots
    implementation 'com.github.anrwatchdog:anrwatchdog:1.4.0' // Used for ANR detection
    // CMU PocketSphinx - used for Wake Word detection
    implementation project(':pocketsphinx-android-5prealpha-release')
    implementation project(':models')
    // Kaldi - used for Wake Word detection
    implementation files('libs/speech/kaldi-android-5.2.aar')
    implementation project(':kaldi-model-small')
    // IBM Watson's Speech-To-Text and Text-To-Speech APIs
    implementation files('libs/speech/ibm-watson-android-sdk-0.5.1.aar')
    implementation ('com.ibm.watson:ibm-watson:8.0.0', {
        exclude group: 'com.google.code.findbugs' // We already have findbugs
        exclude group: 'org.mockito' // Mockito was included by IBM by mistake
    })
    // Google's Speech-To-Text cloud API stuff
    // Can't use com.google.cloud:google-cloud-speech:1.21+ because https://github.com/protocolbuffers/protobuf/issues/6718
    // once it picks up (yet to be released) protobuf-java-3.11.x we should be okay?
    implementation ('io.grpc:grpc-okhttp:1.25.0', {
        exclude group: 'com.google.code.findbugs' // Not even Google can keep dependencies straight - Program type already present: javax.annotation.CheckForNull
    })
    implementation ('com.google.cloud:google-cloud-speech:1.20.0', {
        exclude group: 'com.google.code.findbugs' // Not even Google can keep dependencies straight - Program type already present: javax.annotation.CheckForNull
    })

    testImplementation 'junit:junit:4.13'
    // We use Mockito because it doesn't need extra code to mock final classes.  We use
    // dexmaker-mockito-inline so that we can mock final methods.
    // JMock could work, if DexOpener worked (like JDave-Unfinalizer, but for DEX files), but
    // I was unable to make it work.  Hence I switched to Mockito, which is the favorite among Android
    // Developers (SMM)
//    testImplementation 'org.mockito:mockito-core:2.13.0'
//    testImplementation 'org.mockito:mockito-inline:2.13.0'
    testImplementation files('../../../../lib/jmock-2.8.4/hamcrest-core-1.3.jar')
    testImplementation files('../../../../lib/jmock-2.8.4/hamcrest-library-1.3.jar')
    testImplementation files('../../../../nb/ORCCommon/dist/ORCCommon-test.jar')
    testImplementation files('../../../../nb/CommonLibrary/dist/CommonLibrary-test.jar')
    testImplementation project(':pocketsphinx-android-5prealpha-release')
//    androidTestImplementation 'com.android.support.test:runner:1.0.2'
    androidTestImplementation 'com.android.support.test:rules:1.0.2'
    androidTestImplementation('com.android.support.test.espresso:espresso-core:3.0.1', {
        exclude group: 'com.google.code.findbugs' // We already have findbugs
    })
//    androidTestImplementation 'org.mockito:mockito-android:2.13.0'
    androidTestImplementation 'com.linkedin.dexmaker:dexmaker-mockito-inline:2.25.1'
}

apply from: "findbugs.gradle"

Here is the crash results:
Testing started at 10:49 AM ...

03/11 10:49:34: Launching ButtonBindingsTest
No apk changes detected since last installation, skipping installation of /home/smm/hcs/orc.trunk.java11/tablet/android/ORConnect/app/build/outputs/apk/debug/ORConnect-3.1.0-38566-debug.apk
No apk changes detected since last installation, skipping installation of /home/smm/hcs/orc.trunk.java11/tablet/android/ORConnect/app/build/outputs/apk/androidTest/debug/ORConnect-3.1.0-38566-debug-androidTest.apk
Running tests

$ adb shell am instrument -w -r   -e debug true -e class 'com.hcs.android.orconnect.ui.bindings.ButtonBindingsTest' com.hcs.android.orconnect.test/com.hcs.android.orconnect.junit.CustomTestRunner
Connecting to com.hcs.android.orconnect
Waiting for application to start debug server
Waiting for application to come online: com.hcs.android.orconnect | com.hcs.android.orconnect.test
Connecting to com.hcs.android.orconnect
Waiting for application to start debug server
Waiting for application to come online: com.hcs.android.orconnect | com.hcs.android.orconnect.test
Connecting to com.hcs.android.orconnect
Waiting for application to start debug server
Waiting for application to come online: com.hcs.android.orconnect | com.hcs.android.orconnect.test
Connecting to com.hcs.android.orconnect
Waiting for application to start debug server
Waiting for application to come online: com.hcs.android.orconnect | com.hcs.android.orconnect.test
Connecting to com.hcs.android.orconnect
Capturing and displaying logcat messages from application. This behavior can be disabled in the "Logcat output" section of the "Debugger" settings page.
I/droid.orconnec: The ClassLoaderContext is a special shared library.
I/droid.orconnec: The ClassLoaderContext is a special shared library.
I/droid.orconnec: The ClassLoaderContext is a special shared library.
I/droid.orconnec: The ClassLoaderContext is a special shared library.
W/droid.orconnec: Accessing hidden method Landroid/app/Instrumentation;->execStartActivity(Landroid/content/Context;Landroid/os/IBinder;Landroid/os/IBinder;Landroid/app/Activity;Landroid/content/Intent;ILandroid/os/Bundle;)Landroid/app/Instrumentation$ActivityResult; (light greylist, linking)
                  Accessing hidden method Landroid/app/Instrumentation;->execStartActivity(Landroid/content/Context;Landroid/os/IBinder;Landroid/os/IBinder;Ljava/lang/String;Landroid/content/Intent;ILandroid/os/Bundle;)Landroid/app/Instrumentation$ActivityResult; (light greylist, linking)
I/CustomTestRunner: Setting ORConnectApplication to run under test conditions.
I/droid.orconnec: Waiting for a blocking GC ClassLinker
I/droid.orconnec: WaitForGcToComplete blocked ClassLinker on ClassLinker for 31.393ms
W/ORConnectApplication: ORConnect Application has been switched to test mode.
I/AndroidJUnitRunner: Waiting for debugger to connect...
I/System.out: Sending WAIT chunk
I/System.out: Debugger has connected
I/System.out: waiting for debugger to settle...
Connected to the target VM, address: 'localhost:8603', transport: 'socket'
I/chatty: uid=10140(com.hcs.android.orconnect) identical 2 lines
I/System.out: waiting for debugger to settle...
I/System.out: waiting for debugger to settle...
I/System.out: waiting for debugger to settle...
I/System.out: waiting for debugger to settle...
I/System.out: waiting for debugger to settle...
I/System.out: debugger has settled (1461)
I/AndroidJUnitRunner: Debugger connected.
I/MonitoringInstr: Instrumentation started on process com.hcs.android.orconnect
I/MonitoringInstr: Setting context classloader to 'dalvik.system.PathClassLoader[DexPathList[[zip file "/system/framework/android.test.runner.jar", zip file "/system/framework/android.test.mock.jar", zip file "/data/app/com.hcs.android.orconnect.test-xTHoOLbkK9YyF9NvU50DaA==/base.apk", zip file "/data/app/com.hcs.android.orconnect-s1norxADOcz2oKLHpsxJow==/base.apk"],nativeLibraryDirectories=[/data/app/com.hcs.android.orconnect.test-xTHoOLbkK9YyF9NvU50DaA==/lib/arm, /data/app/com.hcs.android.orconnect-s1norxADOcz2oKLHpsxJow==/lib/arm, /data/app/com.hcs.android.orconnect.test-xTHoOLbkK9YyF9NvU50DaA==/base.apk!/lib/armeabi-v7a, /data/app/com.hcs.android.orconnect-s1norxADOcz2oKLHpsxJow==/base.apk!/lib/armeabi-v7a, /system/lib]]]', Original: 'dalvik.system.PathClassLoader[DexPathList[[zip file "/system/framework/android.test.runner.jar", zip file "/system/framework/android.test.mock.jar", zip file "/data/app/com.hcs.android.orconnect.test-xTHoOLbkK9YyF9NvU50DaA==/base.apk", zip file "/data/app/com.hcs.android.orconnect-s1norxADOcz2oKLHpsxJow==/base.apk"],nativeLibraryDirectories=[/data/app/com.hcs.android.orconnect.test-xTHoOLbkK9YyF9NvU50DaA==/lib/arm, /data/app/com.hcs.android.orconnect-s1norxADOcz2oKLHpsxJow==/lib/arm, /data/app/com.hcs.android.orconnect.test-xTHoOLbkK9YyF9NvU50DaA==/base.apk!/lib/armeabi-v7a, /data/app/com.hcs.android.orconnect-s1norxADOcz2oKLHpsxJow==/base.apk!/lib/armeabi-v7a, /system/lib]]]'
I/ORConnectApplication: OR Panel Application is now DEVICE OWNER.
D/LifecycleMonitor: Lifecycle status change: com.hcs.android.orconnect.activities.LauncherActivity@1ff18cf in: PRE_ON_CREATE
I/ORConnectApplication: Created activity com.hcs.android.orconnect.activities.LauncherActivity@1ff18cf
I/DecorView: createDecorCaptionView >> DecorView@c7e72eb[], isFloating: false, isApplication: true, hasWindowDecorCaption: false, hasWindowControllerCallback: true
W/droid.orconnec: Accessing hidden method Landroid/view/View;->computeFitSystemWindows(Landroid/graphics/Rect;Landroid/graphics/Rect;)Z (light greylist, reflection)
W/droid.orconnec: Accessing hidden method Landroid/view/ViewGroup;->makeOptionalFitsSystemWindows()V (light greylist, reflection)
D/LifecycleMonitor: Lifecycle status change: com.hcs.android.orconnect.activities.LauncherActivity@1ff18cf in: CREATED
I/ORConnectApplication: Started activity com.hcs.android.orconnect.activities.LauncherActivity@1ff18cf
I/ORConnectApplication: Checking all permissions
D/LifecycleMonitor: Lifecycle status change: com.hcs.android.orconnect.activities.LauncherActivity@1ff18cf in: STARTED
I/ORConnectApplication: Resumed activity com.hcs.android.orconnect.activities.LauncherActivity@1ff18cf
D/LifecycleMonitor: Lifecycle status change: com.hcs.android.orconnect.activities.LauncherActivity@1ff18cf in: RESUMED
D/OpenGLRenderer: Skia GL Pipeline
D/EmergencyMode: [EmergencyManager] android createPackageContext successful
D/InputTransport: Input channel constructed: fd=72
D/ViewRootImpl@da0f531[LauncherActivity]: setView = DecorView@c7e72eb[LauncherActivity] TM=true MM=false
I/MonitoringInstr: No JSBridge.
D/ViewRootImpl@da0f531[LauncherActivity]: Relayout returned: old=[0,0][1920,1200] new=[0,0][1920,1200] result=0x7 surface={true<PHONE_NUMBER>} changed=true
I/ConfigStore: android::hardware::configstore::V1_0::ISurfaceFlingerConfigs::hasWideColorDisplay retrieved: 0
I/ConfigStore: android::hardware::configstore::V1_0::ISurfaceFlingerConfigs::hasHDRDisplay retrieved: 0
I/OpenGLRenderer: Initialized EGL, version 1.4
D/OpenGLRenderer: Swap behavior 2
D/mali_winsys: EGLint new_window_surface(egl_winsys_display *, void *, EGLSurface, EGLConfig, egl_winsys_surface **, EGLBoolean) returns 0x3000
D/OpenGLRenderer: eglCreateWindowSurface = 0xe2505720, 0xdeb98808
D/ViewRootImpl@da0f531[LauncherActivity]: MSG_RESIZED: frame=[0,0][1920,1200] ci=[0,0][0,72] vi=[0,0][0,72] or=2
D/ViewRootImpl@da0f531[LauncherActivity]: MSG_WINDOW_FOCUS_CHANGED 1 1
D/InputMethodManager: prepareNavigationBarInfo() DecorView@c7e72eb[LauncherActivity]
                      getNavigationBarColor() -855310
D/InputMethodManager: prepareNavigationBarInfo() DecorView@c7e72eb[LauncherActivity]
D/InputMethodManager: getNavigationBarColor() -855310
V/InputMethodManager: Starting input: tba=com.hcs.android.orconnect ic=null mNaviBarColor -855310 mIsGetNaviBarColorSuccess true , NavVisible : false , NavTrans : false
D/InputMethodManager: startInputInner - Id : 0
I/InputMethodManager: startInputInner - mService.startInputOrWindowGainedFocus
D/InputTransport: Input channel constructed: fd=84
D/ViewRootImpl@da0f531[LauncherActivity]: MSG_RESIZED: frame=[0,0][1920,1200] ci=[0,0][0,72] vi=[0,0][0,0] or=2
D/InputMethodManager: prepareNavigationBarInfo() DecorView@c7e72eb[LauncherActivity]
D/InputMethodManager: getNavigationBarColor() -855310
V/InputMethodManager: Starting input: tba=com.hcs.android.orconnect ic=null mNaviBarColor -855310 mIsGetNaviBarColorSuccess true , NavVisible : false , NavTrans : false
D/InputMethodManager: startInputInner - Id : 0
I/MonitoringInstr: Setting context classloader to 'dalvik.system.PathClassLoader[DexPathList[[zip file "/system/framework/android.test.runner.jar", zip file "/system/framework/android.test.mock.jar", zip file "/data/app/com.hcs.android.orconnect.test-xTHoOLbkK9YyF9NvU50DaA==/base.apk", zip file "/data/app/com.hcs.android.orconnect-s1norxADOcz2oKLHpsxJow==/base.apk"],nativeLibraryDirectories=[/data/app/com.hcs.android.orconnect.test-xTHoOLbkK9YyF9NvU50DaA==/lib/arm, /data/app/com.hcs.android.orconnect-s1norxADOcz2oKLHpsxJow==/lib/arm, /data/app/com.hcs.android.orconnect.test-xTHoOLbkK9YyF9NvU50DaA==/base.apk!/lib/armeabi-v7a, /data/app/com.hcs.android.orconnect-s1norxADOcz2oKLHpsxJow==/base.apk!/lib/armeabi-v7a, /system/lib]]]', Original: 'dalvik.system.PathClassLoader[DexPathList[[zip file "/system/framework/android.test.runner.jar", zip file "/system/framework/android.test.mock.jar", zip file "/data/app/com.hcs.android.orconnect.test-xTHoOLbkK9YyF9NvU50DaA==/base.apk", zip file "/data/app/com.hcs.android.orconnect-s1norxADOcz2oKLHpsxJow==/base.apk"],nativeLibraryDirectories=[/data/app/com.hcs.android.orconnect.test-xTHoOLbkK9YyF9NvU50DaA==/lib/arm, /data/app/com.hcs.android.orconnect-s1norxADOcz2oKLHpsxJow==/lib/arm, /data/app/com.hcs.android.orconnect.test-xTHoOLbkK9YyF9NvU50DaA==/base.apk!/lib/armeabi-v7a, /data/app/com.hcs.android.orconnect-s1norxADOcz2oKLHpsxJow==/base.apk!/lib/armeabi-v7a, /system/lib]]]'
I/UsageTrackerFacilitator: Usage tracking enabled
D/TestExecutor: Adding listener android.support.test.internal.runner.listener.LogRunListener
                Adding listener android.support.test.internal.runner.listener.InstrumentationResultPrinter
                Adding listener android.support.test.internal.runner.listener.ActivityFinisherRunListener
I/TestRunner: run started: 3 tests
E/MockMakerMultiplexer: Could not init mockmaker com.android.dx.mockito.inline.InlineStaticMockMaker
W/droid.orconnec: Accessing hidden method Ldalvik/system/VMDebug;->allowHiddenApiReflectionFrom(Ljava/lang/Class;)V (light greylist, reflection)
W/droid.orconnec: Current dex file has more than one class in it. Calling RetransformClasses on this class might fail if no transformations are applied to it!
I/chatty: uid=10140(com.hcs.android.orconnect) ustomTestRunner identical 1 line
W/droid.orconnec: Current dex file has more than one class in it. Calling RetransformClasses on this class might fail if no transformations are applied to it!
W/droid.orconnec: Accessing hidden field Lsun/misc/Unsafe;->theUnsafe:Lsun/misc/Unsafe; (light greylist, reflection)
W/droid.orconnec: Current dex file has more than one class in it. Calling RetransformClasses on this class might fail if no transformations are applied to it!
I/chatty: uid=10140(com.hcs.android.orconnect) ustomTestRunner identical 2 lines
W/droid.orconnec: Current dex file has more than one class in it. Calling RetransformClasses on this class might fail if no transformations are applied to it!
W/droid.orconnec: Current dex file has more than one class in it. Calling RetransformClasses on this class might fail if no transformations are applied to it!
I/chatty: uid=10140(com.hcs.android.orconnect) ustomTestRunner identical 3 lines
W/droid.orconnec: Current dex file has more than one class in it. Calling RetransformClasses on this class might fail if no transformations are applied to it!
W/droid.orconnec: Current dex file has more than one class in it. Calling RetransformClasses on this class might fail if no transformations are applied to it!
I/chatty: uid=10140(com.hcs.android.orconnect) ustomTestRunner identical 5 lines
W/droid.orconnec: Current dex file has more than one class in it. Calling RetransformClasses on this class might fail if no transformations are applied to it!
W/droid.orconnec: Redefining intrinsic method java.lang.Thread java.lang.Thread.currentThread(). This may cause the unexpected use of the original definition of java.lang.Thread java.lang.Thread.currentThread()in methods that have already been compiled.
                  Redefining intrinsic method boolean java.lang.Thread.interrupted(). This may cause the unexpected use of the original definition of boolean java.lang.Thread.interrupted()in methods that have already been compiled.
W/droid.orconnec: Current dex file has more than one class in it. Calling RetransformClasses on this class might fail if no transformations are applied to it!
I/chatty: uid=10140(com.hcs.android.orconnect) ustomTestRunner identical 3 lines
W/droid.orconnec: Current dex file has more than one class in it. Calling RetransformClasses on this class might fail if no transformations are applied to it!
I/TestRunner: started: bindEnablesTest(com.hcs.android.orconnect.ui.bindings.ButtonBindingsTest)

Started running tests
I/MonitoringInstr: Activities that are still in CREATED to STOPPED: 1
I/MonitoringInstr: Finishing activity: com.hcs.android.orconnect.activities.LauncherActivity@1ff18cf
I/MonitoringInstr: Unstopped activity count: 1
I/chatty: uid=10140(com.hcs.android.orconnect) ustomTestRunner identical 19 lines
I/MonitoringInstr: Unstopped activity count: 1
I/MonitoringInstr: Unstopped activity count: 1
I/chatty: uid=10140(com.hcs.android.orconnect) ustomTestRunner identical 1 line
I/MonitoringInstr: Unstopped activity count: 1
I/MonitoringInstr: Unstopped activity count: 1
I/MonitoringInstr: Unstopped activity count: 1
I/chatty: uid=10140(com.hcs.android.orconnect) ustomTestRunner identical 6 lines
I/MonitoringInstr: Unstopped activity count: 1
I/MonitoringInstr: Unstopped activity count: 1
I/chatty: uid=10140(com.hcs.android.orconnect) ustomTestRunner identical 4 lines
I/MonitoringInstr: Unstopped activity count: 1
E/THREAD_STATE:   Thread[Binder:12023_4,5,main]

                  Thread[Signal Catcher,5,system]

                  Thread[FinalizerWatchdogDaemon,5,system]
                    java.lang.Thread.sleep(Native Method)
                    java.lang.Thread.sleep(Thread.java:373)
                    java.lang.Thread.sleep(Thread.java:314)
                    java.lang.Daemons$FinalizerWatchdogDaemon.sleepFor(Daemons.java:342)
                    java.lang.Daemons$FinalizerWatchdogDaemon.waitForFinalization(Daemons.java:364)
                    java.lang.Daemons$FinalizerWatchdogDaemon.runInternal(Daemons.java:281)
                    java.lang.Daemons$Daemon.run(Daemons.java:103)
                    java.lang.Thread.run(Thread.java:764)

                  Thread[Binder:12023_2,5,main]

                  Thread[FinalizerDaemon,5,system]
                    java.lang.Object.wait(Native Method)
                    java.lang.Object.wait(Object.java:422)
                    java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:188)
                    java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:209)
                    java.lang.Daemons$FinalizerDaemon.runInternal(Daemons.java:232)
                    java.lang.Daemons$Daemon.run(Daemons.java:103)
                    java.lang.Thread.run(Thread.java:764)

                  Thread[HeapTaskDaemon,5,system]

                  Thread[Profile Saver,5,system]

                  Thread[queued-work-looper,5,main]
                    android.os.MessageQueue.nativePollOnce(Native Method)
                    android.os.MessageQueue.next(MessageQueue.java:326)
                    android.os.Looper.loop(Looper.java:181)
                    android.os.HandlerThread.run(HandlerThread.java:65)

                  Thread[Jit thread pool worker thread 0,5,main]

                  Thread[Binder:12023_3,5,main]

                  Thread[ReferenceQueueDaemon,5,system]
                    java.lang.Object.wait(Native Method)
                    java.lang.Daemons$ReferenceQueueDaemon.runInternal(Daemons.java:178)
                    java.lang.Daemons$Daemon.run(Daemons.java:103)
                    java.lang.Thread.run(Thread.java:764)

                  Thread[Instr: com.hcs.android.orconnect.junit.CustomTestRunner,5,main]
                    dalvik.system.VMStack.getThreadStackTrace(Native Method)
                    java.lang.Thread.getStackTrace(Thread.java:1538)
                    java.lang.Thread.getAllStackTraces(Thread.java:1588)
                    android.support.test.runner.MonitoringInstrumentation.getThreadState(MonitoringInstrumentation.java:636)
                    android.support.test.runner.MonitoringInstrumentation.dumpThreadStateToOutputs(MonitoringInstrumentation.java:631)
                    android.support.test.runner.MonitoringInstrumentation.waitForActivitiesToComplete(MonitoringInstrumentation.java:384)
                    android.support.test.runner.AndroidJUnitRunner$1.run(AndroidJUnitRunner.java:439)
                    android.support.test.internal.runner.listener.ActivityFinisherRunListener.testStarted(ActivityFinisherRunListener.java:48)
                    org.junit.runner.notification.SynchronizedRunListener.testStarted(SynchronizedRunListener.java:49)
                    org.junit.runner.notification.RunNotifier$3.notifyListener(RunNotifier.java:121)
                    org.junit.runner.notification.RunNotifier$SafeNotifier.run(RunNotifier.java:72)
                    org.junit.runner.notification.RunNotifier.fireTestStarted(RunNotifier.java:118)
                    org.junit.internal.runners.model.EachTestNotifier.fireTestStarted(EachTestNotifier.java:42)
                    org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:323)
                    org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
                    org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
                    org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
                    org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
                    org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
                    org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
                    org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
                    org.junit.runners.ParentRunner.run(ParentRunner.java:363)
                    org.mockito.internal.runners.DefaultInternalRunner$1.run(DefaultInternalRunner.java:79)
                    org.mockito.internal.runners.DefaultInternalRunner.run(DefaultInternalRunner.java:85)
                    org.mockito.internal.runners.StrictRunner.run(StrictRunner.java:39)
                    org.mockito.junit.MockitoJUnitRunner.run(MockitoJUnitRunner.java:163)
                    org.junit.runners.Suite.runChild(Suite.java:128)
                    org.junit.runners.Suite.runChild(Suite.java:27)
                    org.junit.runners.ParentRunner$3.run(ParentRunner.java:
W/MonitoringInstr: Still 1 activities active after waiting 2000 ms.
I/GrantPermissionCallable: Permission: android.permission.ACCESS_COARSE_LOCATION is already granted!
I/GrantPermissionCallable: Permission: android.permission.ACCESS_WIFI_STATE is already granted!
I/GrantPermissionCallable: Permission: android.permission.RECEIVE_BOOT_COMPLETED is already granted!
I/GrantPermissionCallable: Permission: android.permission.INTERNET is already granted!
I/GrantPermissionCallable: Permission: android.permission.RECORD_AUDIO is already granted!
I/GrantPermissionCallable: Permission: android.permission.READ_EXTERNAL_STORAGE is already granted!
I/GrantPermissionCallable: Permission: android.permission.WRITE_EXTERNAL_STORAGE is already granted!
I/GrantPermissionCallable: Permission: android.permission.READ_EXTERNAL_STORAGE is already granted!
I/GrantPermissionCallable: Permission: android.permission.CAMERA is already granted!
I/System.out: ORCService.__setReadyService(...) called!  This should only be called by tests setting a mocked service!
W/droid.orconnec: Current dex file has more than one class in it. Calling RetransformClasses on this class might fail if no transformations are applied to it!
I/ORConnectApplication: Paused activity com.hcs.android.orconnect.activities.LauncherActivity@1ff18cf
D/LifecycleMonitor: Lifecycle status change: com.hcs.android.orconnect.activities.LauncherActivity@1ff18cf in: PAUSED
W/ActivityThread: handleWindowVisibility: no activity for token android.os.BinderProxy@aba1f33
D/ViewRootImpl@da0f531[LauncherActivity]: MSG_WINDOW_FOCUS_CHANGED 0 1
D/InputMethodManager: prepareNavigationBarInfo() DecorView@c7e72eb[LauncherActivity]
                      getNavigationBarColor() -855310
D/LifecycleMonitor: Lifecycle status change: com.hcs.android.orconnect.activities.FragmentTestActivity@c7de3a1 in: PRE_ON_CREATE
I/ORConnectApplication: Created activity com.hcs.android.orconnect.activities.FragmentTestActivity@c7de3a1
I/DecorView: createDecorCaptionView >> DecorView@9868695[], isFloating: false, isApplication: true, hasWindowDecorCaption: false, hasWindowControllerCallback: true
D/LifecycleMonitor: Lifecycle status change: com.hcs.android.orconnect.activities.FragmentTestActivity@c7de3a1 in: CREATED
I/ORConnectApplication: Started activity com.hcs.android.orconnect.activities.FragmentTestActivity@c7de3a1
D/LifecycleMonitor: Lifecycle status change: com.hcs.android.orconnect.activities.FragmentTestActivity@c7de3a1 in: STARTED
I/ORConnectApplication: Resumed activity com.hcs.android.orconnect.activities.FragmentTestActivity@c7de3a1
D/LifecycleMonitor: Lifecycle status change: com.hcs.android.orconnect.activities.FragmentTestActivity@c7de3a1 in: RESUMED
D/InputTransport: Input channel constructed: fd=91
D/ViewRootImpl@c384e[FragmentTestActivity]: setView = DecorView@9868695[FragmentTestActivity] TM=true MM=false
D/ViewRootImpl@c384e[FragmentTestActivity]: Relayout returned: old=[0,0][1920,1200] new=[0,0][1920,1200] result=0x7 surface={true<PHONE_NUMBER>} changed=true
D/mali_winsys: EGLint new_window_surface(egl_winsys_display *, void *, EGLSurface, EGLConfig, egl_winsys_surface **, EGLBoolean) returns 0x3000
D/OpenGLRenderer: eglCreateWindowSurface = 0xe05c7de0, 0xdeb98008
D/ViewRootImpl@c384e[FragmentTestActivity]: MSG_RESIZED: frame=[0,0][1920,1200] ci=[0,36][0,72] vi=[0,0][0,0] or=2
D/ViewRootImpl@c384e[FragmentTestActivity]: MSG_WINDOW_FOCUS_CHANGED 1 1
D/InputMethodManager: prepareNavigationBarInfo() DecorView@9868695[FragmentTestActivity]
                      getNavigationBarColor() -855310
D/InputMethodManager: prepareNavigationBarInfo() DecorView@9868695[FragmentTestActivity]
                      getNavigationBarColor() -855310
V/InputMethodManager: Starting input: tba=com.hcs.android.orconnect ic=null mNaviBarColor -855310 mIsGetNaviBarColorSuccess true , NavVisible : false , NavTrans : false
D/InputMethodManager: startInputInner - Id : 0
I/InputMethodManager: startInputInner - mService.startInputOrWindowGainedFocus
D/InputTransport: Input channel constructed: fd=93
                  Input channel destroyed: fd=84
A/droid.orconnec: instrumentation.cc:267] Check failed: m == frame.method_ (m=0xe932ec58, frame.method_=0x708ab7b4) Expected void java.lang.Thread.sleep(java.lang.Object, long, int), Found void java.lang.Thread.sleep(java.lang.Object, long, int)
W/droid.orconnec: it should skip dumping thread list to prevent deadlock: exclusive owner ->12043

It does run is there are no breakpoints set, but that defeats the point of the debugger.
Please let me know if you need additional information.  Thanks.

Edited the ticket to improve readability.

Maybe related: https://stackoverflow.com/questions/59037486/cannot-debug-android-instrumentedtest-activityscenario-koin-mocck

Hi @smccants! Sorry for the delay here - I've been trying to repro this with your gradle setup, as well as the sample test linked in that SO post, but have not been able to repro the crash. Could you share some sample test code that causes the crash? I think especially important is understanding what you're trying to mock that causes it - I've tried mocking a bunch of final methods from various OS classes, and haven't had any problems with or without the debugger. A sample project would be awesome if you have the time. Thanks!!

@kkoser thanks for looking at this ticket.  I spent about half a day trying to build a simple test case that would fail, but so far no luck.  More interesting, as I pared down the existing test case, it didn't even require anything being mocked to crash.  Also, the crash seems to occur at different places and occasionally not at all.  It does seem to be time sensitive - I removed almost all of what I was testing (switching between activities by click) and the test would pass consistently.  I added a sleep back in and the crash resumed.  Best I can tell so far, it looks like a combination of some memory corruption with a race condition.   I'm still working on a simple test case, but thought I'd update you on what I found so far.

Thanks, that's useful! If it's a memory leak then it makes sense it would be time-related; theres probably some hidden limit that we hit after a certain amount of time depending on what's happening on the device. As for it requiring no mocking, that's really interesting - I'll try and see if anything stands out as dangerous in init code, although this bug may also be in the JVMTI implementation itself if that's the case...


Grid measurement screwing up around waypoints

https://ptb.discord.com/channels/915186263609454632/1193755370607345695/1220928345106022410

Fixed in v0.8.10.


Specified node version doesn't exist: 18.17.1

Description:
The docs say that the action pulls from the releases page here: https://github.com/actions/node-versions/releases. So I'd expect version 18.17.1 to work. But it doesn't seem to: https://github.com/aptos-labs/aptos-indexer-processors/actions/runs/6054694989/job/16432841789.
Error: The specified node version file at: /runner/_work/aptos-indexer-processors/aptos-indexer-processors/.node-version does not exist

I thought it might be the v at the start of the version number but I tested that it works with other repos.
Action version:
v3
Platform:

[x] Ubuntu
[ ] macOS
[ ] Windows

Runner type:

[x] Hosted
[ ] Self-hosted

Tools version:
pnpm 8.6.2
Repro steps:
https://github.com/aptos-labs/aptos-indexer-processors/actions/runs/6054694989/job/16432841789
Expected behavior:
It should successfully installed node 18.17.1
Actual behavior:
It says the version isn't available.

My bad, made a mistake!


Fixing an issue where we aren't paging for critical

cc @mvilanova I had to remove the signalInstance vector code because it was causing the tests to fail. I don't believe you can create vectors based on column properties (or at least it's not straightforward). I think the better option is to join and then to a query search on the definition's vector.


fix .oniceconnectionstatechange

typo, of course in one of the least tested parts of the code

Codecov Report

Merging #59 into master will not change coverage.
The diff coverage is 0%.

@@          Coverage Diff           @@
##           master     #59   +/-   ##
======================================
  Coverage    93.8%   93.8%
======================================
  Files           1       1
  Lines         807     807
======================================
  Hits          757     757
  Misses         50      50

Impacted Files
Coverage Δ

rtcpeerconnection.js
93.8% <0%> (ø)
:arrow_up:

Continue to review full report at Codecov.

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

published as 1.2.4 to fix a regression in 1.2.3


Adjust map style to match with website CSS

As in title. Currently it clashes with the design and is too bright for the eyes:

Maybe something toned down, with not so bright neon colors? Main color of such style could be changed to have light blue/purple tint instead of dull brown.

It is important to keep the website consistent.
We should replace current style, because it is not maintained by any currently active contributor.
For current website design, the above Frank style seems fitting to me.

It seems we need to change style anyway, because current one was deleted.

In #154 , the site style was updated to https://www.mapbox.com/maps/light which matches the current site design, so this issue can be closed.


Support all kinds of private keys

Fixes #6. @marten-seemann do you have a quick way to test this?

Not really, other than running the interop runner locally.


glTF from Adobe Animate

I loaded a glTF from Adobe Animate into LÖVE. It was fine on https://gltf-viewer.donmccurdy.com but hardly seen with LÖVE using Animation sample with Scene_1.glb. What is wrong with the code?
function lovr.load()
  model = lovr.graphics.newModel('Scene_1.glb')
  animator = lovr.graphics.newAnimator(model)
  animation = animator:getAnimationNames()[1]
  assert(animation, 'No animation found!')
  animator:play(animation)
  animator:setLooping(animation, true)
  model:setAnimator(animator)

  shader = lovr.graphics.newShader([[
    vec4 position(mat4 projection, mat4 transform, vec4 vertex) {
      return projection * transform * lovrPoseMatrix * vertex;
    }
  ]], nil)
end

function lovr.update(dt)
   animator:update(dt)
end

function lovr.draw()
  lovr.graphics.setShader(shader)
  model:draw(0, 0, -4, 0.2)
  lovr.graphics.setShader()
end

Scene_1.glb.zip

Hi, there is a bug in v0.12.0 with the glTF node transform that has been fixed in the master branch.  Are you using the .js build?  I could make an updated version and send you a project that's rendering the model correctly.  Let me know!

yes, please send me the updated .js build.  I tried it with emscripten with the master branch but it failed at opengl.c. It was compiled ok with v0.12.0.
Thank you.

with the latest master, the .js build has been successful but newModel fails to load .glb

Please look into it.

Alright, WebGL is finally working again.  Try this project out:
function lovr.load()
  model = lovr.graphics.newModel('Scene_1.glb')
  shader = lovr.graphics.newShader([[
    vec4 position(mat4 projection, mat4 transform, vec4 vertex) {
      return projection * transform * vertex;
    }
  ]], [[
    vec4 color(vec4 graphicsColor, sampler2D image, vec2 uv) {
      vec4 c = texture(image, uv);

      if (c.a < .75) {
        discard;
      }

      return c;
    }
  ]])
end

function lovr.draw()
  lovr.graphics.setShader(shader)
  model:animate(1, lovr.timer.getTime())
  model:draw(-.5, 2, -1, .001)
  lovr.graphics.setShader()
end

The animation API is more simplified now, using Model:animate(animationName|animationIndex, timestamp, alpha).  I also made the shader discard pixels with low alpha to add the "cutout" effect in the glTF material.  Let me know if you have any other issues!

thank you! It is working good.


0.4.0 - a batch of little tweaks and fixes

@DoronCohen I still have some unanswered comments...

@koreno are you still working on something here?

@koreno are you still working on something here?

I have some follow-ups, I'll try to add the little ones at least.
Later I have a big refactor around logging to adapt it to logbook and new-style formatting...

seems like you removed me as a contributor...
you can add me back as<EMAIL_ADDRESS>


reposition columns

What's the Problem?
Can't position columns in Details View
Solution/Idea
I typically have Name then size then date modified columns in that left to right order...im unable to click and drag any column to the position I want...maybe this isnt implemented yet...
Alternatives
unselecting the items in the column contextual menu then reenabling them in the order desired isn't doing as i hoped.
Priorities

Capability
Priority

This proposal will allow developers to accomplish W
Must

This proposal will allow end users to accomplish X
Should

This proposal will allow developers to accomplish Y
Could

This proposal will allow end users to accomplish Z
Won't

Files Version
v1.5
Windows Version
Windows 11 Pro 21H2 22000.194
Additional comment
No response

Thanks for the suggestion! Tracking in #4643


Convert Mask to Polygon

In the AI tools there is an option to convert masks to polygon.
It would be a great tool to convert any mask to polygon.
Also, is there a setting for the density of dots in the polygon for the AI tools convert masks to polygon?
Many thanks!
DBG

Also, is there a setting for the density of dots in the polygon for the AI tools convert masks to polygon?

You can see this settings during drawing polygon with AI tool:

Default value can be changed in Settings -> Workspace:

@bsekachev Thanks!

Implemented on app.cvat.ai.
Menu => Run Action => Shape converters

Great! Thanks!!
Is it going to be implemented in the docker version?


Intermittent crashing

Every once and a while, the UE4 editor crashes when I stop from playing in PIE mode, using Unreal 4.14 Preview 2 and commit 693233d.
This is somewhat rare, but it has happened a few times now.
I suspect the issue is in the audio portion of the plugin as I never encountered these issues before it was added, and the other open issues (issue #3, #4, #5) having to due with the audio functionality may also be related.
For some reason, even though I have debug symbols for both engine and the plugin, there is no stack trace in the UE4 Crash Reporter window.
I guess I'll have to run in the debugger and see if I can catch the crash.

I found and fixed the obvious offender. See if you're still getting any crashes.

I'm going to close this one out, too. If you find any other issues, please let me know. Otherwise I'll post a 4.14 release for NdiMedia - probably end of day tomorrow. Thanks a lot for your help!