[WIP] Fix bbox to xyz roundtrip

There seem to be a bug in the bbox_to_xyz function.
This is NOT fixing the bug just yet, but adds a few tests for it.

@sharkAndshark please take a look at this function - i think you may know more about it.  See if you know how to fix it?

I'm trying to understand what's the bug here.

@sharkAndshark this test fails, but I was expecting it should succeed.   See https://github.com/maplibre/martin/actions/runs/7155799338/job/19484815026 :
---- tests::test_xyz_to_bbox stdout ----
thread 'tests::test_xyz_to_bbox' panicked at martin-tile-utils/src/lib.rs:336:9:
assertion `left == right` failed
  left: (1, 26, 3, 28)
 right: (1, 3, 2, 5)
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace

The Y coordinate gets decoded as an inverse.

P.S.  Note that both tile-grid and utiles have this functionality, and eventually we should adapt it for our needs, but for now I could use the round-trip-able xyz->bbox->xyz

Use tms only when it's mbtiles make things simplier. I will roll back and check the y axis schema of our tests cases here (even othe places) carefully.

Agree. Use TMS only when it's mbtiles make things simplier. I will roll back and check the y axis schema of our tests cases here (even othe places) carefully.

There are several ways to implement the "tile ID" concept:

some struct + enum. The struct has X,Y,Z, and enum has TMS/WTS values.  This is not a good approach for multiple reasons: it is easy to mess up if struct matches the enum (e.g. to accidentally treat x/y/z as tms whereas it should have been wts, etc. It also makes it impossible to have non-x/y/z style IDs, like what PMTiles, S2, and H3 uses.
have one ID struct for the whole program -- X/Y/Z, whose values are understood to be the same everywhere. Then only mbtiles crate needs to know that it should use TMS internally.  The only drawback is that will not easily support other IDs, e.g. if we ever want to start using H3 for tile access.
use enum with variables, e.g. enum TileID { WTS { x: u32, y: u32, z: u8 }, TMS { x: u32, y: u32, z: u8 }, H3 { ... } } -- this would support all ID types, but it would be more difficult to coordinate different systems with different ID schemas.  Eventually we may go here, but not just yet.

P.S. We really should not implement this ourselves. Instead, we should rely on the other crates as mentioned in https://github.com/maplibre/martin/pull/1059#issuecomment-1848866110

Hi @nyurik Could I split this to these three tasks.

[ ] Fix tests
[ ] For the functions in martin-tiles-util, make xyz schema as default
[ ] Use tile-grid or utiles directly

I think the first two should be done together. As far as I can see, most code is already xyz, so should be minimal changes.  The 3rd is optional, but it might be easier to just use tile grid directly from the start, and not bother with fixing the first two? Not sure.

Before to do anything else, I think we need to talk about this:
assert_relative_eq!(bbox[0], -168.74999999999955, epsilon = f64::EPSILON * 2.0);
assert_relative_eq!(bbox[1], 74.01954331150218, epsilon = f64::EPSILON * 2.0);
assert_relative_eq!(bbox[2], -146.2499999999996, epsilon = f64::EPSILON * 2.0);
assert_relative_eq!(bbox[3], 81.09321385260832, epsilon = f64::EPSILON * 2.0);

// Fixme: These are totally wrong
let xyz = bbox_to_xyz(bbox[0], bbox[1], bbox[2], bbox[3], 5);
assert_eq!(xyz, (1, 3, 2, 5));

assertion `left == right` failed
left: (1, 3, 3, 6)
 right: (1, 3, 2, 5)

either equal, or bigger by no more than 1 tile

Do you actually mean buffered by no more than 1 tile? Then the test code would be like:
assert!(tile_col == some_value || tile_col == some_value+1)
assert!(tile_row == some_value - 1 || tile_row == some_value)

will review & merge shortly, thx for all the hard work!

thanks for fixing this!!!

@sharkAndshark sadly, this solution still has some weird bug, and does not fully solve general use case.  It seems the xy_tile somehow limits the computation to ~z24(?).
Notice that beyond z24, all values are identical
#[test]
fn test_box() {
    fn tst(left: f64, bottom: f64, right: f64, top: f64, zoom: u8) -> String {
        let (x0, y0, x1, y1) = bbox_to_xyz(left, bottom, right, top, zoom);
        format!("({x0}, {y0}, {x1}, {y1})")
    }

    assert_snapshot!(tst(-179.43749999999955,-84.76987877980656,-146.8124999999996,-81.37446385260833, 0), @"(0, 0, 0, 0)");
    assert_snapshot!(tst(-179.43749999999955,-84.76987877980656,-146.8124999999996,-81.37446385260833, 1), @"(0, 1, 0, 1)");
    assert_snapshot!(tst(-179.43749999999955,-84.76987877980656,-146.8124999999996,-81.37446385260833, 2), @"(0, 3, 0, 3)");
    assert_snapshot!(tst(-179.43749999999955,-84.76987877980656,-146.8124999999996,-81.37446385260833, 3), @"(0, 7, 0, 7)");
    assert_snapshot!(tst(-179.43749999999955,-84.76987877980656,-146.8124999999996,-81.37446385260833, 4), @"(0, 14, 1, 15)");
    assert_snapshot!(tst(-179.43749999999955,-84.76987877980656,-146.8124999999996,-81.37446385260833, 5), @"(0, 29, 2, 31)");
    assert_snapshot!(tst(-179.43749999999955,-84.76987877980656,-146.8124999999996,-81.37446385260833, 6), @"(0, 58, 5, 63)");
    assert_snapshot!(tst(-179.43749999999955,-84.76987877980656,-146.8124999999996,-81.37446385260833, 7), @"(0, 116, 11, 126)");
    assert_snapshot!(tst(-179.43749999999955,-84.76987877980656,-146.8124999999996,-81.37446385260833, 8), @"(0, 233, 23, 253)");
    assert_snapshot!(tst(-179.43749999999955,-84.76987877980656,-146.8124999999996,-81.37446385260833, 9), @"(0, 466, 47, 507)");
    assert_snapshot!(tst(-179.43749999999955,-84.76987877980656,-146.8124999999996,-81.37446385260833, 10), @"(1, 933, 94, 1014)");
    assert_snapshot!(tst(-179.43749999999955,-84.76987877980656,-146.8124999999996,-81.37446385260833, 11), @"(3, 1866, 188, 2029)");
    assert_snapshot!(tst(-179.43749999999955,-84.76987877980656,-146.8124999999996,-81.37446385260833, 12), @"(6, 3732, 377, 4059)");
    assert_snapshot!(tst(-179.43749999999955,-84.76987877980656,-146.8124999999996,-81.37446385260833, 13), @"(12, 7465, 755, 8119)");
    assert_snapshot!(tst(-179.43749999999955,-84.76987877980656,-146.8124999999996,-81.37446385260833, 14), @"(25, 14931, 1510, 16239)");
    assert_snapshot!(tst(-179.43749999999955,-84.76987877980656,-146.8124999999996,-81.37446385260833, 15), @"(51, 29863, 3020, 32479)");
    assert_snapshot!(tst(-179.43749999999955,-84.76987877980656,-146.8124999999996,-81.37446385260833, 16), @"(102, 59727, 6041, 64958)");
    assert_snapshot!(tst(-179.43749999999955,-84.76987877980656,-146.8124999999996,-81.37446385260833, 17), @"(204, 119455, 12083, 129917)");
    assert_snapshot!(tst(-179.43749999999955,-84.76987877980656,-146.8124999999996,-81.37446385260833, 18), @"(409, 238911, 24166, 259834)");
    assert_snapshot!(tst(-179.43749999999955,-84.76987877980656,-146.8124999999996,-81.37446385260833, 19), @"(819, 477823, 48332, 519669)");
    assert_snapshot!(tst(-179.43749999999955,-84.76987877980656,-146.8124999999996,-81.37446385260833, 20), @"(1638, 955647, 96665, 1039339)");
    assert_snapshot!(tst(-179.43749999999955,-84.76987877980656,-146.8124999999996,-81.37446385260833, 21), @"(3276, 1911295, 193331, 2078678)");
    assert_snapshot!(tst(-179.43749999999955,-84.76987877980656,-146.8124999999996,-81.37446385260833, 22), @"(6553, 3822590, 386662, 4157356)");
    assert_snapshot!(tst(-179.43749999999955,-84.76987877980656,-146.8124999999996,-81.37446385260833, 23), @"(13107, 7645181, 773324, 8314713)");
    assert_snapshot!(tst(-179.43749999999955,-84.76987877980656,-146.8124999999996,-81.37446385260833, 24), @"(26214, 15290363, 1546649, 16629427)");

    // All these are incorrect
    assert_snapshot!(tst(-179.43749999999955,-84.76987877980656,-146.8124999999996,-81.37446385260833, 25), @"(33554431, 33554431, 33554431, 33554431)");
    assert_snapshot!(tst(-179.43749999999955,-84.76987877980656,-146.8124999999996,-81.37446385260833, 26), @"(67108863, 67108863, 67108863, 67108863)");
    assert_snapshot!(tst(-179.43749999999955,-84.76987877980656,-146.8124999999996,-81.37446385260833, 27), @"(134217727, 134217727, 134217727, 134217727)");
    assert_snapshot!(tst(-179.43749999999955,-84.76987877980656,-146.8124999999996,-81.37446385260833, 28), @"(268435455, 268435455, 268435455, 268435455)");
    assert_snapshot!(tst(-179.43749999999955,-84.76987877980656,-146.8124999999996,-81.37446385260833, 29), @"(536870911, 536870911, 536870911, 536870911)");
    assert_snapshot!(tst(-179.43749999999955,-84.76987877980656,-146.8124999999996,-81.37446385260833, 30), @"(1073741823,<PHONE_NUMBER>,<PHONE_NUMBER>,<PHONE_NUMBER>)");
}

Weired. I'm debuging.


Customize E2E Tests

Coverage remained the same at 81.907% when pulling 794869f752f63c7960d91a242bbfec251e748cd1 on customize-sample-e2e into da8cc77269b34bd3aaa3b6ccd71246785f789b7d on dev.


Cleanup residual files

This PR removes files from the store that are not needed by the current generation:

At open_rw, to clean up a harshly closed store on reboot
After a GC crash, to get rid of the failed new generation

I'm not quite sure how to unit test the GC failures but there were two issues hiding in there:

The GC worker writes its result Ok final_offset | Error ... in a temporary file. The File_manager.read_gc_output was unable to parse the error case in general as repr didn't quite like the polymorphic variants union (so the json decoding was crashing deep into repr internals)
lib_context keeps on calling finalise ~wait:false to know the status of the GC. On a GC crash, the error handling was not marking the GC as finished and so the next finalise would attempt to wakeup a second time the resolver.

Codecov Report

Merging #2095 (ef92e1a) into main (a7baa08) will increase coverage by 0.07%.
The diff coverage is 70.37%.

@@            Coverage Diff             @@
##             main    #2095      +/-   ##
==========================================
+ Coverage   64.60%   64.68%   +0.07%
==========================================
  Files         132      132
  Lines       15695    15708      +13
==========================================
+ Hits        10140    10160      +20
+ Misses       5555     5548       -7

Impacted Files
Coverage Δ

src/irmin-pack/unix/io_errors.ml
55.00% <63.63%> (+20.00%)
:arrow_up:

src/irmin-pack/unix/file_manager.ml
84.06% <69.23%> (+0.45%)
:arrow_up:

src/irmin-pack/layout.ml
92.50% <100.00%> (+0.39%)
:arrow_up:

src/irmin-pack/unix/gc.ml
44.30% <100.00%> (+3.76%)
:arrow_up:

src/irmin-pack/unix/errors.ml
28.88% <0.00%> (ø)

src/irmin-fs/unix/irmin_fs_unix.ml
68.38% <0.00%> (+0.64%)
:arrow_up:

:mega: We’re building smart automated test selection to slash your CI/CD build times. Learn more


CARLA running at 2-3 FPS in Nvidia Tesla T4 GPU

Actually my system is having NVIDIA Tesla T4 GPU, with all updated drivers. still CARLA is running only at 2- FPS
Thanks for contributing to CARLA!
If you are reporting an issue, please use the following outline:
CARLA version: 0.9.13
Platform/OS: Windows 10
Problem you have experienced: Unable to increase CARLA fps
What you expected to happen: increase fps to 30 at least
Steps to reproduce:
Other information (documentation you consulted, workarounds you tried):

你应该是没有配置好同步或异步模式，尝试在运行时添加 --sync 参数？

Hi,
Are you running CARLA in the UE editor?
Marcel


After moving to .Net Standard HttpClient conflicts

I moved my pcl project to .net standard 1.3 and when i reference "TK.CustomMap": "1.5.0" i get the following when i use HttpClient to call my rest API.

Severity Code Description Project File Line Suppression State
Error CS0433 The type 'HttpClient' exists in both 'System.Net.Http, Version=<IP_ADDRESS>, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' and 'System.Net.Http, Version=<IP_ADDRESS>, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'

Ok just forked, modernhttpclient is causing the problem. I removed it, it isn't needed. I ll make a PR

The modern http client is used calling the google places api.

So standard httpclient can't be use? What's so special with google places api?

There is nothing special about the API, but the ModernHttpClient speeds things up quite a bit. I would love to remove as many unnecessary dependencies as possible though.

I stumbled on quite the same issue, although my way to temporary fix it was a bit different: I went to the packages' cache directory i.e. %HOMEDRIVE%%HOMEPATH%\.nuget\packages\TK.CustomMap\1.5.0, edit the TK.CustomMap.nuspec file and commented out (only!) the Microsoft.Net.Http dependency.
...
<dependencies>
            <group>
                <dependency id="Xamarin.Forms.Maps" version="<IP_ADDRESS>" />
                <dependency id="Newtonsoft.Json" version="8.0.3" />
                <!--dependency id="Microsoft.Net.Http" version="2.2.29" /-->
                <dependency id="modernhttpclient" version="2.4.2" />
            </group>
            <group targetFramework="MonoAndroid1.0">
                <dependency id="Xamarin.Forms.Maps" version="<IP_ADDRESS>" />
                <dependency id="Xamarin.GooglePlayServices.Location" version="<IP_ADDRESS>" />
                <dependency id="modernhttpclient" version="2.4.2" />
            </group>
            <group targetFramework="Xamarin iOS1.0">
                <dependency id="Xamarin.Forms.Maps" version="<IP_ADDRESS>" />
                <dependency id="modernhttpclient" version="2.4.2" />
            </group>
        </dependencies>
...

I guess you might need to update your nuget repo file to a one that is compatible with both projects' structures (packages.config & .Net Standard's project.json). Haven't got a clue on how to do that yet, but it seems it is doable (if I'm not mistaken, project https://github.com/paulcbetts/refit for instance has updated it's package like so).

Next release will target net standard 1.5.. It should be compatible with both, PCL and netstandard.

I think ModernHttpClient is obsolete now - you can set native APIs in both Android and iOS projects, not?

Yes, I think that can be removed.

1.5.1.

Thanks for that tip @nbsoftware ! Even up'ing to 1.5.1 i still needed to apply that Microsoft.Net.Http nuspec removal to get out of my error inferno.


use default doxygen settings for output directory

There is no guarantee that the relative path ../../bindoc, which is outside the source tree, will be user writeable. This PR restores the Doxygen default setting for OUTPUT_DIRECTORY, thereby placing the generating HTML directory under doc/html.

In develop branch for now


Don't leave trailing hyphen in deployment name

If the ems_id is nil, empty, or not in the expected format, it can return nil
causing us to leave the deployment name with a trailing hyphen.  Now, we only
append the hyphen and ems_id if it's present.

ems_id cannot be an array, simplifying this logic of ems_id returning nil or an fixnum

ems_id comes from ems_id_from_queue_name which as of [1] can only ever return an
integer or nil from parse_ems_id.
[1] https://github.com/ManageIQ/manageiq/pull/20345
Related, we need to fix the foreman provider to not return an array from queue_name_for_ems

Related, we need to fix the foreman provider to not return an array from queue_name_for_ems

Is this the only worker like this?  If so, I think it's better to fix that, and then not have the special case.


Some screens require waitForAngularEnabled(false) to work properly, even though whole app is angular

For some reason, certain pages (screens) in my angular app aren't respected as angular, and the only way to get protractor to interact with elements on these screens is to set waitForAngularEnabled(false). This then creates flaky tests and requires all kinds of ugly browser.waits. Anyone else ever experienced this or know how to resolve it?
Bug report

Node Version: 12.3.1
Protractor Version: 5.4.2
Angular Version: 7.2.3
Browser(s): Chrome
Operating System and Version Windows 10

conf file
// https://github.com/angular/protractor/blob/master/lib/config.ts

const { SpecReporter } = require('jasmine-spec-reporter');
global.util = require('./src/util/phoenix-protractor-util.js');

exports.config = {
  SELENIUM_PROMISE_MANAGER: false,

  allScriptsTimeout: 30000,

  specs: [
    './src/**/waivers-spec.js'
  ],

  capabilities: {
    browserName: 'chrome',
		acceptInsecureCerts: true,
		chromeOptions: {
			args: ['disable-infobars', 'lang=en-US', '--allow-insecure-localhost'],
			prefs: {
				download: {
					prompt_for_download: false,
					directory_upgrade: true,
					default_directory: '/tmp',
				},
				'profile.password_manager_enabled': false,
				credentials_enable_service: false,
				password_manager_enabled: false,
			},
		},
  },

  directConnect: true,
  baseUrl: 'http://localhost:4200/',
  framework: 'jasmine',
  jasmineNodeOpts: {
    showColors: true,
    defaultTimeoutInterval: 30000,
    print: function() {}
  },

  onPrepare() {
    require('ts-node').register({
      project: require('path').join(__dirname, './tsconfig.e2e.json')
    });
    jasmine.getEnv().addReporter(new SpecReporter({ spec: { displayStacktrace: true } }));

    // TODO: Workaround for https://github.com/angular/protractor/issues/4294
    //  This can be removed once the issue is fixed
    let currentCommand = Promise.resolve();
    // Serialise all webdriver commands to prevent EPIPE errors
    const webdriverSchedule = browser.schedule;
    browser.schedule = (command, description) => {
      currentCommand = currentCommand.then(
        () => webdriverSchedule.call(browser, command, description)
      );
      return currentCommand;
    };
    // end workaround

    // TODO: Workaround for https://github.com/angular/protractor/issues/4507
    //  This can be removed once the issue is fixed
    element.map = mapFn => {
      const finders = this.asElementFinders_();
      return finders.then(arr => {
        let promise = finders.then(() => []);
        arr.forEach((elementFinder, index) => {
          promise = promise.then(result => {
            const mapResult = seleniumWebDriver1.promise
              .fullyResolved(mapFn(elementFinder, index));
            return mapResult.then(mr => result.concat([mr]));
          });
        });
        return promise;
      });
    };
    // end workaround

    browser.driver.manage().window().maximize()
    util.implicitWait(30000);
    util.pageLoadWait(30000);
  },
};

code example
beforeAll(async () => {
   	await util.loadApp(env.APP_URL);
   	await loginPage.loginApplication(USERNAME, PASSWORD);
   	await setupPage.configureApp(be, sp, pn, sn);
   	await setupPage.startApp();
   });

In this code example, util.loadApp will simply navigate to the URL. The login page / screen will work just fine as well. The setup page / screen will also work, however once it reaches the last screen to run to app, protractor can no longer interact with elements from this point on unless waitForAngularEnabled(false). This causes a problem because it forces me to use ugly waits and removes the whole benefit of using protractor in the first place.
Does anyone have any idea what could cause protractor not recognize some screens as angular and others as non-angular?

Protractor requires

window.getAllAngularTestabilities()[0].isStable()

to return true. Ensure that Your app is stable.
Check out this page for the details: https://www.protractortest.org/#/timeouts#timeouts-from-protractor

I'll do some research and report back with my findings. Thank you, baflQA.

Protractor requires

window.getAllAngularTestabilities()[0].isStable()

to return true. Ensure that Your app is stable.
Check out this page for the details: https://www.protractortest.org/#/timeouts#timeouts-from-protractor

window.getAllAngularTestabilities()[0].isStable()
returns false.
However, the getAllAngularTestabilities() object contains isStable: true under _ngZone.
I read that this is not enough for protractor, however. The object also contains hasPendingMacrotasks: true. Our devs say there aren't any macrotasks running at this point.
Ever run into this?

If angular says that there are the macrotasks Pending, then trust me, they are there even If developers say the opposite.
In my project we had a Launchdarkly macrotasks, as well as the Google maps component causing testability being not ready for 40s. Your developers should be able to find what macrotask is running quite easily.

Simple way to check is put a break on ngzone

First thing you can do is open your Dev Tools in Chrome, press Ctrl+O, type zone.js and press Enter.
This will open zone.js source file (not Typescript, yet something).
Inside zone.js look for Zone.prototype.runTask and put a breakpoint inside this method.
Enable the breakpoint after your application is loaded, otherwise it will get hit too many times.
If your Testability is not stabilizing, it probably means that you have some repetitive macro task that reschedules itself. At least that was my case.
If this is the case, the breakpoint will get hit every X time after the application is loaded.
Once the breakpoint is hit, go to task.callback.[[FunctionLocation]] this will take you to (most probably) some setTimeout or setInterval.

https://stackoverflow.com/questions/48627074/how-to-track-which-async-tasks-protractor-is-waiting-on
I am having the same issue, except I know it is caused by requestAnimationFrame and a setTimeout, but both are critical to my project, atleast RAF is.


[CORE] Add Bitblas Format/Kernel Support

@ZX-ModelCloud  rename BaseQuantizeConfig to QuantizeConfig. BaseQuantizeConfig is only used for backward compat with old AutoGPTQ users.

@ZX-ModelCloud  Make sure all new methods are properly type hinted.

@LeiWang1999

I have pushed PR to fix Bitblas as there is bad/incomplete support for gpu detection via nvidia-smi.
Using tinyllama quantized as test, the bitblas conversion and for the first layer it takes about 300s to convert and 2nd layer forward becomes very fast. is TVM caching/bitblas JIT compiling the code the layer 0 and reusing for subsequent layers?

For now, we will monkeypatch bitblas so we can get it working with this PR in our multi-gpu env.
Thanks!

Hi @Qubitium, thank you for your attention. BitBlas will take several minutes for compilation for dynamic shapes when encountering new operator configurations. The tuning results will be saved by default in the database located at ~/.cache/bitblas. Therefore, when layer 0 is initialized next time, the operator should load directly from the database, bypassing the 5-minute wait.
And feel free to make a pull request to BitBLAS for the patch of multi-gpus' detection!

And feel free to make a pull request to BitBLAS for the patch of multi-gpus' detection!

PR created https://github.com/microsoft/BitBLAS/pull/58
We will do some benchmarks on quantized llama7-8b model. If it beats out marlin, exllama v1/v2, we will use as default =)

@Qubitium Thank you for the detailed feedback and review. Regarding your query on the Bitblas disk format, I can confirm that the current BITBLAS disk format is stable, and there are no immediate plans to change or modify the format.
Moreover, bitblas maintains the interface  global_operator_cache.load_from_database(                 BITBLAS_DATABASE_PATH, BITBLAS_TARGET             ), in the event of any updates to the bitblas disk format in future release, we will update the warning message to reflect these changes as well.

I can confirm that the current BITBLAS disk format is stable, and there are no immediate plans to change or modify the format.

@ZX-ModelCloud  We are safe to move forward with refractor and add FORMAT.BITBLAS, This would not only simplify logic but actually allows much more flexibility for how bitblas is integrated moving forward.

Thanks for all of your hard efforts! @Qubitium @ZX-ModelCloud


Use of custom rules in component with parameter (vee validate)

Use of custom rule with parameter
Hi everyone,
I looked the documentation of Vee validate before asking for help here, i do have a problem with the use of custom rules with parameter. In fact, the configuration of my rules is fine but I don't find the correct syntax to make it work properly in the component with a parameter.
What should I write in the "v-validate" features of the concerned field?
Here is my rule:
import { Validator } from 'vee-validate';
Validator.extend('isBigger', (value, [otherValue]) => {
return value <= otherValue;
}, {
hasTarget: true
});
Thanks for your help,

The target rules accept a value which is the value of the ref attribute on the target field.
So in the following case:
<input type="text" name="first" v-validate="'required|isBigger:secondRef'">

<input type="text" name="second" ref="secondRef" v-validate="'required'">

Thanks for your answer but it still not work...
I changed what i have to modified as you told me:
<b-form-input ref="bottom"                     name="sampling depth bottom"                     v-validate="'isBigger:topRef| regex: /^-?\d+[.,]?\d{0,10}$/'"                     placeholder="(in cm)"                     v-model="inputSamplingDepthBot"                   ></b-form-input>                 </b-col>                 <label v-html="$t('message.descPedoContext.txtSeparator')"/>                 <b-col sm="5">                   <b-form-input                     name="sampling depth top"                     ref="topRef"                     v-validate="{regex: /^-?\d+[.,]?\d{0,10}$/}"                     placeholder="(in cm)"                     v-model="inputSamplingDepthTop"                   ></b-form-input>
And i do have the following error:


Fixed #134 Account property filter modification improvement

Issue: #134

Moved filter modification creation out of AccountPropertyTransaction.

Modification class is AccountPropertyModification

Now support both constructor creation and static method creation.
new AccountPropertyModification(PropertyModificationType, T)
or

AccountPropertyModification.createForAddress(PropertyModificationType, Address)
AccountPropertyModification.createForMosaic(PropertyModificationType, Mosaic)
AccountPropertyModification.createForEntityType(PropertyModificationType, entityType)

Pull Request Test Coverage Report for Build 363

4 of 4 (100.0%)  changed or added relevant lines in 2 files are covered.
No unchanged relevant lines lost coverage.
Overall coverage increased (+0.5%) to 79.703%

Totals

Change from base Build 352:
0.5%

Covered Lines:
1504

Relevant Lines:
1773

💛  - Coveralls

Pull Request Test Coverage Report for Build 363

4 of 4 (100.0%)  changed or added relevant lines in 2 files are covered.
No unchanged relevant lines lost coverage.
Overall coverage increased (+0.5%) to 79.703%

Totals

Change from base Build 352:
0.5%

Covered Lines:
1504

Relevant Lines:
1773

💛  - Coveralls

Pull Request Test Coverage Report for Build 363

4 of 4 (100.0%)  changed or added relevant lines in 2 files are covered.
No unchanged relevant lines lost coverage.
Overall coverage increased (+0.5%) to 79.703%

Totals

Change from base Build 352:
0.5%

Covered Lines:
1504

Relevant Lines:
1773

💛  - Coveralls


Allow appConfig to be provided as a string

Description of the Bug
Providing the value for backstage.appConfig as a string does technically work, but is not allowed by the schema.
Description of the change
Allow key backstage.appConfig to be of type object or string.
Existing or Associated Issue(s)
None
Additional Information
The template app-config-configmap.yaml uses the common.tplvalues.render helper function from the bitnami common chart.
https://github.com/backstage/charts/blob/b1d86d306a066282ceba5206ba8267f78fbbb464/charts/backstage/templates/app-config-configmap.yaml#L7-L8
That helper function supports both, string-type and object-type values.
https://github.com/bitnami/charts/blob/35bc6b1d5d87dfc3875ed09a45bffd2bddc9ee6d/bitnami/common/templates/_tplvalues.tpl#L2-L13
Checklist

[X] Chart version bumped in Chart.yaml according to semver.
[X] Variables are documented in the values.yaml and added to the README.md. The helm-docs utility can be used to generate the necessary content. Use helm-docs --dry-run to preview the content.
[X] JSON Schema generated.
[X] List tests pass for Chart using the Chart Testing tool and the ct lint command.

Thanks for the fast approval. In theory I agree with your comment about object vs. string.
But in case of the common.tplvalues.render helper using the string-typed value is a little more powerful than the object-typed. You can use the full "power" of the templating engine. We, for example, define some variables at the top to be used multiple times, like the baseUrl. You could also in- or exclude whole blocks of your configuration based on other values.
Also it was possible in the old version of the chart (we just update from 0.17.1) to use this and it is not anymore :)
Anyways. Thanks for taking care!


feat: use conventional commits format

Hi @akhilmhdh . Thanks for creating nice package.
This PR change commit message and PR title as conventional commits format to clarify the purpose of the commit.
Conventional Commits message format allows you to automate releases and changelog updates with actions that support the conventional commits format, such as https://github.com/google-github-actions/release-please-action.
Automated release example: https://github.com/google-github-actions/release-please-action/releases/tag/v3.2.9
If you have any plans not to use conventional commits, please close this PR.

Hey @shufo. That's a really good suggestion that I ended up missing. Thank you for your contribution.


Added durable support in the config file

This adds support for non-durable messages, etc.

I created a PR for https://github.com/phatboyg/RestBus.Benchmarks that sets the prefetch count to 50 and the default thread setting to 10. Different thread levels will still be tested.
Please merge it if it looks good to you, and I'll merge the upstream PR.


Hide UserError behind a trait object

while it's good to get rid of those generics, one thing is that despite it's a cold path in general case, malicious user can make custom error a hot path and force a lot of allocations

malicious user can make custom error a hot path and force a lot of allocations

Yep, I thought about it but it seemed to me as not a big deal. If we are talking about Parity embedding, then attacker probably could make only 1 allocation per each transaction. Seems to me pretty bounded!
Isn't it will be easier to just blow up the stack for example?


Custom pipeline step names not processed and child router steps cause child router failure

Using the skeleton as a base started using some of the addPipelineStep features, but with error or unexpected behavior occurring even using a simple step such as...
class SomeStep {
run(routingContext, next) {
console.log('Running Step');
return next();
}
}
On the parent router the only steps that appear to work are 'authorize' and 'modelbind', the documentation states that any name can be passed in but they don't appear to get called unless they use the two names, For example a step attached with 'myStep' doesn't appear to actually get called. Adding three "authorize' steps does result in 3 calls.
Then creating a child router with a pipeline step applied simply fails to initialize that class. "ERROR [app-router] Router navigation failed, and no previous location could be restored." and the child router fails to load.

Updating to 10.2 give a more usuable error that steps applied to children router is not supported, although it seems like this should be an option.
10.2 still results in custom step naming to not work as suggested by documentation.

As I've replied to you on gitter, you've misunderstood how custom pipeline steps work. First of all, it's by design that they are never to be added to child routers. This is due to several reasons. For once, it's generally not really practical to do at all, given that the routes are loaded during the pipeline (so, long after it's built). How you make sure that your pipeline steps only run in certain places is to add constraints to them, so they simply don't do anything when they aren't supposed to.
An excellent example of this is the authorize pipeline steps. They typically deny you access to any route that requires you to be authorized, but if the route doesn't require you to be authorized, it doesn't do anything at all.
Next, the names are simply "holes" in the pipeline where you can insert your own pipeline steps (with ease, and without having to deal with step indexes that might change without you knowing it). You can see the defined named steps here: https://github.com/aurelia/router/blob/master/src/pipeline-provider.js#L18-L30
If you add a step with any other name, it will simply be added to a list of named steps, but not included in any pipeline, because there is no named steps that has the same name. What addPipelineStep('authorize', MyStep) does is not add a authorize step, it adds a generic pipeline step (that can do anything) in the authorize slot (and you can have multiple of them). The names are just a convenience to make it easier to get the steps to run in the right order (which is quite important).

Based on Alxandr's comments it turns out this is all possible as the main router does fire on child router navigation and it is possible to access things from the child router from the parent. It is just not as simple as being able to apply steps directly to child routers as you do the patent router.

Those pre-defined names need to be in the documentation. Even if someone managed to find the page where the documentation for those step names could/should be, the steps names are not there (as of the date of this comment).
http://aurelia.io/docs.html#/aurelia/router/1.0.0-beta.1/doc/api/class/RouterConfiguration


Error in localStorage.getItem()

Since v3.6 I've got this messages in logs: Error in localStorage.getItem().
I don't know what is going wrong but localStorage is working fine I guess.

Oh, this just means localStorage can't find your item requested, I will fix the log message


How change layout title

How I change the layout title?
I render my layout and can't change the title.
Flight::render('layout', array('title' => "Home"));

when I try change nothing happens
Flight::route('/login', function(){
      Flight::render('pages/login', array('title' => "Login"));
});

and my html:
<head>
	<title>MKPlace - <?php echo $title; ?></title>
	<link rel="stylesheet" href="/css/bootstrap.min.css">
	<link rel="stylesheet" href="/css/app.css">
</head>

1. You have correct .htaccess file?
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php [QSA,L]

2. You need to set correct folder root.
For example:
Flight::render('../pages/login', array('title' => "Login"));
Or by the views path (recommended):
Flight::set('flight.views.path', 'pages/');
(...)
Flight::render('login', array('title' => "Login"));

L ;)

I have correct .htaccess file and correct root folder. The unique difference, is my architecture.
My views folder:
/views

layout.php
navbar.php
footer.php
/pages
-- login.php
-- etc.php

I need set all views folders or i can't create a directory?
Thanks!

Examples of use for your folder structure:
<?php

	require 'flight/Flight.php';

	Flight::set('flight.views.path', 'views/');

	Flight::route('/login', function(){
	  Flight::render('pages/login', array('title' => "Login"));
	});

	Flight::start();

?>

L ;)

@imbr not working..
layout.php
<head>
		<title>Site - <?php echo $title; ?></title>
</head>

index.php
Flight::set('flight.views.path', 'views/');
Flight::render('layout', array('title' => "Home"));

Flight::route('/login', function(){
    Flight::render('pages/login', array('title' => "Login"));
});

The title continue "Home"... :(

@Iazzetta When you call render, it sends the output immediately. So if you render layout first and then pages/login it won't change anything. You need to render the layout last, after you render all your page content. See http://flightphp.com/learn/#views.

Oh nice, so I need render layout.php in each route? For me works. Thanks!
Flight::route('/login', function(){
    Flight::render('pages/login', array('title' => "Login"));
    Flight::render('layout', array('title' => "Home"));
});

Flight::route('/home', function(){
    Flight::render('pages/home', array());
    Flight::render('layout', array('title' => "Home"));
});


Update kentico-cloud-delivery to 5.x.y

We should update to latest kentico-cloud-delivery sdk version.

Great - I have checked whether there is no breaking change in v5 version and haven't found anything.


Update ListMultipartUploads to prevent leaking other users' upload IDs

Follow-up to https://github.com/Alluxio/alluxio/pull/16162

If there's an exception thrown in the constructor, I intentionally want the Proxy process to crash. That metadata directory is necessary for the S3 API to function. As for clean-up, I 100% agree.

I see, just want to make sure the information is surfaced to the user when they have a crash instead of getting swallowed(and logged) by Jakarta.

alluxio-bot, merge this please

so with this change there's no user who could have a view for all mp uploads in a bucket? ( a global list-multipart-upload scenario) ?


chore: FAM renovate babysit

Renovate prs babysit.
Acceptance Criteria

[x] Verify and close some renovate PRs.

Additional context

Below renovate PRs are verified, merged and closed:

chore(deps): update dependency authlib to v1.3.1 [security] #1446
chore(deps): update sqlalchemy #1553
chore(deps): update github actions all dependencies #1567
chore(deps): update boto to v1.35.5 #1554
fix(deps): update dependency axios to v1.7.4 [security] #1528


Feature request

Add variable or device state substitution when specifying a message payload.
eg.
{"cmd":6, "gw_id": "5150D91D004B1200",  "dev_id": "%%d:DEVID:STATEID%%",  "duration": %%v:VARID%%}

Try https://github.com/FlyingDiver/Indigo-Shims/releases/tag/2022.1.0

I tested variable substitution. Worked fine. I have not tested device states.
Thanks!

On 27 Oct 2022, at 02:11, Joe Keenan @.***> wrote:
Try https://github.com/FlyingDiver/Indigo-Shims/releases/tag/2022.1.0 https://github.com/FlyingDiver/Indigo-Shims/releases/tag/2022.1.0
—
Reply to this email directly, view it on GitHub https://github.com/FlyingDiver/Indigo-Shims/issues/27#issuecomment-1292796553, or unsubscribe https://github.com/notifications/unsubscribe-auth/AAZLU4KEDSCU5WDCFAJAFHDWFHCCXANCNFSM6AAAAAARPG4UBE.
You are receiving this because you authored the thread.

That was my assumption 😉

On 27 Oct 2022, at 15:22, Joe Keenan @.***> wrote:
They're both done by the same call to the plugin base class, so if one works the other will also.
—
Reply to this email directly, view it on GitHub https://github.com/FlyingDiver/Indigo-Shims/issues/27#issuecomment-1293519611, or unsubscribe https://github.com/notifications/unsubscribe-auth/AAZLU4LQJH5R4WT2Y4XPXPTWFJ6YFANCNFSM6AAAAAARPG4UBE.
You are receiving this because you authored the thread.


Java 8 support

This is an enhancement, it would be great to have Java 8 support with the runtime environment. I love the app so far and this is the only thing stopping me from using my iPad  as my main development machine.

Hello. That’s a really great suggestion. It’s indeed possible to cross compile JDK for iOS.
Hopefully I will be able to include it in the near feature.

Local Java is now available in the latest TestFlight build. You can use java and javac to run Java programs locally.

Thanks so much, really glad it could be done and that we can now use ipads
for java development, thank you all.
El dom, 7 ene 2024 a las 22:21, Chung Shing Hin @.***>)
escribió:

Closed #60 https://github.com/thebaselab/codeapp/issues/60 as completed.
—
Reply to this email directly, view it on GitHub
https://github.com/thebaselab/codeapp/issues/60#event-11413105756, or
unsubscribe
https://github.com/notifications/unsubscribe-auth/AJDFLAU2KD5GKFZYNDPGC6LYNNX6PAVCNFSM4ZV6UML2U5DIOJSWCZC7NNSXTWQAEJEXG43VMVCXMZLOORHG65DJMZUWGYLUNFXW4OZRGE2DCMZRGA2TONJW
.
You are receiving this because you authored the thread.Message ID:
@.***>


External App support

query Ongoing App Installations
InstallApp mutation
job for handling app installation
retryInstallApp mutation
dropFailedInstallation mutation
extend App model by new fields

App installation via API

Installation job flow

@mirumee/saleor-core  Ready to review!


OneClick download/delete log files (#65)

@rus-daniel silencing errors is discouraged, son don't use @ ;)

@rus-daniel Did you check my comment about the missing of the image OYST

@StefBrito I leave you valid this PR again ;)

It is working for me approved


open-metadata-labs: all functions in environment-check with "WithDebug" suffix miss core functionality

For example all functions that should return values, don't return anything only print the request and response

this has been fixed (thanks)


Update README.md

Added Descriptions, App, Website, Twitter, Discord and Telegram links for a bunch of projects
Added Evmos.info under other ecosystem resources
42T twitter account changed to https://twitter.com/4T2Finance
Essos removed, twitter account suspended
Evolidly removed, no activity
Lunarlabs removed, no activity
Fantastic swap removed, no activity
Luner Labs - removed, no activity, website down
metalancer removed, no activity on twitter, website full of anchors with no content
PlantDex removed, no activity on twitter, name changed to abc, no website or discord
PlasmaFinance removed, twitter account deleted
Midas Capital, removed twitter account deleted
Evmosians removed, website goes to host's landing page

No worries, thanks for the updated info. I will close this PR and open a new one with Midas and FantasticSwap


Reassessment Workflow

Work with Robin to create workflows for Reassessments
Scenarios Include:

[ ] How do we get from Institution OR Student 'Report a Change' to Reassessment
[ ] How do we get from 'Edit Program / Offering' to Reassessment
[ ] Any other Priority Scenarios?
[ ] Determine the Outcome of the Reassessment ( What Happens?)  Overaward? Restriction?

https://app.zenhub.com/files/319429847/1e2bb991-1192-44be-90dc-5d6184bcba19/download

https://app.zenhub.com/files/319429847/5ce7ee59-3d2a-40a4-bb8e-c3a9f4a68b28/download

Latest version for review is attached.

Old restriction - APPC (Application Cancel / Hold)


Merge pull request #2 from myesui/master

Update

Coverage remained the same at 100.0% when pulling 5e07b16ababfb5364e4cb1ccbe73b3ee7116d173 on twinj:master into 15769b0f68a2cec1119a7502ffe23ee5d6b95dd6 on myesui:master.


Tag 8.4.0 requires tf13?

In the project description there's a statement that the terraform v12 users should pin to module v8, however the latest tagged release is specifying tf13 as requirement in versions.tf?
Is there some reason for it or was that just oversight during backporting?

Diff for history of versions file:
https://github.com/trussworks/terraform-aws-logs/commits/v8.3.0/versions.tf
https://github.com/trussworks/terraform-aws-logs/commits/v8.4.0/versions.tf
Obviously the best thing would be to upgrade TF version, however I'm not sure how quickly I can do that for the project and I just wanted to add few modules from here.

So digging into Git log seems to point to rather simple problem - while 8.3.0 == terraform12 branch, PR #120 added a tag for 8.4.0 on the master branch...

Yeah, it was mistakenly released off of master instead of the terraform12 branch. I think I fixed this in the 0.8.5 release. Let me know if it doesn't work.

Any update on this?

Thanks for the quick solution! I have only validated the solution by code review - I have already migrated the code to TF13 instead.


DeCONZ long release or hold commands not working

Describe the bug
The DeCONZ events received by the remotes don't seem to work properly, I can only get "short release" (short press) events, while "long release" and "hold" seem to be flaky, I managed to trigger a long release event only once.
I'm sure it's a bug with this package because the same events work just fine if controlled using the built-in Home Assistant automation scripts.
To Reproduce
Steps to reproduce the behavior:

Read a deconz_event from the events: all node
Log all the msg.payload.event.event codes using debugger
Notice how, after long pressing the detected events are only ending with 2 (short release)

Expected behavior
All the deconz event should be detected
Screenshot

Example Flow
[
  {
    id: "e9415866.e8e818",
    type: "server-events",
    z: "20911376.3811fc",
    name: "Home Assistant",
    server: "a513c2af.8fb5c",
    x: 240,
    y: 480,
    wires: [["d064837b.5c32e"]]
  },
  {
    id: "5ed9b78f.5f6e08",
    type: "debug",
    z: "20911376.3811fc",
    name: "",
    active: true,
    tosidebar: true,
    console: false,
    tostatus: false,
    complete: "payload.event.event",
    x: 690,
    y: 480,
    wires: []
  },
  {
    id: "d064837b.5c32e",
    type: "function",
    z: "20911376.3811fc",
    name: "is deconz event",
    func:
      "if (msg.event_type === 'deconz_event') {\n    return msg\n}\nreturn null;",
    outputs: 1,
    noerr: 0,
    x: 440,
    y: 480,
    wires: [["5ed9b78f.5f6e08"]]
  },
  {
    id: "a513c2af.8fb5c",
    type: "server",
    z: "",
    name: "Home Assistant",
    url: "https://<IP_ADDRESS>:8123",
    pass: "xxxxxxx"
  }
];

Environment (please complete the following information):

Node Red Version: 0.18.5
NR Home Assistant Plugin Version: 0.3.2
Is Node Red running in Docker:no

Other (please complete the following information):

Have you searched previous issues for duplicates?: yes
Did you attempt to reproduce the issue in the dev docker environment, if so what were results (See README.md): no

Additional context
The below Home Assistant action works just fine, as you can see it's listening for the 2001 event (button hold)
- action:
  - data_template:
      brightness: 255
      entity_id: light.kitchen
    service: light.turn_on
  alias: Brighten to max kitchen lights
  condition: []
  id: '1519727307662'
  trigger:
  - event_data:
      event: 2001
      id: kitchen_remote
    event_type: deconz_event
    platform: event
  hide_entity: true

Are you using Lutron Connect Bulb Remotes?

Nope it's the Ikea Remote. Lately it started to work more reliably, at least for the "long press", the "hold" still doesn't work tho

Hmmm. I have the Lutron if you couldn’t guess. Let me post my flow in the morning that I’ve been using. It works...okay-ish.
Jonathan Weinberg

From: Federico Zivolo<EMAIL_ADDRESS>Sent: Saturday, May 26, 2018 3:52:29 AM
To: AYapejian/node-red-contrib-home-assistant
Cc: Jonathan D Weinberg; Comment
Subject: Re: [AYapejian/node-red-contrib-home-assistant] DeCONZ long release or hold commands not working (#72)
Nope it's the Ikea Remote. Lately it started to work more reliably, at least for the "long press", the "hold" still doesn't work tho
—
You are receiving this because you commented.
Reply to this email directly, view it on GitHubhttps://github.com/AYapejian/node-red-contrib-home-assistant/issues/72#issuecomment-392244550, or mute the threadhttps://github.com/notifications/unsubscribe-auth/ACDTU9_e9fbOaJrQGHRczrsPGmoxn0f-ks5t2Qm9gaJpZM4T6O5w.


Genetic algorithm modularization

GA must be made so operators & parameters are easily exchangeable.
Consider using pipeline (chain of responsibility) design pattern.
We also need to generalise the implementation, so that not only real-valued genes are supported.

Closing as this sisue is outdated & replaced with more specific ones.


Convert image to grayscale

I'm new to crystal. I tried to use stumpy_png to convert an image to grayscale. The code I created looks like this:
require "stumpy_png"

canvas = StumpyPNG.read("image.png")

(0...canvas.width).each do |x|
  (0...canvas.height).each do |y|
    color = canvas[x, y]
    g = 0_u32
    g = (g + color.r + color.g + color.b) / 3
    canvas[x, y] = StumpyPNG::RGBA.from_gray_n(g, 16)
  end
end

StumpyPNG.write(canvas, "output.png")

Note: I know that grayscale convertion is a bit more complicated than the average value of 3 colors, but this is a simple example.
As you can see, the code looks very complicated. It seems that I cannot assign the value to the color directly (canvas[x, y].r = 0 doesn't work), so I need to assign the color to a variable and then create a new color. I also need to specify the type of the grayscale value (UINT32), otherwise I get incorrect values for bright colors. Moreover, the performance is very unsatisfactory (a full HD image was converted in around 4s).
All this makes me think that I'm doing something wrong. I found some occurences of the term 'grayscale' in stumpy_png repo, but I don't really know how to use it. Could you please provide an example of how to correctly (that is: efficiently and maybe in a less verbose way) solve this problem?
Some things I would like to know are:

is there a predefined grayscale filter in stumpy_png?
can I write a color directly (without creating new RGBA object)?
is there an easier way to apply an operation to each pixel?

Hi,
I'll try to answer your questions in order:

When creating this lib (and stumpy_gif),
I tried to come up with some kind of base infrastructure
for canvases and colors (stumpy_core)
so the functionality is very minimal (basically setting & getting pixels + creating colors),
so what you are doing is pretty much the best way ;)
Color filters would definitely be useful,
but I'm not sure in what part of this abstraction they would belong

In crystal there are classes (like in Java / Ruby / etc. ) and structs,
structs are immutable but allocated in a different way
which makes them (in most cases) much faster,
so I chose to implement the canvas as a class
and the single colors as structs.
As a result every time you "change" a color,
you need to create a new object.

Currently not.

About the bad performance:
Can you upload the image your are using somewhere
or tell me its dimensions so I can do some benchmark?
Are you compiling your program with the --release flag?
If not, maybe that will make it a lot faster.
Possible solutions:
Maybe it is possible to implement the Enumerable
interface for the Canvas class, so it could provide
methods like canvas.map!(&block).
canvas.map! do |color|
    g = (g + color.r + color.g + color.b) / 3
    StumpyPNG::RGBA.from_gray_n(g, 16)
end

Additionally, if you come up with a nice function to convert colors to grayscale,
I could add it to the RGBA struct, so the above code could be simplified even more:
canvas.map!(&.to_grayscale)

(map!(&.to_grayscale) is equivalent to map! { |c| c.to_grayscale })
Would you find those changes useful?
If so, would you like to try to implement them yourself
and open up a pull request or shall I do that?

Thanks for the --release flag hint, now the program runs in around 1s :) Still, a program in Python runs in 0.2s for the same image:
from PIL import Image

im = Image.open('image.png')
im_gray = im.convert('L')
im_gray.save('output.png')

As I mentioned, the image size is full HD (1920x1080). Here it is:

I am disappointed by the performance. I guess it is the result of using colors as structs and creating a new one for each pixel.
Please don't get me wrong. Your shard creates a very useful abstraction for images, and it's great that you help Crystal community by creating tools like this one. But still, Crystal was supposed to be efficient like C while still having a high level syntax like Ruby (I am not a Rubyist, but I could appreciate a language with both these advantages). It seems however that, at least in this case, Crystal is neither high level (the code is quite verbose) nor efficient (compared with Python, which is supposed to be slower than anything you can compile!).
Let's leave the verbosity of the code for a moment. Do you think something can be done here about the performance? Some preferably small change to stumpy_png itselt or to my code that would boost it up a bit?
Regarding your question, for the moment I don't want to create a PR for grayscale function, since I want to focus on improving the performance of my solution (not the readability).

I inserted some code to get the elapsed time after each of the operations
(t1: load image, t2: convert to grayscale, t3: save image)
and it seem like the most time is wasted loading and saving the image
Crystal:
t2 - t1 # => 00:00:00.4599181
t3 - t2 # => 00:00:00.0112788
t4 - t3 # => 00:00:00.2979503

Python:
0.11043930053710938
0.052173614501953125
0.08035922050476074

This is not very scientific but by the looks of it,
the grayscale conversion in crystal is faster than the one in python.
On the other hand loading and saving the image is much faster in python,
maybe PIL uses bindings to libpng or their code is more efficient.
Additionally the output png of the python version is only ~240kb in size
and stored in the 8bit grayscale png format,
this shard currently only supports writing images in 16bit rgb+alpha format,
so the resulting size is ~830kb.

Your measurements seem to be consistent with my observations. Initially I was printing the width and height of the loaded image (to check if the loading process was successful) and it took a moment for the output to appear. So it seems that the loading process itself takes a lot of time.
Your shard is one of two that enable image processing. The other one still has TODO in the readme file :) Also, your project is the only one listed here, so that makes you the author of the most popular Crystal image processing lib :)
Crystal is already 2 years old (5 if you count the initial version). I don't have much experience with young programming languages, but I thought that the number of available tools would be higher at this stage of development. Perhaps I was wrong and it takes more time. Or perhaps I chose the wrong topic (I guess HTTP server is something that Crystal programmers need more and it would be more intensively developed).
I just wanted a quick dive in Crystal to check how it works, how the code looks like and what is the performance. It seems though that this language is a bit too young to be fully useful. I've had some issues with installing shards, and now the most popular image processing lib turns out to be in a very early stage of development. It seems that Crystal is still a language that needs a lot of contributions. I might help in the future, but that was not the purpose of this little experiment.
Thank you very much for your help and quick answers! It seems that great community is something that Crystal does not lack :) I hope that you will continue working on this lib and make it faster and easier to use than PIL :)

Wow, judging from some comments in the source code
PIL is seems to be more than 20 years old.
I guess these kinds of performance optimizations
just take time (or manpower), I'm pretty new to the language myself,
maybe there are some performance tricks I don't know of (yet).
Some Benchmarks
Because stumpy_png can only write 16bit-RGBA images,
I used one as a input, too.
Go image/png

reading: 110ms
writing: 650ms

The resulting file is a 16bit-RGB image, ~800kb
Python Pillow

reading: 90ms
writing: 360ms

The resulting file is a 8bit-RGBA image, ~720kb
Crystal stumpy_png

reading: 680ms
writing: 320ms

The resulting file is a 16bit-RGBA image, ~1100kb
Ruby chunky_png

reading: 2200ms
writing: 1600ms

The resulting file is a 8bit-RGB image, ~660kb
Ruby oily_png

reading: 110ms
writing: 320ms

The resulting file is a 8bit-RGB image, ~660kb
So the writing speed is actually not that bad,
I only need to find out why reading takes so long...
Possible solutions

Make reading faster
Allow writing other png color types (hard)

(It seems @l3kn beat me for a few seconds :-D)
@pfertyk Hi! I've profiled your program and timed each of the parts (read, transform, write), here are the results:
Read: 427.93ms (61.14%)
Transform: 15.98ms (2.28%)
Write: 256.06ms (36.58%)
Total: 699.96ms

That means that transforming the PNG isn't the bottleneck. I didn't think it was because an RGBA is a struct of four UInt16, so in total it's 64 bytes so it's a word and passing that around should be very fast.
We still need to optimize the read and write parts. I believe it's possible, I think there are many intermediate memory allocations that could be avoided. As with every language, you can write slow code in it, using a language doesn't guarantee good efficiency.
I'll try to see how this can be done (I really like optimizing programs and efficient code, and I really enjoy programs where you can see something nice as the output, such as an image ^_^)

After this comment (by @l3kn) I had no doubt that the processing itself is not a problem here. But the problem for me (as a developer) is that the library does not perform as well as expected. It doesn't matter if the problem is processing the image or reading/writing it. I wanted to convert images efficiently and I couldn't do it.
That is nothing that a good contributor couldn't fix, of course :) I can't wait to see how stumpy_png will work after your modifications, @asterite. Image processing is a domain that could really benefit from high performance.

Now there are some ways to make the code a bit less verbose
require "stumpy_png"

canvas = StumpyPNG.read("image.png")

canvas.map! do |color|
  g = (color.r.to_u32 + color.g + color.b) / 3
  StumpyPNG::RGBA.new(g.to_u16)
end

StumpyPNG.write(canvas, "output.png")

and (thank to @asterite) the performance is a lot better.

@l3kn Nice!
Would it help to have a to_gray method on RBGA that does that? That way you could do:
require "stumpy_png"

canvas = StumpyPNG.read("image.png")
canvas.map! &.to_gray
StumpyPNG.write(canvas, "output.png")

That way all the "verbosity" would be gone and it would be almost the same as the python version. I don't know if to_gray makes sense by itself, though, mostly because of the note in the first comment in this thread:

Note: I know that grayscale convertion is a bit more complicated than the average value of 3 colors, but this is a simple example.

@l3kn I tried your code, but I got this error:
$ crystal build --release file.cr
Error in ./file.cr:3: instantiating 'StumpyPNG:Module#read(String)'

canvas = StumpyPNG.read("image.png")
                   ^~~~

in ./libs/stumpy_png/stumpy_png.cr:9: instantiating 'StumpyPNG::PNG:Class#new()'

    png = PNG.new
              ^~~

instantiating 'StumpyPNG::PNG#initialize()'

in ./libs/stumpy_png/stumpy_png/png.cr:39: undefined constant IO::Memory

      @idat_buffer = IO::Memory.new
                     ^~~~~~~~~~

Could you help me with this?

Which crystal version are you using?
IO::Memory was added with 0.20.0 (as far as I know)
which is pretty new, so hopefully a update would fix your error.

That was it, thanks! The code works and takes around 0.48s to execute.
I've got to say, I'm impressed. In just a few days you guys doubled the speed and improved the readability of the code. Crystal has a really amazing community :)
Do you think it would be possible to make this program work faster than the one in Python (so less than 0.2s)? It is a bit weird for a compiled language to lose the speed competition with Python ;)

@asterite One of the next features I'd like to implement
would the ability to save images in different color types and bit depths
(currently only RGBA with 16bit is supported).
This would require methods like .to_gray etc,
so (unless someone wants to have this right now)
I'd add all of that in one go.
@pfertyk Thanks!
I'm pretty sure it is possible (and going to happen soon) ;)
One of the reasons the python version is faster
is that it supports writing images as RGBA 8-bit and grayscale
so the amount of bytes it has to process when writing
is a little bit lower.
If I take out the grayscale conversion in both programs
the python one runs in 0.400s (and outputs RGBA-8bit instead of 16bit)
and the crystal one in 0.480s, so depending on what you are doing
with the images in your program, the speed difference might not be that great.

@pfertyk Also remember that PIL (or Pillow, as I understand) has most of the core of the processing code written in C. Check the project, click on the colored bar bellow "commits", "branches", etc, you'll see:  Python 59.2%,  C 39.8%, etc. The conversion code is here. So this is Crystal vs. C, really, so it's no wonder C is faster right now, specially with 15 years ahead of us :-)

I added the ability specify the color mode and bit depth of the resulting image,
now all you need to do to get a grayscale image is:
require "stumpy_png"

canvas = StumpyPNG.read("image.png")
# No need to convert to grayscale here
StumpyPNG.write(canvas, "output.png", color_type: :grayscale, bit_depth: 8)

The python version seems to be using some other method (not averaging red, green and blue)
to calculate the grayscale value and outputs a smaller (file size) image
but besides that the results are pretty much the same (in terms of png file types).
The updated (very scientific) benchmarks are:
Crystal

read: 140ms (90ms if the input image has a color depth of 16)
transform: 0ms (done when writing)
write: 40ms
total: 180ms (130ms if the input image has a color depth of 16)

Python

read: 90ms
transform: 50ms
write: 80ms
total: 220ms

So the crystal version is now (for this specific use case)
faster than the python version :boom:


Add rpm builder for VMware Photon OS

Signed-off-by: Fabio Rapposelli<EMAIL_ADDRESS>

Job: Docker-PRs-WoW-TP4 FAILED
Here are what we parsed from the logs at https://jenkins.dockerproject.org/job/Docker-PRs-WoW-TP4/744/consoleText as the failures:

---
70c646c.
+ ec=125
+ set +x

----------------------------------
ERROR: Failed to build test binary
----------------------------------

-----------------------------------------------
ERROR: Failed with exitcode 125 at Mon Feb  8 17:06:40 CUT 2016.
-----------------------------------------------

INFO: Tidying up at end of run
INFO: Nuking /d/CI
INFO: Zapped successfully
INFO: End of cleanup
INFO: Ended at Mon Feb  8 17:06:40 CUT 2016 (1m 2s)
Build step 'Execute shell' marked build as failure
[PostBuildScript] - Execution post build scripts.
[docker] $ sh -xe D:\temp\hudson7324030351366316638.sh
+ set +e
+ set +x
INFO: End of cleanup
Notifying endpoint 'HTTP:https://leeroy.dockerproject.org/notification/jenkins'
---

/cc @tianon, @jfrazelle

is there a reason why we should support this now or can we wait for GA

Agreed, I'd prefer to wait for a stable/GA release before merging this.

I'm going to close, thanks so much, hope its soon!


fix(tower-plugin): add protocol and port for global whitelist

Codecov Report

Merging #332 (179c236) into main (96eb9e1) will decrease coverage by 0.12%.
The diff coverage is 66.66%.

@@            Coverage Diff             @@
##             main     #332      +/-   ##
==========================================
- Coverage   63.78%   63.65%   -0.13%
==========================================
  Files          41       41
  Lines        7171     7154      -17
==========================================
- Hits         4574     4554      -20
- Misses       2209     2214       +5
+ Partials      388      386       -2

Impacted Files
Coverage Δ

plugin/tower/pkg/controller/policy/controller.go
83.55% <66.66%> (+1.44%)
:arrow_up:

pkg/agent/controller/policy/policy_controller.go
74.74% <0.00%> (-4.05%)
:arrow_down:

pkg/agent/controller/policy/cache/group.go
75.91% <0.00%> (-2.19%)
:arrow_down:

pkg/agent/datapath/multiBridgeDatapath.go
59.89% <0.00%> (-0.88%)
:arrow_down:

pkg/controller/group/group_controller.go
72.02% <0.00%> (+1.08%)
:arrow_up:


[riscv] Implement system timer

Hi @vvaltchev
Sorry to upload so many PR at once, but basically they are little things like timer, rtc..., which are relatively simple and do not affect others, so I chose to upload them at once;
The last PR is the syscall part, which changes slightly more than the previous PR. After this PR merged the riscv64 porting work is basically complete.

No problem, the smaller changes are better.


aaa

 Thank you for your submission, we really appreciate it. Like many open source projects, we ask that you sign our Contributor License Agreement before we can accept your contribution.:x: ryyaeg sign nowYou have signed the CLA already but the status is still pending? Let us recheck it.


Add support for full "Serving over HTTP" spec

Currently only POST requests are routed: https://github.com/spring-projects-experimental/spring-graphql/blob/d7f3aa6fa9e67905d81aa9a7a51006f4eb283d4a/spring-graphql-web/src/main/java/org/springframework/boot/graphql/WebMvcGraphQLAutoConfiguration.java#L51-L55
It would be nice to support the full spectrum as stated on https://graphql.org/learn/serving-over-http/

Serving over HTTP
HTTP is the most common choice for client-server protocol when using GraphQL because of its ubiquity. Here are some guidelines for setting up a GraphQL server to operate over HTTP.
Web Request Pipeline
Most modern web frameworks use a pipeline model where requests are passed through a stack of middleware (AKA filters/plugins). As the request flows through the pipeline, it can be inspected, transformed, modified, or terminated with a response. GraphQL should be placed after all authentication middleware, so that you have access to the same session and user information you would in your HTTP endpoint handlers.
URIs, Routes
HTTP is commonly associated with REST, which uses "resources" as its core concept. In contrast, GraphQL's conceptual model is an entity graph. As a result, entities in GraphQL are not identified by URLs. Instead, a GraphQL server operates on a single URL/endpoint, usually /graphql, and all GraphQL requests for a given service should be directed at this endpoint.
HTTP Methods, Headers, and Body
Your GraphQL HTTP server should handle the HTTP GET and POST methods.
GET request
When receiving an HTTP GET request, the GraphQL query should be specified in the "query" query string. For example, if we wanted to execute the following GraphQL query:

{
  me {
    name
  }
}

This request could be sent via an HTTP GET like so:

http://myapi/graphql?query={me{name}}

Query variables can be sent as a JSON-encoded string in an additional query parameter called variables. If the query contains several named operations, an operationName query parameter can be used to control which one should be executed.
POST request
A standard GraphQL POST request should use the application/json content type, and include a JSON-encoded body of the following form:

{
  "query": "...",
  "operationName": "...",
  "variables": { "myVariable": "someValue", ... }
}

operationName and variables are optional fields. operationName is only required if multiple operations are present in the query.
In addition to the above, we recommend supporting two additional cases:
If the "query" query string parameter is present (as in the GET example above), it should be parsed and handled in the same way as the HTTP GET case.
If the "application/graphql" Content-Type header is present, treat the HTTP POST body contents as the GraphQL query string.

This is similar as also added to https://github.com/graphql-java/graphql-java-spring via https://github.com/graphql-java/graphql-java-spring/issues/4.
That support all the Serving over HTTP cases already: https://github.com/graphql-java/graphql-java-spring/blob/c6606f624d98b0835e719e0d48ab7223b141cd19/graphql-java-spring-webmvc/src/main/java/graphql/spring/web/servlet/components/GraphQLController.java#L45-L135 (just like Micronaut also does).

Just to make sure I'm not missing anything, the goal here is to support HTTP GET with query parameters, correct?

A HTTP POST could also be with query params

In addition to the above, we recommend supporting two additional cases:
If the "query" query string parameter is present (as in the GET example above), it should be parsed and handled in the same way as the HTTP GET case.
If the "application/graphql" Content-Type header is present, treat the HTTP POST body contents as the GraphQL query string.

Hi @marceloverdijk,
do you know some specific clients or use case which rely on GET, application/graphql or query param requests.
Thanks

There is no spec I think but a draft in progress.

We agree that supporting the full spec is the goal.
But as the spec is still being developed we will quite likely only support the POST+JSON until the spec is released.
For others who will reach this Issue: If you are blocked because your client require GET or something else, please comment here and we will reevaluate. Thanks!

Fair enough.
You have probably more inside info but is there work done on an official spec in this area?
Until now I always looked at https://graphql.org/learn/serving-over-http/

@marceloverdijk there is a dedicated Repo with a dedicated WG for formalizing a spec: https://github.com/graphql/graphql-over-http  There is also a slack channel graphql-over-http in the GraphQL slack.
As always it is an open process and everybody who wants to contribute can do so,

I'm closing for now as we have no immediate plans to do it, but we can always revisit and re-open.

Just to cross post our caching use case for GET from https://github.com/graphql/graphql-over-http/issues/123#issuecomment-1144636356 :

We rely on GET for queries that don't contain mutations in order to support caching via cache-control and etag, both in edge caches and on clients.
Much as I'd prefer just use POST everywhere, which avoids long URL limitations, it's extremely difficult to do caching of POST responses at both these layers. Clients that follow the HTTP spec will refuse to reuse POST responses, and only some edge caches/CDNs allow caching (for example, with enough configuration Varnish and Akamai do, but AWS CloudFront does not).

If anyone's looking for supporting GET requests in Spring for GraphQL I made a relatively naive implementation:
https://gist.github.com/maciejwalkowiak/3d1f251da7f18dc090cad53518da8409
Naive, because does not reject GET requests containing mutations.


Where does this proposal stand?

I couldn't help but notice it's not in that list, the issues seem active - where does this proposal currently stand with the process?

Stage 1.  I'll send a request to update that list later today.

Awesome, thanks.


update the proteinpaint-client version to 2.69.1-0

Description
Features:

OncoMatrix and GEC: allow to recompute term shown in continuous mode as zscore
OncoMatrix: enable edit option for geneVariant terms
OncoMatrix: handle custom matrix geneset input option
OncoMatrix: support overall survival data
OncoMatrix: allow gene expression term to pull data on all cases
GEC: allow the drag/drop of rows from non-clustered row groups
GEC: when screening user-defined gene sets, use a close-to-zero min_median_log2_uqfpkm parameter to keep more genes expressed at low level
GEC: allow switching to other color scheme for heatmap

Fixes:

OncoMatrix: hover/click menu over geneexp/metabolite rows should indicate term type, and do not show undefined for missing data
GEC: speed up top variably expressed genes query from gdc api, directly submit case filter and do not first retrieve list of cases
GEC: fix the error with group Add_Rows UI, which can only add compatible terms
GEC: allow GDC gene exp scatter plot to show case name
GEC: refactored not to pretend geneVariant term type
GEC: set missing term type based on data type
Barchart: pass filter0 in barchart request to work for gdc data
Violin: fix error when clicking labels on violin plot breaks
SingleCell native gene exp data is loaded from rds file; no longer grep

General:

may handle geneExpression and metabolite as float terms

Devops:

Improve OncoMatrix non-ci test to include gene expression and survival, and CNV-only cohort

Checklist

[ ] Added proper unit tests
[ ] Left proper TODO messages for any remaining tasks
[ ] Scanned for web accessibility with aXe, and mitigated or documented
flagged issues

Screenshots/Screen Recordings (if Appropriate)

@craigrbarnes please let me know if I can help fix the gitlab CI failure

@craigrbarnes please let me know if I can help fix the gitlab CI failure

It's our CI pipeline timing out. I re-ran it, and it was completed without errors.


Fixes #1763

It's worth thinking about adding convenience functions like this to the C++ API (instead of just having them available on the Python side)...


How to run CLI commands with verbose logs?

How to run CLI commands with verbose logs?
"appcenter distribute release" fails with "failed to finish release upload..." error and I have no idea why. How can I see more logs when running CLI commands?

Found it
--debug


[stable/spinnaker] Fix kubeconfig s3 bucket configuration in spinnaker chart

Is this a new chart

NOTE: We're experiencing a high volume of PRs to this repo and reviews will be delayed. Please host your own chart repository and submit your repository to the Helm Hub instead of this repo to make them discoverable to the community. Here is how to submit new chart repositories to the Helm Hub.

No
What this PR does / why we need it:
This PR fixes bug in spinnaker helm chart which expects kubeconfig secret as a volume mount even when s3 bucket is chosen as the source.
Which issue this PR fixes

fixes #22765

Checklist
[Place an '[x]' (no spaces) in all applicable fields. Please remove unrelated fields.]

[x] DCO signed
[x] Chart Version bumped
[x] Variables are documented in the README.md
[x] Title of the PR starts with chart name (e.g. [stable/mychartname])

/assign @paulczar

/ok-to-test
/lgtm

/retest

It's not clear to me what the error here was.  let's retry in case it was transitive.
/retest

@paulczar the halyard-config.yaml needs to be updated as well, I believe I missed it. Before updating it, I have a query though.
When the kubeConfig.enabled is set to false, is spinnaker still intended to pickup the config of cluster it is deployed on? It's a little confusing to me

@Karthik-13 looks like the issue is NOT resolved yet. Volume entry is getting created.
When kubeConfig.secretName and kubeConfig.secretKey  are commented
kubeConfig:
  enabled: true
  #secretName: kubeconfig
  #secretKey: masterkubeconfig
  encryptedKubeconfig: encrypted:s3!r:us-east-1!b:BUCKET_NAME!f:masterkubeconfig

YAML generated contains
      volumes:
      - name: kube-config
        secret:
          secretName: my-kubeconfig

Not sure where exactly "my-kubeconfig" is coming from.
When kubeConfig.secretName = false
kubeConfig:
enabled: true
secretName: false
#secretKey: masterkubeconfig
encryptedKubeconfig: encrypted:s3!r:us-east-1!b:BUCKET_NAME!f:masterkubeconfig
YAML generated contains

  volumes:
  - name: kube-config
    secret:
      secretName: false

@shubhamc183 Could you please provide more information such as your environment, app version, chart version that you are using currently?

env: K8s, EKS
version: 2.0.0-rc9
appVersion: 1.16.2


don't send to segment on called to "auth" subcommand

Please answer the following questions before submitting your issue. Thanks!
What version of the DCOS CLI are you using (dcos --version)?
0.4.3
What version of DCOS are you using?
1.7.dev
What operating system and version are you using?
osx
What did you do?
If possible please provide a recipe for reproducing.
dcos auth logout
What did you expect to see?
no output
What did you see instead?
text to authenticated

unneeded after #570, but leaving as a remainder when we add tracking back in.

I would just close this issue. It is not an issue after your PR so lets be optimistic and assume that it wont be an issue when we re-implement it. :smile:


feat(other): add custom CSS for Authentik flows

🍰 Pullrequest

Issues

relates #375

Todo

[X] None

Is this on production? I cannot see it?

Since this PR has not been approved yet, thes changes are not deployed anywhere.

Can you provide screenshots?

Sure. See the PR description.
This PR can be tested locally.

@ulfgebhardt
now the changed database is in the PR.
Sorry, my bad.


Using arrow keys when in input field has focus moves the whole node.

Using arrow keys when in input field has focus moves the whole node, would be nice if this only happened when the focus was on the node itself, and not a field on it.

Fixed that in 25f0e1a already, but it's only on develop so far, as it is not that critical to directly push to master. If you want, you can add the few lines manually until we merge it:)

Ok!


Workspace currency optimistic actions update

Details

Fixed Issues

$ https://github.com/Expensify/App/issues/31638
PROPOSAL: https://github.com/Expensify/App/issues/31638#issuecomment-1821310344
Tests

Test 1

Create a new workspace.
Click on the bank account to change currency to USD
Go to the expense report of the workspace
Make a request of any amount.
Go offline.
Make another request in a currency that is not USD.
Make sure the preview is greyed out and the amount gets updated once we get online.

Test 2

Create a new workspace.
Click on the bank account to change currency to USD
Go to the expense report of the workspace
Go offline.
Make a request in a currency that is not USD.
Make sure that we are shown that currency in the preview and it gets updated to USD once online.

[x] Verify that no errors appear in the JS console

Offline tests

QA Steps

Test 1

Create a new workspace.
Click on the bank account to change currency to USD
Go to the expense report of the workspace
Make a request of any amount.
Go offline.
Make another request in a currency that is not USD.
Make sure the preview is greyed out and the amount gets updated once we get online.

Test 2

Create a new workspace.
Click on the bank account to change currency to USD
Go to the expense report of the workspace
Go offline.
Make a request in a currency that is not USD.
Make sure that we are shown that currency in the preview and it gets updated to USD once online.

[x] Verify that no errors appear in the JS console

PR Author Checklist

[x] I linked the correct issue in the ### Fixed Issues section above
[x] I wrote clear testing steps that cover the changes made in this PR

[x] I added steps for local testing in the Tests section
[x] I added steps for the expected offline behavior in the Offline steps section
[x] I added steps for Staging and/or Production testing in the QA steps section
[x] I added steps to cover failure scenarios (i.e. verify an input displays the correct error message if the entered data is not correct)
[x] I turned off my network connection and tested it while offline to ensure it matches the expected behavior (i.e. verify the default avatar icon is displayed if app is offline)
[x] I tested this PR with a High Traffic account against the staging or production API to ensure there are no regressions (e.g. long loading states that impact usability).

[x] I included screenshots or videos for tests on all platforms
[x] I ran the tests on all platforms & verified they passed on:

[x] Android: Native
[x] Android: mWeb Chrome
[x] iOS: Native
[x] iOS: mWeb Safari
[x] MacOS: Chrome / Safari
[x] MacOS: Desktop

[x] I verified there are no console errors (if there's a console error not related to the PR, report it or open an issue for it to be fixed)
[x] I followed proper code patterns (see Reviewing the code)

[x] I verified that any callback methods that were added or modified are named for what the method does and never what callback they handle (i.e. toggleReport and not onIconClick)
[x] I verified that the left part of a conditional rendering a React component is a boolean and NOT a string, e.g. myBool && <MyComponent />.
[x] I verified that comments were added to code that is not self explanatory
[x] I verified that any new or modified comments were clear, correct English, and explained "why" the code was doing something instead of only explaining "what" the code was doing.
[x] I verified any copy / text shown in the product is localized by adding it to src/languages/* files and using the translation method

[x] If any non-english text was added/modified, I verified the translation was requested/reviewed in #expensify-open-source and it was approved by an internal Expensify engineer. Link to Slack message:

[x] I verified all numbers, amounts, dates and phone numbers shown in the product are using the localization methods
[x] I verified any copy / text that was added to the app is grammatically correct in English. It adheres to proper capitalization guidelines (note: only the first word of header/labels should be capitalized), and is approved by marketing by adding the Waiting for Copy label for a copy review on the original GH to get the correct copy.
[x] I verified proper file naming conventions were followed for any new files or renamed files. All non-platform specific files are named after what they export and are not named "index.js". All platform-specific files are named for the platform the code supports as outlined in the README.
[x] I verified the JSDocs style guidelines (in STYLE.md) were followed

[x] If a new code pattern is added I verified it was agreed to be used by multiple Expensify engineers
[x] I followed the guidelines as stated in the Review Guidelines
[x] I tested other components that can be impacted by my changes (i.e. if the PR modifies a shared library or component like Avatar, I verified the components using Avatar are working as expected)
[x] I verified all code is DRY (the PR doesn't include any logic written more than once, with the exception of tests)
[x] I verified any variables that can be defined as constants (ie. in CONST.js or at the top of the file that uses the constant) are defined as such
[x] I verified that if a function's arguments changed that all usages have also been updated correctly
[x] If any new file was added I verified that:

[x] The file has a description of what it does and/or why is needed at the top of the file if the code is not self explanatory

[x] If a new CSS style is added I verified that:

[x] A similar style doesn't already exist
[x] The style can't be created with an existing StyleUtils function (i.e. StyleUtils.getBackgroundAndBorderStyle(theme.componentBG))

[x] If the PR modifies code that runs when editing or sending messages, I tested and verified there is no unexpected behavior for all supported markdown - URLs, single line code, code blocks, quotes, headings, bold, strikethrough, and italic.
[x] If the PR modifies a generic component, I tested and verified that those changes do not break usages of that component in the rest of the App (i.e. if a shared library or component like Avatar is modified, I verified that Avatar is working as expected in all cases)
[x] If the PR modifies a component related to any of the existing Storybook stories, I tested and verified all stories for that component are still working as expected.
[x] If the PR modifies a component or page that can be accessed by a direct deeplink, I verified that the code functions as expected when the deeplink is used - from a logged in and logged out account.
[x] If a new page is added, I verified it's using the ScrollView component to make it scrollable when more elements are added to the page.
[x] If the main branch was merged into this PR after a review, I tested again and verified the outcome was still expected according to the Test steps.

Screenshots/Videos

Android: Native

Android: mWeb Chrome

iOS: Native

iOS: mWeb Safari

MacOS: Chrome / Safari

https://github.com/Expensify/App/assets/77237602/b5ffb047-d56d-4658-8378-a906f4c257d6
https://github.com/Expensify/App/assets/77237602/29a9f8de-14c3-492b-a8c0-ff4897f21157

MacOS: Desktop

@c3024 Upon further inspection, I noticed that this does solve the following case:

Create a workspace with default currency as USD.
Make 1-2 requests in USD.
Make the default currency of the workspace INR.
Try to make a request in INR.

We see that the iouReport and the reportPreview retain the original USD currency because that was the currency with which the IOU report was made. At first I thought that we update the iouReport once we change the default currency of the workspace to be in that currency.
But since it seems that we don't do that, would be be alright if we check for the currency of the iouReport rather than the outputCurrency of the workspace?
if (lodashGet(iouReport, 'currency') === currency) {

The question basically is that if the user updates the workspace default currency, then should the iouReport be updated to that currency or not.

If yes, then we can go with the changes already made in the PR
If no, then we would have to update to check the iouReport currency instead of policy.outputCurrency...

Nice find.

The question basically is that if the user updates the workspace default currency, then should the iouReport be updated to that currency or not.

The currency and the amount of the iouReport comes from the backend, right? So, if we need to update the iouReport to workspace default currency, it would require forex conversion and I think it would need backend changes, correct?

Yes @c3024 that would require backend changes. Moreover, I think we need to make the decision whether that conversion should happen or not as well. But I think that can be a separate issue as well... maybe feedback from an internal engineer is required.

The question basically is that if the user updates the workspace default currency, then should the iouReport be updated to that currency or not.

I too think is outside the scope of this issue.

if (lodashGet(iouReport, 'currency') === currency) {
If no, then we would have to update to check the iouReport currency instead of policy.outputCurrency.

We should get the currency from iouReport like you pointed out. This is not inconsistent with the Slack discussion as well.
Please make those changes.
We will refer our discussion to the CME for final approval of PR.
If they suggest something different then their suggested changes can be incorporated.

@c3024 Made the requested changes

Reviewer Checklist

[ ] I have verified the author checklist is complete (all boxes are checked off).
[ ] I verified the correct issue is linked in the ### Fixed Issues section above
[ ] I verified testing steps are clear and they cover the changes made in this PR

[ ] I verified the steps for local testing are in the Tests section
[ ] I verified the steps for Staging and/or Production testing are in the QA steps section
[ ] I verified the steps cover any possible failure scenarios (i.e. verify an input displays the correct error message if the entered data is not correct)
[ ] I turned off my network connection and tested it while offline to ensure it matches the expected behavior (i.e. verify the default avatar icon is displayed if app is offline)

[ ] I checked that screenshots or videos are included for tests on all platforms
[ ] I included screenshots or videos for tests on all platforms
[ ] I verified tests pass on all platforms & I tested again on:

[ ] Android: Native
[ ] Android: mWeb Chrome
[ ] iOS: Native
[ ] iOS: mWeb Safari
[ ] MacOS: Chrome / Safari
[ ] MacOS: Desktop

[ ] If there are any errors in the console that are unrelated to this PR, I either fixed them (preferred) or linked to where I reported them in Slack
[ ] I verified proper code patterns were followed (see Reviewing the code)

[ ] I verified that any callback methods that were added or modified are named for what the method does and never what callback they handle (i.e. toggleReport and not onIconClick).
[ ] I verified that the left part of a conditional rendering a React component is a boolean and NOT a string, e.g. myBool && <MyComponent />.
[ ] I verified that comments were added to code that is not self explanatory
[ ] I verified that any new or modified comments were clear, correct English, and explained "why" the code was doing something instead of only explaining "what" the code was doing.
[ ] I verified any copy / text shown in the product is localized by adding it to src/languages/* files and using the translation method
[ ] I verified all numbers, amounts, dates and phone numbers shown in the product are using the localization methods
[ ] I verified any copy / text that was added to the app is grammatically correct in English. It adheres to proper capitalization guidelines (note: only the first word of header/labels should be capitalized), and is approved by marketing by adding the Waiting for Copy label for a copy review on the original GH to get the correct copy.
[ ] I verified proper file naming conventions were followed for any new files or renamed files. All non-platform specific files are named after what they export and are not named "index.js". All platform-specific files are named for the platform the code supports as outlined in the README.
[ ] I verified the JSDocs style guidelines (in STYLE.md) were followed

[ ] If a new code pattern is added I verified it was agreed to be used by multiple Expensify engineers
[ ] I verified that this PR follows the guidelines as stated in the Review Guidelines
[ ] I verified other components that can be impacted by these changes have been tested, and I retested again (i.e. if the PR modifies a shared library or component like Avatar, I verified the components using Avatar have been tested & I retested again)
[ ] I verified all code is DRY (the PR doesn't include any logic written more than once, with the exception of tests)
[ ] I verified any variables that can be defined as constants (ie. in CONST.js or at the top of the file that uses the constant) are defined as such
[ ] If a new component is created I verified that:

[ ] A similar component doesn't exist in the codebase
[ ] All props are defined accurately and each prop has a /** comment above it */
[ ] The file is named correctly
[ ] The component has a clear name that is non-ambiguous and the purpose of the component can be inferred from the name alone
[ ] The only data being stored in the state is data necessary for rendering and nothing else
[ ] For Class Components, any internal methods passed to components event handlers are bound to this properly so there are no scoping issues (i.e. for onClick={this.submit} the method this.submit should be bound to this in the constructor)
[ ] Any internal methods bound to this are necessary to be bound (i.e. avoid this.submit = this.submit.bind(this); if this.submit is never passed to a component event handler like onClick)
[ ] All JSX used for rendering exists in the render method
[ ] The component has the minimum amount of code necessary for its purpose, and it is broken down into smaller components in order to separate concerns and functions

[ ] If any new file was added I verified that:

[ ] The file has a description of what it does and/or why is needed at the top of the file if the code is not self explanatory

[ ] If a new CSS style is added I verified that:

[ ] A similar style doesn't already exist
[ ] The style can't be created with an existing StyleUtils function (i.e. StyleUtils.getBackgroundAndBorderStyle(theme.componentBG)

[ ] If the PR modifies code that runs when editing or sending messages, I tested and verified there is no unexpected behavior for all supported markdown - URLs, single line code, code blocks, quotes, headings, bold, strikethrough, and italic.
[ ] If the PR modifies a generic component, I tested and verified that those changes do not break usages of that component in the rest of the App (i.e. if a shared library or component like Avatar is modified, I verified that Avatar is working as expected in all cases)
[ ] If the PR modifies a component related to any of the existing Storybook stories, I tested and verified all stories for that component are still working as expected.
[ ] If the PR modifies a component or page that can be accessed by a direct deeplink, I verified that the code functions as expected when the deeplink is used - from a logged in and logged out account.
[ ] If the PR modifies the form input styles:

[ ] I verified that all the inputs inside a form are aligned with each other.
[ ] I added Design label so the design team can review the changes.

[ ] If a new page is added, I verified it's using the ScrollView component to make it scrollable when more elements are added to the page.
[ ] If the main branch was merged into this PR after a review, I tested again and verified the outcome was still expected according to the Test steps.
[ ] I have checked off every checkbox in the PR reviewer checklist, including those that don't apply to this PR.

Screenshots/Videos

Android: Native

Android: mWeb Chrome

iOS: Native

iOS: mWeb Safari

MacOS: Chrome / Safari

MacOS: Desktop

Please attach test videos of all platforms.

@c3024 Really sorry for the delay... I have been trying to make the web version work on mWeb safari but for some reason the simulator doesn't load beyond the logo page. Videos for other platforms has been attached.

Fixed the conflict that came up

Ah sorry can you fix the conflict @esh-g ?

@nkuoch Fixed!

:hand: This PR was not deployed to staging yet because QA is ongoing. It will be automatically deployed to staging after the next production release.

🚀 Deployed to staging by https://github.com/nkuoch in version: 1.4.22-0 🚀

platform
result

🤖 android 🤖
success ✅

🖥 desktop 🖥
cancelled 🔪

🍎 iOS 🍎
success ✅

🕸 web 🕸
success ✅

🚀 Deployed to staging by https://github.com/nkuoch in version: 1.4.22-0 🚀

platform
result

🤖 android 🤖
success ✅

🖥 desktop 🖥
success ✅

🍎 iOS 🍎
success ✅

🕸 web 🕸
success ✅

🚀 Deployed to production by https://github.com/thienlnam in version: 1.4.22-6 🚀

platform
result

🤖 android 🤖
success ✅

🖥 desktop 🖥
success ✅

🍎 iOS 🍎
success ✅

🕸 web 🕸
success ✅