Service timeout

Originally discussed on HMRC internal Slack by @adamfenwick in collaboration with @roblav

Feedback from Repayments project DAC report:
Page refresh
WCAG 2.0 References:
Provide users with disabilities enough time to read and use content.
WCAG 2.0 reference 2.2 - Enough time
https://www.w3.org/TR/WCAG20/#time-limits
Pages that are refreshed periodically can cause access problems for people with disabilities. Some with disabilities simply need more time to finish reading a page or completing a form. Refreshing the page before the user has finished using it can be a very frustrating experience; particularly if the session is reset and any interaction with the page, such as a partially completed form is lost.
Although we appreciate that session time-outs are important for security, these must not
prohibit disabled users from using the website.
Result = Fail
A time-out was present that resulted in users being logged out after a certain time of
inactivity. As it may take some users longer than others to complete tasks online, it is
important that a warning is presented to inform of this functionality and where possible the
option to extend this time.
High priority A
Technical Comment: Time-out without warning
URL: https://www-staging.tax.service.gov.uk/repayments/timeout
Issue ID: DAC_TECH_Refresh_Issue1
Screen Shot:

There is a time-out feature present on the service that does not warn users that this is the
case. This can prove disorienting for users; a warning must be provided and where
possible the option to delay the time out.
Issue ID: DAC-USER-SRTB-T1-02

What type of issue did you experience?
Time out function without warning for blind users.

Where was the issue? Please give the URL.
Identified on the ‘happy path’ section (journey 1.)

Screen shot 2 showing time out message:

Describe the issue in detail and where it occurred on the page
While attempting to enter account details, I found that blind Talkback users will be logged
out without warning if no activity has been detected.

How did you work around this issue?
There is currently no work around for this issue.

Solution
For each time limit that is set by the content, at least one of the following is true:
Turn off: The user is allowed to turn off the time limit before encountering it; or
Adjust: The user is allowed to adjust the time limit before encountering it over a wide range
that is at least ten times the length of the default setting; or
Extend: The user is warned before time expires and given at least 20 seconds to extend the time limit with a simple action (for example, "press the space bar"), and the user is allowed to extend the time limit at least ten times;
or
Real-time Exception: The time limit is a required part of a real-time event (for example, an
auction), and no alternative to the time limit is possible;
or
Essential Exception: The time limit is essential and extending it would invalidate the activity;
or
20 Hour Exception: The time limit is longer than 20 hours.

Here's the pattern that was created by Jen Rahman and Billy Adamson.

We followed the guidance of Chris Moore, our very own Accessibility champion, about the implementation using a modal box, implementing our solution using the criteria that follows.
Make sure the modal dialog box is accessible

If you use a modal dialog box then you must make sure it is accessible by doing these things:
set the role attribute to 'dialog' - give the containing element of the dialogue the 'dialog' role. This will inform screen readers they’re dealing with a dialogue
on open, keyboard focus must be assigned to the dialogue (give it tabindex=-1 to allow this)
give the dialog a name using either aria-label (to put the name in an attribute) or aria-labelledby (to link it to the id of an element with its name like a heading) that is recognised by assistive technologies
whilst open, keyboard focus must be constrained within the dialogue
it must be possible to close the dialogue via a close button and/or with the escape key
on close, keyboard focus must be returned to the original point on the page
visually fade the underlying page whilst a modal dialogue is open. This helps users of screen magnifiers understand why they’re unable to interact with the underlying page
prevent scrolling of the underlying page whilst a modal dialog is open. The user should not be able to interact with the original page whilst it's open.
test thoroughly on a range of screen sizes to make sure they work properly

Online references

https://designpatterns.hackpad.com/Modal-dialog-boxes-ZJNqssq4Dll
http://www.nczonline.net/blog/2013/02/12/making-an-accessible-dialog-box/
http://www.w3.org/WAI/GL/wiki/Using_ARIA_role%3Ddialog_to_implement_a_modal_dialog_box

@roblav thanks for the contribution. Some comments we had in slack that are worth exposing in this issue:

IMO what is needed from session timeout:

explain when a user is logged out and why they have been logged out
if possible save data they have submitted in the journey so far
if possible return user to same place in journey before they were logged out when they log back in so any disruption is minimal

Thoughts:

if a user is not using the page then it should timeout (granted)
if a user is not using a page it's highly possible they will not see a modal window telling them they are going to timeout
the user doesn't know or care about the session
the user will be reassured we log out for security reasons after a period of time

To start with I'd ask what is the user need? and how can we address this in a progressive and accessible way?
A good read around modals
https://developer.appway.com/screen/ShowSingleRecipe/selectedRecipeId/1390246496349

Whilst inline alerts described by the linked article are generally preferable to dialogs, the difference between this and the examples cited is that those examples are the result of direct user interaction triggering the dialog and user focus is on the particular part of the screen where the alert will be inlined. Here we are talking about something which is not a result of user interaction and needs to be brought front-and-centre for the user.
For example, in the case of a user employing a screen magnifier, what would the solution be for an inline alert given the user might be quite literally focussed on a different part of the page?
In addition, the examples don’t have any major consequences if the user does not interact with the dialog, whereas in the case of the timeout they can be signed out.
What we don't want is for this dialog pattern to be taken as a reason to introduce more dialogs where inlined alerts would be preferable. So if progressed I think we'd need a set of preferred patterns developing to cover other instances where people might think to employ a dialog (such as those in the linked article).

I think the 20-hour exemption quoted in https://www.w3.org/TR/WCAG20/#time-limits feels a little arbitrary.
We’re currently running with an extended session timeout of 30 mins on our service and will be gathering data about how this additional time assists all users by preventing unwanted session ends.

In response to your the above comments:
IMO what is needed from session timeout:

explain when a user is logged out and why they have been logged out
The content provided in the modal has been supplied by the content/design team, and has been approved by Chris Moore. It explains that it is for the users security that they will be signed out.
if possible save data they have submitted in the journey so far
This isn't an issue as they are still on the page, at the same point in the service.
if possible return user to same place in journey before they were logged out when they log back in so any disruption is minimal
This happens already as required by the criteria given in Make sure the modal dialog box is accessible - on close, keyboard focus must be returned to the original point on the page

In response to your the above comments:

@roblav thanks. My thoughts were about providing these needs without a modal. Then potentially there may be no need for one.
The question for me is what is the original pain point for users and how we can mitigate against those, that was what my thoughts were around.
Also if these things can be solved without JavaScript it makes it all the bit more resilient.

Hi all, I found this this morning and thought it might be helpful - http://blog.barrierbreak.com/2017/02/14/modal-dialogs-and-accessibility-a-tricky-minefield/
It has some useful points on creating accessible modal windows but I must admit that the mailing list I got this from had the sub-heading 'Of course, the simplest solution is to stop using them'.

Hi, I've recently created some new timeout screens for lost creds and 2SV registration.
Lost creds - the user will see this error during a lost credentials flow.  I think the inactivity is set to 7 minutes

2SV - this one is displayed when access code text (or call back) takes too long to arrive

We also use this one in the IV journey, usually appears if the user takes too long to find evidence options.  e.g. they've gone to find a payslip to prove their identity and it takes too long.

this one also got sent round the design team and I thought it was useful to inform my thinking.

link to GOV.UK guidance on content for session timeout

On SCRS we have a modal window that someone else has mentioned and we used this because it has been approved for accessibility and tested well with users when we did some scenario testing. Example below

I think we need to look at the content of all these suggestions. There is a lot of jargon that could be made simpler. Things like timeout, inactivity, session are web jargon.
For a modal, screen readers must announce the title and set focus to the link or button at the same time. Not all content may be read out.
Something like:
For your security, you will be signed out in 1 minute.
Stay signed in

Meeting notes
Attendees

@roblav
@bethnoble
@gavinwye

Notes

The work on the pattern to date has been done by @roblav without support from an interaction designer. We need to find people to support this side of the work.
The pattern will be owned by the pattern library and in time will be supported by the patterns working group.
@edwardhorsford at GDS has been working on a similar pattern. We prefer the design of this compared to our pattern but think we may have done more work to make the pattern accessible.
@chrismoorembe is doing an accessibility review of the two patterns.
We will try to combine the interface design of @edwardhorsford's pattern with the accessibility improvements of @roblav's version.
We need to ensure that the content for the pattern covers all services at HMRC. We will try to make the content as generic as possible adding additional content as necessary for individual services
We don't want to use terms like time out, interactivity and session as @stevenaproctor pointed out in his comment above.
Once we consider the pattern to be usable by a number of services we will review it again and submit the pattern to the HMRC working group for review and inclusion in the HMRC pattern library.
More user research is needed on the pattern. There has only been one round of research to date. However, as we will be iterating the design of the pattern we will need to ensure that the pattern is useful for users.
We will aim to upstream any useful work to the rest of Government.

Actions

[ ] @gavinwye to help out from an interaction design perspective
[ ] @gavinwye to speak to @fred-jackson about supporting from a content design perspective
[ ] @roblav to build the pattern into the design pattern's prototype
[ ] @fred-jackson to review content for the pattern and suggest content variations that meet the needs of HMRC services
[ ] @gavinwye to ensure that the interface and interaction design is consistent with the rest of government.

I’ve taken a look at the proposed GDS time-out modal with JAWS 17 for Windows, and the current versions of VoiceOver screen reader for Mac and iOS.
The first thing that struck me about the modal is that it has been coded to use the  tag. This is great for ensuring it isn’t dependant on JavaScript, but fails to correctly work on those browsers that don’t fully support the dialog tag yet.
The modal worked fine on Chrome, Firefox and the latest version of Safari on the Mac. Focus is moved to the action button to extend the session and there is a keyboard trap so non mouse users can’t stray outside the modal.
When testing with IE11, the modal doesn’t behave completely as expected as there is no keyboard trap, and the button that has default focus is not automatically announced. Also, the modal completely falls over while using Safari on iOS. This is a deal breaker for me, as in the last GOV.UK assistive technology survey, both IE11 and Safari for iOS were the 2 most commonly used browsers with screen readers. Robert’s prototype worked across all browsers and assistive technologies and this was also independently tested by the Digital Accessibility Centre.
I also feel that the content being used inside the modal is more verbose than it needs to be, and that having 3 actions falls short of simplicity.
I also didn’t expect the ‘Cancel’ link to take me back to the GOV.UK home page.
To keep things simple, I think there should be only one action within the modal to extend the time-out. The user should be able to trigger this by the escape key to dismiss the modal, activate the default action button by spacebar, enter, tap or mouse click. If the time out is extended, the user can either save their current information or continue with the application.
If less idle the modal box will close the application and the user will b taken to a page that explains to the user what happened and why, and what they can do next.
The timed out page on offer by GDS also enables the user to go back to the GOV.UK modal, so I feel that including ‘Cancel’ within the modal offers little value. The user also has the option to delete their data, but how this differs to the application being reset may not be clear to users. If the user chooses to leave the page, go back to the GOV.UK home page or close the application, we should automatically delete the data.
The GDS wording for the time-out modal is:
Alert:Your application will time out soon
We will reset your application if you do not respond in 1 minute. We do this to keep your information secure.
Useful additional information: you have not left the current page. If you close this modal, you will be able to continue with your current application.
Continue application (button)
Save application
Cancel application
Comment:
This could be much simpler, less verbose and I don’t think real users will know what a modal is.
Suggestion:
"Alert:Your application will time out soon
We will reset your application if you do not respond in 1 minute. We do this to keep your information secure.
Continue using application (button)"
When the user is finally kicked out for inactivity, they get the following message:
You’ll have to start again
Your application has timed-out
We have reset your application because you did not do anything for 10 minutes. We did this to keep your information secure.
Start application again
If you don’t want to start again, you can Return to GOV.UK</link.

link>Delete data

Comment:
We usually advise that the page title and H1 should mirror each other, but they don’t in this pattern.
Has it been determined that 10 minutes is all we now need to allow before a product or service times out? We are currently giving 15 minutes on HMRC services
The wording above refers to the service as an application. Is this wording being used because the service is enabling the user to apply for something?
Are we able to amend the wording to meet our BTA/PTA needs?
For example:
“
You’ve been signed out
You’ve been signed out
We have signed you out of your account. because you did not do anything for 15 minutes.
We did this to keep your information secure."
I am not sure what timed out wording we are currently using within Robert’s prototypes, but I’ll leave the crafting to Steve and Fred.

On 30 Aug 2017, at 18:34, Gavin Wye<EMAIL_ADDRESS>wrote:
Meeting notes
Attendees
@roblav https://github.com/roblav
@bethnoble https://github.com/bethnoble
@gavinwye https://github.com/gavinwye
Notes
The work on the pattern to date has been done by @roblav https://github.com/roblav without support from an interaction designer. We need to find people to support this side of the work.
The pattern will be owned by the pattern library and in time will be supported by the patterns working group.
@edwardhorsford https://github.com/edwardhorsford at GDS has been working on a similar pattern. We prefer the design of this compared to our pattern but think we may have done more work to make the pattern accessible.
@chrismoorembe https://github.com/chrismoorembe is doing an accessibility review of the two patterns.
We will try to combine the interface design of @edwardhorsford https://github.com/edwardhorsford's pattern with the accessibility improvements of @roblav https://github.com/roblav's version.
We need to ensure that the content for the pattern covers all services at HMRC. We will try to make the content as generic as possible adding additional content as necessary for individual services
We don't want to use terms like time out, interactivity and session as @stevenaproctor https://github.com/stevenaproctor pointed out in his comment above.
Once we consider the pattern to be usable by a number of services we will review it again and submit the pattern to the HMRC working group for review and inclusion in the HMRC pattern library.
More user research is needed on the pattern. There has only been one round of research to date. However, as we will be iterating the design of the pattern we will need to ensure that the pattern is useful for users.
We will aim to upstream any useful work to the rest of Government.
Actions
@gavinwye https://github.com/gavinwye to help out from an interaction design perspective
@gavinwye https://github.com/gavinwye to speak to @fred-jackson https://github.com/fred-jackson about supporting from a content design perspective
@roblav https://github.com/roblav to build the pattern into the design pattern's prototype https://github.com/hmrc/design-patterns
@fred-jackson https://github.com/fred-jackson to review content for the pattern and suggest content variations that meet the needs of HMRC services
@gavinwye https://github.com/gavinwye to ensure that the interface and interaction design is consistent with the rest of government.
—
You are receiving this because you were mentioned.
Reply to this email directly, view it on GitHub https://github.com/hmrc/design-patterns/issues/89#issuecomment-326063739, or mute the thread https://github.com/notifications/unsubscribe-auth/ATkM54gg7e-Z-d7ILiNOE1QAT23XyppFks5sdZ0IgaJpZM4Ly3E0.

@gavinwye
@bethnoble
I worked with @roblav on the content of his alert and me and @rebekah-barry from DWP made suggestions to @edwardhorsford for GDS's.
I totally agree with @chrismoorembe that the content is too long. Do people need that much explanation? Does it add value at that moment in time?
We should avoid 'sorry' because we are not sorry, 'modal', 'timed out' or any kind of web jargon.
There needs to be at least 2 versions: one for a service you are signed in to, and one where you are not. I have taken a look at the content we suggested and refined it a little. Hopefully this will help @fred-jackson.
For a service you are signed in to
Title: For your security, we will be sign you out of this service in 5 minutes. Any information you do not send or save will be deleted.
Green button: Stay signed in
Link (under the button but can navigate to using arrow keys or tab): Sign out
The second sentence in the title is optional. If you have save and return you could say "Your details have been saved."
The link under the green button is optional too. I would put this under the button rather than having it floating to the right of the button. That looks odd to me and means the button is on the left of the box. It would be good to let the button go full width like it does on a transaction page.
For a service you are not signed in to
Title: For your security, we will clear your details in 5 minutes.
Green button: Continue
Link (under the button but can navigate to using arrow keys or tab): Clear my details now
Again, the link under the green button is optional. Again, I would put this under the button rather than having it floating to the right of the button. That looks odd to me and means the button is on the left of the box. It would be good to let the button go full width like it does on a transaction page.
The link should take them to the service's start page. It is not logical to take them to GOV.UK because they may never have been there during their journey.
When you have been signed out
Again, there needs to be 2 versions of this.
If they are signed in to the service:
You have been signed out
You have been signed out
For your security, we signed you out of this service because you did not do anything for 15 minutes. Any information you did not send or save was deleted.
Sign in
Again, the second sentence in the paragraph is optional and could say "Your details have been saved." if the services has save and return.
If they are not signed in to the service:
You will have to start again
You will have to start again
For your security, we cleared your details because you did not do anything for 15 minutes.
If you do not want to start again, you can [explore GOV.UK](https://www.gov.uk).
Start again

Hi @chrismoorembe / @stevenaproctor @gavinwye ,
I worked on our modal design with @hannalaakso. She can hopefully take a look at the HMRC modal and your findings. Ideally we'd get the best of both. Our intention (and the bulk of the work) has been on accessibility.
We've so far taken it through 2 rounds of user research, with 2 more to follow. So far it as worked very well, with some content tweaks in the last round. Understanding of it has been really high - everyone seems to know what 'timed out' means.
Has anyone observed users using browser back when the modal opens? I'm planning adding something to the history when it opens so that if they do use browser back, they stay on the current page (and delete from history when closed).

@chrismoorembe going through your comments in turn:

The first thing that struck me about the modal is that it has been coded to use the  tag. This is great for ensuring it isn’t dependant on JavaScript, but fails to correctly work on those browsers that don’t fully support the dialog tag yet.

It's meant to - must be a bug. This is a similar implementation to the one I shared with you last year that you liked.

When testing with IE11, the modal doesn’t behave completely as expected as there is no keyboard trap, and the button that has default focus is not automatically announced. Also, the modal completely falls over while using Safari on iOS. This is a deal breaker for me, as in the last GOV.UK assistive technology survey, both IE11 and Safari for iOS were the 2 most commonly used browsers with screen readers.

Sounds like a bug for @hannalaakso to look at. We intend to support a wide range of AT.

I also feel that the content being used inside the modal is more verbose than it needs to be, and that having 3 actions falls short of simplicity.

Agreed. I am going to work with our content designer on it. I don't think we need to say so much. We're trying to satisfy our accessibility acceptance criteria that users know when a modal has opened - I think we can do this whilst saying less.

I also didn’t expect the ‘Cancel’ link to take me back to the GOV.UK home page.

I'd consider this placeholder / prototype. There will likely be a secondary link and it will likely go somewhere.

To keep things simple, I think there should be only one action within the modal to extend the time-out. The user should be able to trigger this by the escape key to dismiss the modal, activate the default action button by spacebar, enter, tap or mouse click. If the time out is extended, the user can either save their current information or continue with the application.

The intention is for there to be only one way to extend. Do you see more than one? I'm unsure whether esc should extend it though.

The timed out page on offer by GDS also enables the user to go back to the GOV.UK modal, so I feel that including ‘Cancel’ within the modal offers little value. The user also has the option to delete their data, but how this differs to the application being reset may not be clear to users. If the user chooses to leave the page, go back to the GOV.UK home page or close the application, we should automatically delete the data.

This is a artefact of the prototype. In a real service, once you've timed out, you won't be able to return to where you were.

This could be much simpler, less verbose and I don’t think real users will know what a modal is.

Agreed - will talk with a content designer about this, and making it simpler.

Continue using application (button)

I suspect many services will need / want a secondary action - either to quit the application, or to save and return later. This will be for services to decide.

We usually advise that the page title and H1 should mirror each other, but they don’t in this pattern.

This is a mistake in the prototype.

Has it been determined that 10 minutes is all we now need to allow before a product or service times out? We are currently giving 15 minutes on HMRC services

We're using an artificially short time in user research so the modal shows up more frequently. Ultimately the timeout will be for services to decide. I expect our guidance to be that it shouldn't be less than 15 minutes, ideally 30 minutes or more. We'll likely advise the timeout warning comes up 5 minutes before timeout.

The wording above refers to the service as an application. Is this wording being used because the service is enabling the user to apply for something?

Yes. Aspects of the wording will need to change depending on the type of service - particularly whether it includes any form of 'save and return'.

@stevenaproctor
We're hoping to have two sets of content - but services will obviously have to adapt these to suit their needs. There's actually a third case as well where users have successfully applied for a thing (and are on the completion page), but then time out. In that case, they don't need to start again, because they're done.

The link should be under the green button not floating to the right of the button. That looks odd to me and means the button is on the left of the box and not full width like it is on a transaction page.

I'm unconvinced about this - we do it in several places on GOV.UK. Whats your thinking? FYI buttons are only full width on mobile, not on desktop. If you open this modal on mobile, you'll get a full width button.

Any information you do not send or save will be deleted.

I'm wary of this sentence - I don't think it's clear how you might go about 'sending' something or what the user needs to do. They can't actually send or save anything from this page - so what are they meant to do with this sentence? The real answer is that if they do nothing, any information on the current page will be lost.

@edwardhorsford

We're hoping to have two sets of content - but services will obviously have to adapt these to suit their needs. There's actually a third case as well where users have successfully applied for a thing (and are on the completion page), but then time out. In that case, they don't need to start again, because they're done.

This is a good point. You could drop the optional line or put something in to reassure them that we still have whatever it is. This would need to follow through to the timed out page.

I'm unconvinced about this - we do it in several places on GOV.UK. Whats your thinking? FYI buttons are only full width on mobile, not on desktop. If you open this modal on mobile, you'll get a full width button.

Great that you get a full width button on a mobile.
I think having a button and a link next to one another looks odd because they are so different to one another. Two buttons next to each other looks OK.
Floating the link in the middle of the button may be bad for horizontal scanning in the same way that vertically aligning content to the middle of a cell is bad in a table. It definitely stops me when I see it like this.

I'm wary of this sentence - I don't think it's clear how you might go about 'sending' something or what the user needs to do. They can't actually send or save anything from this page - so what are they meant to do with this sentence? The real answer is that if they do nothing, any information on the current page will be lost.

I agree this could be better but it is optional. All of the services I have worked on have a ‘confirm and send’ button at the end. The GDS content style guide says 'send' is better than 'file' or 'submit'. This is what I mean by 'sending'.
It is not just information on the current page you may lose. You could be 20 screens into a 21 screen journey and lose everything if you are timed out. It depends on the service.
A tax credits version because we do not have save and return would be something like ‘Any changes you do not confirm and send will be deleted.’

Thanks for the comments everyone.
I think the next steps are to get the HMRC version of this built into the pattern library prototype taking account of all the feedback above and we can then discuss once we have something to look at.

Hi @gavinwye
Thanks for taking a look at the modal prototype. We are actively developing and testing it, it’s not yet entered our alpha phase so we are cataloguing and prioritising bug fixes.
We've got a card in the backlog for the IE11 issue where the focus gets lost when you tab "past" the modal.
I'm reviewing the iOS VoiceOver bug. I did testing on VoiceOver before but the timer countdown was a late addition and I kept tweaking it for AT so I suspect that could be the reason.
The component takes advantage of the native dialog element and polyfills with Google's Modal Dialog polyfill for browsers that don't support the dialog element. We’ve so far found the combination to be robust in cross browser/device and AT testing.
I wrote some accessibility acceptance criteria for the component:
https://gist.github.com/hannalaakso/2641fc16d2158e60d551cd9da960b5da
I sent this to the X-Gov Accessibility mailing list for review and it was reviewed by our Accessibility team here too.
The modal currently fails number 7 since no browser supports this.
HMRC modal:
We did some testing on the link you provided for the modal. A couple of bugs were discovered:
On NVDA + Firefox 53.0.3 + Windows 10, the contents of the modal do not get read out so there is no AT notification that a timeout is about to happen.
On iOS + Safari and Jaws 18.0 + IE11, the count down only gets read out only once “For your security, you’ll be signed out in 1 minute” before time out. The user would miss hearing this first announcement if they return to the application after the modal is triggered.
We’re getting around the above by announcing the changed countdown time once a minute until the count is down to the last minute which is when we announce every 20 seconds and then every 10 seconds for the last 30 seconds. These timings are still due to be reviewed but that's the general idea.
Really happy to share work and thinking.

Something to be aware of if using js to count down, is that browsers will 'sleep' tabs which are not in focus (eg not the active tab in a window), which will throw out this timing.
On our modal I did a timestamp comparison when the page regained focus to check if the user would have been timed out already and act appropriately.

Thanks @adamliptrot-oc good advice. I think we're going to have to do more work on how we calculate the times - really the decision of when / whether to timeout is something for the server. The timeout should ultimately be communicating with the server to know when to display / delay.

I've created a PR for the HRMC version which looks like this,

User Research
The pattern was tested in July 2017 with 5 users. Two of them have special needs: one is dyslexic, and the other was 70 at the time of testing.
The 5 users understood the message and managed to used it – all of them stayed signed in.
Browser & device testing
This pattern has been browser and device tested based on the following the GDS guidelines
https://www.gov.uk/service-manual/technology/designing-for-different-browsers-and-devices
Accessibility testing
The modal works fine with ZoomText. The modal to be fully accessible and both visually and audibly accurate.
Configuration options:
To make the session timeout modal as useful as possible there are default settings with the options to pass in custom values. Here is an overview of those configuration options.
<script type="text/javascript">     $.timeoutDialog( { timeout: @appConfig.defaultTimeoutSeconds, countdown: 60, title: 'You’re about to be signed out', message: "@Messages("taxcalc.timeout.message")", keep_alive_url: '/tax-you-paid/keep-alive', logout_url: '/tax-you-paid/timeout' });     var dialogOpen;   </script>

Key
Value
Description

timeout:
@appConfig.defaultTimeoutSeconds
The default timeout setting on the platform is 15 minutes.

countdown:
60
This sets the countdown timer in seconds. This value minus the timeout value will determine when the session timeout modal appears i.e. 15 mins - 60 seconds = 14 minutes.

title
You’re about to be signed out
Adds a heading to the modal, if required, by default this is not displayed.

message:
"@Messages("taxcalc.timeout.message")"
Message to display in the modal.

keep_alive_url:
'/tax-you-paid/keep-alive'
This endpoint needs to be set up in the service to return a 200 OK when the user selects the link to extend their time.

logout_url:
'/tax-you-paid/timeout'
If the user doesn’t select the link to extend their session they get automatically directed to this URI

A thought. The configuration of the time out is good for a per service basis as not all services will have the same requirements for this.

I still think the content is too passive.
title: We are about to sign you out.
message: For your security, we will sign you out of this service in 2 minutes.
Also, is the title and the message read out automatically by a screen reader? Or do you have to go through the dialog the way you would go through a screen?

@gavinwye Do we need a separate pattern for the timed out page we send someone to?

@stevenaproctor I think there are two things here:

the component
the pattern that explains the whole thing end to end.

I'm starting to put this into the design system

I understand why 'We signed you out' (I think it's now For your security we signed you out'.) However I've been struggling with We saved your stuff and We did not save your stuff. It sounds intentional or worse as though we made a choice. The signing out is our choice as we decided this timing to keep information secure. The saving or not saving is just what happens after that, so it should revert to the less personal Your answers have not/have been saved.
Similarly I think it's OK to say For your security we cleared your details (but never OK to say 'Explore GOV.UK - it's not a mysterious mansion).

@lizhitchcock The saving or not saving is kind of our choice. It depends if the service does it or not. I think changing from active to passive would be odd.
I totally agree about the 'Explore GOV.UK' link. I have always thought it odd when it appears on sign out pages and error pages.

This is on the GOV.UK Design System backlog. There are 3 relevant issues.

Timeout warning
Timeout page
Modal dialogue

On the GOV.UK Design System backlog.

Upstreamed to the GOV.UK issues backlog https://github.com/alphagov/govuk-design-system-backlog/issues/175

@jennifer-hodgson  I'm just wondering where this got to? We are looking at service time out screens for our services and there seems to be a few different ways other services are doing this.

On the timeout design pattern page, it has the heading "When the user is not signed in" but underneath is an example for "You’re about to be signed out". Seems like the timeout dialog example has gone for when the user is not signed in
https://design.tax.service.gov.uk/hmrc-design-patterns/service-timeout/

Hi @sophie-still yes, that example isn't correct. Thanks for letting us know, I'll look into it.

Could we do a bit of tidying on this pattern's modal examples.

BUTTON WIDTH
According to researched discussed in https://github.com/alphagov/govuk-design-system-backlog/issues/34#issuecomment-736516135 there is a risk for buttons to be confused for a banner or text-box of some sort.
When a button takes a full-width of the page it visually detaches from its reading context which is left-aligned.
BUTTON TEXT LINE HEIGHT
For best readability, when a button's text breaks into multiple lines the line-height should be similar to a paragraph style.
BUTTON TEXT ALIGNMENT
When the button uses more that a single line another issue emerges -- should the button text be aligned to the centre or the left? GOV.Uk doesn't specify for this situation. In the GOV.UK button pattern the button is aligned to the left of the page and the button width adjusts to its content allowing a 10px padding either side. This can be interpreted as centre and/or left alignment.
Pretty close but I feel left-alignment has a slight advantage on screen-magnification use. (See below illustrated both ways)
ELEMENT ALIGNMENT
Can we amend the HMRC pattern examples to so that the button and link align to each other and the layout.
Pattern edited would look like this:

I've raised a couple issues on this today:
Heading not read out by screen readers (possibly intentional, but seems an odd choice?)
Focus on modal is un-styled
Feature requests:
Feature request: support passing in html for timeout dialog
Feature request: improve timeout dialog example


permission issue with es_data on elk vm

needs to be chmodded to 777 or chown to 1000:root

I would assume this was fixed by https://github.com/enowars/EnoELK/commit/f833e192af03f9641bfd1e890b1776aa8b2c72ae ? But the dates of this issue and the commit do not line up.
Any idea what this was and if we need to look into it again @Trolldemorted ?

I think ES just became less picky in the last releases


When Sphinx 3.1.0 is out, we can remove our workaround

https://github.com/sphinx-doc/sphinx/issues/7559#event-3293750050 has been solved in 3.1.0. It's causing https://github.com/peopledoc/procrastinate/blob/e2ec16c708e27d0482a381fb9a916be4a317ef21/procrastinate/utils.py#L66-L71.
When it's out, we can (optionally pin Sphinx to >= 3.1.0 and) remove the workaround.

3.1.0 is out !
https://github.com/sphinx-doc/sphinx/releases/tag/v3.1.0


Community

Sorry for the non-technical issue.
I see the app has a great potential though it is a kind of middleware. So I suggest there's a need in a place for community to gather: an IRC, a forum or Google group to discuss what to do with it and how...
Please?

FYI I created the discussion room @ gitter: https://gitter.im/AndroidLua/AndroLua


Functional testing with codeception

Hi and thank you for this library.
I'm setting up tests for my project, but I can't seem to find a straight forward way to disable the Captcha validation when running the tests suite.
Yii2 captcha's have a special mode for tests, which I can't seem to find here. Am I missing something?

It appears that this was proposed in https://github.com/himiklab/yii2-recaptcha-widget/pull/80 but the PR was closed.


Scals.js 1.0.0-M1

Requires https://github.com/lihaoyi/utest/pull/120

@lihaoyi Updated to utest 0.5.3. You can also close #163.

Thanks, will push out artifacts for 1.0.0-M1

scalatags_sjs1.0.0-M1_{2.10,2.11,2.12}-0.6.7.jar are on their way to maven central


VFX not being replaced properly in the editor.

This really is a reoccurring issue and every time, it appears and go randomly, still, it's very bothering, i don't know what's up with it...
Anyways, i load a vfx ( any vfx ), i load a vfx being replaced ( any armor ) and vfxedit will simply not display the vfx on it, no matter what, i'm forced to use the "Spawn" button to make it appear on me but this doesn't help since when i export, the mod is not displaying anything once enabled in penumbra basically.
I check the option "vfx" when i export and still, the resulting mod does nothing, either exported as penumbra, or textool, the result is the same.
I will never understand where this issue come from, sometimes there is no problem as i said...
I've uninstalled and re-installed vfxedit to no avail.
If i can do anything to help resolve this weird issue, or if there is any available ressources already out there to resolve it, let me know.
As a fair warning though, i have no clue how to make a log of anything right now.

Ok so for anyone out there that wonder and are new to this like me :
The exported mod was LIKELY to be functional, the issue was with the fact that somehow, i needed to add the actual item to penumbra advanced editing, ( advanced editing on the mod -> meta manip -> Variant edits (IMC) ) and there make sure the VFX ID AND Sound ID were set to 1 ( Sound because the VFX had a sound effect attached to it )


Use MaxResults/pagination for list_secrets in AWS Secrets Manager - or switch to describe_secret instead

In services/aws.py:list_secret_names() there is no MaxResults nor any pagination code - so in any account with a lot of secrets, it may not return the secret being used - which will then cause create_or_update_secret() to fail creating a new secret instead of updating the existing one.
Alternatively, could refactor the code to call describe_secret instead of list_secrets as this would reduce the IAM policy requirements and also fix pagination issues at the same time.
Thanks, this tool is really helpful :)

@KiraLT - Thanks for the update - but... the v0.4.0 build zip file seems to be a bit broken. After upgrading I get this error in AWS Lambda.
{
  "errorMessage": "Failed to resolve requirements from PEX environment @ /var/task.\nNeeded cp39-cp39-manylinux_2_26_x86_64 compatible dependencies for:\n 1: cryptography>=2.5.0\n    Required by:\n      acme 2.1.0\n      certbot 2.1.0\n    But this pex had no ProjectName(raw='cryptography', normalized='cryptography') distributions.\n 2: cryptography>=1.5\n    Required by:\n      josepy 1.13.0\n    But this pex had no ProjectName(raw='cryptography', normalized='cryptography') distributions.\n 3: cryptography<39,>=38.0.0\n    Required by:\n      pyOpenSSL 22.1.0\n    But this pex had no ProjectName(raw='cryptography', normalized='cryptography') distributions.\n 4: cryptography>=2\n    Required by:\n      dns-lexicon 3.11.7\n    But this pex had no ProjectName(raw='cryptography', normalized='cryptography') distributions.",
  "errorType": "ResolveError",
  "requestId": "",
  "stackTrace": [
    "  File \"/var/lang/lib/python3.9/importlib/__init__.py\", line 127, in import_module\n    return _bootstrap._gcd_import(name[level:], package, level)\n",
    "  File \"<frozen importlib._bootstrap>\", line 1030, in _gcd_import\n",
    "  File \"<frozen importlib._bootstrap>\", line 1007, in _find_and_load\n",
    "  File \"<frozen importlib._bootstrap>\", line 986, in _find_and_load_unlocked\n",
    "  File \"<frozen importlib._bootstrap>\", line 680, in _load_unlocked\n",
    "  File \"<frozen importlib._bootstrap_external>\", line 850, in exec_module\n",
    "  File \"<frozen importlib._bootstrap>\", line 228, in _call_with_frames_removed\n",
    "  File \"/var/task/main.py\", line 34, in <module>\n    bootstrap_pex_env(__entry_point__)\n",
    "  File \"/var/task/.bootstrap/pex/pex_bootstrapper.py\", line 684, in bootstrap_pex_env\n    PEXEnvironment.mount(entry_point, pex_info).activate()\n",
    "  File \"/var/task/.bootstrap/pex/environment.py\", line 321, in activate\n    self._activated_dists = self._activate()\n",
    "  File \"/var/task/.bootstrap/pex/environment.py\", line 671, in _activate\n    resolved = self.resolve()\n",
    "  File \"/var/task/.bootstrap/pex/environment.py\", line 502, in resolve\n    for fingerprinted_distribution in self.resolve_dists(all_reqs)\n",
    "  File \"/var/task/.bootstrap/pex/environment.py\", line 589, in resolve_dists\n    raise ResolveError(\n"
  ]
}

FYI I am also getting this Failed to resolve PEX error with the .40 zip. I downgraded to the .30 zip and still get the problem? Hopefully this is helpful.
Thanks for the work, this saved me a bunch of time :)


'pod lib lint' with AFNetworking ~> 2.5 dependency

I am using AFNetworking as a dependency in my .podspec. When i want to verify my podspec for pushing trunk up to cocoapods i am getting this error:
: fatal error: 'AFHTTPSessionManager.h' file not found

Pods project available at /var/folders/lm/7pcgczhs01gbyz89p7p63r3c0000gn/T/CocoaPods/Lint/Pods/Pods.xcodeproj for inspection.

When i open Pods.xcodeproj for inspection there is only AFNetworking.h in Pods/AFNetworking/ folder.
Do you have any ideas what could happened?

Try deleting your pods directory and attempting to fetch all of your dependencies again.


Unable to install wapiti

I just tried to install wapitii (I appear to need it for the hazm package), but get an error:
$ pip install wapiti
Collecting wapiti
Using cached https://files.pythonhosted.org/packages/94/e4/428658a281edc240281759a3b09b9ada60e56325a12c9492f13b97ecc394/wapiti-0.1.tar.gz
ERROR: Command errored out with exit status 1:
command: 'c:\python37-32\python.exe' -c 'import sys, setuptools, tokenize; sys.argv[0] = '"'"'C:\cygwin64\tmp\pip-install-s0d_11cn\wapiti\setup.py'"'"'; file='"'"'C:\cygwin64\tmp\pip-install-s0d_11cn\wapiti\setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(file);code=f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, file, '"'"'exec'"'"'))' egg_info --egg-base pip-egg-info
cwd: C:\cygwin64\tmp\pip-install-s0d_11cn\wapiti
Complete output (5 lines):
Traceback (most recent call last):
File "", line 1, in
File "C:\cygwin64\tmp\pip-install-s0d_11cn\wapiti\setup.py", line 28, in
raise NotImplementedError("wapiti Python 3 support en route to your location")
NotImplementedError: wapiti Python 3 support en route to your location
----------------------------------------
ERROR: Command errored out with exit status 1: python setup.py egg_info Check the logs for full command output.
WARNING: You are using pip version 19.2.1, however version 19.2.2 is available.
You should consider upgrading via the 'python -m pip install --upgrade pip' command.
Can you advise?
Thank you,
Manny

Oh! Yes, wapiti hasn't seen a Python 3 update yet. It doesn't support Python 3. You might be able to get things working under Python 2. What's hazm?
I hadn't considered doing a wapiti python3 port, but it actually might be pretty interesting, I'll put it on the list!

Thank you very much for the quick response! My bad, I see the Python 2.6/2.7 notice now.
hazm (https://github.com/sobhe/hazm) is a package for processing Persian text that I am trying to integrate into another platform. That's also supposed to run under 2.7, hopefully it will solve my problem.

Is this message still accurate? I see installation docs here which tell that I should have python 3.9 and above. I install python3.11 virtualenv and... get this error. What version should I install?

Sorry, question closed. Didn't see 3 in installation guide wapiti3 pip package.


Multi-select in advanced search

Can you fill in exactly how you want these to work?

Implement multi-select fields on Advanced Search page:

Author (already done)
Defendant
Trial Issues
Trial
Language
Source

These should all be implemented as the Author picklist is currently: with multiple items selectable by the user, with items vertically listed and allowing the user de-select individual items from the currently selected list by clicking on the "x" to the left of the item name.

@pdeschner ok this is live on the site.  Can you check it over for me please? I did a few successful searches that seem to work, but on some items like Trial I'm not finding any documents that span two of them easily and hoping you just know of some.


Fitness goes to infinity

Output shows best fitness from population
Generation: 91
1.80598556E15
Generation: 92
1.80598556E15
Generation: 93
1.2207653E22
Generation: 94
Infinity

Fixed


Blur shader new customization options

Describe your PR, what does it fix/add?
This PR adds new and changes existing customization options for decoration.blur.
The new blur settings are:
    # Clamp the brightness after the blurring
    # Allows for a more precise intuitive control than `brightness`
    min_brightness = 0.0
    max_brightness = 1.0

    # The new color boosting
    boost_colors = true
    saturation_boost = 0.1
    brightness_boost = 0.0

    base_brightness = 1 # Like previous brightness

Other changes:

Replaced brightness with base_brightness
contrast and base_brightness now get applied only before the blur.

Is there anything you want to mention? (unchecked code, possible bugs, found problems, breaking compatibility, etc.)
The clamping part ( softClamp ) in Textures.hpp is currently not optimized.
It should be possible to rewrite it without if statement, but right now it is nice and readable.
I dont know if removing the ifs would increase performance.
Is it ready for merging, or does it need work?
I could not find where the default config gets generated and add the new setting there.
This still needs to get implemented.
Yes. It could be more optimized, but for now its better than before and the code is clean.

Based on received feedback I will adjust the blur parameters more to get more pleasant results, especially on higher saturation_boost levels

I'd rather not replace brightness with base_brightness.

Hmmm weird...
Saturated it should technically look like this:
(Ignore outside the borders...)

Also weird photo to pick out 💀

I havnt picked that photo, thats your wallpaper xDD
It looks like less saturated but bright colors should receive more of a saturation boost.
The reason why its not just saturating everything equally is that perceptually dark colors like deep red or blue would then become way to strong relative to other colors in the image.
In your image the normal saturation method works, because it is solely composed of warm colors. However, if you increase the saturation the reddish pinks will probably start to look kinda ugly.
So yes, I will play around with the function which determines which colors get a boost and keep brightness as brightness.

Here you can already see how the red starts to clip in an ugly way.

I havnt picked that photo, thats your wallpaper xDD
It looks like less saturated but bright colors should receive more of a saturation boost.
The reason why its not just saturating everything equally is that perceptually dark colors like deep red or blue would then become way to strong relative to other colors in the image.
In your image the normal saturation method works, because it is solely composed of warm colors. However, if you increase the saturation the reddish pinks will probably start to look kinda ugly.
So yes, I will play around with the function which determines which colors get a boost and keep brightness as brightness.

It's not mine, it's Vaxry's 😆

@TangerineGameDev didnt realize that your comment wasnt Vaxry, sorry ^^

So yes, I will play around with the function which determines which colors get a boost and keep brightness as brightness.

Honestly I think as something called "saturation boost" it should clip, no?
I feel like the user expects, exactly that behaviour I just showed...
If you could somehow keep the values in an HDR color space and then normalize them, I guess maybe a better result could come up? (I don't know if you've already done that...)
Maybe normalize according to an exponential scale?
Colors that are off the charts, receive a way smaller boost in color, than colors that don't get affected as much by the saturation? (But honestly this might just make a big red everything blob, in hindsight...)

Decreasing the contrast could work.
HSV and HSL are different. HSL is good, but much more expensive.
HSV is okayish :D
Maybe I should try out HSL, it should work much better.

Well I was only changing the saturation component here... So I think it shouldn't matter, no?
But yeah no, I was using HSL originally...

Check out the HSV color picker image I posted. When you increase the saturation you move the X to the right, which creates orange.
And the maxed out orange actually has maximum brightness in HSV. In HSL maximum brightness is white. So HSL is a lot nicer for color this stuff.
So here I used HSL. Much better. But more expensive.

@vaxerski What do you think?

This GLSL shader does conversion with no if's if that's why you're mentioning performance issues:
https://gist.github.com/983/e170a24ae8eba2cd174f

I think I used this one before, but it turned a lot of color gray.
But Ill try out, thank you :)

This shader does conversions between HSL and RGB without any if's for performance.
https://www.shadertoy.com/view/4dKcWK

I think I used this one before, but it turned a lot of color gray. But Ill try out, thank you :)

Sorry posted the wrong one, now it's correct...

This one does turn weak colors into gray, already tried it :/

How about this site?
I use it quite often... But you have to do the pseudo-code to code yourself...
https://www.easyrgb.com/en/math.php
Theirs has way less branches...
Though it seems like branches are required, for it to look good...

I will try it out tomorrow and thank you for sharing :)

I've tried personally to optimize it... (rgb2hsl, I didn't do the other one...)
vec3 rgb2hsl_v2( in vec3 c ) {
    float h = 0.0;
    float s = 0.0;
    float l = 0.0;

    float r = clamp(c.r, 0.0, 1.0);
    float g = clamp(c.g, 0.0, 1.0);
    float b = clamp(c.b, 0.0, 1.0);

    float cMin = min( r, min( g, b ) );
    float cMax = max( r, max( g, b ) );

    l = ( cMax + cMin ) / 2.0;

    if ( cMax > cMin ) {
	float cDelta = cMax - cMin;

        //s = l < .05 ? cDelta / ( cMax + cMin ) : cDelta / ( 2.0 - ( cMax + cMin ) ); //Original
        //s = l < .0 ? cDelta / ( cMax + cMin ) : cDelta / ( 2.0 - ( cMax + cMin ) );
        // l can't be under 0.0...
	s = cDelta / ( 2.0 - ( cMax + cMin ) );

        float rg = float(r == cMax) * (g - b) / cDelta;
        float gb = float(g == cMax) * (2.0 + (b - r) / cDelta);
        float br = float(b == cMax) * (4.0 + (r - g) / cDelta);

        h = rg + gb + br;

	h += step(h, 0.0) * 6.0;
	h = h / 6.0;
    }

	return vec3( h, s, l );
}

I've kept the first huge if, because it probably is more performant to exit out early of all those calculations, instead of always calculating them.
Also quick question, is float(bool == bool) considered branching? No, right?
Anyways, the color conversion still works like the original function.
Test it out! https://www.shadertoy.com/view/msVfzG
hsl2rgb_v2() is the new version, hsl2rgb() is the old one...

Awesome, thank you, Ill update test it and update the PR later :)

Awesome, thank you, Ill update test it and update the PR later :)
And your float(bool == bool) does not seem like branching as its just a multiplication.
Im not very knowledgeable with shaders yet though :D

I've also heard multiple times that certain functions like ’step’ actually get compiled to branches (don't know if that's true) and that branches nowadays aren't as costly as they originally were...

Sadly this version also turns weak colors into fully desaturated grey :/

I now understand! I am actually seeing it! The hair should be blue huh...
Well I fixed it. Seems like the s value has to have a range...
Check the ShaderToy shader now out if you wanna test it!

Sadly this version also turns weak colors into fully desaturated grey :/

I now understand! I am actually seeing it! The hair should be blue huh...
Well I fixed it. Seems like the s value has to have a range...
Check the ShaderToy shader now out if you wanna test it!

@TangerineGameDev Thank you for sharing!
Vax found a conversion function her https://stackoverflow.com/a/17309861 where the author even takes a look at the generated assembly code to verify that its not branching and it produces good colors, so thats basically perfect -- but still thank you :)

@TangerineGameDev Thank you for sharing! Vax found a conversion function her https://stackoverflow.com/a/17309861 where the author even takes a look at the generated assembly code to verify that its not branching and it produces good colors, so thats basically perfect -- but still thank you :)

Are we sure ternaries aren't just another way of branching? I am fine with our current solution (as I said, branching isn't really bad nowadays), but afaik we are still branching this way...

I will remove those two settings again.
I think putting brightness now in blurfinish would make sense

I am not sure about what would be the best approach.
If brightness gets applied after the blurring with a value above 1, it can quickly lead to clipping.
If it gets applied before the blurring with a negative value, it will negatively affect the color boosts.

I am not sure about what would be the best approach.
If brightness gets applied after the blurring with a value above 1, it can quickly lead to clipping.
If it gets applied before the blurring with a negative value, it will negatively affect the color boosts.
Also the current implementation of brightness will not affect pure black as it is a multiplication and black is 0.

Should it not be additive?
Also if the value is above 1 then clipping is of course expected (We are multiplying after all...)

The current implementation of brightness only adjust the white point as its multiplying the RGB values.
So black which has a value of 0,0,0 always stays black.
Brightness 1.0

Brightness 2.0

Brightness 0.5

However, what would work is to change the behavior of brightness if its >1.0 or <1.0.
If its bigger than 1.0 it could instead affect the black point, like this:

I am not sure how to implement that though :D But for sure there is a way. Probably just the mix function.
This would probably look nicer, but I dislike how negative values affect the color_boost as it wont boost dark that much.
Thats why I originally added max_brightness, which smoothly clamps the brightness, so you dont have to have such a high opacity on translucent surfaces to maintain readability on very bright surfaces (like a light-theme website and your app runner is displayed on top of it), as mixing a solid color with the blur makes the blur look more dull.
What are your thoughts? :) @TangerineGameDev

Furthermore the current implementation of contrast, which is a simple S-curve, quickly start to clip values, which doesnt look very nice as you end up with a lot of pure black and white.

I am not sure how to do it better though, in a way which protects colors better.
Again, your thoughts? :D

The current implementation of brightness only adjust the white point as its multiplying the RGB values. So black which has a value of 0,0,0 always stays black.
Brightness 1.0

Brightness 2.0

Brightness 0.5

However, what would work is to change the behavior of brightness if its >1.0 or <1.0. If its bigger than 1.0 it could instead affect the black point, like this:
I am not sure how to implement that though :D But for sure there is a way. Probably just the mix function.
This would probably look nicer, but I dislike how negative values affect the color_boost as it wont boost dark that much. Thats why I originally added max_brightness, which smoothly clamps the brightness, so you dont have to have such a high opacity on translucent surfaces to maintain readability on very bright surfaces (like a light-theme website and your app runner is displayed on top of it), as mixing a solid color with the blur makes the blur look more dull.
What are your thoughts? :) @TangerineGameDev

For the brightness the solution is quite easy actually. Use a power of N!
(A quick example)
https://www.shadertoy.com/view/ddKfz3
If the pow value is set to 0.3 for example, the values are stretched to never clip, but decrease the brightness overall. Same goes for values above 1.0. (See if case. Guarantees no clipping is happening)

Furthermore the current implementation of contrast, which is a simple S-curve, quickly start to clip values, which doesnt look very nice as you end up with a lot of pure black and white.
I am not sure how to do it better though, in a way which protects colors better. Again, your thoughts? :D

So about the contrast... I really don't know how we could approach this problem with it clipping...
Thing is I don't understand how you want to get it to work without clipping?
Contrast literally kind of is designed to "clip" (Contrast either increases or decreases the mid-ranges influence causing others to "disappear").
We could try out different smoothing functions to "reduce" the clipping, but it kind of has to happen...

@TangerineGameDev Thank you for the improved brightness! :)
How would this code look for rgba though? Idk how to write it in a nice way without 3 if statements

Yes the contrast is a tricky one.
Iirc DavinciResolve does it by decreasing the amount of contrast applied to a color if it would clip. Similar to your brightness function.

@TangerineGameDev Thank you for the improved brightness! :)
How would this code look for rgba though? Idk how to write it in a nice way without 3 if statements

Wdym if statements? The main piece of code is on the 2nd line. The if statement there is only to visualize that there is no clipping going on...

Yes the contrast is a tricky one.
Iirc DavinciResolve does it by decreasing the amount of contrast applied to a color if it would clip. Similar to your brightness function.

So maybe a logarithmic approach?
I'm currently outside when I get home, I'll try something similar out...

@Visual-Dawg Yea no I don't think there is a way to do what you want...
Thing is you want to spread the colors across the whole range (0, 1), but that's exactly what contrast shouldn't do...
This is paradoxical man...
I did find a function that is REALLY good for mapping contrast though!
Values between 0.0 and 1.0 cause low contrast while higher values cause high contrasty colors!
(PS: This is a function, that doesn't "clip" because it doesn't outright clamp values (so it is reversible), but the values do get VERY small, so it seems like they're clipping to the naked eye...
(If the contrast value is high, the differences are like 0.00001 so yea...)
https://www.shadertoy.com/view/msyfzt

@TangerineGameDev This looks really promising. Thank you!
I will try it out (might become Monday)
Ah, I have not understood the if statement there. I see, nice

@TangerineGameDev the new contrast looks really good!
I dont get how to implement brightness with pow though, so that 1 is normal, +1 is brighter and <1 is darker
    pixColor.r =  pow(pixColor.r, brightness);
    pixColor.g =  pow(pixColor.g, brightness);
    pixColor.b =  pow(pixColor.b, brightness);

@TangerineGameDev the new contrast looks really good!
I dont get how to implement brightness with pow though, so that 1 is normal, +1 is brighter and <1 is darker

    pixColor.r =  pow(pixColor.r, brightness);

    pixColor.g =  pow(pixColor.g, brightness);

    pixColor.b =  pow(pixColor.b, brightness);

    pixColor.r =  1.0 - pow(pixColor.r, brightness);

    pixColor.g =  1.0 - pow(pixColor.g, brightness);

    pixColor.b =  1.0 - pow(pixColor.b, brightness);

I think I tried that already and it inverted the colors. But gimme a sec

I think I tried that already and it inverted the colors. But gimme a sec
Edit: Yes, the colors get inverted like that

Wait, doesn't the original work the way that you described then?

True, I think brightness is fine as it is

I think I tried that already and it inverted the colors. But gimme a sec
Edit: Yes, the colors get inverted like that

    pixColor.r =  pow(pixColor.r, 1.0 / brightness);

    pixColor.g =  pow(pixColor.g, 1.0 / brightness);

    pixColor.b =  pow(pixColor.b, 1.0 / brightness);

I updated the contrast based on @TangerineGameDev formular (which looks really nice) and adjusted the brightness.
Now increasing the brightness happens before the blur, but decreasing happens after the blur.
The clipping from increasing it gets blurred, and the color boost still gets good image data for boosting colors.

I removed all config options except saturation_boost, which by default is 0.0 and wont do anything.
If increased, the blurred colors will get stronger.
brightness_boost has been removed as it does not make much sense with the new hsl mode.
I consider this to be ready form merging now.

@TangerineGameDev Sorry, I phrased it badly :D
All the previous options like contrast and brightness are still there, I just removed brightness_boost and boost_colors.
brightness_boost did not do much with hsl, as it quickly just turns white.
boost_colors is then not nessecary anymore, as you can also set saturation_boost to something other than 0 to enable it :)

finally this doesn't look like shit.

Actually not bad :)

skimming over the shader code - definitely needs some cleanup though, indentation errors, no spacing in some places in formulas.

another comment is could we make the threshold configurable? on some darker wallpapers like this one sat_boost even on 3 doesnt do shit.

we could make this default on now, as it doesn't mess up anything from my testing, adds a nice small touch.
I'd propose a default for saturation_boost to 0.1696 which is sqrt(2pi) / (2(e^2))

Thank you!
I might not get around it today but this are going to be my next steps:

Add the new default value for saturation_boost.
Run the shader code through Clang.
Figure out a good way to create a saturation_threshold as a float (and come up with a good name for it, as it is more of a lightness_threshold.

I added the requested changes. The new boost_threshold takes in a float between 0 and 1.
1 is the default value. The lower the more the boost starts to effect darker areas.

boost_threshold: 0.3
saturation_boost: 0.3

No boost

@TangerineGameDev Im not sure if I understand. saturation_boost 0.0 means no boosting. Everthing higher will increase the colors.
And for the threshold, the default is 1. If you lower the threshold, you start effecting darker tones too.
Have I understood you correctly? :D

@TangerineGameDev Im not sure if I understand. saturation_boost 0.0 means no boosting. Everthing higher will increase the colors.
And for the threshold, the default is 1. If you lower the threshold, you start effecting darker tones too.
Have I understood you correctly? :D

Oh I think I got it now...
So the boost_threshold affects the darker colors while saturation_boost is just in general?
The way I understood you was that 1.0 is the default and a value of 0.3 boosts the color values...

@TangerineGameDev Yes, kinda. By default dark colors will be left untouched from the saturation boost. However the threshold for those can now be adjusted boost_threshold 0.0 will allow saturation_boost to affect nearly all colors.
So if saturation_boost is 0, boost_threshold wont do anything, as it only adjust the behavior of the former.
I think the variable name for boost_threshold might not be very good though.
Do you have an idea for a better one? :D

Maybe darkness_chroma_factor?
Or just darkness_chroma

I renamed to vibrancy and vibrancy_darkness.
"Vibrancy" is nice and short and commonly used for similar color operations.
vibrancy_darkness now does not affect anything when set to 0 and "officially" goes up to 1.
In that way the user does not need to invert the logic for setting the threshold (decreasing the value to increase the effect on darker areas).
Also it has the added side-effect that inserting anything higher than 1 increases the strength even more (it doesnt look very good though - but might be desirable for some setups)

Haha, good to hear xDD
From my side I am happy with the current state. The api is nice and the defaults look good.


Map all of the Button box controls to joystick as well

just in case button box fails....

up fast - 7
down fast - 9
up slow - 8
down - slow - 10
arms out - 11
arms in - 12


Stretched logo issue resolution

Notion card
https://www.notion.so/saeloun/The-company-logo-is-stretched-on-the-client-invoice-view-eeb844bef95a4808a739962631e8c03b?pvs=4
what

Added resolution of stretched logo by adding width and height

why

The issue was accuring on client side due to not fixed image size

screenshots-

apoo

@apoorv1316 can you please review this PR?

@onkar-saeloun Please update the branch and assign this PR to me. I will approve it and merge then.


chore: correctly typed document

Description

TypeScript safe way of using document
Additional context

Prevent future type errors

What is the purpose of this pull request?

[ ] Bug fix
[ ] New Feature
[ ] Documentation update
[x] Other

Before submitting the PR, please make sure you do the following

[x] Read the Contributing Guidelines.
[x] Read the Pull Request Guidelines and follow the Commit Convention.
[x] Check that there isn't already a PR that solves the problem the same way to avoid creating a duplicate.
[x] Provide a description in this PR that addresses what the PR is solving, or reference the issue that it solves (e.g. fixes #123).
[ ] Ideally, include relevant tests that fail without this PR but pass with it.

I don't know if this is a good idea. IIUC, there are going to be a lot more variables here made available and that could lead to errors because they end up being used in the other functions that are not intended to be used in the browser. If we do this, I think we should move the function to another file where you can safely bring the reference to the dom builtins.

I don't know if this is a good idea. IIUC, there are going to be a lot more variables here made available and that could lead to errors because they end up being used in the other functions that are not intended to be used in the browser. If we do this, I think we should move the function to another file where you can safely bring the reference to the dom builtins.

Oh, that is interesting 🤔
I thought it just import the typedefs to this file and I didn't know that it bleeds out. Or did I misunderstood something else?
I could lookup if it's possible to just import the types from lib.dom.d.ts in another way so the don't get exported.

It only imports them to this file, but there are other functions here that are intended to run in node and not in the browser.

@patak-js Okay nevermind, I will gave up for now. Seems it's not possible to partially import interfaces like Document from lib.dom :shrug:
Either all or nothing :slightly_frowning_face:
So we need to live with that this part is not type-safe and not secured by TypeScript


[Feature Request] Disable Storing Intermediate outputs

Is your feature request related to a problem? Please describe.
In the current implementation of Promptflow, all intermediate outputs are stored by default. This results in a significant amount of data being written to disk, as reported by heavy users. For instance, a run of 8000 rows results in a 1.23GB data artifact, despite the actual output being only 4MB. Additionally, each input, prompt, etc., are written to a jsonl, which can be redundant.
As a result, users find themselves having to manually clean up their systems regularly to avoid running out of disk space. This is especially problematic for users with limited storage capacity, such as those using a 2TB VM.
Describe the solution you'd like
This feature request proposes the addition of a toggle to turn off storing intermediate outputs, especially for batch runs. This would help manage disk space more efficiently.
Describe alternatives you've considered
An alternative is easy way to grab output files and delete everyting else.  I was recently made aware of CLI tool that will delete and entire run, but this throws out the baby with the bathwater.  That is, I want to grab the output file prior to deleteing the run.
Another alternative is the option to direct the output file to a location other than the directory containing all the run metadata.
Additional context
Add any other context or screenshots about the feature request here.

Hi @geoss , thanks for reporting this. I'd like to clarify a few things with you. Do you want to persist run record for runs without intermediate outputs? For example, do you want to list/show/visualize/etc this kind of run? Many of prompt flow features are relying intermediate data.
If you just want to batch run a flow and get output (probably also get metrics). We might support this by create a run without a run record. Which means this kind of run can not be list/show/visualize/etc.
Here's an example:
SDK
          run: Run = pf.run(
              flow="path/to/flow",
              data="path/to/data",
              disable_intermediate_data=True
          )

          # outputs & metrics are available through the run object.
          # output will be list of lines run outputs
          output: list = run._to_dict()["outputs"]
          # sample: [{'output': 1, 'line_number': 1}, {'output': 2, 'line_number': 2}]
          # metrics will be dict of metrics
          metrics: dict = run._to_dict()["metrics"]
          # sample: {'accuracy': 0.5}

          # get this kind of run will return error
          with pytest.raises(RunNotFoundError):
              pf.runs.get(run.name)

CLI:
pf run create --flow path/to/flow --data path/to/data --disable-intermediate-data

Sample output
{
    "name": "run_name",
    "created_on": "2023-12-26T15:28:10.099618",
    "status": "Completed",
    "display_name": "display_name",
    "description": null,
    "tags": null,
    "properties": {
        "system_metrics": {
            "total_tokens": 0,
            "prompt_tokens": 0,
            "completion_tokens": 0,
            "duration": 5.92971
        }
    },
    "flow_name": "flow_name",
    "data": "path/to/data",
    "output": [
        {'output': 1, 'line_number': 1},
        {'output': 2, 'line_number': 2}
    ],
    "metrics": {
        "accuracy": 0.5
    }
}

Does this meet your needs?

Hi sorry for the slow response.  I missed this and just got a reminder.  Yes, I think "--disable-intermediate-data" would make sense.    For system metrics I think latency is also a useful data point (avg time per row) and success rate (count of failed rows/total rows).  I'm not sure if those stats require the full intermediate output.  They're in the logs now.   Thanks again and sorry for the slow response.

Hi @geoss , I'd like to understand more about your scenario. Since our run's concept is a reproducible, so we stored necessary data(snapshot, inputs, run meta) to persist the run.

If you don't want to persist run info in your machine, does batch run flow tests meet your need?
df = pd.read_json("path/to/data", dtype=object, lines=True)
results = []
for _, row in df.iterrows():
    result = pf.test(flow="path/to/flow", inputs=row.to_dict())
    results.append(result)
print(results)

Or, we have exposed batch engine to execute flow in batch:
from promptflow.batch import BatchEngine

batch_engine = BatchEngine(flow_file="absolute/path/to/flow")
with tempfile.TemporaryDirectory() as temp_dir:
    result = batch_engine.run(
        input_dirs={"data": "absolute/path/to/data"},
        inputs_mapping={"xxx": "${data.xxx}"},
        output_dir=Path(temp_dir),
    )

Does those existing features suit your need?

Yes I think these should meet my needs as long as we don't replicate all of
the input data and output data multiple times.  What's the difference
between the above and doing a batch run via the GUI?  Thanks again.
On Mon, Mar 4, 2024 at 11:34 PM Han Wang @.***> wrote:

Hi @geoss https://github.com/geoss , I'd like to understand more about
your scenario. Since our run's concept is a reproducible, so we stored
necessary data(snapshot, inputs, run meta) to persist the run.
image.png (view on web)
https://github.com/microsoft/promptflow/assets/7776147/f6ab52ed-0769-492b-adb5-8ccc3510d708
If you don't want to persist run info in your machine, does batch run flow
tests meet your need?
df = pd.read_json("path/to/data", dtype=object, lines=True)results = []for _, row in df.iterrows():
result = pf.test(flow="path/to/flow", inputs=row.to_dict())
results.append(result)print(results)
Or, we have exposed batch engine to execute flow in batch:
from promptflow.batch import BatchEngine
batch_engine = BatchEngine(flow_file="absolute/path/to/flow")with tempfile.TemporaryDirectory() as temp_dir:
result = batch_engine.run(
input_dirs={"data": "absolute/path/to/data"},
inputs_mapping={"xxx": "${data.xxx}"},
output_dir=Path(temp_dir),
)
Does those existing features suit your need?
—
Reply to this email directly, view it on GitHub
https://github.com/microsoft/promptflow/issues/1800#issuecomment-1978056441,
or unsubscribe
https://github.com/notifications/unsubscribe-auth/ABFLKV7FNKFV6WXG6GYZQDLYWVRRDAVCNFSM6AAAAABCCQECZKVHI2DSMVQWIX3LMV43OSLTON2WKQ3PNVWWK3TUHMYTSNZYGA2TMNBUGE
.
You are receiving this because you were mentioned.Message ID:
@.***>

By GUI do you mean the VS Code extension? The batch run in VS Code extension/CLI/SDK used BatchEngine as inner implementation. Besides performing a batch run, batch run API is designed to persist the run (and it's inputs/outputs), so that other runs can reference the data from this run.
Compared to the for loop with pf.test API, BatchEngine provides concurrent execution capabilities which will execute each line  in a new process. If performance is not an issue, you can also choose to run multiple pf.test.


Upgrade to GHC 9.2

https://discourse.haskell.org/t/ghc-9-2-1-released/3527

GHC 9.2 is not available through haskell/actions/setup for windows:

Version was specified as '9.2.1'. It is possible that version does not exist for 'ghc' at the source specified.


Open and Close methods

Hi,
Great plugin.
Is it possible to open and close the sidebar with js. Any method available?
Many thanks,

This worked for me:
function openSidePanelIfClosed() {
  var opened = L.DomUtil.hasClass(sidePanel._panel, 'opened');
  var closed = L.DomUtil.hasClass(sidePanel._panel, 'closed');
  if (!opened && closed) {
    L.DomUtil.removeClass(sidePanel._panel, 'closed');
    L.DomUtil.addClass(sidePanel._panel, 'opened');
  } else if (!opened && !closed) {
    L.DomUtil.addClass(sidePanel._panel, 'opened');
  }
}

function closeSidePanelIfOpened() {
  var opened = L.DomUtil.hasClass(sidePanel._panel, 'opened');
  var closed = L.DomUtil.hasClass(sidePanel._panel, 'closed');
  if (opened && !closed) {
    L.DomUtil.removeClass(sidePanel._panel, 'opened');
    L.DomUtil.addClass(sidePanel._panel, 'closed');
  }
}

var sidePanel = L.control.sidepanel(...); // insert your parameters here
sidePanel.addTo(map);
openSidePanelIfClosed(); // open sidePanel
closeSidePanelIfOpened(); // close sidePanel

Please note that I am not associated with developers (contributors) of this plugin in any way.

Adding on, here is a shorter code using jQuery. Note that in my use-case I never close the panel using JS.
const $jQuerysidePanel = $("#mySidepanelLeft");

if ($jQuerysidePanel.hasClass("closed")) {
	$jQuerysidePanel.removeClass("closed")
	$jQuerysidePanel.addClass("opened")
} else {
	$jQuerysidePanel.addClass("opened")
}

Hello, I copied this project and implement this feature in my copy:
https://github.com/cyclingbyte/Leaflet.SidePanel
you can find my package also on npm:
https://www.npmjs.com/package/leaflet.sidepanel


v3.13.1: improve error messages

I hereby agree to the terms of the CLA available at: https://yandex.ru/legal/cla/?lang=en

Pull request type

Please check the type of change your PR introduces:

[ ] Bugfix
[ ] Feature
[ ] Code style update (formatting, renaming)
[x] Refactoring (no functional changes, no api changes)
[ ] Build related changes
[ ] Documentation content changes
[ ] Other (please describe):

What is the current behavior?

Issue Number: N/A
What is the new behavior?

Other information

Codecov Report

Merging #151 (9f6bcc3) into master (710f840) will increase coverage by 0.07%.
The diff coverage is 33.33%.

@@            Coverage Diff             @@
##           master     #151      +/-   ##
==========================================
+ Coverage   25.86%   25.93%   +0.07%
==========================================
  Files          62       60       -2
  Lines       10251    10206      -45
==========================================
- Hits         2651     2647       -4
+ Misses       7433     7393      -40
+ Partials      167      166       -1

Flag
Coverage Δ

1.14.x
25.93% <33.33%> (+0.07%)
:arrow_up:

1.15.x
25.93% <33.33%> (+0.07%)
:arrow_up:

1.16.x
25.93% <33.33%> (+0.07%)
:arrow_up:

1.17.x
25.93% <33.33%> (+0.07%)
:arrow_up:

macOS-latest
?

ubuntu-latest
25.93% <33.33%> (+0.03%)
:arrow_up:

unit
25.93% <33.33%> (+0.07%)
:arrow_up:

windows-latest
?

Flags with carried forward coverage won't be shown. Click here to find out more.

Impacted Files
Coverage Δ

internal/cluster/cluster.go
51.76% <0.00%> (ø)

internal/errors/transport.go
10.10% <ø> (ø)

internal/table/scanner/result.go
36.26% <0.00%> (ø)

internal/table/scanner/scan_raw.go
0.00% <0.00%> (ø)

internal/table/scanner/scanner.go
36.04% <0.00%> (ø)

testutil/driver.go
9.65% <0.00%> (ø)

retry/retry.go
70.37% <33.33%> (ø)

internal/table/retry.go
65.12% <41.17%> (ø)

internal/table/client.go
86.25% <66.66%> (+0.70%)
:arrow_up:

internal/table/transaction.go
76.23% <100.00%> (ø)

... and 3 more

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 710f840...9f6bcc3. Read the comment docs.


Tracking integration for Image Segmentation

Tracking integration of task - Image Segmentation
Note that you're not expected to do all of the following steps. This PR helps track all the steps required to get a new task fully supported in the Hub 🔥

[x] Integration with Inference API. Select at least one of the following:

[x] Added a transformers pipeline https://github.com/huggingface/transformers/pull/13828
[ ] Added to Community Inference API for 3rd party library
[ ] Added to Community Inference API for generic

[x] Added basic UI elements (icon, order specification, etc)
[x] Added a widget https://github.com/huggingface/huggingface_hub/pull/378

Integration guide: https://hf.co/docs/hub/adding-a-task

This is now shipped :fire:


Merge code should compare non-key columns to determine rows to update

Describe the feature
Currently the generated merge code updates every row in the target table if the unique key exists in the source.  It would be preferable to also compare the the non-key columns to see if they have changed before blindly updating the target row.
Example of the current generated code:
merge into [Schema].[Target Table] as DBT_INTERNAL_DEST
        using [Schema].[Target Table]__dbt_tmp as DBT_INTERNAL_SOURCE
        on
            DBT_INTERNAL_SOURCE.PRIMARY_KEY = DBT_INTERNAL_DEST.PRIMARY_KEY

   when matched then update set
        "Attribute_1" = DBT_INTERNAL_SOURCE."Attribute_1"
	   ,"Attribute_2" = DBT_INTERNAL_SOURCE."Attribute_2"
	   ,"PRIMARY_KEY" = DBT_INTERNAL_SOURCE."PRIMARY_KEY"
...

Suggested Code:
merge into [Schema].[Target Table] as DBT_INTERNAL_DEST
        using [Schema].[Target Table]__dbt_tmp as DBT_INTERNAL_SOURCE
        on
            DBT_INTERNAL_SOURCE.PRIMARY_KEY = DBT_INTERNAL_DEST.PRIMARY_KEY
        WHERE (   coalesce(DBT_INTERNAL_DEST.Attribute_1, [Default Value]) <> coalesce(DBT_INTERNAL_DEST.Attribute_1, [Default Value])
	           OR coalesce(DBT_INTERNAL_DEST.Attribute_2, [Default Value]) <> coalesce(DBT_INTERNAL_DEST.Attribute_2, [Default Value])
		      )

   when matched then update set
        "Attribute_1" = DBT_INTERNAL_SOURCE."Attribute_1"
	   ,"Attribute_2" = DBT_INTERNAL_SOURCE."Attribute_2"
	   ,"PRIMARY_KEY" = DBT_INTERNAL_SOURCE."PRIMARY_KEY"
...

Describe alternatives you've considered
If people don't agree this should be the default behavior, I think it should at least be an optional configuration.
Additional context
My use case for this is the following.
I am using a replication tool (Fivetran) to replicate tables from an Oracle database into Snowflake.  Tables are replicated in their entirety to a "staging" schema.  I am then using dbt to create star schema models, using the replicated tables as my source.  My dbt model for a simple dimension table may source from one or more tables, but only selecting a few columns (not every column from the source table(s)). It is very common that rows from the source table would be updated, but not affect the columns I am selecting from.  If I do an incremental materialization, using the Fivetran synced date (_FIVETRAN_SYNCED) to limit the query to only new/updated rows it includes these irrelevant record updates are also included.  This results in unnecessary updates on my target table.
Who will this benefit?
Are you interested in contributing this feature?
I would be happy to contribute myself.  I pulled open the macro code, but couldn't figure out all the pieces I need to make this work.

Hey @naterinke! Thanks for the detailed writeup.
Following the approach you've outlined, I'm not convinced that there's a gain in database performance or human intuition:

The database has to perform a more expensive merge join, comparing values of many more columns, with the potential benefit of updating fewer rows. In columnar databases like Snowflake, I believe the performance cost of additional join keys outweighs the cost of batch-updating rows. (That said, if you've been able to do any benchmarking on this, I'd be very curious to see details!)
Conceptually, the record has been updated, reflected in the timestamp you're using in your {% is_incremental() %} condition. If you're only pulling in a subset of columns, it's likely that some updates will not be relevant to your model, but they're still updates. Writing extra logic to distinguish between relevant and irrelevant updates doesn't feel worth it: it's additional code complexity, with a very low upside—the record stays the same, instead of updating to be... also the same—and a significant downside—what if your logic causes you to miss a relevant update by mistake?

Local override
All that said, if this is the behavior you want in your own project, you can override get_merge_sql by creating a macro by the same name in your own project's macros/ folder. You would want to change the logic from:
https://github.com/fishtown-analytics/dbt/blob/b188a9488a41ddcfd73c9291d425e41760ccd280/core/dbt/include/global_project/macros/materializations/common/merge.sql#L38-L44
To:
    {% if unique_key %}
    when matched AND
    {% for column in dest_columns %}
        DBT_INTERNAL_SOURCE.{{ column }} != DBT_INTERNAL_DEST.{{ column }}
        {{ "OR" if not loop.last }}
    {% endfor %}

    then update set
        {% for column in dest_columns -%}
            {{ adapter.quote(column.name) }} = DBT_INTERNAL_SOURCE.{{ adapter.quote(column.name) }}
            {%- if not loop.last %}, {%- endif %}
        {%- endfor %}
    {% endif %}

I'm going to close this because I don't see us making a code change to dbt, but I'd encourage you to keep commenting here with your thoughts + findings!

Thanks for the help!  I appreciate you providing the code anyways.  That helps me understand it a bit better.  I did make one minor tweak to get it to run (FYI to anyone that wants to do the same).
DBT_INTERNAL_SOURCE.{{ column.name }} != DBT_INTERNAL_DEST.{{ column.name }}
My intention is not to improve performance, but to improve data accuracy.  To expand on my use case, I intend to add additional system columns to my fact and dimension tables that provide some data lineage and processing related information.  I will have a column that indicates the date the record was initially loaded into the table as well as a column that indicates the date it was last changed.  These columns help to facilitate "As-is" "As-was" reporting/analysis.  This is a common requirement in financial analytics projects I have worked on.  I am aware there are other ways to achieve the same functionality. Snowflake time travel, for example, allows for the same functionality, but 90 days isn't always sufficient, plus I prefer a solution that is database agnostic (to the extent possible).
I did do a quick performance comparison between the two code versions.  I plan to do more robust testing when I have the time. I also want to add the coalesce into the comparision as well to measure it's impact.  FYI...

Code   Version
Warehous Size
Duration
Execution Time
Bytes Scanned
Updated Rows
Total Rows
Processing
Remote Disk IO
Synchronization
Initialization

Original
x-small
1.1s
616ms
8.7MB
29.8K
1m
76%
14%
5%
5%

Updated
x-small
1.3s
600ms
48.6MB
29.8K
1m
57%
29%
0%
14%


Document Bottleneck as an alternative

I found request-rate-limiter because its name describes the problem I'm trying to solve. When searching for other packages that do the same thing, I found Bottleneck, a more robust solution. It would be nice for the documentation to mention Bottleneck as an alternative. For example, Bottleneck supports rate limit jobs across multiple Node.js instances, which is a very helpful feature.

Hi @rjruizes thanks for the input. Feel free to create a pull request for this.


Fix 3D materials not updating on texture invalidation

See better implementation: #54489

Fixes #51361
Fixes #53206
Fixes #53089
Should fix #42821
Might fix #50296
Might fix #52505
Might fix #45746
It's possible there are other issues related to/fixed by this.
Might be relevant for #50327.
Supersedes #52528
https://user-images.githubusercontent.com/6376721/139451979-66d26ad5-ca1b-4c4b-b4ae-af25adc0fdc8.mp4

Explanation of the issue here:
https://github.com/godotengine/godot/issues/51361#issuecomment-954350904
This is essentially finishing what #50269 set out to do. Implementation derived from: https://github.com/godotengine/godot/blob/0dc809cd0142fa7b512c46fa00dabbac77f60e54/servers/rendering/renderer_rd/renderer_canvas_render_rd.cpp#L1378-L1382

This is an area of the code I am unfamiliar with, but it looks like reduz wrapped the calls in a check to ensure that material_force_update_texture was only ever called once per frame
https://github.com/godotengine/godot/blob/0dc809cd0142fa7b512c46fa00dabbac77f60e54/servers/rendering/renderer_rd/renderer_canvas_render_rd.cpp#L1376-L1383
I'm wondering if it should be the same for the other calls

Yup, seems those checks were intended design. Updated.
The uniform set should only be invalid once per frame, so maybe this isn't a big deal in the end. The only code run every material use would be RID_Alloc::owns, which doesn't look expensive, but redundant nonetheless.

Somehow didn't consider that there's a lot of code repetition here. If this is the preferred solution, this should be abstracted out  to RendererStorageRD::MaterialData.

Superseded by #54489.


Fix : Login softkeyboard bug

Fixes #766
Changes: SoftKeyBoard is closed explicitly if remains open when log in button is pressed. Changes made in login fragment only.

Your PR still contains stale commits


Analysis of needs metrics

Idea by @StephanKuempel
We already have .. needreport to document the current configuration.
But it would be also good to document various aspects of the current need-data (dict).
Ideas, what shall be documented (only the numbers, no list of needs):

Needs amount
Used need types
Needs per type
Used options
Used options per type (Req --> author, status, Spec --> tags)
Used link types
Amount of needs per link types
Target need type of links per link type (E.g. validates --> Req, Test, block --> Spec)

This analysis can be also done on a needs.json file.
Example:
.. needreport::
   :usage:

closed in #684


Regenerate well known types for to_proto

from #149

created https://github.com/Shopify/protoboeuf/issues/153


Procedures with multiple result tables - Very important for SAP Hana

System information:

Win 10
DBeaver 21.0.0

Connection specification:

SAP Hana

Describe the problem you're observing:
In SAP Hana almost all procedures have multiple output parameters of type table. When I call such like this one
CALL "PUBLIC"."GET_REMOTE_SOURCE_OBJECT_TREE" ('DATALAKE_RTDI','',?,?);

in DBeaver, the first table parameter is shown but the second is not.
While less common in other databases, it can happen there as well!
For reference, Hana Studio shows all.

My guess is, the getMoreResults() JDBC call is not used.
CallableStatement stmt = connection.prepareCall("{CALL GET_REMOTE_SOURCE_OBJECT_TREE" ('DATALAKE_RTDI','',?,?)}");
boolean moreResults = stmt.execute();
while (moreResults) {
    ResultSet rs = stmt.getResultSet();
    // do something
    rs.close();
    moreResults = stmt.getMoreResults();
}
stmt.close();

FYI: works with multiple implicit results, so looks only like an issue with multiple out parameters

for reproduction here a simpler test case:
CREATE OR replace PROCEDURE proc1 (OUT tab1 sys.dummy, OUT tab2 sys.dummy) AS BEGIN
    tab1 = SELECT 'A' AS dummy FROM dummy;
    tab2 = SELECT 'B' AS dummy FROM dummy;
END;

CALL proc1(?,?)

cannot reproduce it against 21.0.4 EA

I also couldn't reproduce it any more. looks like it somehow has been fixed

Summary: "How can I output scalar output variables for Hana?" Please execute the following command on our test server:
CALL "PUBLIC"."GET_REMOTE_SOURCE_OBJECT_TREE" ('FILESOURCE','',?,?);
Detail:
Interesting. I just tried with call proc1(?,?) as well and it worked as well, even I have not upgraded the DBeaver installation.
The variant with implicit result sets worked as well, I have created a proc2 procedure in our Hana test server in addition.
Still, the CALL "PUBLIC"."GET_REMOTE_SOURCE_OBJECT_TREE" ('DATALAKE_RTDI','',?,?); does not. So there must be another difference between our test cases.
To make it easier for you, I have installed SDI on our test server and just executed as dbeaver_normal user the command.
CALL "PUBLIC"."GET_REMOTE_SOURCE_OBJECT_TREE" ('FILESOURCE','',?,?);

Result is a single table.

In Hana Studio it shows to tabs:

When I look at the procedure definition:
CREATE PROCEDURE GET_REMOTE_SOURCE_OBJECT_TREE
(IN REMOTE_SOURCE_NAME NVARCHAR(256),
IN UNIQUE_NAME NVARCHAR(5000),
OUT IS_STATEFUL TINYINT,
OUT IS_PARTIAL TINYINT) AS BUILTIN

So as you see, the second tab is showing the scalar values, it is not a second out table as such!
Hence the issue text is wrong and should rather be "How can I output scalar output variables for Hana?"

CALL proc2(?,?);

scalar results are shown at proc2 but not at proc1

Fixed:

As a bonus, fixed for DB2 (same problem):

verified


Change misspelled tag: 'foot_way'->'footway'

This PR fixes the absence of highway=footway ways in the output due to the misspelled foot_way tag.

Thanks a lot for spotting that error!


Allow OmniAuth OpenID provider taking :login_entrypoint as an option.

This change will allow developer to specify the login entrypoint other than using the default OpenID login form, as what is shown below.
  provider :open_id, :login_on => ->(env){
    if request.get?
      response = Rack::Response.new
      response.redirect YOUR_LOGIN_PAGE
      response.finish
    end
  }

:+1: Pass

Also happy @jaxi :+1:


Getting the message receiver

Simply put, when creating an Expansion, you have the onPlaceholderRequest(Player, Identifier) method. The player obviously is the player who is writing the message. I am wondering if it's possible to get the person looking at the message, so that the format can be modified based on the relationship the players have? This all depends on how messages are sent obviously, and if there are any limitations preventing this. I'm using PlaceholderAPI along with DeluxeChat, and am wanting to have a placeholder for the colour relationship between two factions players (ally faction tags are green, enemy are red). I believe you could do this in the past with %faction_relation_color%, or something similar, however I've not been able to get it working.
A solution to either/both would be much appreciated! :)

Well I should mention first that this version of PlaceholderAPI is exclusive to the SpongeAPI project, while DeluxeChat, and the PlaceholderAPI that it uses, are for Spigot. For relational placeholders in DeluxeChat, install this instead.
As far as relational placeholders in this plugin are concerned, I have actually been working on them for a little while now, and am almost at a point where I can release them. Of course, they will need time to be used as hooks, but I am making them nonetheless. Through the process of making the new API I discovered that I would like to change the API that I currently use but I cannot do that without breaking existing expansions, so I will not be changing that. I should be able to get relational placeholders (the method to use one, by the way, would be onRelationalRequest(Player one, Player two, Optional<String> identifier)) out within the next couple of days.

That's fantastic to hear! Sorry for posting this in the wrong section though. Thank you for your response, this is very useful information. Best of luck with the development <3


Displaying chance of opponent's card draw seems unnecessary

I can definitely see how chances of us drawing a certain card will be useful.
However, I don't think displaying opponent's chance of drawing cards is useful, especially when it would simply be incorrect when bounce spells are involved (As you can see with opponent's Loatheb)
Also, is it possible to make chance display an optional function? My screen is very small and it would be nicer to have a bit more space for Hearthstone.

+1 it takes up too much space on the screen and doesn't help.