[New Feature] Sync Drafts Across Devices

If you haven’t already, check out our contributing guidelines for onboarding and email<EMAIL_ADDRESS>to request to join our Slack channel!

Action Performed:

Navigate to a conversation
Write something in the compose box
Log out of the account.
Log in again with the same account
Navigate to the same conversation

Expected Result:
The previous drafted message should be displayed even if the user logged out and back in
Actual Result:
Drafted message is not saved if the user logs out
Workaround:
Save the drafted message elsewhere if the user is logging out.
Platform:

Where is this issue occurring?

Web
iOS
Android
Desktop App
Mobile Web

Version Number: 1.1.2-0
Reproducible in staging?: yes
Reproducible in production?: yes
Logs: https://stackoverflow.com/c/expensify/questions/4856
Notes/Photos/Videos: Any additional supporting documentation
Expensify/Expensify Issue URL:
Issue reported by: @roryabraham
Slack conversation: https://expensify.slack.com/archives/C01GTK53T8Q/p1632412938049600
View all open jobs on GitHub

Triggered auto assignment to @muttmuure (AutoAssignerTriage), see https://stackoverflow.com/c/expensify/questions/4749 for more details.

Triggered auto assignment to @pecanoro (Engineering), see https://stackoverflow.com/c/expensify/questions/4319 for more details.

@roryabraham Hmm, I am not sure how drafted messages work, but if we want to save the message even after logging out, this should be internal, right? Since we would have to save the draft in the account somewhere, or maybe I am missing something.

Yep @pecanoro I think this should be internal 👍

Yeah, I think a rNVP could totally work! Another thing we could do is just create a draftReportActions table. I haven't spent much time considering the potential pros/cons of each option. What do you think?
Reflecting on this, I think this change is maybe bigger than I acknowledged initially and should probably go through WN/design doc process.

A new table seems a bit overkill, I think a rNVP would be great. But I agree with you, we may need to open up the discussion on Slack so we can weigh our options in case a small doc is needed. I will try to do so later in the day.

I have some other higher priorities right now.

Ok, I am going to bring this up for discussion on Slack this week since it's not that straightforward and we may need some opinions.

Not a priority right now

Still not a priority right now

Ok, I think I will have to return this to the pool since I have way too many things that are more important to take care, I can revisit this once my plate looks better.

I was still able to reproduce this.

I don't know if this is actually a good improvement tbh. If you log out and had a draft I don't think the expectation is that it should still be there IMO.
If you close your browser an open it sure, but if you log out it makes sense to delete the draft IMO

I think there's pretty widespread demand for this. It's also not just when you log out, but syncing drafts across devices too. i.e: I start typing up a long draft on my mobile during lunch, then I come back and can finish it up and send it out

Just got reported again today: https://expensify.slack.com/archives/C01GTK53T8Q/p1666216353599709

Alright, then I think this part can be external, we just need to not clear the draft key in onyx when we log out. Don't know if we have a process for that already, might warrant a pre-design or something to make sure we generalize it not just for this key, but any key we want to persist post logout

we just need to not clear the draft key in onyx when we log out

I wouldn't be in support of this design, it feels like a hack. Instead, we should:

Persist draft messages in the database via a new API endpoint like CreateDraftComment
Propagate draft messages to all clients logged in to a user account
Then send drafts to the front-end in OpenApp and ReconnectApp so that they appear even if you log out, clear Onyx, and log back in

The only concern I would have is how this would work offline. i.e: if you're offline and come back online then we only want current drafts to send, not all the intermediate drafts you had when you were offline.

Given that, I don't think this can or should be an external issue

Okay I removed the labels, changed the title, and made this a weekly. I do think syncing drafts between devices is part of WAQ. What do you think @JmillsExpensify ?

Hey y'all, thoughts about rolling this refactoring issue into this one? It's kind of an implementation detail, but a pretty important one (and a simplification, imo).

Sorry for the delay. I think it makes sense to merge the issues (with this one being the one that stays open). Once we save drafts server side it will be unnecessary to save locally. The exception would be if a user is offline we need to save the draft locally right?
Only semi-related, bump @JmillsExpensify do you think this is part of WAQ?

Sorry! Just getting to this. We recently removed polish from WAQ, so I don't think it strictly fits there. That said, given that this is external, and also involves a refactor, I think we should continue forward with it.

given that this is external

Sorry for the confusion, but this is not an external issue. Going to unassign @sobitneupane and @johncschuster.

I think there are two challenges we'll face with this issue that we may not have encountered before.

How do we prevent quick actions from being overwritten by server responses?
How do we queue a "debounced" action offline?

For example, let's assume we had a simple solution to sync drafts across devices and sessions, using Onyx and Pusher, that looked something like this:

I start typing a draft message
Once I stop typing for X milliseconds, we:

save the draft to disk
make an API request like SaveDraftComment to sync it across devices/sessions

The API then adds the draft comment to some NVP in the back-end, and sends out a Pusher event to all the user's devices with the new draft comment.

So given that setup, I think we would run into (at least) two problems:
Quick actions race condition
I start typing, and then stop briefly. We send an API request to update the draft comment, then I quickly start typing again (for example, imagine that I just pressed CMD + A then delete to quickly delete my draft). Then, the API request completes and I receive a Pusher event from the completed request with the draft comment from before. If we aren't careful, that draft comment will populate the text box I just deleted.
Queuing "debounced" actions offline
In another scenario, imagine that I'm completely offline. While offline, I start typing a long draft message. If we were online, we would send a SaveDraftComment API request to sync the draft in the server, let's say after 100ms of inactivity. Let's then image that while I am drafting this message offline, I pause typing for more than 100ms 100 discrete times (I think this is totally a reasonable number, even for a reasonable-length comment like this one).
So if we follow the normal pattern of calling API.write, then we would queue 100 SaveDraftComment requests to happen later in the sequential network queue. When I come back online, the sequential queue would process those requests one-by-one. Estimating that each request takes 500ms on average (which is less than the average for AddComment from some cursory testing on staging), then we'd have to wait 50,000ms or 50 seconds for all those requests to complete. 🐌

Given those constraints, here's what I would recommend for a draft implementation plan:
High level

Only update draft messages in the server if the client created them after the draft messages that are already in the server. In effect, this means that only the newest draft messages (according to when they were written on the client) would be saved in the server.
Upgrade Onyx to be smart enough to prefer client updates over server updates in certain scenarios when client updates are time-sensitive and happen much faster and w/ greater frequency than server updates.

Don't queue draft messages to be saved offline – instead just save them when you come back online in OpenApp and ReconnectApp

Onyx
To make this work, we need a way to recognize when Onyx updates coming from Pusher are less up-to-date than what we already have locally. There's probably a few ways to do this, but here's one that makes sense to me...
Update Onyx such that it always internally keeps track of a writeLog, both in the in-memory cache and on disk. This would use a special reserved Onyx key, and it would store a JSON key-value mapping where ONYXKEYS are keys and the values are timestamps (with at least millisecond precision):
"reserved_writeLog": {
    "ACCOUNT": "2022-11-01 12:00:00.000",
    "report_<reportID>": "2022-11-01 12:30:00.123"
}

This JSON value represents the last time any key was updated, and whenever data is updated in the cache or on disk via any of the Onyx "setters" (set, multiSet, merge, mergeCollection, clear), then we would also update the writeLog.
Then we create a new Onyx mutator called softMerge. It would be similar to merge, but instead of taking only a key and value, it will take a key, value, and a timestamp. It will behave exactly like merge, except that it will only update the key with the new value if the timestamp is greater than the previous timestamp recorded in the writeLog. We would also update Onyx.update to support this new "setter"/mutator.
Auth
Create a new Auth command called SaveDraftComments. It would take one parameter called draftComments, which would be an array of JSON objects with the following shape:
{
    reportID: Number,     // The ID of the report to save the draft for
    draftComment: String, // The text for the draft comment
    created: String,      // The datetime string representing the moment in time when the draft comment was written in the client
}

Then for each JSON value in that array, it would save the draft comment in a new user NVP called private_draftComments, with the following shape:
{
    [reportID]: "draft message",
    1234: "Draft message for report w/ ID 1234",
	5678: "Draft message for report w/ ID 5678",
}

However, in peek, the Auth command would determine the subset of reportID/user combos included in the draftComments parameter for which:
- The NVP already has a value, _AND_
- The `created` field for the NVP is greater than the `created` parameter provided by the client.

If this subset encompasses all the reportID/user combos provided in the draftComments parameter, it would return early with a 409 jsonCode. Otherwise, in process it would update the draft message only for the reportID/user combos where the created parameter from draftComments is greater than the current value of the NVP created column for that reportID/user combo.
API
Next we'd create a new API command called SaveDraftComment. It would take three parameters:

reportID: The ID of the report to save the draft for
draftComment: The text for the draft comment
created: The datetime string representing the moment in time when the draft comment was written in the client

It would pack those up into a single JSON object, wrap the object in a JSON array, and then call the SaveDraftComments Auth command. If Auth returns early in peek (i.e: doesn't save the draft comment and provides a 409 jsonCode), then the API would just return 200 and do nothing else. This is a totally reasonable and expected case.
If Auth updates the NVP and responds to PHP with a 200 jsonCode, then the PHP layer would take the new value of the draft comment and send it out to all clients via a Pusher-driven Onyx update. As suggested in this issue, draft comments would not be saved as a separate Onyx key but as a field in the report stored in Onyx. We would need to store not only the draft comment, but also the client-generated created field. Critically, this server-side Onyx update would use the new softMerge Onyx mutator described above.
Next, we'd need to update OpenApp and ReconnectApp to accept draft comments written while offline (instead of queueing many calls to the SaveDraftComment endpoint while offline, we'll just update drafts when via Open/ReconnectApp when we come back online). To do this, these API endpoints will need to accept a draftComments parameter just like the one accepted by the SaveDraftComments Auth command. It would pass this parameter directly to the Auth command, and then post-process the Auth command via Pusher updates, just as was done for the SaveDraftComment endpoint.
App
Once the back-end and Onyx pieces are ready, then this app would:

Create a new function in src/libs/actions/Report.js called saveDraftComment that would:

Save the draft comment, along with a locally-generated created datetime string, in the report in Onyx via a call to Onyx.merge
ONLY IF ONLINE, call the SaveDraftComment API endpoint with the value of the draft comment and a client-generated timestamp (in datetime string format, not a unix timestamp, for consistency with the other layers)

Then, call ReportActions.saveDraftComment in the composer whenever the value of the composer changes (debounced to happen 400ms after a user stops typing).
In OpenApp and ReconnectApp, generate a JSON array of all draftComments from all reports locally stored in Onyx, including their stored created fields. Then pass this JSON to the OpenApp and ReconnectApp API endpoints accordingly.

While I think this is a good step towards a feasible implementation plan, writing this up has made me think that we really need a mini design doc for this feature, or at the bare minimum some consensus on this plan from other Expensify engineers.

How do we queue a "debounced" action offline?

This is an interesting question and I have a crazy idea, what if we just didn't. What if instead, part of coming back online is that we send all drafts to the server?

What if instead, part of coming back online is that we send all drafts to the server?

Yep, agreed, that's the design I proposed in the comment above ^. Send all draft comments in OpenApp and ReconnectApp

Chatted with @marcaaron, and he suggested that maybe a simpler solution that the fancy Onyx writeLog table I mentioned above would be to implement this solution to avoid sending the pusher event back to the client that triggered it. I whole-heartedly agree that this is a much simpler solution

What do ya'll think about summarizing this discussion in open source and getting feedback on the above path?

Still not really a priority. With the focus on bugs, I think we should also de-prioritize this for now. I switched out weekly for monthly.

Still on hold for WAQ.

No longer on hold for WAQ but it's tough to call this a priority.

This issue came up in conversation over in this thread. Not sure if it really pushes the priority needle on this or not, but if we implement this it will bring some small benefit to the Prefetch Chat Messages solution.

Following on my last comment, at the moment we seem to have little work for engineering. If this is tied to something important like prefetch chat messages, then I'm more inclined to want to prioritize it.

Chatted with @stitesExpensify 1:1, I'm going to grab this issue from him.

@roryabraham Is this feature implementation currently in your queue? I still think it's helpful and a cool feature, though I also wanted update my comment from a couple of weeks ago and say that we've also got plenty of pretty high value stuff up for grabs in the roadmap too. Ultimately up to you!

I'm not super passionate about this one right now and we can always re-open when someone is passionate and has time to take it on. Please anyone re-open if you want to pick this up.

Still happy to take this one on.

This would be great.  How are you thinking it would be built?  Off the cuff I would think:

After you stop typing we send some kind of StoppedTypingInComposer 1:1:1 API command
It would upload the latest draft as a rNVP
It would also push it out to your personal channel via Pusher
This would populate the draft everywhere else

The question is: how do we reliably clear it on other devices?  How do we handle offline drafts?  There could be some weird edge cases like:

Alice has two devices, A and B
Alice starts typing "Hello" on A, the draft is sync'd over to B
Alice goes offline on A
Alice adds more to the message on A, while offline (eg, "Hello world!")
Alice goes to B and notices that the draft is still there, and starts typing more (eg, "Hello world, I love you so much!")
A comes back on line
A's draft blows away B's draft

Or various cases like that.

yep. I'd love to crack this out before we dive back into report pagination in earnest, because it will simplify that. Not a hard requirement but I'm optimistic about completing this quickly

Still in the monthly queue

Was there a PR in progress for this? @luacmartins I see you marked it as Reviewing

No idea why I did that, must have edited without noticing 😅

Going to close this out. We can re-open when someone wants to pick it up.


Move Miri extern functions to a Miri utils crate

These things: https://github.com/rust-lang/miri/tree/73452b3213b906a7d2a08f176d38730bcc363f6f#miri-extern-functions
Quoting @saethlin in https://github.com/rust-lang/miri/issues/2757#issuecomment-1385665138:

We should really figure out some kind of Miri utils crate if we're going to keep incentivizing library authors to do stuff like this. As-written, this is ugly to use and also the mechanism that this hooks into makes me uncomfortable because it's so permissive.

Another option would be for miri to provide this utils crate in the sysroot such that #[cfg(miri)] extern crate miri_utils; works and always pulls in the right utils crate version for the current miri version.


FIX: update relationship and table references

update class relationships and table references that prevent existing and new Features getting edited on the CMS and displayed on the site.

Thanks, @wilr


Fix handling of delegators in global-state-update-gen

It is now possible to specify the delegators for new validators, and to leave delegators of old validators untouched.
The PR also fixes a couple of bugs, most notably that validators weren't being added in updates with only_listed_validators = false.
Closes #3213

bors merge

bors merge


Text correction: Instructions

Whole text in Instructions will change a bit. Waiting for final text from customer...

How to use this app:

Click “Start activity” to activate a trip, which could take from a short jogging, fishing, hiking to several days backpacking in nature.

Please do not stop the activity until you completely finish it.

Mark positive or negative spots in the nature and tag non-material benefits.

When finishing an activity, complete a survey about the experience you just had.

You will be able to withdraw from the study at any point by sending an email to<EMAIL_ADDRESS>Project website: http://site.uit.no/cultes/en/related-projects/phd-nature-based-tourism/

OK


Log retention

Description

Log retention for ETR uploaded logs needs to be in place so that we do not fill the log area with files.
Note that this might not need to be implemented in ETOS at all. Discuss in this issue.
Motivation

Exemplification

Benefits

Possible Drawbacks

This is not an ETOS issue. Add to log_area provider and to log area.


On the TP / SL modal bring the toast to the front

The Chore
We are working on a longer term consistent approach here: https://github.com/vegaprotocol/frontend-monorepo/issues/6170
But for now just bring the toast to the front so it looks less broken.
Additional details / background info

The toast is not allowing me to dismiss it so its not quite working as expected


allow the process.stdin mode to stay raw

keeps .close() the same, but adds a .close(true) to allow the input to keep going into the menu system rather than back into the terminal's handlers.

Thanks for the patch! Merged in 0.3.5.


Change Provider NOC/Admin Fields to GitHub-Flavored Markdown

Environment

Python version:  3.6.6
NetBox version:  2.5.5

Proposed Functionality
In circuits/providers/, change the NOC and Admin contact fields to be GitHub-Flavored Markdown fields (similar to the Comments field).
Use Case
The NOC and Admin fields may contain information related to more than one person/department. For instance, you may have different admin contacts for different roles. Markdown would help structure those two fields.
Database Changes
None.
External Dependencies
None.

I've got a similar feature request that has been accepted. Maybe this will fit your purpose?
https://github.com/digitalocean/netbox/issues/1344

It does fit the purpose, though I'm very sure it requires a bit more effort (new object type, likely to change database structure, etc...). For this request, I simply ask that those two fields are formatted similar to the comments section. This change, as far as I can tell, should be quite simple.
Long term, I'd prefer your approach as it is way more scalable, though it seems the devs are busy with other things, so I tried suggesting a middle-ground solution.


Record type are not suggested when trying to add HTTP payload

Description:
When we try to add a payload for HTTP resource, we don't get record types.
Steps to reproduce:

Affected Versions:
Swan Lake Beta 6
OS, DB, other environment details and versions:
Mac OS

Tried on the latest patch branch and observed the following behavior where the records are being suggested.

Hence closing the issue and if the still exists, please reopen.


Architect multipart forms with file uploads result in corrupted files

What version of Remix are you using?
1.3.3
Steps to Reproduce

Create a new remix project with npx create-remix
Select "Just the basics"
Select "Architect (AWS Lambda)"
Select "Typescript"
Finish creating the project
Replace the contents of app/routes/index.tsx with the following code:

import {
  ActionFunction,
  Form,
  unstable_createFileUploadHandler,
  unstable_parseMultipartFormData,
} from "remix";

export const action: ActionFunction = async ({ request }) => {
  const uploadHandler = unstable_createFileUploadHandler({
    maxFileSize: 10_000_000,
    directory: "public/uploads",
    file: ({ filename }) => filename,
  });

  const formData = await unstable_parseMultipartFormData(
    request,
    uploadHandler
  );

  const file = formData.get("file-upload") as File;

  if (file) {
    console.log(`File uploaded to server/public/uploads/${file.name}`);
  } else {
    console.log("No file uploaded");
  }

  return {};
};

export default function Index() {
  return (
    <Form reloadDocument method="post" encType="multipart/form-data">

          Upload a file
          <input
            id="file-upload"
            name="file-upload"
            type="file"
          />

        <button type="submit">Upload image</button>

    </Form>
  );
}

Run the server locally with npm run dev
Open http://localhost:3333 in your web browser and choose an image file to upload
Submit the form
View the file in <root>/server/public/uploads

Expected Behavior
The file should be uploaded uncorrupted
Actual Behavior
The file that is uploaded isn't the same file as the one selected, has additional data that is "corrupting" the file

I'm experiencing the same issue.
I believe the problem is in @remix-run/architect/server.js as I don't think event.body is being parsed correctly for multipart/form-data, so the resulting buffer isn't the correct length
To test i uploaded a 109kb file, the results are:
unstable_createFileUploadHandler:
The saved file is corrupted and 196kb in size
unstable_createMemoryUploadHandler:
console.log(Buffer.byteLength(await formData.get("file").arrayBuffer()));

length is incorrect at 196286 bytes
custom uploadHandler:
const uploadHandler = async ({
  name,
  filename,
  mimetype,
  encoding,
  stream,
}) => {
  if (name !== "file") {
    stream.resume();
    return;
  }

  const stream2buffer = await new Promise((resolve, reject) => {
    const _buf = [];

    stream.on("data", (chunk) => _buf.push(chunk));
    stream.on("end", () => resolve(Buffer.concat(_buf)));
    stream.on("error", (err) => reject(err));
  });

  console.log(Buffer.byteLength(stream2buffer));

  const key = "test";

  return JSON.stringify({ filename, key });
};

buffer is incorrect at 196286 bytes
Test mod of  @remix-run/architect/server.js
Adding this block into line 48 of server.js, I believe confirms that the body is parsed correctly when the content-type is multipart/form-data
if (event.headers["content-type"]?.includes("multipart/form-data")) {
  let parser = await require("lambda-multipart-parser");
  bodyWithFiles = await parser.parse(event);
  console.log(Buffer.byteLength(bodyWithFiles.files[0].content));
}

byte length is 108911 which is correct

Here's the full server.js file I've used for testing this
/**
 * @remix-run/architect v1.3.3
 *
 * Copyright (c) Remix Software Inc.
 *
 * This source code is licensed under the MIT license found in the
 * LICENSE.md file in the root directory of this source tree.
 *
 * @license MIT
 */
'use strict';

Object.defineProperty(exports, '__esModule', { value: true });

var node = require('@remix-run/node');
var binaryTypes = require('./binary-types.js');

/**
 * A function that returns the value to use as `context` in route `loader` and
 * `action` functions.
 *
 * You can think of this as an escape hatch that allows you to pass
 * environment/platform-specific values through to your loader/action.
 */

/**
 * Returns a request handler for Architect that serves the response using
 * Remix.
 */
function createRequestHandler({
  build,
  getLoadContext,
  mode = process.env.NODE_ENV
}) {
  let handleRequest = node.createRequestHandler(build, mode);
  return async (event, _context) => {
    let abortController = new node.AbortController();
    let request = await createRemixRequest(event, abortController);
    let loadContext = typeof getLoadContext === "function" ? getLoadContext(event) : undefined;
    let response = await handleRequest(request, loadContext);
    return sendRemixResponse(response, abortController);
  };
}
async function createRemixRequest(event, abortController) {
  let host = event.headers["x-forwarded-host"] || event.headers.host;
  let search = event.rawQueryString.length ? `?${event.rawQueryString}` : "";
  let url = new URL(event.rawPath + search, `https://${host}`);
  if(event.headers['content-type']?.includes('multipart/form-data')) {
    var parser = require('lambda-multipart-parser');
    let bodyWithFiles = await parser.parse(event);
    console.log(Buffer.byteLength(bodyWithFiles.files[0].content))
  }
  return new node.Request(url.href, {
    method: event.requestContext.http.method,
    headers: createRemixHeaders(event.headers, event.cookies),
    body: event.body && event.isBase64Encoded ? Buffer.from(event.body, "base64").toString() : event.body,
    abortController,
    signal: abortController === null || abortController === void 0 ? void 0 : abortController.signal
  });
}
function createRemixHeaders(requestHeaders, requestCookies) {
  let headers = new node.Headers();

  for (let [header, value] of Object.entries(requestHeaders)) {
    if (value) {
      headers.append(header, value);
    }
  }

  if (requestCookies) {
    headers.append("Cookie", requestCookies.join("; "));
  }

  return headers;
}
async function sendRemixResponse(response, abortController) {
  let cookies = []; // Arc/AWS API Gateway will send back set-cookies outside of response headers.

  for (let [key, values] of Object.entries(response.headers.raw())) {
    if (key.toLowerCase() === "set-cookie") {
      for (let value of values) {
        cookies.push(value);
      }
    }
  }

  if (cookies.length) {
    response.headers.delete("set-cookie");
  }

  if (abortController.signal.aborted) {
    response.headers.set("Connection", "close");
  }

  let contentType = response.headers.get("content-type");
  let isBinary = binaryTypes.isBinaryType(contentType);
  let body;
  let isBase64Encoded = false;

  if (isBinary) {
    let blob = await response.arrayBuffer();
    body = Buffer.from(blob).toString("base64");
    isBase64Encoded = true;
  } else {
    body = await response.text();
  }

  return {
    statusCode: response.status,
    headers: Object.fromEntries(response.headers),
    cookies,
    body,
    isBase64Encoded
  };
}

exports.createRemixHeaders = createRemixHeaders;
exports.createRemixRequest = createRemixRequest;
exports.createRequestHandler = createRequestHandler;
exports.sendRemixResponse = sendRemixResponse;

I've been digging into this more, I think the use of toString() on the buffer in two locations is causing the binary data to be skewered.
I've modified<EMAIL_ADDRESS>&<EMAIL_ADDRESS>and I now have an uncorrupted file 😄
Putting together a PR so they can review and decide if they're happy this is a fix / doesn't affect anything else.
In the meantime you could manually patch the files yourself to test:
<EMAIL_ADDRESS>
/**
 * @remix-run/architect v1.3.3
 *
 * Copyright (c) Remix Software Inc.
 *
 * This source code is licensed under the MIT license found in the
 * LICENSE.md file in the root directory of this source tree.
 *
 * @license MIT
 */
'use strict';

Object.defineProperty(exports, '__esModule', { value: true });

var node = require('@remix-run/node');
var binaryTypes = require('./binary-types.js');

/**
* A function that returns the value to use as `context` in route `loader` and
* `action` functions.
*
* You can think of this as an escape hatch that allows you to pass
* environment/platform-specific values through to your loader/action.
*/

/**
* Returns a request handler for Architect that serves the response using
* Remix.
*/
function createRequestHandler({
  build,
  getLoadContext,
  mode = process.env.NODE_ENV
}) {
  let handleRequest = node.createRequestHandler(build, mode);
  return async (event, _context) => {
    let abortController = new node.AbortController();
    let request = await createRemixRequest(event, abortController);
    let loadContext = typeof getLoadContext === "function" ? getLoadContext(event) : undefined;
    let response = await handleRequest(request, loadContext);
    return sendRemixResponse(response, abortController);
  };
}
function createRemixRequest(event, abortController) {
  let host = event.headers["x-forwarded-host"] || event.headers.host;
  let search = event.rawQueryString.length ? `?${event.rawQueryString}` : "";
  let url = new URL(event.rawPath + search, `https://${host}`);
  let isFormData = false;

  if (event.headers["content-type"] && event.headers["content-type"].includes("multipart/form-data")) {
    isFormData = true;
  }

  return new node.Request(url.href, {
    method: event.requestContext.http.method,
    headers: createRemixHeaders(event.headers, event.cookies),
    body: event.body && event.isBase64Encoded ? !isFormData ? Buffer.from(event.body, "base64").toString() : Buffer.from(event.body, "base64") : event.body,
    abortController,
    signal: abortController === null || abortController === void 0 ? void 0 : abortController.signal
  });
}
function createRemixHeaders(requestHeaders, requestCookies) {
  let headers = new node.Headers();

  for (let [header, value] of Object.entries(requestHeaders)) {
    if (value) {
      headers.append(header, value);
    }
  }

  if (requestCookies) {
    headers.append("Cookie", requestCookies.join("; "));
  }

  return headers;
}
async function sendRemixResponse(response, abortController) {
  let cookies = []; // Arc/AWS API Gateway will send back set-cookies outside of response headers.

  for (let [key, values] of Object.entries(response.headers.raw())) {
    if (key.toLowerCase() === "set-cookie") {
      for (let value of values) {
        cookies.push(value);
      }
    }
  }

  if (cookies.length) {
    response.headers.delete("set-cookie");
  }

  if (abortController.signal.aborted) {
    response.headers.set("Connection", "close");
  }

  let contentType = response.headers.get("content-type");
  let isBinary = binaryTypes.isBinaryType(contentType);
  let body;
  let isBase64Encoded = false;

  if (isBinary) {
    let blob = await response.arrayBuffer();
    body = Buffer.from(blob).toString("base64");
    isBase64Encoded = true;
  } else {
    body = await response.text();
  }

  return {
    statusCode: response.status,
    headers: Object.fromEntries(response.headers),
    cookies,
    body,
    isBase64Encoded
  };
}

exports.createRemixHeaders = createRemixHeaders;
exports.createRemixRequest = createRemixRequest;
exports.createRequestHandler = createRequestHandler;
exports.sendRemixResponse = sendRemixResponse;

<EMAIL_ADDRESS>
/**
 * @remix-run/node v1.3.3
 *
 * Copyright (c) Remix Software Inc.
 *
 * This source code is licensed under the MIT license found in the
 * LICENSE.md file in the root directory of this source tree.
 *
 * @license MIT
 */
'use strict';

Object.defineProperty(exports, '__esModule', { value: true });

var stream = require('stream');
var Busboy = require('busboy');
var formData = require('./formData.js');

function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }

var Busboy__default = /*#__PURE__*/_interopDefaultLegacy(Busboy);

/**
 * Allows you to handle multipart forms (file uploads) for your app.
 *
 * @see https://remix.run/api/remix#parsemultipartformdata-node
 */

function parseMultipartFormData(request, uploadHandler) {
  return request.formData(uploadHandler);
}
async function internalParseFormData(contentType, body, abortController, uploadHandler) {
  let formData$1 = new formData.FormData();
  let fileWorkQueue = [];
  let stream$1;

  if (typeof body === "string" || Buffer.isBuffer(body)) {
    stream$1 = stream.Readable.from(body);
  } else {
    stream$1 = body;
  }

  await new Promise(async (resolve, reject) => {
    let busboy = new Busboy__default["default"]({
      highWaterMark: 2 * 1024 * 1024,
      headers: {
        "content-type": contentType
      }
    });
    let aborted = false;

    function abort(error) {
      if (aborted) return;
      aborted = true;
      stream$1.unpipe();
      stream$1.removeAllListeners();
      busboy.removeAllListeners();
      abortController === null || abortController === void 0 ? void 0 : abortController.abort();
      reject(error || new Error("failed to parse form data"));
    }

    busboy.on("field", (name, value) => {
      formData$1.append(name, value);
    });
    busboy.on("file", (name, filestream, filename, encoding, mimetype) => {
      if (uploadHandler) {
        fileWorkQueue.push((async () => {
          try {
            let value = await uploadHandler({
              name,
              stream: filestream,
              filename,
              encoding,
              mimetype
            });

            if (typeof value !== "undefined") {
              formData$1.append(name, value);
            }
          } catch (error) {
            // Emit error to busboy to bail early if possible
            busboy.emit("error", error); // It's possible that the handler is doing stuff and fails
            // *after* busboy has finished. Rethrow the error for surfacing
            // in the Promise.all(fileWorkQueue) below.

            throw error;
          } finally {
            filestream.resume();
          }
        })());
      } else {
        filestream.resume();
      }

      if (!uploadHandler) {
        console.warn(`Tried to parse multipart file upload for field "${name}" but no uploadHandler was provided.` + " Read more here: https://remix.run/api/remix#parseMultipartFormData-node");
      }
    });
    stream$1.on("error", abort);
    stream$1.on("aborted", abort);
    busboy.on("error", abort);
    busboy.on("finish", resolve);
    stream$1.pipe(busboy);
  });
  await Promise.all(fileWorkQueue);
  return formData$1;
}

exports.internalParseFormData = internalParseFormData;
exports.parseMultipartFormData = parseMultipartFormData;

Thanks @hicksy, these patches have fixed the issue for me as well. I used patch-package with the following patches using your code from above:
@remix-run-issue-2476-patches.zip

Perfect, thanks @ericallam

hey folks, this is resolved in 1.3.5 by #2495 - feel free to re-open if you're still running into issues :)


No globs support

As mentioned in the Readme:

Allow to use glob as a target.
Please note that you have to quote your parameter as follows:
$ textlint "docs/**"

It doesn’t work and I don’t see a glob expansion anywhere in the code.
❯ textlint "source/en/all/*.md"
✖ Error
ENOENT: no such file or directory, stat 'source/en/all/*.md'

✖ Stack trace
Error: ENOENT: no such file or directory, stat 'source/en/all/*.md'
    at Object.fs.statSync (fs.js:907:18)
    at walk (/usr/local/lib/node_modules/textlint/lib/util/traverse.js:21:19)
    at /usr/local/lib/node_modules/textlint/lib/util/traverse.js:76:9
    at Array.forEach (native)
    at traverse (/usr/local/lib/node_modules/textlint/lib/util/traverse.js:75:11)
    at findFiles (/usr/local/lib/node_modules/textlint/lib/util/find-util.js:18:5)
    at TextLintEngineCore.executeOnFiles (/usr/local/lib/node_modules/textlint/lib/engine/textlint-engine-core.js:281:55)
    at Object.executeWithOptions (/usr/local/lib/node_modules/textlint/lib/cli.js:171:96)
    at Object.execute (/usr/local/lib/node_modules/textlint/lib/cli.js:115:25)
    at /usr/local/lib/node_modules/textlint/bin/textlint.js:33:16
    at process._tickCallback (internal/process/next_tick.js:103:7)
    at Module.runMain (module.js:607:11)
    at run (bootstrap_node.js:420:7)
    at startup (bootstrap_node.js:139:9)
    at bootstrap_node.js:535:3

It however work without quotes but I’m afraid that’s because of my Zsh and might not work on other platforms.
❯ textlint source/en/all/*.md

/Users/sapegin/Dropbox/Projects/_Repos/blog.sapegin.me/source/en/all/bower.md
   16:26   ✓ error  Incorrect usage of the term: “websites”, use “sites” instead             terminology
...

Good catch. It is documentation bug.
(or missing feature)

We will release this feature #264 at tomorrow.

Release https://github.com/textlint/textlint/releases/tag/v7.3.0
It support glob pattern.
@sapegin Please check v7.3.0,  this issue should be fixed.


(hmr/keep-alive): After hmr, the page cannot be switched normally

Vue version
3.2.45
Link to minimal reproduction
https://stackblitz.com/edit/vitejs-vite-knceak?file=src%2FDemoA.vue,src%2FApp.vue&terminal=dev
Steps to reproduce
When I do not modify any code, the operation is very normal, and the DemoA page and DemoB page can be switched normally. However, if DemoA.vue or DemoB.vue is modified, the page switching will be invalid and there will be no error message. I have tried many versions. All versions have this problem. After deleting keep-alive, it will be normal
What is expected?
DemoA and DemoB can be opened normally after hmr
What is actually happening?
After hmr, the page cannot be switched normally, just like this page does not exist
System Info
No response
Any additional comments?
No response

Are you sure this is reproducible? The reproduction is working fine for me.

你确定这是最新版本的 Vue 可以重现的吗？复制对我来说工作正常。

https://user-images.githubusercontent.com/41950121/201557070-66188b07-cf2d-4b32-8cb2-f35c20fe7a19.mp4
Is there a problem with my node version?

Are you sure this is reproducible with the latest version of Vue? The reproduction is working fine for me.

https://user-images.githubusercontent.com/41950121/201557473-5fe1c201-d07c-4d03-ad60-21ca2e0265d0.mp4
Is there a problem with my node version?

Are you sure this is reproducible with the latest version of Vue? The reproduction is working fine for me.

I can reproduce it. It must be to change DemoA with DemoA displayed, then wait for hmr to finish before switching to DemoB.

Are you sure this is reproducible with the latest version of Vue? The reproduction is working fine for me.

I can reproduce it. It must be to change DemoA with DemoA displayed, then wait for hmr to finish before switching to DemoB.

I can reproduce it too.   and transition mode must be out-in

It seems to be caused by here:
https://github.com/vuejs/core/blob/64e6d9221d353598b5f61c158c978d80e3b4628c/packages/runtime-core/src/components/BaseTransition.ts#L207
When hmr is done, the oldInnerChild here is expired.

@yyx990803  No updates yet?

https://github.com/vuejs/core/issues/7121

https://github.com/vuejs/router/issues/1655


tom-select doesn't work well together with CSP

Describe the bug
When setting a CSP-policy, unsafe-inline must be set on style-src (there a two inline style attributes on a div with class ts-dropdown single and a div with class ts-dropdown-content) and data: must be allowed on img-src (for the dropdown icon). Probably there are some more situations like this.
To Reproduce
Steps to reproduce the behavior:

Set a CSP-policy on a page with tom-select selectors, such as: content-security-policy: default-src 'self'.
The selectors don't work, have a look at the console in DevTools to see the blocked resources.

Expected behavior
I would expect this plugin to work with a secure CSP.
Additional context
Add any other context about the problem here.

OS: Windows 10, 20H2
Browser: Chrome
Version:  89.0.4389.90
Device: Desktop

I moved the inline styles and I'm getting a clean CPS report in DevTools but I'm going to look at img-src and data: a little more.

Thanks for the very quick response and fix. Maybe good to know: I encountered this issue using the Bootstrap 5.x theme. Maybe it's related to that specific theme or Bootstrap itself. I can have a closer look at it tomorrow.

Ah, yep, there it is. I was looking at bootstrap4

Not sure if you've seen this, here's what Bootstrap says about CSP and embedded SVGs

Several Bootstrap components include embedded SVGs in our CSS to style components consistently and easily across browsers and devices. For organizations with more strict CSP configurations, we’ve documented all instances of our embedded SVGs (all of which are applied via background-image) so you can more thoroughly review your options.
...
Based on community conversation, some options for addressing this in your own codebase include replacing the URLs with locally hosted assets, removing the images and using inline images (not possible in all components), and modifying your CSP. Our recommendation is to carefully review your own security policies and decide on a best path forward, if necessary.

Thanks, @oyejorge. Very helpful and thus not related to tom-select.


updated enteprise bot to use latest telemetry + other small formattin…

!--- Provide a general summary of your changes in the Title above -->
Description

Updated Telemetry and fixed other small formatting fixes
Related Issue

Testing Steps

While we are making this changes is it a good time to bring across the base bot response localisation from VA and the refined cancellation logic (gated on a higher confidence value?)

@lauren-mills  - We'll need to update the Ent Template docs around deployment before we push this change


Layout fallthrough

Describe the bug
I am trying to throw an error:
export async function load({ page }) {
  if (page.params.foo !== 'okay') {
    return
  }
  return {}
}

This example works as expected within a page component. However when I put this logic inside __layout.svelte it behaves rather oddly.
In first case when nothing is returned then application proceeds to the page component. It renders the page contents, however ignores the __layout content. When the page is refreshed and reloaded completelly it thows an error 500 saying "load must return a value except for page fall through"
I want to check path validity for all the child pages within one directory and putting this logic inside every single page is not ideal. Better solution would to be able to check only once, inside the layout component.
I understand this is probably outside of the scope of intended functionality but it might be a mice addition, in my opinion.
Reproduction
https://github.com/lemmon/svelte-kit-layout-error
Logs
No response
System Info
System:
    OS: macOS 11.5.2
    CPU: (4) x64 Intel(R) Core(TM) i5-6500 CPU @ 3.20GHz
    Memory: 49.27 MB / 16.00 GB
    Shell: 5.8 - /bin/zsh
  Binaries:
    Node: 14.17.1 - /usr/local/bin/node
    npm: 7.22.0 - /usr/local/bin/npm
  Browsers:
    Brave Browser: <IP_ADDRESS>
    Chrome: 93.0.4577.82
    Firefox: 92.0
    Safari: 14.1.2
  npmPackages:
    @sveltejs/kit: next => 1.0.0-next.168
    svelte: ^3.34.0 => 3.42.6

Severity
serious, but I can work around it
Additional Information
No response

What do you want to achieve / what is your expected behavior when you return nothing from a load function in __layout? AFAIK, fall-through routes exist for pages only, not for layouts.

I want it to behave the same as the page endpoints. If the __layout returns nothing it should fall-through. I understand this issue is part bug and part feature request.
I have this routes structure:
routes/[foo]/ .. and many pages here.
I don't want to check validity of foo inside every single page but only once in the layout.

I want it to behave the same as the page endpoints. If the __layout returns nothing it should fall-through. I understand this issue is part bug and part feature request.

So you have
routes/[foo]/..
routes/[bar]/..

and you want to fall through to bar by returning nothing from the __layout in foo?

Yeah. Fall through either to [bar] or an __error page. I don't have bar in my case. The very thing is possible when you return nothing form either a page or an endpoint. But it's quite anoying and ugly when you have a lot of pages under the foo (or bar). Seems like __layout is the best place to validate such scenario but the functionality is not there.

I'd like to work on this issue and will create a PR as soon as I'm done.

Turns out the solution to this issue is pretty easy. All I had to do was to remove a is_leaf check in the load_node function in the server runtime
// if leaf node (i.e. page component) has a load function
// that returns nothing, we fall through to the next one
if (!loaded && is_leaf && !is_error) return;

and in the client-side renderer:
else if (is_leaf && module.load) {
// if the leaf node has a `load` function
// that returns nothing, fall through
return;

However it seems like this behaviour was actively prevented in the past. Was there a reason for that?


Add Hound integration

Travis now runs our jest tests/eslint. In this issue we will integrate Hound CI for linting.
https://github.com/ManageIQ/miq_bot/issues/368

@priley86 I'm fine with closing this.... likely couldn't be done till the repo rename anyways


@RequiredArgsConstructor + @NonNull breaks eclipse highlighting

I simplified code that breaks highlighting in eclipse:
package highlight;

import lombok.NonNull;
import lombok.RequiredArgsConstructor;

@RequiredArgsConstructor
public enum LombokHighlight {
    TYPE1("type1");

	@NonNull
    private final String format;

    public boolean method1(String s1, String s2) {
    	return s1.equals(s2);
    }

}

Open this file in Eclipse (initially highlight is fine) then click on equals method in return s1.equals(s2); clause. Important: click just after opening file. Don't click anywhere else.
All upper code will be highlighted as comment (gray in my color scheme).
After this clicking on classname fixing highlight and clicking equals again don't break it anymore. But if you click at random places in code then after some time highlight is breaks again. This is not so oftern in this simple file. But in real project with bigger file when this enum is nested in other class etc - this is became very very often.

Using your example code, I observed the behavior, but as you already wrote, it's not always the case. Could you also reproduce this in a non-enum type?

Yes, if you change the enum keyword to class and remove TYPE1("type1"); then highlight is still disappearing.
In my real class where I initially observed this bug this enum is actually nested in outer class and this bug eats highlighting in the whole class but only above the line which you click.
After you click (1) there is always this:
// unhighlighted code
(1) some java code highligted // you clicked here
/* all code below this line (inclusive) is highlighted too */

And yes. It is not always the case but with bigger file this is much often than with this small example files.
And to fix the highlighting almost always you need to click somewhere upper the (1). Usually the class name when highlighting is broken. But only until you click somewhere below again (but not always).


Bug: Fix Certificate's AdditionalOutputFormat in admission within Webhook

This PR fixes a bug where the Certificate's additionalOutputFormats' field was only ever being validated by the webhook at admission time if the privateKey` on the Certificate field was also set. The webhook was also incorrectly using the controllers feature set.
Webhook component providing API validation, mutation and conversion functionality for cert-manager (canary) ()
...
      --feature-gates mapStringBool                  A set of key=value pairs that describe feature gates for alpha/experimental features. Options are:
                AdditionalCertificateOutputFormats=true|false (ALPHA - default=false)
                AllAlpha=true|false (ALPHA - default=false)
                AllBeta=true|false (BETA - default=false)
                ExperimentalCertificateSigningRequestControllers=true|false (ALPHA - default=false)
                ExperimentalGatewayAPISupport=true|false (ALPHA - default=false)
                ValidateCAA=true|false (ALPHA - default=false)

->
$ ./webhook --help
Webhook component providing API validation, mutation and conversion functionality for cert-manager (canary) ()
...
      --feature-gates mapStringBool                  A set of key=value pairs that describe feature gates for alpha/experimental features. Options are:
                AdditionalCertificateOutputFormats=true|false (ALPHA - default=false)
                AllAlpha=true|false (ALPHA - default=false)
                AllBeta=true|false (BETA - default=false)
...

This PR should be backported, and a patch released published.

I'll leave the cherry-pick command for another maintainer.
/kind bug
/priority critical-urgent
/milestone v1.8
Fix: The alpha feature Certificate's `additionalOutputFormats` is now correctly validated at admission time, and no longer _only_ validated if the `privateKey` field of the Certificate is set. The Webhook component now contains a seperate feature set.
`AdditionalCertificateOutputFormats` feature gate (disabled by default) has been added to the webhook. This gate is required to be enabled on both the controller and webhook components in order to make use of the Certificate's `additionalOutputFormat` feature.

This also needs cherrypicking to v1.7 right?

/lgtm

/hold feel free to unhold when you're ready

I'll leave the cherry-pick command for another maintainer.

This also needs cherrypicking to v1.7 right?

@munnerz Indeed, I wasn't sure what the current process was for cherry picking, but vaguely remember that it was better for someone other than the author to do the command (?). Not sure why.. will do the command myself anyways.
/cherry-pick v1.7
/hold cancel

This is a breaking change, right? I feel like we should notify people that are using additionalOutputFormats. Should I add ACTION REQUIRED? @JoshVanL


[REVIEW] Fix issue where unique returns an index like result from backends.

unique currently is converting to pd.Series when the result is of type index-like as well. Hence guarding the series conversion with is_index_like check too.
Fixes: https://github.com/rapidsai/cudf/issues/5037

[x] Tests added / passed
[x] Passes black dask / flake8 dask

@jrbourbeau
Minimal example, when we call unique on index, it returned series:
>>> import numpy as np
>>> import pandas as pd
>>> import dask.dataframe as dd
>>> pdf = pd.DataFrame(
...         {
...             "x": [1, 2, 1, 3, 3, 1, 4, 2, 3, 1],
...             "y": ["a", "c", "b", np.nan, "c", "b", "a", "d", np.nan, "a"],
...         }
...     )
>>> ddf = dd.from_pandas(pdf, npartitions=3)
>>> ddf.index.unique()
Dask Index Structure:
npartitions=1
    int64
      ...
dtype: int64
Dask Name: unique-agg, 10 tasks
>>> ddf.index.unique().compute()
0    0
1    1
2    2
3    3
4    4
5    5
6    6
7    7
8    8
9    9
dtype: int64
>>> pdf.index.unique()
Int64Index([0, 1, 2, 3, 4, 5, 6, 7, 8, 9], dtype='int64')

With the fix, this will be resolved:
>>> ddf.index.unique().compute()
Int64Index([0, 1, 2, 3, 4, 5, 6, 7, 8, 9], dtype='int64')

>>> pdf.index.unique()
Int64Index([0, 1, 2, 3, 4, 5, 6, 7, 8, 9], dtype='int64')

rerun tests


Setting a published page to draft should remove it from the production search index

Steps to Reproduce

Create a page
Publish is to staging and production. Confirm that it was published in both sites and the page appears in the resource search
Set Draft=True in the page's metadata
Publish is to staging and production

Expected Behavior

the page with draft=true should be removed from the resource search index
pages and resources should behave the same way

Actual Behavior

the page with draft=true is still available in the resource search index

For example: https://ocwnext.odl.mit.edu/search/?q=Visualizations RealOne™ Player&t=Physics&t=Electromagnetism&type=resourcefile still returns the Visualizations page even though it has been marked as draft in studio
Related Issues

[ ] #1190

@gumaerc do you think this can be closed since we added --delete to the sync?

@pdpinch I just tested this and yes, the change to the single course pipeline that runs the sync with --delete accomplishes this.


v1.3 scan: Streaming API Med 1

CampDAPI_Med&Lows.xlsx
Application Information Leakage is an application weakness
where an application reveals sensitive data, such as
technical details of the web application or environment.
Application data may be used by an attacker to exploit the
target web application, its hosting network, or its users.
Therefore, leakage of sensitive data should be limited or
prevented whenever possible. Information Leakage, in its most
common form, is the result of one or more of the following
conditions: A failure to scrub out HTML/Script comments
containing sensitive information or improper application or
server configurations.
Failure to scrub HTML/Script comments prior to a push to the
production environment can result in the leak of sensitive,
contextual, information such as server directory structure, SQL
query structure, and internal network information. Often a
developer will leave comments within the HTML and/or script
code to help facilitate the debugging or integration process
during the pre-production phase. Although there is no harm in
allowing developers to include inline comments within the
content they develop, these comments should all be removed prior
to the content's public release.
Software version numbers and verbose error messages (such as
ASP.NET version numbers) are examples of improper server
configurations. This information is useful to an attacker by
providing detailed insight as to the framework, languages, or
pre-built functions being utilized by a web application. Most
default server configurations provide software version numbers
and verbose error messages for debugging and troubleshooting
purposes. Configuration changes can be made to disable these
features, preventing the display of this information.
Error Message Exposed via 'GET api.epa.gov/easey/staging/streaming-services/*

This API does not exist, targeting the wrong url. I have tested the repo but didn't find this route.

After some research decided that it is a false positive

False Positive. Approved reclassification on 3/4/2040


resizeToAvoidBottomInset: false blocks scrolling

Steps to Reproduce
When setting resizeToAvoidBottomInset to false and clicking on a textfield, the scrolling does not work. The TextField ends up behind the keyboard and you can not access it.
The following minimal example reproduces it on the latest stable version.
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';

void main() {

  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}) : super(key: key);

  final String title;

  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  int _counter = 0;

@override
void initState() {
  SystemChrome.setEnabledSystemUIOverlays([]);
  super.initState();
}
  void _incrementCounter() {
    setState(() {

      _counter++;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      resizeToAvoidBottomInset: false,
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
        child: ListView(children: [
          Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              Text(
                'You have pushed the button this many times:',
              ),
              Text(
                '$_counter',
                style: Theme.of(context).textTheme.display1,
              ),
               Text(
                'Hello',
              ),
              Text(
                'HelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHello',
              ),
              Text(
                'HelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHello',
              ),
              Text(
                'HelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHello',
              ),
              Text(
                'HelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHello',
              ),
              Text(
                'HelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHello',
              ),
                Text(
                'HelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHello',
              ),
                Text(
                'HelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHello',
              ),
                Text(
                'HelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHello',
              ),
                Text(
                'HelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHello',
              ),
              TextField(),
            ],
          ),
        ]),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: _incrementCounter,
        tooltip: 'Increment',
        child: Icon(Icons.add),
      ), // This trailing comma makes auto-formatting nicer for build methods.
    );
  }
}

Well that's how it is supposed to work if you look at the documentation, it says that for the resizeToAvoidBottomInset:
/// If true the [body] and the scaffold's floating widgets should size
/// themselves to avoid the onscreen keyboard whose height is defined by the
/// ambient [MediaQuery]'s [MediaQueryData.viewInsets] bottom property.
///
/// For example, if there is an onscreen keyboard displayed above the
/// scaffold, the body can be resized to avoid overlapping the keyboard, which
/// prevents widgets inside the body from being obscured by the keyboard.
///
/// Defaults to true.

If I may propose something that you could play with:
`import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: MyHomePage(title: 'Flutter Demo Home Page'),
);
}
}
class MyHomePage extends StatefulWidget {
MyHomePage({Key key, this.title}) : super(key: key);
final String title;
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State {
int _counter = 0;
@override
void initState() {
super.initState();
}
void _incrementCounter() {
setState(() {
  _counter++;
});

}
@override
Widget build(BuildContext context) {
SystemChrome.setEnabledSystemUIOverlays([]);
return  Material(
  child: Container(
    color: Colors.white,
    child: Scaffold(
        body: ListView(
            children: [
              Column(
                mainAxisAlignment: MainAxisAlignment.center,
                children: <Widget>[
                  Text(
                    'You have pushed the button this many times:',
                  ),
                  Text(
                    '$_counter',
                    style: Theme.of(context).textTheme.display1,
                  ),
                  Text(
                    'Hello',
                  ),
                  Text(
                    'HelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHello',
                  ),
                  Text(
                    'HelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHello',
                  ),
                  Text(
                    'HelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHello',
                  ),
                  Text(
                    'HelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHello',
                  ),
                  Text(
                    'HelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHello',
                  ),
                  Text(
                    'HelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHello',
                  ),
                  Text(
                    'HelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHello',
                  ),
                  Text(
                    'HelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHello',
                  ),
                  Text(
                    'HelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHello',
                  ),
                  TextField(),
                ],
              ),
            ])
    ),
  ),
);

}
}
`
Does it help?

Thanks @GaspardMerten for the quick reply. The default value of true works fine but it seems to reserve some space at the bottom for the Android native navigation bar.
The problem is that we have a fixed hight application and when I set  resizeToAvoidBottomInset to true, it seems to reserve some space at the bottom. That is what I am trying to avoid.
This is what it looks like when I set it to false in our app. I can use the full height but when I click the textfield, the keyboard shows and the TextField is hidden.

On the other hand, if I use the default setting, when the keyboard shows, it scrolls the TextField to the correct place so that works as expected. However, I am not able to use the full height of the Scaffold, not the darker brown border below the Confirm / Cancel buttons.

Then I think that this should do it :D
MediaQuery(       data: MediaQueryData(),       child: <Your scaffold widget with the listview here without setting the parameter it to false>

I was a little upset about not finding the answer so ... I found it after a little while... :D
`  @override
Widget build(BuildContext context) {
double bottomPadding = 0;
if (MediaQuery.of(context).viewInsets.bottom > 100) {
  // keyboard is open
  bottomPadding = MediaQuery.of(context).viewInsets.bottom;
}

return MediaQuery(
  data: MediaQueryData.fromWindow(window).copyWith(viewInsets: EdgeInsets.only(bottom: bottomPadding)),
  child: Builder(
      builder: (context) {
        return `

Thats a nice solution, thanks for taking the time to investigate it, so appreciated.
The side effect I see is that after opening and dismissing the keyboard, the black native navigation bar stays visible on top of the buttons. This is the same problem as I posted in a separate issue.

I can get around this by adding an else to your code above:
 if (MediaQuery.of(context).viewInsets.bottom > 100) {
      // keyboard is open
      bottomPadding = MediaQuery.of(context).viewInsets.bottom;
    } else {
      SystemChrome.setEnabledSystemUIOverlays([]);
    }

There is a quick flash but this effectively removes the bottom black navigation bar when the keyboard is dismissed. It seems kind of a hack but it does this job.

HI @ansolantz
I'd glad that the issue is solved
thank you @GaspardMerten for stepping in
I feel confident to close the issue,
if you disagree please comment below and I will reopen it
Thank you


Theming: add workbench configuration option for minimap opacity

This change allows configuration of the opacity of the entire minimap.
Following the pattern set for configuring opacity via hex color in editorUnnecessaryCodeOpacity, this adds an option under workbench.colorCustomizations called minimapOpacity.  Color input into this property is ignored and only the opacity is used, as was done here previously.

Sample usage with default dark theme and minimapOpacity set to #0007:

Defaults for dark, light, and high contrast themes are set to null, meaning by default these themes display the minimap at full opacity.
Light default:

Light with minimapOpacity: "#0007":

Dark default:

Dark with minimapOpacity: "#0007":

High-contrast default:

High-contrast with minimapOpacity: "#0007":

I am sorry, but this PR is literally adding "screen cheese" behind a setting. I don't understand why this screen cheese is desirable. We typically do recovery builds if we have bugs that lead to renderings like these:

I don't understand how this can be useful. Are there are other editors or even software that has screen cheese like this intentionally?

I'm not sure I've run into the term "screen cheese" before... Google searching only brings up other vscode issues and PRs, along with cheese articles. :)  I'm assuming it means the possible clash of having text on top of other text.
The difference between this and bugs where things overlap is that the minimap, while useful, is only useful in terms of "general shape" of the code.  It does not give me insight into what the text is, or does, or even give me lint highlights.
The code/writing/etc underneath it, on the other hand, is useful.  It's of direct interest to me, and when you're working in more cramped configurations, like the very common vertical split, code is often tucked underneath it.  There are times when I (personally) would rather not scroll further right in order to view, for example, those comments you took a screen shot of.  I'd like to know where I am in the file, but in those moments, the minimap is less useful than the text underneath.
The most frustrating example of this is when a line ending is right next to the minimap -- is that the end of the line? Or is there more to see?  You can't view it at a glance, and it can be frustrating.
I could see considering this "cheese" if you could read what was on the minimap.  At present it's just a visual indicator of where you are.
Regardless of the opinion on whether it "looks like cheese"(?), the PR was to add a setting for it.  Right now there is no option besides having a decent chunk of your editing space obscured, unless you want to forgo the minimap entirely.
As for previous art, yes, this is an editable setting in:

Sublime Text, by default (through theme settings). Sublime Text also allows editing the color of the minimap and hovers.
Atom, by package 'minimap' and its settings. (I believe, after a short google search. I have not used Atom myself.)
This isn't an "issue" in Notepad++, as there's a large visible scroll bar between your file and the document map, which I feel is the entirely wrong solution.

Are there other text editors I should check?  Those are the three relevant ones that came to mind first.

Hi @alexandrudima! Just a ping as I see aeschli removed their assignment, which I'm guessing means that there won't be additional input.  Is there anything else that I can do on my end for you (better/more examples from other editors/similar software, etc)?
I guess what I'm really asking is:
Is this an outright rejection?
If it is, can I take that to mean VS Code will never add minimap opacity customization, or similar features involving "peeking through" menu items / UI elements?
Either way, thanks for taking the time to look at this stuff :)

Hi!  Still hoping for a response in either direction here.

Hi @alexandrudima! Is this still something you would never consider as an option?
I can see that scrollbars are opaque, and the option to make the minimap opaque to match would be ideal.

@alexandrudima This PR is the best available method for me to maximize horizontal screen space, which I need.
I frequently have three or four columns of code open. These files are often quite small, so the 100% opacity full-length minimap is covering code with... nothing. This is a pure loss of screen real estate for no reason.
The issue with minimap covering code is not an issue, as the default behavior is the same as the current behavior. Users would have to opt into changing the transparency.
Users being able to configure their system to something that is not suitable for your use-case is fine, in the same way that allowing users to configure their font size to be too small for me to read is fine.

 This will now work via the minimap.background color, which will be respected, including its alpha component, e.g.:
"workbench.colorCustomizations": {
    "minimap.background": "#ffffff33"
},


Focus search box after Search 🔎 icon

Clicking on the icon opens a search input box, but does not autofocus it, making the user click a second time.
Focusing the input should also open the keyboard.

Todo: replicate the same on the Speaker page


Avoid options collision deprecations

Recent versions of ember-cli emit deprecations warnings like:
DEPRECATION: Ember CLI addons manage their own module transpilation during the `treeForAddon` processing. `ember-svg-jar` (found at `XXX/node_modules/ember-svg-jar`) has overridden the `this.options.ember-cli-babel.compileModules` value which conflicts with the addons ability to transpile its `addon/` files properly.

This is happening because ember-cli now has a standard use for an addon's this.options, which is colliding with ember-svg-jar's own usage.
This pr just renames this.options to this.svgJarOptions to avoid the problem.

Thank you.

@ivanvotti Is there any chance we could get a release now that this has been merged to silence this deprecation in our projects? Thanks!

@kpfefferle this addon doesn't work if you install it directly from git, because it has a prepublish build step.
In order to use my PR before it has been released, I ran the build and checked in the results here. Feel free to point at it directly:
https://github.com/ef4/ember-svg-jar#4d297846aa23dcc7db2319b76351a3291d867d64


fix: Konflux Improvements for Operator Bundle

Description
This PR

introduces some non-functional changes to the new PipelineRun for operator-bundle so that it becomes more similar in shape to the other YAMLs.
Adds missing labels for the EC checks.

User-facing documentation

[x] CHANGELOG update is not needed
[x] documentation PR is not needed

Testing

[ ] inspected CI results

How I validated my change
Just waiting for CI.

Something's up with the style check which shows up as failed. https://github.com/stackrox/stackrox/actions/runs/10249798075/job/28353995315?pr=12156
I wonder if that could be about CSV changes?

I believe, in the current form the PR makes things better.
Enterprise Contract status is unknown but it's being figured out.
Are you ok to merge this PR as it is @porridge @vladbologa ?

/retest


SSL on main client?

I noticed there's no SSL on web.macrodeck.org.
Could this be added, or if not then instructs on how to self-host the web client? I wouldn't want anyone on my local network to be able to sniff the http traffic if it contains sensitive info.

There is no SSL certificate because currently Macro Deck does not support secure websockets and a SSL secured web app cannot access a non secured WebSocket server but you don't need to worry. The web client runs only on your local machine and does not send any data to a web server outside your network. Also over the connection is no sensitive data transmitted which could be sniffed.
If you still want to self-host the client, you can setup any web server (Node, Apache, Nginx...)


Raw queries page needs some work

The raw queries page needs some shuffling about and examples improved upon. Including looking at potential SQL Server examples

@millsp It looks like you may have a PR about this. Could you link it here pls? Thanks!

:heavy_check_mark:


Simplify Travis CI Env

If we use AWS_* as the name for the auth env vars, it just works magically!

This is great!  ...... should we document it somewhere? :)


Refactor adapters for actix-web, axum, etc.

Write now there's some awkward boilerplate in all the examples that interfaces between the various servers and application code. This should be refactored so that it lives in leptos somewhere and not in user-land and can simply be imported and used in application code.

This is happening over on the server-integrations branch.

This is done in at least an initial form in #101.


Zoom makes the image blurry on Chromebook

I've been using this program with no problems for a while now to make pixel art. Whenever I zoomed in with the magnifying glass the image retained it's pixel perfect quality, but now all of a sudden, it's really blurry as if the anti-aliasing was on. I went through my settings multiple times and tried googling the problem but nothing has helped. I'm not sure if it's a glitch in my computer or maybe a random bug that popped up. Thanks for helping!

It was a problem with my laptop.

Were you able to fix it somehow? Or just resolving not to use the app on your laptop

My laptop updated and then somehow went into dev mode which drastically decreased the quality. I just had to take it out of Dev mode and now it works perfectly again.


Unable to upload anything when clicking Upload ID button on Tamara

What area is the issue related to?
Checkout Sheet Kit
What version of the package are you using?
3.0.2
Reproducible sample code
No response
Steps to Reproduce

Open checkout
Select option with any installment plan, in my case it's Tamara.
Click on Pay now.
Otp Verification
It will ask to Upload ID of front & back but button is not doing anything.

Expected Behavior
There can be two ideal cases:

If Camera permission is not given it should ask for Camera permission and then opens camera to capture picture.
If camera permission is given, it should directly opens camera.

Actual Behavior
By clicking on Upload ID nothing happened.
Screenshots/Videos/Log output
https://github.com/user-attachments/assets/e2e0f904-5029-46f7-a497-d2d6aab8ada8
Storefront domain
https://revibe.me/

Yup, already gave permission for the microphone and camera. I've also
attached the screenshot of app permissions.
On Mon, Jul 29, 2024 at 7:27 PM Dan Kift @.***> wrote:

Did you already do something like this:
https://github.com/Shopify/checkout-sheet-kit-android/blob/6cb7598c8a5e7facbdb4a7e5ad6233293ae99b69/samples/MobileBuyIntegration/app/src/main/java/com/shopify/checkout_sdk_mobile_buy_integration_sample/common/MobileBuyEventProcessor.kt#L85
And add the relevant permissions to your AndroidManifest?
—
Reply to this email directly, view it on GitHub
https://github.com/Shopify/checkout-sheet-kit-android/issues/115#issuecomment-2256095854,
or unsubscribe
https://github.com/notifications/unsubscribe-auth/BKCNJOWAZ63UPH5EUU3OHETZOZGOFAVCNFSM6AAAAABLUL6EQGVHI2DSMVQWIX3LMV43OSLTON2WKQ3PNVWWK3TUHMZDENJWGA4TKOBVGQ
.
You are receiving this because you authored the thread.Message ID:
@.***>

Yes, tried this solution already but still got the same issue.
On Tue, Jul 30, 2024 at 1:18 PM Dan Kift @.***> wrote:

So you've called something like ActivityCompat.requestPermissions(), and
then clicked something like allow this time as a user r.e. camera and
microphone? And the button still doesn't work?
Is that the same if you close and reopen checkout and retry (i.e. when
permissions have been granted before opening checkout)?
—
Reply to this email directly, view it on GitHub
https://github.com/Shopify/checkout-sheet-kit-android/issues/115#issuecomment-2257754972,
or unsubscribe
https://github.com/notifications/unsubscribe-auth/BKCNJOS4W4C4HOG3SI2PBQLZO5D6PAVCNFSM6AAAAABLUL6EQGVHI2DSMVQWIX3LMV43OSLTON2WKQ3PNVWWK3TUHMZDENJXG42TIOJXGI
.
You are receiving this because you authored the thread.Message ID:
@.***>

We can provide the keys or any support required from Tamara to expedite the
process.
On Wed, Jul 31, 2024 at 10:35 AM Syed Asim Zubair @.***>
wrote:

Thank you Dan for looking into this.However, can you please mention how
much time will it take to debug this issue ? We are losing 20% of our
customers due to this.
On Tue, Jul 30, 2024 at 2:41 PM Dan Kift @.***> wrote:

In that case I think we'll have to setup a store in the right region,
install Tamara, request an API key, etc. to debug.
It might take a little while. I'll update when there's more info
—
Reply to this email directly, view it on GitHub
https://github.com/Shopify/checkout-sheet-kit-android/issues/115#issuecomment-2257925596,
or unsubscribe
https://github.com/notifications/unsubscribe-auth/BKCNJOUOXCK3F2IZ3V4ZXCTZO5NVDAVCNFSM6AAAAABLUL6EQGVHI2DSMVQWIX3LMV43OSLTON2WKQ3PNVWWK3TUHMZDENJXHEZDKNJZGY
.
You are receiving this because you authored the thread.Message ID:
@.***>

@kiftio can you please give us any update regarding the issue ?

Ah unfortunately, the first step is to verify a mobile number, which must be a UAE number. So, I'm still a bit stuck I'm afraid

Any update?
On Wed, Jul 31, 2024 at 4:03 PM Ali Hanif @.***> wrote:

We can provide the keys or any support required from Tamara to expedite
the process.
On Wed, Jul 31, 2024 at 10:35 AM Syed Asim Zubair <
@.***> wrote:

Thank you Dan for looking into this.However, can you please mention how
much time will it take to debug this issue ? We are losing 20% of our
customers due to this.
On Tue, Jul 30, 2024 at 2:41 PM Dan Kift @.***>
wrote:

In that case I think we'll have to setup a store in the right region,
install Tamara, request an API key, etc. to debug.
It might take a little while. I'll update when there's more info
—
Reply to this email directly, view it on GitHub
https://github.com/Shopify/checkout-sheet-kit-android/issues/115#issuecomment-2257925596,
or unsubscribe
https://github.com/notifications/unsubscribe-auth/BKCNJOUOXCK3F2IZ3V4ZXCTZO5NVDAVCNFSM6AAAAABLUL6EQGVHI2DSMVQWIX3LMV43OSLTON2WKQ3PNVWWK3TUHMZDENJXHEZDKNJZGY
.
You are receiving this because you authored the thread.Message ID:
@.***>

I can't test Tamara without a UAE number unfortunately. So no, no update.
Can you see if there are any logs when the page is loaded / button clicked?

The logs are not showing anything when clicking on button.
Can we align a meeting? So we can give do testing on UAE number ?

@kiftio  Waiting for your response to expedite the process.

Hi @AsimNGI - This is important to us, and we will have the bandwidth to investigate this further at the end of August at the earliest.
In the meanwhile, were you able to test whether this works in a standard web view, without the Checkout Sheet Kit?

@AsimNGI Few more questions to help us double check things:

Are you testing via the emulator or on a real device?
Which Android OS version are you using?
Can you try in a different device (different model, different OS) and report back if you see the same issue?

Thanks

I'm testing in a real device and it's not working in all android models of
all brands and tested in all OS versions. Still same issue is coming.
On Sat, 10 Aug 2024, 1:40 pm Dan Kift, @.***> wrote:

@AsimNGI https://github.com/AsimNGI Few more questions to help us
double check things:

Are you testing via the emulator or on a real device?
Which Android OS version are you using?
Can you try in a different device (different model, different OS)
and report back if you see the same issue?

Thanks
—
Reply to this email directly, view it on GitHub
https://github.com/Shopify/checkout-sheet-kit-android/issues/115#issuecomment-2280357019,
or unsubscribe
https://github.com/notifications/unsubscribe-auth/BKCNJOQZR275MDPZXFYVL5LZQXGWXAVCNFSM6AAAAABLUL6EQGVHI2DSMVQWIX3LMV43OSLTON2WKQ3PNVWWK3TUHMZDEOBQGM2TOMBRHE
.
You are receiving this because you were mentioned.Message ID:
@.***>

@kiftio  Any update ? We're loosing 20% of our customers due to this bug. Can we schedule a meeting at your earliest? and we can provide you our UAE number to test

@AsimNGI - We've been working through your merchant success manager to setup a call so we can debug further. There should have been an email sent to your team last week to coordinate a time to meet. Please follow up there and we'll be happy to provide further guidance.

Hi @LouisMVA! Where have you sent the email. We are unable to find any and can you please keep my email in loop as well?

Mind sharing your email with me? I can make sure you get copied

Sure! My email is @.***
On Mon, 26 Aug 2024, 2:56 pm Louis, @.***> wrote:

Mind sharing your email with me? I can make sure you get copied
—
Reply to this email directly, view it on GitHub
https://github.com/Shopify/checkout-sheet-kit-android/issues/115#issuecomment-2309819994,
or unsubscribe
https://github.com/notifications/unsubscribe-auth/BKCNJOVDKZWT5Q5XPV277U3ZTL3V7AVCNFSM6AAAAABLUL6EQGVHI2DSMVQWIX3LMV43OSLTON2WKQ3PNVWWK3TUHMZDGMBZHAYTSOJZGQ
.
You are receiving this because you were mentioned.Message ID:
@.***>

Sure, my email is<EMAIL_ADDRESS>

Hi @LouisMVA ! We had multiple connects with @kiftio regarding this issue. However, we are stuck in only 1 edge case which is regarding to the camera. We tested in multiple devices and here are the results:
Image Upload:
When we pick an image using the image picker, everything works fine on all devices we've tested so far.
Camera:

Initially, the camera worked fine on two devices: Google Pixel (Android 11) and Samsung (Android 11).

However, when we retested the checkout flow on the same Samsung device, we were unable to place the photo on Tamara's checkout WebView after taking and selecting the picture. (Video 1)

We encountered the same issue (issue #2) when testing on an Infinix phone (Android 13). (Video 1)

On a Xiaomi phone (Android 14), after taking a picture and selecting the photo, the screen blacked out, and we had to close the app. (No video, happened all of sudden)

We retested on the same Xiaomi device, and after selecting the photo by taking a picture, the checkout flow was dismissed. (Video 2).

[https://drive.google.com/file/d/1P6p669D1C7rRuqWtgF9LPxJdnhK13is_/view?usp=drive_link](Video 1)
https://drive.google.com/file/d/1P9whb_ym0AIGKrVyg4Tf9jZniqBA4p_D/view?usp=drive_link

It sounds like we're now OK based on https://github.com/Shopify/checkout-sheet-kit-android/pull/130 so I think we can close this ticket

+Muhammad Musharaf @.***>
On Tue, Oct 1, 2024 at 7:09 PM Dan Kift @.***> wrote:

It sounds like we're now OK based on #130
https://github.com/Shopify/checkout-sheet-kit-android/pull/130 so I
think we can close this ticket
—
Reply to this email directly, view it on GitHub
https://github.com/Shopify/checkout-sheet-kit-android/issues/115#issuecomment-2386078274,
or unsubscribe
https://github.com/notifications/unsubscribe-auth/BKCNJOXCMU5ZNWVPTKXZXRDZZKUITAVCNFSM6AAAAABLUL6EQGVHI2DSMVQWIX3LMV43OSLTON2WKQ3PNVWWK3TUHMZDGOBWGA3TQMRXGQ
.
You are receiving this because you were mentioned.Message ID:
@.***>


Convolution (Third times the charm :) ) ++ Jane's work

We've included 2 new functions:

recommended by JB, and
a more efficient model of an older model using matrix multiplication by Jane.

Added new script ("2"), which is much more through in the exploration, and I've added comments about when I run %timeit on creating the predicted HRF functions.
Didn't have the heart to override the other script (but we can totally delete that after we make this pull requestion.)
Updated the test function (all doing a lot better on accuracy in the class test data)
@janewliang @jbpoline
Further note: I updated a multiple regression script to include the last image for the first paper.

Niiiiiiiiiiiiice. Sorry that the matrix multiplication didn't really work out for your final version.

Oh, it did kinda. I'm kinda indifferent to the method we use (yours or the 15 cut convolution).

Merging so I can do time shift.


jl0.5 plotting constant value set / mathematically correct plotting at its best

plot(x=linspace(0,1,100), y=ones(linspace(0,1,100)), Geom.smooth)
results in

am I right in the assumption that it isn't intended to look like that? (Focus on the y axis)

It's not too surprising... just tiny numerical leftovers that are too small for axis tick calculations.

With Coord.cartesian:
e = 10.0^(-8.0)
coord = Coord.cartesian(ymin=1.0-e, ymax=1.0+e)
theme(x) = Theme(default_color=parse(Colors.Colorant,x))
p = plot(x=linspace(0,1,100), y=ones(100), coord,
  layer(Geom.point, theme("orange"), order=1),
  layer(Geom.smooth, theme("blue"), order=2)
)

For fun, try changing the size of e.


I want wrapper persistence to be free

[ ] #741
[ ] #742

Status update: all issues listed above (https://github.com/polywrap/monorepo/issues/741, https://github.com/polywrap/monorepo/issues/742) are under review. Marking this story as "in review".


ARTEMIS-1391: Create a reproducer for this issue

Signed-off-by: Jens Reimann<EMAIL_ADDRESS>

I wouldn't send a PR with just a test reproducer.. I would attach a patch to a JIRA instead.

it's probably ok though

I did talk to @mtaylor I understood that we would go that way.
I know you can't merge that right now, but we can wait for the fix to the made and then rebase and merge this PR.

@ctron  can you ammend the commit name then?
like, adding test to reproduce the whatever case it was...
I don't like having to open JIRA when doing git log.. it's not practical.

I sent PR #1539 to deal with this.  You can go ahead and close this one.

Thanks for fixing this!


x/sys/unix: TestDevices test fails on Solaris

Discovered when the package was vendored and tested by builders.
This broke both Solaris builders.
https://build.golang.org/log/7c8e4f372950715426cac40c9a124602804df843
--- FAIL: TestDevices (0.00s)
--- FAIL: TestDevices//dev/zero_134:12 (0.00s)
dev_solaris_test.go:41: for /dev/zero Major(0x840000000c) == 132, want 134
dev_solaris_test.go:47: for /dev/zero Mkdev(134, 12) == 0x860000000c, want 0x840000000c
--- FAIL: TestDevices//dev/null_134:2 (0.00s)
dev_solaris_test.go:41: for /dev/null Major(0x8400000002) == 132, want 134
dev_solaris_test.go:47: for /dev/null Mkdev(134, 2) == 0x8600000002, want 0x8400000002
--- FAIL: TestDevices//dev/ptyp0_172:0 (0.00s)
dev_solaris_test.go:41: for /dev/ptyp0 Major(0xa900000000) == 169, want 172
dev_solaris_test.go:47: for /dev/ptyp0 Mkdev(172, 0) == 0xac00000000, want 0xa900000000
--- FAIL: TestDevices//dev/ttyp0_175:0 (0.00s)
dev_solaris_test.go:41: for /dev/ttyp0 Major(0xac00000000) == 172, want 175
dev_solaris_test.go:47: for /dev/ttyp0 Mkdev(175, 0) == 0xaf00000000, want 0xac00000000
--- FAIL: TestDevices//dev/ttyp1_175:1 (0.00s)
dev_solaris_test.go:41: for /dev/ttyp1 Major(0xac00000001) == 172, want 175
dev_solaris_test.go:47: for /dev/ttyp1 Mkdev(175, 1) == 0xaf00000001, want 0xac00000001

/cc @tklauser, @4ad

I think we can just skip or delete those tests. They seem specific to one Solaris variant or version and I suspect it's not guaranteed that those device numbers are guaranteed stable over time.

Yes, let's drop this, the only way to do this is by parsing /etc/name_to_major, which is harder and more work (so more error prone) than the thing being tested.

Ok. I also noticed the same test with hardcoded numbers for other OSes (dev_*_test.go). What about them?

I don't know how other operating systems are supposed to work.

Ok. I also noticed the same test with hardcoded numbers for other OSes (dev_*_test.go). What about them?

At least on Linux, these numbers are guaranteed to be stable between releases. I'm not sure about the BSDs. On Darwin most of the major/minor numbers are generated dynamically and the few static ones (which are used in the test) might change as well in future releases.
I'll send a CL removing these tests on *BSD and Darwin as well.


UserId in MTRewardedAdOptions not used in LoadRewarded method

Hi,
I’m experiencing an issue with the LoadRewarded method when using Rewarded Ads. Specifically, I’m passing the UserId as part of the MTRewardedAdOptions to the LoadRewarded method, but it appears that this UserId (and the whole MTRewardedAdOptions passed argument) is not being used within the RewardService.
As a result, my SSV (Server-Side Verification) fails because the UserId is empty, despite it being provided at the call site.
Versions:
Plugin.MauiMTAdmob: v1.6.0

I'll check and if I find the issue, I'll update the plugin asap.

Did you have a chance to take a look at this one? I would be happy to contribute, but since it's not open source, I can't do anything except waiting ...

I'm looking at it right now.
You are right, the options are not passed correctly.
I'm looking at fixing it right now and I'll publish an update asap.

I've just released the new version 1.6.2 that fixes this issue on both Android and iOS.
It should be available in the next few minutes.
I'm closing this issue for now but feel free to open a new one if needed.


PKB is trying to use a removed --mode flag for gcloud compute networks create

Example output from ping benchmark:
pkb.py [stderr]: 2018-04-02 23:01:12,351 ping MainThread ping(1/1) INFO     Provisioning resources for benchmark ping
pkb.py [stderr]: 2018-04-02 23:01:12,361 ping Thread-2 ping(1/1) DEBUG    Environment variables: None
pkb.py [stderr]: 2018-04-02 23:01:12,361 ping Thread-2 ping(1/1) INFO     Running: /abc/latest/bin/gcloud compute networks create pkb-network-ping --format json --quiet --project xyz --mode auto
pkb.py [stderr]: 2018-04-02 23:01:16,167 ping Thread-2 ping(1/1) INFO     Ran /abc/latest/bin/gcloud compute networks create pkb-network-ping --format json --quiet --project xyz --mode auto. Got return code (2).
pkb.py [stderr]: STDOUT:
pkb.py [stderr]: STDERR: ERROR: (gcloud.compute.networks.create) `mode` has been removed. Please use `subnet-mode` instead.

Cloud SDK version is 194.0.0.

Hi Madari, thanks for the feedback. Opened #1628 to update gcloud version.
In the meantime, you can use previous version of gcloud from https://pantheon.corp.google.com/storage/browser/cloud-sdk-release?authuser=0&pli=1,
The version I am currently using is 168.0.0, which works with current version of PerfkitBenchmarker


High Gas Fees Issues: Write Contract Burn on TaikoScan.

Describe the bug
I encountered an issue on TaikoScan where performing a Write Contract burn (NFTs) transaction incurs significantly high gas fees compared to other transactions. Ideally, I expected the gas fees to be consistent or similar across different types of transactions.

Steps to reproduce

Open TaikoScan

Find a smart contract that has been verified and supports burning
Connect wallet > Contract section > Write Contract > Burn > Executing the transaction.

Compare the gas cost incurred for a burn transaction with other types of transactions on the platform.

Spam policy

[X] I verify that this issue is NOT SPAM and understand SPAM issues will be closed and reported to GitHub, resulting in ACCOUNT TERMINATION.

у мене таке саме

Its just because this execution will be reverted.


estimate training time

Hi team, may I ask what's the approximate training time with the default configuration? Thank you !:)

Hi,
It took me approx 3 weeks to train the model with the results I have now. Its suuuper slow sadly :(

I see. Thx for the info!


Carousel Enhancements: Autoplay and/or dot navigation

Category
[X ] Enhancement
[ ] Bug
[ ] Question
Version
Please specify what version of the library you are using: [ 1.16.0 ]
Desired Behavior
Recently I had to implement an "Autoplay" and a "Dot navigation" for the Carousel control.
I had to do this "from outside" via "TriggerNextPage" function.
My Suggestion would be to implement this directly into the control as Options such as

EnableAutoplay
AutoplayDelay (in s)
ShowDotNavigation

Example how it would look like can be found here:
https://mmsharepoint.wordpress.com/2019/12/23/pnp-spfx-react-carousel-improvements-autoplay/

Hi @mmsharepoint if I understand your request, those features are available:

"autoplay" is available through isInfinite
"indicator" is available through both indicatorsDisplay and indicatorShape

Can you confirm on your side?

@michaelmaillot Honestly came not across this control since >3yrs
So don't know but if you are sure.
We can close the issue as I won't implement the "suggested enhancement" myself anyway, anymore.
But thanks for picking this up from the "museum" ;-)


Shutdown does not abort running subscriptions or long running streaming operations

When you call shutdown() on any of the client classes, e.g. the EventStoreDBClient, the client will not shutdown if there are long running streaming operations or running subscriptions.
The reason for this behavior is that the underlying GrpcClient calls shutdown on the gRPC ManagedChannel which will only send a disconnection message to the server and will no longer accept new calls but will not abort running streams.
This topic is discussed in the following thread:
https://github.com/grpc/grpc-java/issues/3095
The issue that arises is that calling shutdown() will therefore not notify the subscription of any failure and the ManagedChannel will remain open forever. This might produce a potential resource leak.
The solution to this problem is for force a hard shutdown of the ManagedChannel after a grace period if necessary. For a hard shutdown the shutdownNow() method on the ManagedChannel must be called (see https://github.com/grpc/grpc-java/issues/3095)
Current code in GrpcClient
    private void closeConnection() {
        if (this.channel != null) {
            try {
                this.channel.shutdown().awaitTermination(5, TimeUnit.SECONDS);
            } catch (InterruptedException e) {
                logger.error("Error when closing gRPC channel", e);
            } finally {
                this.channel = null;
            }
        }
    }

Proposed solution:
    private void closeConnection() {
        if (this.channel != null) {
            try {
                boolean terminated = this.channel.shutdown().awaitTermination(5, TimeUnit.SECONDS);
                if (!terminated) {
                    this.channel.shutdownNow().awaitTermination(5, TimeUnit.SECONDS);
                }
            } catch (InterruptedException e) {
                logger.error("Error when closing gRPC channel", e);
            } finally {
                this.channel = null;
            }
        }
    }

PR opened: https://github.com/EventStore/EventStoreDB-Client-Java/pull/162