ParseRequestedURI: config.yaml failed to parse with error parse "config.yaml": invalid URI for request

Environment (please complete the following information):

OS: [Linux pve 6.8.4-2-pve #1 SMP PREEMPT_DYNAMIC PMX 6.8.4-2 (2024-04-10T17:36Z) x86_64 GNU/Linux]
EaseProbe Version EaseProbe v2.1.2 5dbb97a94 2024-01-10T08:20:21Z go1.20.4

Describe the bug
config.yaml
http:
  - name: EaseProbe Github
    url: https://www.baidu.com
notify:
  log:
    - name: log file
      file: ./easeprobe.log
settings:
  log:
    level: "debug"

root@local:~/download/easeprobe/bin# ./easeprobe -f config.yaml
DEBU[2024-06-13T01:39:10+08:00] Load meta data: name[EaseProbe], version[v2.1.2]
INFO[2024-06-13T01:39:10+08:00] Clean data file: data/data.yaml-2024-06-12T17_34_31.18293374Z
INFO[2024-06-13T01:39:10+08:00] Load the configuration file successfully!
DEBU[2024-06-13T01:39:10+08:00]
version: ""
http:
    - name: EaseProbe Github
      channels: []
      alert:
        strategy: unknown
        factor: 0
        max: 0
      url: https://github.com/megaease/easeprobe
      proxy: ""
      ca: ""
      cert: ""
      key: ""
      insecure: false
tcp: []
shell: []
client: []
ssh:
    bastion: {}
    servers: []
tls: []
host:
    bastion: {}
    servers: []
ping: []
websocket: []
notify:
    log:
        - name: log file
          file: ./easeprobe.log
          host: ""
          network: ""
settings:
    name: EaseProbe
    icon: https://megaease.com/favicon.png
    pid: /root/download/bin/easeprobe.pid
    log:
        level: debug
        file: ""
        self_rotate: true
        size: 10
        age: 7
        backups: 5
        compress: true
    timeformat: 2006-01-02 15:04:05 UTC
    timezone: UTC
    probe:
        interval: 1m0s
        timeout: 30s
        alert:
            strategy: unknown
            factor: 0
            max: 0
    notify:
        retry:
            times: 3
            interval: 5s
        dry: false
    sla:
        schedule: daily
        time: "00:00"
        data: data/data.yaml
        backups: 5
        channels:
            - __EaseProbe_Channel__
    http:
        ip: <IP_ADDRESS>
        port: "8181"
        refresh: 0s
        log:
            level: info
            file: ""
            self_rotate: true
            size: 10
            age: 7
            backups: 5
            compress: true
INFO[2024-06-13T01:39:10+08:00] Successfully created the PID file: /root/download/bin/easeprobe.pid
INFO[0000] Application Log File [Stdout] - Self-Rotate
INFO[0000] Web Access Log File [Stdout] - Self-Rotate
DEBU[2024-06-13T01:39:10+08:00] [Web] Auto refresh interval time: 1m0s
INFO[2024-06-13T01:39:10+08:00] [Web] HTTP server is listening on <IP_ADDRESS>:8181
DEBU[2024-06-13T01:39:10+08:00] --------- Process the probers settings ---------
DEBU[2024-06-13T01:39:10+08:00] --> HTTP / slice / {DefaultProbe:{ProbeKind: ProbeTag: ProbeName:EaseProbe Github ProbeChannels:[] ProbeTimeout:0s ProbeTimeInterval:0s Labels:map[] StatusChangeThresholdSettings:{Failure:0 Success:0} NotificationStrategySettings:{Strategy:unknown Factor:0 MaxTimes:0} ProbeFunc:<nil> ProbeResult:<nil> metrics:<nil>} URL:https://github.com/megaease/easeprobe Proxy: ContentEncoding: Method: Headers:map[] Body: TextChecker:{Contain: NotContain: RegExp:false containReg:<nil> notContainReg:<nil>} Evaluator:{Variables:[] DocType:unsupported Expression: Document: Extractor:<nil> EvalFuncs:map[] ExtractedValues:map[]} User: Pass: SuccessCode:[] TLS:{CA: Cert: Key: Insecure:false} client:<nil> traceStats:<nil> metrics:<nil>}
DEBU[2024-06-13T01:39:10+08:00] --------- Process the notification settings ---------
DEBU[2024-06-13T01:39:10+08:00] --> Log - slice - {DefaultNotify:{NotifyKind: NotifyFormat:unknown NotifySendFunc:<nil> NotifyName:log file NotifyChannels:[] Dry:false Timeout:0s Retry:{Times:0 Interval:0s}} File:./easeprobe.log Host: Network: Type:0 logger:<nil>}
DEBU[2024-06-13T01:39:10+08:00] Global Probe Configuration: {Interval:1m0s Timeout:30s StatusChangeThresholdSettings:{Failure:0 Success:0} NotificationStrategySettings:{Strategy:unknown Factor:0 MaxTimes:0}}
INFO[2024-06-13T01:39:10+08:00] Found result from data file with name: EaseProbe Github
INFO[2024-06-13T01:39:10+08:00] Probe [http / EaseProbe Github] base options are configured!
DEBU[2024-06-13T01:39:10+08:00] [Metric] get the name: EaseProbe_http_total
INFO[2024-06-13T01:39:10+08:00] [Metric] Gauge <EaseProbe_http_total> is created!
DEBU[2024-06-13T01:39:10+08:00] [Metric] get the name: EaseProbe_http_total_time
INFO[2024-06-13T01:39:10+08:00] [Metric] Gauge <EaseProbe_http_total_time> is created!
DEBU[2024-06-13T01:39:10+08:00] [Metric] get the name: EaseProbe_http_duration
INFO[2024-06-13T01:39:10+08:00] [Metric] Gauge <EaseProbe_http_duration> is created!
DEBU[2024-06-13T01:39:10+08:00] [Metric] get the name: EaseProbe_http_status
INFO[2024-06-13T01:39:10+08:00] [Metric] Gauge <EaseProbe_http_status> is created!
DEBU[2024-06-13T01:39:10+08:00] [Metric] get the name: EaseProbe_http_sla
INFO[2024-06-13T01:39:10+08:00] [Metric] Gauge <EaseProbe_http_sla> is created!
DEBU[2024-06-13T01:39:10+08:00] [http / EaseProbe Github] the security checks false
DEBU[2024-06-13T01:39:10+08:00] [Metric] get the name: EaseProbe_http_status_code
INFO[2024-06-13T01:39:10+08:00] [Metric] Counter <EaseProbe_http_status_code> is created!
DEBU[2024-06-13T01:39:10+08:00] [Metric] get the name: EaseProbe_http_content_len
INFO[2024-06-13T01:39:10+08:00] [Metric] Gauge <EaseProbe_http_content_len> is created!
DEBU[2024-06-13T01:39:10+08:00] [Metric] get the name: EaseProbe_http_dns_duration
INFO[2024-06-13T01:39:10+08:00] [Metric] Gauge <EaseProbe_http_dns_duration> is created!
DEBU[2024-06-13T01:39:10+08:00] [Metric] get the name: EaseProbe_http_connect_duration
INFO[2024-06-13T01:39:10+08:00] [Metric] Gauge <EaseProbe_http_connect_duration> is created!
DEBU[2024-06-13T01:39:10+08:00] [Metric] get the name: EaseProbe_http_tls_duration
INFO[2024-06-13T01:39:10+08:00] [Metric] Gauge <EaseProbe_http_tls_duration> is created!
DEBU[2024-06-13T01:39:10+08:00] [Metric] get the name: EaseProbe_http_send_duration
INFO[2024-06-13T01:39:10+08:00] [Metric] Gauge <EaseProbe_http_send_duration> is created!
DEBU[2024-06-13T01:39:10+08:00] [Metric] get the name: EaseProbe_http_wait_duration
INFO[2024-06-13T01:39:10+08:00] [Metric] Gauge <EaseProbe_http_wait_duration> is created!
DEBU[2024-06-13T01:39:10+08:00] [Metric] get the name: EaseProbe_http_transfer_duration
INFO[2024-06-13T01:39:10+08:00] [Metric] Gauge <EaseProbe_http_transfer_duration> is created!
DEBU[2024-06-13T01:39:10+08:00] [Metric] get the name: EaseProbe_http_total_duration
INFO[2024-06-13T01:39:10+08:00] [Metric] Gauge <EaseProbe_http_total_duration> is created!
DEBU[2024-06-13T01:39:10+08:00] [http / EaseProbe Github] configuration: {DefaultProbe:{ProbeKind:http ProbeTag: ProbeName:EaseProbe Github ProbeChannels:[__EaseProbe_Channel__] ProbeTimeout:30s ProbeTimeInterval:1m0s Labels:map[] StatusChangeThresholdSettings:{Failure:1 Success:1} NotificationStrategySettings:{Strategy:regular Factor:1 MaxTimes:1} ProbeFunc:0xe227e0 ProbeResult:0xc0005f3e00 metrics:0xc0004d81e0} URL:https://github.com/megaease/easeprobe Proxy: ContentEncoding: Method:GET Headers:map[] Body: TextChecker:{Contain: NotContain: RegExp:false containReg:<nil> notContainReg:<nil>} Evaluator:{Variables:[] DocType:unsupported Expression: Document: Extractor:<nil> EvalFuncs:map[] ExtractedValues:map[]} User: Pass: SuccessCode:[[0 499]] TLS:{CA: Cert: Key: Insecure:false} client:0xc0004d82a0 traceStats:<nil> metrics:0xc000526500}
INFO[2024-06-13T01:39:10+08:00] [log / log file] - local log file(./easeprobe.log) configured
INFO[2024-06-13T01:39:10+08:00] Notification [log] - [log file] is running on Live mode!
INFO[2024-06-13T01:39:10+08:00] Notification [log] - [log file] is configured!
INFO[2024-06-13T01:39:10+08:00] Successfully setup the notify channel: log
INFO[2024-06-13T01:39:10+08:00] --------- Channel Configuration ---------
INFO[2024-06-13T01:39:10+08:00] Channel: __EaseProbe_Channel__
INFO[2024-06-13T01:39:10+08:00]    Probers:
INFO[2024-06-13T01:39:10+08:00]     - http: EaseProbe Github
INFO[2024-06-13T01:39:10+08:00]    Notifiers:
INFO[2024-06-13T01:39:10+08:00]      - log: log file
DEBU[2024-06-13T01:39:10+08:00] Start Time Gap: 1s = 1m0s / 1
INFO[2024-06-13T01:39:10+08:00] Ready to monitor(http): EaseProbe Github - https://github.com/megaease/easeprobe
DEBU[2024-06-13T01:39:10+08:00] --------- SLA Report Notifies ---------
DEBU[2024-06-13T01:39:10+08:00]   - log : log file
INFO[2024-06-13T01:39:10+08:00] Scheduling daily SLA reports at 00:00 UTC time...
DEBU[2024-06-13T01:39:10+08:00] [http / EaseProbe Github] Delay 0s = (0 * 1s) seconds to start the probe work
INFO[2024-06-13T01:39:10+08:00] The SLA report will be schedule at 2024-06-13 00:00:00 UTC
DEBU[2024-06-13T01:39:10+08:00] [http TRACE EaseProbe Github] - total - start get connection:<PHONE_NUMBER>849669863
DEBU[2024-06-13T01:39:10+08:00] [http TRACE EaseProbe Github] - dns - start resolve github.com:<PHONE_NUMBER>849784
DEBU[2024-06-13T01:39:10+08:00] Successfully save the SLA data to file: data/data.yaml
DEBU[2024-06-13T01:39:10+08:00] ParseRequestedURI: config.yaml failed to parse with error parse "config.yaml": invalid URI for request
DEBU[2024-06-13T01:39:10+08:00] The configuration file [config.yaml] has not been modified
DEBU[2024-06-13T01:39:10+08:00] [http TRACE EaseProbe Github] - dns - resolve ip [{<IP_ADDRESS> }], time 3.757ms
DEBU[2024-06-13T01:39:10+08:00] [http TRACE EaseProbe Github] - conn - start tcp connect to <IP_ADDRESS>:443:<PHONE_NUMBER>853567
DEBU[2024-06-13T01:39:10+08:00] [http TRACE EaseProbe Github] - conn - tcp connection created to <IP_ADDRESS>:443. time: 70.651ms
DEBU[2024-06-13T01:39:10+08:00] [http / EaseProbe Github] dial tcp:github.com:443
DEBU[2024-06-13T01:39:10+08:00] [http TRACE EaseProbe Github] - tls - start negotiation:<PHONE_NUMBER>924311
DEBU[2024-06-13T01:39:11+08:00] [http TRACE EaseProbe Github] - tls - negotiated to "github.com", time: 88.151ms
DEBU[2024-06-13T01:39:11+08:00] [http TRACE EaseProbe Github] - connection established. reused: false idle: false idle time: 0ms
DEBU[2024-06-13T01:39:11+08:00] [http TRACE EaseProbe Github] - send - start write header field Host [github.com] :<PHONE_NUMBER>012528
DEBU[2024-06-13T01:39:11+08:00] [http TRACE EaseProbe Github] - send - start write header field User-Agent [MegaEase EaseProbe/v2.1.2] :<PHONE_NUMBER>012528
DEBU[2024-06-13T01:39:11+08:00] [http TRACE EaseProbe Github] - send - start write header field Connection [close] :<PHONE_NUMBER>012528
DEBU[2024-06-13T01:39:11+08:00] [http TRACE EaseProbe Github] - send - start write header field Accept-Encoding [gzip] :<PHONE_NUMBER>012528
DEBU[2024-06-13T01:39:11+08:00] [http TRACE EaseProbe Github] - send - headers written, time: 0.066ms
DEBU[2024-06-13T01:39:11+08:00] [http TRACE EaseProbe Github] - wait - start write request:<PHONE_NUMBER>012609
DEBU[2024-06-13T01:39:11+08:00] [http TRACE EaseProbe Github] - transfer - start transfer the response:<PHONE_NUMBER>641416
DEBU[2024-06-13T01:39:11+08:00] [http TRACE EaseProbe Github] - wait - got first response byte, time: 628.805ms
DEBU[2024-06-13T01:39:11+08:00] [http TRACE EaseProbe Github] - transfer - done, time: 0.356ms
DEBU[2024-06-13T01:39:11+08:00] [http TRACE EaseProbe Github] - total - done , time: 792.102ms
DEBU[2024-06-13T01:39:11+08:00] [http TRACE EaseProbe Github] ======================== Trace Stats ======================
DEBU[2024-06-13T01:39:11+08:00] [http TRACE EaseProbe Github] DNS	Connect	TLS	Send	Wait	Trans	Total
DEBU[2024-06-13T01:39:11+08:00] [http TRACE EaseProbe Github] 3.76	70.65	88.15	0.07	628.81	0.36	792.10
DEBU[2024-06-13T01:39:11+08:00] [http TRACE EaseProbe Github] ===========================================================
DEBU[2024-06-13T01:39:11+08:00] [http / EaseProbe Github] - Text Mode - Contain:[], NotContain:[]
DEBU[2024-06-13T01:39:11+08:00] [http / EaseProbe Github] - Status Threshold Checking - Current[true], StatusCnt[1], FailureThread[1], SuccessThread[1]
INFO[2024-06-13T01:39:11+08:00] [http / EaseProbe Github] - Status is UP! Threshold reached for success [1/1]
DEBU[2024-06-13T01:39:11+08:00] [http / EaseProbe Github] - HTTP Status Code is 200
DEBU[2024-06-13T01:39:11+08:00] http: {"name":"EaseProbe Github","endpoint":"https://github.com/megaease/easeprobe","time":"2024-06-12T17:39:10.849636947Z","timestamp":1718213950849,"rtt":933990476,"status":"up","prestatus":"init","message":"Success (http): HTTP Status Code is 200","latestdowntime":"0001-01-01T00:00:00Z","recoverytime":0,"stat":{"since":"2024-06-12T17:35:34.287769348Z","total":1,"status":{"1":1,"2":0},"uptime":60000000000,"downtime":0,"StatusHistory":[{"Status":true,"Message":"HTTP Status Code is 200"}],"MaxLen":1,"CurrentStatus":true,"StatusCount":1,"alert":{"strategy":"regular","factor":1,"max":1,"notified":0,"failed":0,"next":1,"interval":0}}}
DEBU[2024-06-13T01:39:11+08:00] [channel / __EaseProbe_Channel__]: EaseProbe Github (https://github.com/megaease/easeprobe) - Initial Status [init] == [up], no notification.
DEBU[2024-06-13T01:39:15+08:00] ParseRequestedURI: config.yaml failed to parse with error parse "config.yaml": invalid URI for request
DEBU[2024-06-13T01:39:15+08:00] The configuration file [config.yaml] has not been modified

The following two lines of log output mean what？
DEBU[2024-06-13T01:39:20+08:00] ParseRequestedURI: config.yaml failed to parse with error parse "config.yaml": invalid URI for request
DEBU[2024-06-13T01:39:20+08:00] The configuration file [config.yaml] has not been modified

These debug logs are generated by EaseProbe as it monitors changes in a configuration file:

The first line indicates when EaseProbe is determining if the configuration file is sourced from an external URL.
The second line shows the result of this check.


chore: Add stale.yml configuration file for stale bot

This configuration will mark 'awaiting-feedback' labeled issues or pull requests with a stale label
if no one responds to the issue/PR within 60 days. It will then close it after 7 after the label if no futher activity results.

Fixes #285

Looks great, thanks for adding this! So the 60 days and 7 days are built-in to the bot, and we just configure the labels? And, the only manual part is then adding the awaiting-feedback label after asking a question?

Yes, the 60 and 7 days are the defaults. I added the option to only look as awaiting-feedback because I thought that it would be better to only have it mark issues that we were waiting on, rather than no one has gotten around to fixing. And yes, the only manual part is adding the label awaiting-feedback. I couldn't think of a way to easily automate that part.

If you want to see the other defaults, you can view them here


Where is the OnLogEvent in 41.1.0?

FTP Server OS: Unix
Client Computer OS: Windows
FluentFTP Version: 41.1.0
Framework: .NET 4
Hi, I come from previous version, where I had configured this code to print into a textarea the verbose logs:
client.OnLogEvent = OnFTPLogEvent;
void OnFTPLogEvent(FtpTraceLevel ftpTraceLevel, string logMessage)
  {
      Application.Current.Dispatcher.Invoke(() =>
      {
          textLog.Text += ">> " + logMessage + "\n";
      });
  }

Unfortunately the new version updated to 41.1.0 no longer has the event "OnLogEvent".
What is the correct way to bind the function with this version?
Thank you in advance.

Use client.LegacyLogger
Read more: https://github.com/robinrodricks/FluentFTP/wiki/Logging#legacy-logger


Fix typo

Fix typo: assume assume
By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice.

Thanks!


Avatars should link to /username

Avatars should link to /username — same as @username

I will take this.

Brilliant Tom!


Copy as code doesn't work in debug mode

Cannot perform copy as code action while in debug mode.

Copy is not supported
java.lang.UnsupportedOperationException: Copy is not supported
at org.exbin.bined.intellij.DebugViewDataSource.copy(DebugViewDataSource.java:92)
at org.exbin.bined.swing.basic.DefaultCodeAreaCommandHandler.copyAsCode(DefaultCodeAreaCommandHandler.java:517)
at org.exbin.bined.swing.CodeAreaCore.copyAsCode(CodeAreaCore.java:118)
at org.exbin.bined.intellij.panel.DebugViewPanel.lambda$createContextMenu$1(DebugViewPanel.java:238)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2022)
...

Action can now be performed in version 0.2.0, although there is other error, which causes, that popup menu shows only when invoked above header or row number area.


Karma configuration not taken into account

Versions
Angular CLI: 1.6.1
Node: 8.9.1
OS: win32 x64
Angular: 5.1.1
... animations, common, compiler, compiler-cli, core, forms
... http, language-service, platform-browser
... platform-browser-dynamic, router

@angular/cdk: 5.0.1
@angular/cli: 1.6.1
@angular/flex-layout: 2.0.0-beta.10-4905443
@angular/material-moment-adapter: 5.0.1
@angular/material: 5.0.1
@angular-devkit/build-optimizer: 0.0.36
@angular-devkit/core: 0.0.22
@angular-devkit/schematics: 0.0.42
@ngtools/json-schema: 1.1.0
@ngtools/webpack: 1.9.1
@schematics/angular: 0.1.11
@schematics/schematics: 0.0.11
typescript: 2.4.2
webpack: 3.10.0

Repro steps

Step 1 Create a new project
Step 2 add some properties to the karma.conf.js file (see which ones in the other details part)

Observed behavior
When I disable logs from the browser into karma, karma just ignores it and display them anyway. I believe this is because its configuration is overriden ?
Desired behavior
I would like to not see the browser logs into my console when I ask not to see them
Mention any other details that might be useful (optional)
In my karma.conf.js I added those properties :
client: {
  captureConsole: false,
  clearContext: false
},
logLevel: config.LOG_DISABLE,
browserConsoleLogOptions: {
  level: 'disable',
  terminal: false
},

But no matter what I do, my console output looks like this (sample) :
Error: Template parse errors:
  'mat-dialog-content' is not a known element:
    1. If 'mat-dialog-content' is an Angular component, then verify that it is part of this module.
    2. If 'mat-dialog-content' is a Web Component then add 'CUSTOM_ELEMENTS_SCHEMA' to the<EMAIL_ADDRESS>of this component to suppress this message. ("
Confirmation d'action

[ERROR ->]<mat-dialog-content>

    <button mat-raised-button [ERROR ->][mat-dialog-close]="false">Annuler</button>
    <button mat-raised-button color="primary" [mat-dialog"): ng:///DynamicTestModule/ConfirmationDialogComponent.html@8:30
  Can't bind to 'mat-dialog-close' since it isn't a known property of 'button'. ("ed-button [mat-dialog-close]="false">Annuler</button>
    <button mat-raised-button color="primary" [ERROR ->][mat-dialog-close]="true">Confirmer</button>
</mat-dialog-actions>"): ng:///DynamicTestModule/ConfirmationDialogComponent.html@9:46
  'mat-dialog-actions' is not a known element:
    1. If 'mat-dialog-actions' is an Angular component, then verify that it is part of this module.
    2. If 'mat-dialog-actions' is a Web Component then add 'CUSTOM_ELEMENTS_SCHEMA' to the<EMAIL_ADDRESS>of this component to suppress this message.

I took a quick look at this as we're triaging all our issues. I'm not able to reproduce this particular problem. I made a new repo with ng new and added <mat-dialog-content> to a template without importing it to simulate the same error you got. Running ng test shows:
$ ng test
Chrome 83.0.4103.61 (Linux x86_64): Executed 2 of 2 SUCCESS (0.074 secs / 0.055 secs)
TOTAL: 2 SUCCESS
TOTAL: 2 SUCCESS
WARN: ''mat-dialog-content' is not a known element:
1. If 'mat-dialog-content' is an Angular component, then verify that it is part of this module.
2. If 'mat-dialog-content' is a Web Component then add 'CUSTOM_ELEMENTS_SCHEMA' to the<EMAIL_ADDRESS>of this component to suppress this message.'
Chrome 83.0.4103.61 (Linux x86_64): Executed 0 of 2 SUCCESS (0 secs / 0 secs)
WARN: ''mat-dialog-content' is not a known element:
1. If 'mat-dialog-content' is an Angular component, then verify that it is part of this module.
WARN: ''mat-dialog-content' is not a known element:
1. If 'mat-dialog-content' is an Angular component, then verify that it is part of this module.
2. If 'mat-dialog-content' is a Web Component then add 'CUSTOM_ELEMENTS_SCHEMA' to the<EMAIL_ADDRESS>of this component to suppress this message.'
Chrome 83.0.4103.61 (Linux x86_64): Executed 1 of 2 SUCCESS (0 secs / 0.057 secs)
WARN: ''mat-dialog-content' is not a known element:
1. If 'mat-dialog-content' is an Angular component, then verify that it is part of this module.

I then updated my karma.conf.js with the values you mentioned (and removed the existing values for those properties). Restarting Karma then passes the test without displaying any warnings:
$ ng test
Chrome 83.0.4103.61 (Linux x86_64): Executed 2 of 2 SUCCESS (0.116 secs / 0.068 secs)
TOTAL: 2 SUCCESS
TOTAL: 2 SUCCESS

Since this is quite an old issue it may have been fixed at some point. If you're still able to reproduce the problem on latest Angular CLI, let me know with a minimal reproduction and we can re-open this issue to investigate further.
My full karma.conf.js:
// Karma configuration file, see link for more information
// https://karma-runner.github.io/1.0/config/configuration-file.html

module.exports = function (config) {
  config.set({
    basePath: '',
    frameworks: ['jasmine', '@angular-devkit/build-angular'],
    plugins: [
      require('karma-jasmine'),
      require('karma-chrome-launcher'),
      require('karma-jasmine-html-reporter'),
      require('karma-coverage-istanbul-reporter'),
      require('@angular-devkit/build-angular/plugins/karma')
    ],
    client: {
      captureConsole: false,
      clearContext: false // leave Jasmine Spec Runner output visible in browser
    },
    browserConsoleLogOptions: {
      level: 'disable',
      terminal: false
    },
    coverageIstanbulReporter: {
      dir: require('path').join(__dirname, './coverage/fixit-test'),
      reports: ['html', 'lcovonly', 'text-summary'],
      fixWebpackSourcePaths: true
    },
    reporters: ['progress', 'kjhtml'],
    port: 9876,
    colors: true,
    logLevel: config.LOG_DISABLE,
    autoWatch: true,
    browsers: ['Chrome'],
    singleRun: false,
    restartOnFileChange: true
  });
};

$ ng version

     _                      _                 ____ _     ___
    / \   _ __   __ _ _   _| | __ _ _ __     / ___| |   |_ _|
   / △ \ | '_ \ / _` | | | | |/ _` | '__|   | |   | |    | |
  / ___ \| | | | (_| | |_| | | (_| | |      | |___| |___ | |
 /_/   \_\_| |_|\__, |\__,_|_|\__,_|_|       \____|_____|___|
                |___/

Angular CLI: 9.1.7
Node: 12.16.1
OS: linux x64

Angular: 9.1.9
... animations, common, compiler, compiler-cli, core, forms
... localize, platform-browser, platform-browser-dynamic, router
Ivy Workspace: Yes

Package                           Version
-----------------------------------------------------------
@angular-devkit/architect         0.901.7
@angular-devkit/build-angular     0.901.7
@angular-devkit/build-optimizer   0.901.7
@angular-devkit/build-webpack     0.901.7
@angular-devkit/core              9.1.7
@angular-devkit/schematics        9.1.7
@angular/cli                      9.1.7
@ngtools/webpack                  9.1.7
@schematics/angular               9.1.7
@schematics/update                0.901.7
rxjs                              6.5.5
typescript                        3.8.3
webpack                           4.42.0


Delete returns 204 with content

I've noticed that Delete is returning a 204 with content, which is a protocol violation...
HTTP/1.1 204 No Content
Content-Length: 110
Content-Type: application/json; odata=minimalmetadata; streaming=true; charset=utf-8
Server: Microsoft-IIS/8.5
DataServiceVersion: 3.0
Date: Mon, 18 Apr 2016 22:26:30 GMT
{
"odata.metadata":"https://myservice/api/odata/v3/$metadata#Edm.String","value":"Deleted"
}
I then get an exception on the next call to the OData client.

Thanks for the observation, working on it.

I may need more information about what kind of exception you get. The protocol violation (204 with content) comes from the server but why SOD raises exception on the next call is rather strange. So if you have more data to share, please do.

Here's a debug trace of what happens from a unit test that creates, then deletes an entity..
2016/04/23 10:33:14:179 [DEBUG] Client.SensorsClient - Coating
2016/04/23 10:33:14:187 [DEBUG] Client.SensorsClient - POST request: https://service.com/api/odata/v3/Coating
2016/04/23 10:33:14:243 [DEBUG] Client.SensorsClient - Request completed: Created
2016/04/23 10:33:14:248 [DEBUG] Client.SensorsClient - Coating: Id=1183
2016/04/23 10:33:14:262 [DEBUG] Client.SensorsClient - DELETE request: https://service.com/api/odata/v3/Coating(1183)
2016/04/23 10:33:14:289 [DEBUG] Client.SensorsClient - Request completed: NoContent
2016/04/23 10:33:14:290 [DEBUG] Client.SensorsClient - Coating: Id:1183
2016/04/23 10:33:14:294 [DEBUG] Client.SensorsClient - GET request: https://service.com/api/odata/v3/Coating(1183)
2016/04/23 10:33:14:325 [ERROR] Client.SensorsClient - Coating: Id:1183 - An error occurred while sending the request.
2016/04/23 10:33:14:327 [ERROR] Client.SensorsClient - System.Net.Http.HttpRequestException: An error occurred while sending the request. ---> System.Net.WebException: The server committed a protocol violation. Section=ResponseStatusLine
    at System.Net.HttpWebRequest.EndGetResponse(IAsyncResult asyncResult)
    at System.Net.Http.HttpClientHandler.GetResponseCallback(IAsyncResult ar)
    --- End of inner exception stack trace ---
    at Microsoft.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
    at Microsoft.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccess(Task task)
    at Simple.OData.Client.FluentClientBase`1.<RectifyColumnSelectionAsync>d__8.MoveNext()
    --- End of stack trace from previous location where exception was thrown ---
    at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
    at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
    at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()
    at Client.SensorsClient.<FindAsync>d__25`1.MoveNext() in C:\Devel\SensorsClient.cs:line 157

SensorsClient is a wrapper around IODataClient...
    public async Task<T> FindAsync<T>(object id)
        where T : class
    {
        try
        {
            if (Logger.IsDebugEnabled)
            {
                Logger.DebugFormat("{0}: Id:{1}", typeof (T).Name, id);
            }
            return await For<T>()
                .Key(id)
                .FindEntryAsync();
        }
        catch (Exception ex)
        {
            Logger.ErrorFormat("{0}: Id:{1} - {2}", typeof(T).Name, id, ex.Message);
            Logger.Error(ex);
            throw;
        }
    }

And this happens only if you first call Delete (and server violates the protocol by returning content)? So the exception is not raised in Delete but on a next call? I am suspecting that there is a pending content after Delete that triggers the exception in ODataLib.

Hmm, not sure what to do about it. See a similar issue: http://stackoverflow.com/questions/18496451/c-httpclient-the-server-committed-a-protocol-violation-section-responsestatu
The core problem is on the server side. For libraries using WebRequest it is possible to set a flag in app.config (useUnsafeHeaderParsing) but HttpClient doesn't support that. Right now I can't think of a resolution that will not affect performance (trying to read response even though server returned 204 is out of the question).
I can only think about some workaround on the client side: knowing that it's dealing with bad server and guard DELETE request with some dummy GET that will swallow exception.

That's what I've done - I'll also report it as a bug against OData 3....
    public async Task DeleteAsync<T>(object id)
        where T : class
    {
        try
        {
            if (Logger.IsDebugEnabled)
            {
                Logger.DebugFormat("{0}: Id={1}", typeof(T).Name, id);
            }

            await For<T>()
                .Key(id)
                .DeleteEntryAsync();

            try
            {
                await FindAsync<T>(id);
            }
            catch (HttpRequestException re)
            {
                // Swallow
                var inner = re.InnerException;
            }
        }
        catch (Exception ex)
        {
            Logger.ErrorFormat("{0}: Id={1} - {2}", typeof(T).Name, id, ex.Message);
            Logger.Error(ex);
            throw;
        }
    }


Dynamically generated styles don't get added to a popup window

Environment

OS: macOS 10.15.6
Node: 12.13.1 - ~/.nvm/versions/node/v12.13.1/bin/node
Yarn: 1.22.5 - /usr/local/bin/yarn
npm: 6.12.1 - ~/.nvm/versions/node/v12.13.1/bin/npm

Reproduction
Steps to reproduce
Using react-new-window, create a popup. The popup includes a styled-component (say, a toggle). Everything is displayed properly (as the initial styles get copied from parent to popup on initialization) until you try to interact with a component in a way that changes its state. At that point the newly generated CSS class gets added to the <head> of the parent window, instead of the popup, so the component appears unstyled in the popup.
Expected Behavior
CSS gets added to current window
Actual Behavior
CSS gets added to parent window

Hiya, this is expected behaviour. Styles will always be added to styled-components' default style tag instead of anywhere else.
You may want to look into the StyleSheetManager provider to add an alternative style tag for a sub tree.

Thanks @kitten, worked like a charm! My solution ended up looking something like this:
import React from 'react';
import styled, {StyleSheetManager} from 'styled-components';
import NewWindow from 'react-new-window';

class Parent extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      showPopout: false,
    };
    this.nwRef = React.createRef();
  }

  render () {
    ... some stuff
    this.state.showPopout && (
    <StyleSheetManager target={this.nwRef.current}>
      <NewWindow
        title="Title"
        features={{width: '960px', height: '600px'}}
        onUnload={() => this.setState({showPopout: false})}
      >
        <div ref={this.nwRef}>
          <Popout isPopout={true}>
            ... popup stuff
          </Popout>
        </div>
      </NewWindow>
    </StyleSheetManager>
  )}
}


Missing HttpStatusCode versions of attribute constructors

This is more of an annoyance than a bug. But can we please get HttpStatusCode versions of Attributes?
It would save me having to manually cast them to int everywhere.

There.. created a pull request, lets see if it gets added :)

You just have to use another type for this
https://github.com/aspnet/HttpAbstractions/blob/dev/src/Microsoft.AspNetCore.Http.Abstractions/StatusCodes.cs

@xperiandri Makes sense, but is there any reason not to have an override allowing the System.Net.HttpStatusCode type in an overload? Seems like it might be nice to have either way.
@VisualBean Came across this and your PR (#465) after creating my own attribute for a similar overload. Not sure what happened with the CI build as it seems to have failed, but I'd also love to see this implemented to have the option of using the System.Net type (unless there is a compelling reason not to support it in addition to the Microsoft.AspNetCore.Http.StatusCodes)

Yeah I dunno why this PR failed - cant figure out which "check" failed

Microsoft.AspNetCore.Http.Abstractions/StatusCodes appears to be the "Core" way of dealing with status codes. So going to keep SB consistent with the Core and close issue


Consolidate and bump the snappy-java version

While updating the Avro dependency I've noticed that we're using different versions of the snappy compression codec. I would propose to pin it to one version.

LGTM provided Travis agrees. We're downgrading snappy version from presto-product-tests' perspective (which i'm ok with).

Thanks for the prompt reply. Travis seems happy.
Just for the record. We're only updating the dependencies, from <IP_ADDRESS> to <IP_ADDRESS>, which is congruent with the latest version of Apache Avro: https://mvnrepository.com/artifact/org.apache.avro/avro/1.9.1

@cla-bot check

@Fokko @dain @xerial  does "Output the snappy header even for the empty input" change in Snappy <IP_ADDRESS> (https://github.com/xerial/snappy-java/blob/master/Milestone.md) affect how we write eg Snappy compressed textfiles or ORC files?

does "Output the snappy header even for the empty input" change in Snappy <IP_ADDRESS> (https://github.com/xerial/snappy-java/blob/master/Milestone.md) affect how we write eg Snappy compressed textfiles or ORC files?

@Fokko @xerial can you please comment?

Hi. There has been no format change between these snappy-java versions. Mixing them should have no problem.
<IP_ADDRESS> only added a fix when empty data is compressed. It will just ensure outputting the codec header.

I am concerned that empty bucket files will no longer be empty (the codec header).
And empty files have special treatment. Can we verify it's not the case?
Eg. create snappy compressed bucketed table.

Actually this behavior of <IP_ADDRESS> (writing the codec header for the empty input) is the same with 1.1.2.x. This behavior, which was removed before <IP_ADDRESS>, was simply restored. So even an empty bucket file should already have the codec header.
This change applies only for data compressed with SnappyOutputStream, which uses snappy-java's own streaming data format.
However, Avro is not using this streaming format: https://github.com/apache/avro/blob/master/lang/java/avro/src/main/java/org/apache/avro/file/SnappyCodec.java
So this version change has no impact at all to Avro

Many thanks @xerial for your detailed explanation!
We're doing two things here:

code cleanup to define snappy version once -- ✔
bumping the version -- which doesn't matter in our case, but doesn't hurt either.

I'm going to merge this tomorrow, unless someone objects.

Merged, thanks!

My pleasure Piotr


How to evaluate on KITTI and Sintel

Hi gengshan~~ Thanks for your wonderful work and code!
I have done the three training stage: FlyingChairs->FlyingThings->KITTI. I tried the following code to evaluate my model:
modelname=kitti-ft-trainval
i=149999
CUDA_VISIBLE_DEVICES=0 python submission.py --dataset 2015 --datapath /ssd/kitti_scene/training/   --outdir ./weights/$modelname/ --loadmodel ./weights/$modelname/finetune_$i.tar  --maxdisp 512 --fac 2
python eval_tmp.py --path ./weights/$modelname/ --vis no --dataset 2015

But I get the following error:
epe = np.sqrt(np.power(gtflow - flow,2).sum(-1))[mask]
ValueError: operands could not be broadcast together with shapes (370,1224,2) (375,1242,2)

Another problem is how to finetune my model on Sintel, I am confused with the "rob_devkit" tool. When I run python flow_devkit.py, it asks me which format to use. There are two choices: middlebury and kitti. Which format should I use? I tried to use kitti format, and get the following folder structure:
rob_devkit/
    flow/
        datasets_kitti2015/
            metadata/
            test/
            training/
            bundler/

But in your main.py, the sintel dataset is loaded by iml0, iml1, flowl0 = ls.dataloader('%s/rob_flow/training/'%args.database). I don't know where to find the rob_flow.
I am a newcomer to this field and puzzled by these problems for several days. Could you please help me?

ValueError: operands could not be broadcast together with shapes (370,1224,2) (375,1242,2)
I don't see this error. This is due to the shape mismatch between flow ground-truth and your prediction. Can you make sure the shape of the input image is identical to the shape of the ground-truth? Note KITTI has both 370x1224 and 375x1242 images.

But in your main.py, the sintel dataset is loaded by iml0, iml1, flowl0 = ls.dataloader('%s/rob_flow/training/'%args.database). I don't know where to find the rob_flow.

You could move/link folder datasets_kitti2015 as a subfolder rob_flow in your dataset folder and try again. There should be 3373 images in rob_flow/training/flow_occ.
Let me know if you have further questions.

Thanks for your immediate reply!
I found the error is caused by 000155_10.png. In submission.py, the shape of this image is 1242. But in eval_tmp.py, the shape of ground-truth is 1224. I am confused by this bug.
I also tried --dataset 2015test. However, there is no pathway named kitti_scene/testing/flow_occ in my computer, which seems necessary for eval_tmp.py. My kitti dataset is unzipped from data_scene_flow.zip directly, and I do not find kitti_scene/testing/flow_occ.
Besides, I am not sure whether my training process is correct. I want to confirm the following details:

Before I finetune the FlyingChair model on FlyingThings dataset, must I resume the number of iterations?  I find that the learning rate still starts with 1e-3 on FlyingThings if I do not resume the number of iterations. But when I finetune on KITTI, it seems that I do not need to resume the number of iterations.
Before I finetune on KITTI, should I run dataloader/kitti15list_val.py, dataloader/kitti15list_train.py ?
If I want to reproduce the KITTI result in your paper, which stage (2015train or 2015trainval) should I use to train? which stage (2015 or 2015test) should I use to test?
To run + visualize on KITTI-15 test set, you use CUDA_VISIBLE_DEVICES=0 python submission.py --dataset 2015test --datapath dataset/kitti_scene/testing/   --outdir ./weights/$modelname/ --loadmodel ./weights/$modelname/finetune_$i.tar  --maxdisp 512 --fac 2. When evaluating on KITTI-val, you use CUDA_VISIBLE_DEVICES=0 python submission.py --dataset 2015 --datapath /ssd/kitti_scene/training/   --outdir ./weights/$modelname/ --loadmodel ./weights/$modelname/finetune_$i.tar  --maxdisp 512 --fac 2. The dataset/kitti_scene/testing/ seems to be a relative directory; but /ssd/kitti_scene/training/ seems to be an absolute directory. So where should I put my KITTI dataset?
As is mentioned above, several bugs occurs when I test on KITTI. It may caused by mismatched folder structure. My KITTI dataset is unzipped from data_scene_flow.zip directly. I want to know the details for preparing KITTI dataset for runing your code.

Could you please help me?

I found the error is caused by 000155_10.png. In submission.py, the shape of this image is 1242. But in eval_tmp.py, the shape of ground-truth is 1224. I am confused by this bug.

This is not a bug of the code. Can you check again with the official KITTI 2015 scene flow dataset? The size of data_scene_flow/training/image_2/000155_10.png should be 1224x370x3.

I also tried --dataset 2015test.

I'm assuming you want to visualize the flow, since ground-truth for test data is held-out. Did you pass --vis? You can refer to Evaluate on KITTI-15 benchmark section.
To reproduce numbers in the paper, just follow the pre-training and fine-tuning procedure listed as cmmand in readme. So for you questions

Yes
That's just for your own records. i.e., to get training error and validation error.
train with 2015trainval, test with 2015test
put KITTI anywhere you like and change the path accordingly
rename data_scene_flow as kitti_scene

Thanks for your help!


Add Jake Hutchinson<EMAIL_ADDRESS>

Terraform Format and Style 🖌success
Terraform Initialization ⚙success
Terraform Validation 🤖success
Validation Output

Success! The configuration is valid.

Terraform Plan 📖success
Show Plan

undefined

Pusher: @oneswig, Action: pull_request, Working Directory: ``, Workflow: Terraform GitHub


Battery draining since 1.10.1(0)

I see a battery usage of 12% today in release 1.10.1(0) in iOS 14.3 which hasn’t been that high in any other release

Internal Tracking ID:   EXPOSUREAPP-1882

Could you please share some screenshots of the battery settings in your phone settings?
What is the battery health?

Could you please share some screenshots of the battery settings in your phone settings?
What is the battery health?

Internal Tracking ID:   EXPOSUREAPP-1882

Internal Tracking ID:   EXPOSUREAPP-1882

Hey @Ein-Tim
thanks for your reply. Here are the required information:

Model: iPhone 12
Battery health at 90%
Original Battery
There is at least one more device typically in range most of the day.
I’ve never seen it using so much battery, it usually was at 2-5% all the time. Even over the night it’s showing 9% now.
Screenshot:

Thanks and Best
SecuNinja

Hey @Ein-Tim
thanks for your reply. Here are the required information:

Model: iPhone 12
Battery health at 90%
Original Battery
There is at least one more device typically in range most of the day.
I’ve never seen it using so much battery, it usually was at 2-5% all the time. Even over the night it’s showing 9% now.
Screenshot:

Thanks and Best
SecuNinja

Hi @secuninja
Thanks for providing the information.
A short term solution would be to turn Bluetooth off during the night.
The 9% are relative to usage.
So if you do not use your phone during the night (maybe even deactivate WiFi) than it makes sense that "Begegnungsmitteilungen" is responsible for a high percentage of the battery usage (same applies for daytime, if the phone is not used that much - the only thing that can drain the battery is "Begegnungsmitteilungen").
Maybe you could test something for me.
Charge your phone to 100% and leave it unplugged during the night. Turn WiFi off too.
 On an iPhone 12 with battery health 90% I expect this to be between 5% and 10%.
Thank you

Hi @secuninja
Thanks for providing the information.
A short term solution would be to turn Bluetooth off during the night.
The 9% are relative to usage.
So if you do not use your phone during the night (maybe even deactivate WiFi) than it makes sense that "Begegnungsmitteilungen" is responsible for a high percentage of the battery usage (same applies for daytime, if the phone is not used that much - the only thing that can drain the battery is "Begegnungsmitteilungen").
Maybe you could test something for me.
Charge your phone to 100% and leave it unplugged during the night. Turn WiFi off too.
 On an iPhone 12 with battery health 90% I expect this to be between 5% and 10%.
Thank you

Hi @Ein-Tim
thanks for you reply. I was just wondering what has been changed in the past releases that increased the relative baterry usage. I was always at 2-5% by "Begegnungsmitteilungen" while I did not change my other device usage.
Yesterday in the evening, the remaining battery was at 25% means 12% of the 75% used has been drained by the CWA which is pretty much in my eyes ;)
Turning off WIFI at night is not possible for me unfortunately as I need that for incoming alerts.
Thanks! :)

Hi @Ein-Tim
thanks for you reply. I was just wondering what has been changed in the past releases that increased the relative baterry usage. I was always at 2-5% by "Begegnungsmitteilungen" while I did not change my other device usage.
Yesterday in the evening, the remaining battery was at 25% means 12% of the 75% used has been drained by the CWA which is pretty much in my eyes ;)
Turning off WIFI at night is not possible for me unfortunately as I need that for incoming alerts.
Thanks! :)

Okay. If you are not able to turn WiFi off, you can leave it on too, but then there are also other Apps with active background updates (which will drain the battery too) so this is not that clear.
Could you please reboot your phone and keep monitoring for a few days?
Thanks

Okay. If you are not able to turn WiFi off, you can leave it on too, but then there are also other Apps with active background updates (which will drain the battery too) so this is not that clear.
Could you please reboot your phone and keep monitoring for a few days?
Thanks

Sure :)

Sure :)

So I’ve been monitoring for the last two days and also restarted the phone. Now Begegnungsmitteilugen is at 15% for the last 24h now at 21:30 while battery remaining power is 50% sind the last 100% loading.
I feel like this is too much compared to where it has been 🤷🏼♂

So I’ve been monitoring for the last two days and also restarted the phone. Now Begegnungsmitteilugen is at 15% for the last 24h now at 21:30 while battery remaining power is 50% sind the last 100% loading.
I feel like this is too much compared to where it has been 🤷🏼♂

@secuninja
Okay thank you.
I can sadly not help you any further here. Maybe @thomasaugsten could take a look at this.
Thanks and have a nice evening.

@secuninja
Okay thank you.
I can sadly not help you any further here. Maybe @thomasaugsten could take a look at this.
Thanks and have a nice evening.

@secuninja Thanks for reporting. We have added your information to the internal ticket for the developers. Should you observe any change in the behaviour, please let us know. Any further development on this issue will be reported here. Many thanks. Best wishes, DS

@secuninja Thanks for reporting. We have added your information to the internal ticket for the developers. Should you observe any change in the behaviour, please let us know. Any further development on this issue will be reported here. Many thanks. Best wishes, DS

Done ✅
I’ll let you know the results

Done ✅
I’ll let you know the results

With iOS 14.3 and CWA 1.11.0(9) the power usage is still extremely high (59 % used by CWA "Begegnungsmitteilungen").

With iOS 14.3 and CWA 1.11.0(9) the power usage is still extremely high (59 % used by CWA "Begegnungsmitteilungen").

Hey @stweil
Please update to iOS 14.4 and keep on monitoring.
Thanks

Hey @stweil
Please update to iOS 14.4 and keep on monitoring.
Thanks

That's still not offered for my device.

That's still not offered for my device.

Interesting, what device are you using?

Interesting, what device are you using?

Can you give an idea of what the average battery consumption of CWA should be like? So it would be easier to compare if the own consumption is too high or not.

Can you give an idea of what the average battery consumption of CWA should be like? So it would be easier to compare if the own consumption is too high or not.

This is really hard to tell since, as you know, this depends on the overall usage of your phone.
I use my main phone, an iPhone XR with 95% battery health (CWA 1.11 & iOS 14.4) phone very often, "Begegnungsmitteilungen" is responsible for 2% of the battery consumption in the last 24h
On my secondary device, which is hardly used, an iPhone 6s with 100% battery health (CWA 1.11 & iOS 14.4), "Begegnungsmitteilungen" is responsible for 95% of the battery consumption in the last 24h.
So I'm sorry, I can't really give you any average or so since all the numbers you're seeing in the battery settings are realtive to the usage of your device.

This is really hard to tell since, as you know, this depends on the overall usage of your phone.
I use my main phone, an iPhone XR with 95% battery health (CWA 1.11 & iOS 14.4) phone very often, "Begegnungsmitteilungen" is responsible for 2% of the battery consumption in the last 24h
On my secondary device, which is hardly used, an iPhone 6s with 100% battery health (CWA 1.11 & iOS 14.4), "Begegnungsmitteilungen" is responsible for 95% of the battery consumption in the last 24h.
So I'm sorry, I can't really give you any average or so since all the numbers you're seeing in the battery settings are realtive to the usage of your device.

thanks. i‘m on 14.4 now since it’s available and on latest CWA. i’ll let you know

thanks. i‘m on 14.4 now since it’s available and on latest CWA. i’ll let you know

Today (weekend) I used my iPhone a lot for surfing the internet, so today Safari is 80%; followed by Begegnungsmitteilungen (exposure checks, 7%) and cwa (4%).
On other days with less 'active' usage, the relative consumption of cwa plus exposure checks is much higher (15 - 20%).
I am not sure which 'budget' (exposure checks, or cwa?) is used for the background task / risk checking. Since the risk check is performed 5 - 6 times daily instead of only once, the battery consumption has significantly increased. The other factor is the higher number of keys in the risk check (much higher infection rates than we had in summer, and on top of this the European federation of keys).
Personally I am very happy with the frequent risk check, and would be reluctant to return to a daily check only.
A solution could be to let the user decide, and spend a configuration parameter like 'frequency of risk check' where everybody can fine-tune battery consumption vs faster warnings.
@Ein-Tim you have an amazing overview over all items on our wishlist. 😀😀 Has such a configuration parameter already been suggested?

Today (weekend) I used my iPhone a lot for surfing the internet, so today Safari is 80%; followed by Begegnungsmitteilungen (exposure checks, 7%) and cwa (4%).
On other days with less 'active' usage, the relative consumption of cwa plus exposure checks is much higher (15 - 20%).
I am not sure which 'budget' (exposure checks, or cwa?) is used for the background task / risk checking. Since the risk check is performed 5 - 6 times daily instead of only once, the battery consumption has significantly increased. The other factor is the higher number of keys in the risk check (much higher infection rates than we had in summer, and on top of this the European federation of keys).
Personally I am very happy with the frequent risk check, and would be reluctant to return to a daily check only.
A solution could be to let the user decide, and spend a configuration parameter like 'frequency of risk check' where everybody can fine-tune battery consumption vs faster warnings.
@Ein-Tim you have an amazing overview over all items on our wishlist. 😀😀 Has such a configuration parameter already been suggested?

Was the frequency of risk checks the relevant change which increased the energy needs of the app?
I wonder why that seems to be different on Android where I see only 1 % or 2 % battery drain for cwa.
How much data is typically transferred for each check? Does it transfer all data each time (which would be expensive), or is most of the data cached locally?

@ndegendogo

you have an amazing overview over all items on our wishlist. 😀😀 Has such a configuration parameter already been suggested?

You talked about this before, but besides of this I only found this Issue:

https://github.com/corona-warn-app/cwa-wishlist/issues/81

Battery load is a critical factor for the success of the warn app. People consider removing it from their iPhone because it reduces the availability when too much power is used. I would remove it from my Android, too, if it would increase the power consumption that much.

@stweil

Was the frequency of risk checks the relevant change which increased the energy needs of the app?

Yes, we saw a higher battery usage in versions after 1.5 (1.7 introduced more frequent risk checks)

How much data is typically transferred for each check?

I'm afraid I can't answer this. 😕

Does it transfer all data each time (which would be expensive), or is most of the data cached locally?

Most of the data is cached (Source): "No new key files are downloaded they are cached based on the hash."

How much data is typically transferred for each check? Does it transfer all data each time (which would be expensive), or is most of the data cached locally?

@stweil cwa caches the key files after first download and subsequently loads only the new files. A daily key file currently has between ~ 12000 and ~ 30000 keys.
(To be more precise: since multiple checks per day, cwa loads the hourly files of current day, and at the end of the day the daily file with the aggregated keys of the day; so this accounts to ~ 12000 .. 30000 additional keys downloaded).
However, the significant increase of power consumption is not the download of keys from the server, but the local key matching and risk calculation. This part is mainly performed in the ENF (Exposure Norification Framework) provided by Apple / part of iOS; so we know the functional description what they are doing, but not the exact details of implementation.
What they are doing basically:

each downloaded key is the 'master key' of all 144 RPIs of one day that the corresponding user sent around (one RPI for every timeslot of 10 minutes); so the first step is to perform this key derivation for all RPIs.
Key derivation is a cryptographic operation -> expensive in terms of CPU usage.

find matches. Which of these derived RPI correspond to captured / locally stored RPI. The time slot of each RPI is known, so
this step can be optimized. Still, for mitigation of not perfectly synchronized clocks between sender and receiver, they extend the 10-minute lifetime of an RPI to a time slot of 2 hours.
This second step is just a comparison. If you are able to have very few contacts, there is not much to do. But if your phone has captured a lot of RPIs all day long, even from a family member of your household, then it's different.

For all matches: decrypt the meta data of the RPI. These are data like calibration of the attenuation values of the sender, and they are needed to estimate the distance of a contact from the signal strength.
Decryption again is a cryptographic operation.

Again for all matches: group them to 'exposure windows' (30 minutes) and
estimate distance, duration, and risk scores, based on cwa risk parameters.

Cumulate all the exposure windows to a single risk score / risk level (red or green). This final step is implemented in cwa.

Thanks for the detailed information. This sounds as it should be possible to run integration tests for iOS and Android with hand crafted test apps and power meters, so more precise data like Joule per cycle could be determined. As this is essential for the success of the cwa and there seem to be major unexplained differences between iOS and Android, I'd expect such tests to be made by Apple and Telekom / SAP.

We have the battery draining "problem" more visible on iOS because of the misleading battery consumption feature.
When you drop in 1h from 100% to 90% and iOS stated 90% is regarding the exposure notification framework. This means not   the framework used 90% of your battery. It was using 90% of the 10% = 9%.
But the features shows only app consumption  in this 10% there are also hardware  consumption included which are not visible and in the winter time you have also drop of battery charge because of the temperature.

@stweil & @secuninja please update to CWA 1.12.1 and keep us posted about the issue.
Thanks

CWA 1.11.0(9) "Begegnungsmitteilungen" used 12 % battery on iPhone, that's more than mail, but about the same as browser, a heavily used other app used 20 %.
I'll report numbers for CWA 1.12.1 as soon as it is updated to that version.

So I’m on the latest app and IOS and at this time my remaining battery is in 36% and the consumption of CWA is 14% which is still too much in my eyes. This is way more than my twitter, mail or browser app I’m using most of the day. For comparison twitter and mail are both at 7%.

latest app and IOS

@secuninja so that's iOS 14.4, right?
How much more details does your iOS version show? Could you give us more details?
I am still on 14.2 and I can switch between 24 hours and 10 days view. And I can switch between "activity" and "battery usage". And for 'activity' it shows separate numbers for 'foreground' and 'background'.
My numbers actually look not bad:
10-days view:
activity: cwa 1:12 h foreground + 5 min background = 1:17 h
battery: exposure notifications (Begegnungsmitteilungen) 11%
cwa 2%
24h view:
activity: cwa 1 min foreground
battery: exposure notifications 8%
cwa negligible
cwa 1.11 / iOS 14.2 / iPhone 8

@ndegendogo for info.
@secuninja Also thanks for reporting.
We keep that observing, however, it doesn´t seem that there is a fundamental or critical issue here.

thank you all so far!
Yes I’m on 14.4
Today’s view right now 24h:
Begegnungsmitteilungen 11%
CWA 0% (not opened today)
10days:
BM 10%
CWA 2%
Notable might be that i’m mostly at home so there is only one other phone in range throughout the day.
If that’s all fine in numbers I’ll have to live with that 🤷🏼♂

@secuninja Thanks for the feedback.

How is the current strategy for "Begegnungsmitteilungen"? How often is it run each day?
As far as I have understood it is a critical factor for power usage, so optimizing it can reduce the battery drain.
I noticed for example that CWA shows a nightly update of that information, at a time where I would not care because I sleep. So I could imaging either an optional user setting "no nightly updates" or use sensor information to see whether the smartphone is in use and stop nightly updates when it isn't used.

I noticed for example that CWA shows a nightly update of that information, at a time where I would not care because I sleep. [...] use sensor information to see whether the smartphone is in use and stop nightly updates when it isn't used.

@stweil well, you don't care about the nightly risk assessment, but other people need it before they are going to work and meeting other people (clients / collegues / ...).

So I could imaging either an optional user setting "no nightly updates" [...] users should also have an option to decide themself how often they would like to have an update.

Yes, you are right, there should be more options.
Feel free to upvote this wishlist item and/or extend it with your ideas.

@stweil well, you don't care about the nightly risk assessment, but other people need it before they are going to work and meeting other people (clients / collegues / ...).

Just replace "nightly" by periods of sleep or other inactivity, then it applies to most people. I don't think that it is necessary to wake someone just to say that there was a critical contact. That's why I suggested to use sensor data. The typical acceleration sensors would indicate whether the phone is in use or laying somewhere motionless.
Your wishlist item has good ideas. I upvoted it and added a comment.


Cleanup gitignore for Eclipse files

Currently, some, but not all files that Eclipse creates under .settings
are committed to the repo. It seems cleaner to remove them altogether.

This pull request is now managed with CodeReviewHub. Refresh.

This was taken out of my previous pull request. Not sure if .settings is needed in the repo for some reason but it probably makes sense to take it out?


Discussion: Replace usage of Builder with TypedBuilder

Currently we used Builder to derive builder for simple struct. I just learned that there is another builder implementation called TypedBuilder, which uses generics to ensure safety at compile. I would propose to replace Builder with TypedBuilder.

cc @Fokko @ZENOTME @JanKaul @Xuanwo

Hi! I'm learning Apache Iceberg and I think this issue might be a good starting point to learn about the source code.
I noticed that PartitionSpec, Snapshot, and SortOrder are still using the derive_build macros, and I figured out a solution to migrate them to TypedBuilder.

Snapshot is straightforward:

-#[derive(Debug, PartialEq, Eq, Clone, Builder, Serialize, Deserialize)]
+#[derive(Debug, PartialEq, Eq, Clone, TypedBuilder, Serialize, Deserialize)]
 #[serde(from = "SnapshotV2", into = "SnapshotV2")]
-#[builder(setter(prefix = "with"))]
+#[builder(field_defaults(setter(prefix = "with_")))]
 /// A snapshot represents the state of a table at some time and is used to access the complete set of data files in the table.
 pub struct Snapshot {
     /// A unique long ID
     snapshot_id: i64,
     /// The snapshot ID of the snapshot’s parent.
     /// Omitted for any snapshot with no parent
-    #[builder(default = "None")]
+    #[builder(default = None)]
     parent_snapshot_id: Option<i64>,
     /// A monotonically increasing long that tracks the order of
     /// changes to a table.
@@ -82,7 +83,7 @@ pub struct Snapshot {
     /// A string map that summarizes the snapshot changes, including operation.
     summary: Summary,
     /// ID of the table’s current schema when the snapshot was created.
-    #[builder(setter(strip_option), default = "None")]
+    #[builder(setter(strip_option), default = None)]
     schema_id: Option<i64>,
 }

PartitionSpec is a bit complex, because we need to explicitly define the with_fields and with_partition_field methods

-#[derive(Debug, Serialize, Deserialize, PartialEq, Eq, Clone, Default, Builder)]
+#[derive(Debug, Serialize, Deserialize, PartialEq, Eq, Clone, Default, TypedBuilder)]
 #[serde(rename_all = "kebab-case")]
-#[builder(setter(prefix = "with"))]
+#[builder(field_defaults(setter(prefix = "with_")))]
 ///  Partition spec that defines how to produce a tuple of partition values from a record.
 pub struct PartitionSpec {
     /// Identifier for PartitionSpec
     pub spec_id: i32,
     /// Details of the partition spec
-    #[builder(setter(each(name = "with_partition_field")))]
-    pub fields: Vec<PartitionField>,

+    #[builder(mutators(
+        pub fn with_fields(self, fields: Vec<PartitionField>) {
+            self.fields.extend(fields)
+        }
+
+        pub fn with_partition_field(self, field: PartitionField) {
+            self.fields.push(field)
+        }
+    ), default, via_mutators)]
+    pub fields: Vec<PartitionField>,
 }

SortOrder is similar to PartitionSpec

Hi, @xiaoyang-sde Welcome to contribute! This seems reasonable to me.

Hi, @xiaoyang-sde Welcome to contribute! This seems reasonable to me.

Thanks! Could you please assign this issue to me?

Hi, @xiaoyang-sde Welcome to contribute! This seems reasonable to me.

Thanks! Could you please assign this issue to me?

Done!


[Code] aaz: Support AAZListArg singular options list

Related command

Description

Testing Guide

History Notes

[Component Name 1] BREAKING CHANGE: az command a: Make some customer-facing breaking change
[Component Name 2] az command b: Add some customer-facing feature

This checklist is used to make sure that common guidelines for a pull request are followed.

[ ] The PR title and description has followed the guideline in Submitting Pull Requests.

[ ] I adhere to the Command Guidelines.

[ ] I adhere to the Error Handling Guidelines.

Code


6 token limit should be 4000 not 3900

I can't fully compare whether it works correctly, because the introductory prompt doesn't contain all the things yet, but it looks like it's a lot better than the previous function.
I think we could merge it for now.

OK, I will merge and test in master.


Error with the return of repositories

Hi,
I just upgraded from 1.3.29 to 1.3.31, and also doctrine/doctrine-bundle from 2.7.0 to 2.8.2
I have now errors with the repository->findOneBy method which returns now object|null instead of the expected entity or null.
I use an objectManagerLoader, I include vendor/phpstan/phpstan-doctrine/extension.neon and vendor/phpstan/phpstan-doctrine/rules.neon. I tried with and without bleedingEdge.
The errors disappear  when I downgrade the StubFilesExtensionLoader->getFiles() method and go back to the
return
[
    $path . '/ORM/QueryBuilder.stub',
    $path . '/EntityRepository.stub',
];

I saw that an other issue was created and solved by 1.3.30 but it's still not ok for me.

Please create a small reproducing repository that shows the problem.

I prepared the reproducing repo here. Just run vendor/bin/phpstan and the error that comes out as result is:
Parameter #1 $fooEntity of method App\Controller\FooController::useFoo() expects App\Entity\FooEntity|null, object|null given.

This should work now with PHPStan 1.9.11 and phpstan-doctrine 1.3.32. Please test it :)
The fix: https://github.com/phpstan/phpstan-doctrine/commit/6812cf44e0aff413df467c1a9d12e8ee9b8b192b
The background: Because of how the declaration of the class is conditional (https://github.com/doctrine/DoctrineBundle/blob/2.8.x/Repository/ServiceEntityRepository.php), PHPStan always sees the first definition (class ServiceEntityRepository extends LazyServiceEntityRepository).
But the previous logic in StubFilesExtensionLoader didn't reflect this, which means that the used stub said @extends EntityRepository<TEntityClass>, but because the rest of PHPStan saw class ServiceEntityRepository extends LazyServiceEntityRepository, it didn't use the @extends tag.
The new logic in StubFilesExtensionLoader should be resilient to this.

Thank you, it works!

Thank you @ondrejmirtes !


What kind approch is best to re-render(or reload) List class?

I'm developing the react-native APL using react-native-hackathon-starter(Tab controller) and list-detail screen control (Navigator)
'''
render() {
return (
// Handle navigation between screens
<Navigator
// Default to list route
initialRoute={{name: 'list1'}}
// Use FloatFromBottom transition between screens
configureScene={(route, routeStack) => Navigator.SceneConfigs.FloatFromBottom}
// Pass a route mapper functions
renderScene={RouteMapper}
/>
);
}
}
'''
Sign up, login processing is done at the account tab.
Login processing is implemented with Firebase authentication.
On the user tab, we acquire the current user id and display a list of logged-in user's information.
At the account tab, if the user logs out.
On the user tab, dose not reflect the logout and redisplay the previous user  information.
If the user logs in on a separate account tab, same dose not reflect the logout and redisplay the  previous user  information .
The problem is that the user tab's render does not occur after logging in and logging out.
I can retrieve the correct user by reloading the application and display it.
Two question

Can I control application reloading with React Native? such as CTRL-R on debbuger?

When login change processing was done with the account tab,
Can I re-load the user tab? as described Hierarchy here,

User Tab Class Hierarchy
RootContainer (come from react-native-hackathon-starter)
Nav  (come from react-native-hackathon-starter)
List    (this class needed reloaded including constructor)
Row
Detail (When change tab clicked, list item is tapped, render is started)
How to re-render(or reload) List class when login or logou is occured?
Thanks
Shoji

hi @itagakixt,
From what I understand, if you need to re-render a component, you can change its state using the this.setState method and React Native will pick this up and re-render your component. You can use the componentWillUpdate method as this will be called each the component re-renders.
I would recommend you look into the lifecycle methods for React Native. Check this link out for a start: http://www.reactnativeexpress.com/lifecycle_api

Thanks for reply and pointer,
I'm just studying the lifecycle methods for React Native.
Can I call this.setState from another class?
(in my APL, another Tab need to call this class)
Is there any way to call direct call?(if possible, from beginning constructor )
redux may be a solution for this kind problem?
Thanks
Mounting Cycle
constructor(props) { super(props); this.state = { // state initial process } }
componentWillMount(){ // before render process }
shouldComponentUpdate(){ // view or not // return true or false}
render() { return( // View ); }
componentDidMount(){ // after render, DOM initial process }
Updating Cycle
componentWillReceiveProps(nextProps){ // called when props is update}
componentWillUpdate(nextProps, nextState){ // before Component update }
componentDidUpdate(prevProps, prevState){ // after Component update}
componentWillUnmount(){ // called when deleted Component} }


Update layout for release and visibility section of item deposit form

Goal is to make this section more readable and to make it clear that there are multiple settings the user may need to consider here.
In general this will:

split this into separate sections -- 2 now, and 3 once DOI is added
each section will have its own clear header
asterisks for whether a section is provided will be displayed next to the header ONLY when the user can actually make a choice, i.e. when the collection-level setting is "depositor selects"
sections will be set off from each other with gray boxes
in each section the display will either say what the setting is set for when it has been defined at the collection level, or the display will present the user an option when the collection has been set for "depositor selects"

See the design mockup for this at https://projects.invisionapp.com/share/EQXC9CLKCR2#/screens/453759485_DOI -- see mockup IIIa.

This ticket is only for the release and visibility sections. The DOI section will be ticketed separately.

Currently waiting for final changes to the mockups to be completed.

@astridu should we drop the bold text on the radio label that is selected?

@amyehodge the implication for including DOI in this section is that it happens after publication, but we want the DOI to be minted right away, not after the embargo is released, right?  Is that confusing to the user?

@jcoyne
should we drop the bold text on the radio label that is selected? Yes, it's inconsistent with how we treat other radio button selections (like on the collections page).
Are we going to stop doing the conditional title for this section? No. Updated the screenshot below.

@astridu and @jcoyne I've been thinking about @jcoyne's question to me above. The reason we had included "after publication" in this header was to make it clearer that these things only happen after you click the "deposit" button. Though this button in hydrus is called "publish" which was more of a direct connection. I wonder if that makes sense now that we changed the button to say "deposit."
Maybe we should go for more clarity here -- "Manage settings for release date, download access, and DOI assignment". If we do that we may want to change the subheader for "Audience" as well to "Download access".
Thoughts?

That sounds good. Will update mockup this afternoon.

Here is a link to the updated mockups: https://projects.invisionapp.com/share/EQXC9CLKCR2#/453759485_DOI

Thanks, @astridu. @jcoyne does this adequately address your concern?

Sure does. 👍

Cool. I'm putting this in the ready.


[Question] Md2Autocomplete and textChange emit old value

Hi. Just a question.
When i subscribed on Md2Autocomplete.textChange i am waiting for actual value but i see there is previous result.
e.g.
i typed 'Hello', but emitted value is 'Hell'
http://plnkr.co/edit/mXFOxwDB7jFmeotrausc?p=preview
And one more:
When i key 'left arrow' or any other keys which do not affect somehow on text, the emit is performed.
But i believe that emit should not be performed.

@maratoss will update it in next build

@krupa310
Thanks.
I see you left the emit value in keyDown handler and now we have it also in keyUp handler => it will emit twice, is it correct behavior?
And what about second point?
I guess it should emit only when text is really changed, but as i said it emits even if you push any arrows or Esc Or Enter etc...

@maratoss  no it should trigger only once(on KyeUp). I had mistakenly keep it in KeyDown.
For your second point:
Currently, we are not planning for that.


Update Jest

60 vulnerabilities are cause by an outdated braces version. This brings the version of jest the current version in which the braces version is updated to fix it.

This is a dupe of #6278.


Editor tab changes to blue when there's no changes after format

Editor tab in IDEA changes to blue indicating file is changed after doing code format with EclipseCodeFormatter. How ever when you check with commit dialog (git) and show differences view, there is no differences between before / after formatting.

Does Refresh VCS changes button in Version Control tool window help?

Looks familiar?

Hmm IJ 16 seem to have a problem with that, but after I edit another file, the project view changes it back to white...

Yes sometimes later it usually goes back from blue ...
I have also setup git so it won't count CRLF as change...

I am using IJ 15.0.3 Community edition ...

fixed, you can try it from here:
https://github.com/krasa/EclipseCodeFormatter/releases/download/<IP_ADDRESS>7.0/EclipseFormatter.zip


Can I use detection data set  for training?

Hello, I saw the centertrack paper mentioned: "If there is no labeled video data, we can also use a static image to train CenterTrack: by randomly scaling and transforming the current image to generate the previous frame, so The purpose of simulating the movement of the target. The experiment proves that this trick is very effective and will hardly affect the effect of the tracking model..The detection data set does not have target ID number,Does this mean that the detection data set can be used for model training?

Yes.

Hi，I am very interested in detection data set to train this model. Can you tell me how to use the detection data？Thank you

But when i used static images to train this model, and the map/f1score didn't get higher results than centerNet.
when i use this datasets to train CenterNet, and results got better.  and i don't know why


Fix incorrect version links

Motivation

The releases page was incorrectly pointing to Relay's releases page.
Add missing key to render.
General formatting improvements.

Have you read the Contributing Guidelines on pull requests?
Yes
Test Plan
Load versions page locally and clicked around.
Related PRs
NA

We might want to make similar fixes to the example versions file too. https://github.com/facebook/Docusaurus/blob/master/examples/versions/pages/en/versions.js


Not able to get it to work :(

Hey Fernando!
I've been searching for a native lib like this for a long time, it has everything I need but unfortunately I couldn't get it to work. I followed the examples and every time I end up with just an image on the screen.  All I did was install the package and rebuilt the app via EAS, do I need to do some additional setup step that I'm missing?
  import { Image } from 'expo-image';
  import { Galeria } from '@nandorojo/galeria';

  const url = 'https://i.imgur.com/gZc0oeO.png',

  return (
    <View
      style={{
        flex: 1,
        justifyContent: 'center',
        alignItems: 'center',
        borderColor: 'red',
        borderStyle: 'solid',
        borderWidth: 1
      }}
    >
      <Galeria urls={[url]} theme="light">
        <Galeria.Image>
          <Image
            source={{ uri: url }}
            style={{
              width: 300,
              height: 300
            }}
          />
        </Galeria.Image>
      </Galeria>
    </View>
  );

This is on a Expo SDK 51 managed workflow with a dev client.

hey, weird. i’ll take a look, might be a version thing. not new arch right?

hey, weird. i’ll take a look, might be a version thing. not new arch right?

Yep old arch, thanks!

hey, weird. i’ll take a look, might be a version thing. not new arch right?

Hey @nandorojo any update on this? :)

hey remind me the platform? just checked the example app and it worked for me

hey remind me the platform? just checked the example app and it worked for me

ok this is weird, I finally got it to work randomly but it looks very different from what the instructions say:
Single:
    <Galeria>
      <Galeria.Image
        src={urls[0]}
        style={{
          width: 300,
          height: 300
        }}
      />
    </Galeria>

Multiple:

   <Galeria urls={urls}>
        <FlashList
          data={urls}
          renderItem={({ item, index }) => {
            return (
              <Galeria.Image
                src={urls[index]}
                index={index}
                recyclingKey={item + index}
                style={{
                  width: IMAGE_SIZE,
                  height: IMAGE_SIZE
                }}
              />
            );
          }}
          numColumns={3}
          estimatedItemSize={IMAGE_SIZE}
          keyExtractor={(item, i) => item + i}
        />
      </Galeria>

So not using any additional image component and using the src prop directly on the Galeria.Image tag instead. And for the single version not using a urls prop on the Galeria wrapper doesn't seem to matter, works without it too.
Anyway I'll close the bug,I'll let u decide if the instructions should be updated or not. Really weird that the demo is working but if no one else complained it might be some weird case with me 🤷

The same issue persists, nothing has happend on press, it doesn't work as described in the documentation for the latest version (0.4.0) on iOS 18.2. The previous version works but only as presented above by @TowhidKashem when you pass the src prop to GaleriaImage. However, this version has different issues, such as missing/flickering items.
0.4.0: (Press event is not visible on recording, but basically the item does not react)
https://github.com/user-attachments/assets/9405de8d-3f3d-4aa8-8c1d-3f4b59c5bb91
Expo 52
New architecture enabled.
import React, { useMemo } from "react";
import { FlatList, type ListRenderItemInfo, type ViewStyle } from "react-native";
import { Image } from "expo-image";

// 0.4.0 is not published on npm, I copied manually sources
import { Galeria } from "../../../modules/galeria";

interface GalleryProps {
  images: { url: string; photoId: string; thumbnailUrl?: string; type: string }[];
  style?: ViewStyle;
}

export const Gallery = ({ images, style }: GalleryProps): React.ReactElement => {
  const imagesWithUri = useMemo(() => images.map((image) => ({ uri: image.url })).map((item) => item.uri), []);
  const renderItem = ({ item: url, index }: ListRenderItemInfo<string>) => {
    return (
      <Galeria.Image
        id={url}
        index={index}
        style={{
          borderRadius: 8,
          overflow: "hidden",
          width: 60,
          height: 60,
        }}
      >
        <Image
          style={{
            width: 60,
            height: 60,
            resizeMode: "cover",
          }}
          source={typeof url === "string" ? { uri: url } : url}
          recyclingKey={url + index}
        />
      </Galeria.Image>
    );
  };
  return (
    <>
      <Galeria urls={imagesWithUri} theme="dark">
        <FlatList
          horizontal
          contentContainerStyle={[
            {
              justifyContent: "center",
              alignContent: "flex-start",
              gap: 12,
              paddingHorizontal: 2,
              marginVertical: 8,
            },
            style,
          ]}
          data={imagesWithUri}
          showsHorizontalScrollIndicator={false}
          renderItem={renderItem}
          keyExtractor={(item, i) => item + i}
        />
      </Galeria>
    </>
  );
};

@nandorojo Any advice how fix it?

I found a fix for new architecture:
https://github.com/user-attachments/assets/78f09ebe-a03e-44e4-81b7-751b503182fe
import UIKit
import ExpoModulesCore
import ImageViewer_swift

public class GaleriaView: ExpoView {
    // Props
    var urls: [String]? {
        didSet {
            setupImageView()
        }
    }

    var initialIndex: Int? {
        didSet {
            setupImageView()
        }
    }

    var theme: Theme = .dark {
        didSet {
            setupImageView()
        }
    }

    var closeIconName: String?
    var rightNavItemIconName: String?

    let onPressRightNavItemIcon: EventDispatcher

    public required init(appContext: AppContext? = nil) {
        onPressRightNavItemIcon = EventDispatcher()
        super.init(appContext: appContext)
    }

    public override func didUpdateReactSubviews() {
        super.didUpdateReactSubviews()
        setupImageView()
    }

    public override func didMoveToWindow() {
        super.didMoveToWindow()
        setupImageView()
    }

    private func getChildImageView() -> UIImageView? {
        func findImageView(_ view: UIView) -> UIImageView? {
            if let imageView = view as? UIImageView {
                return imageView
            }

            for subview in view.subviews {
                if let found = findImageView(subview) {
                    return found
                }
            }

            return nil
        }

        return findImageView(self)
    }

    private func setupImageView() {
        let viewerTheme = theme.toImageViewerTheme()
        guard let childImage = getChildImageView() else {
            return
        }

        if let urls = self.urls, let initialIndex = self.initialIndex {
            setupImageViewerWithUrls(
                childImage,
                urls: urls,
                initialIndex: initialIndex,
                viewerTheme: viewerTheme
            )
        } else {
            setupImageViewerWithSingleImage(childImage, viewerTheme: viewerTheme)
        }
    }

    private func setupImageViewerWithUrls(
        _ childImage: UIImageView,
        urls: [String],
        initialIndex: Int,
        viewerTheme: ImageViewerTheme
    ) {
        let urlObjects = urls.compactMap(URL.init(string:))
        let options = buildImageViewerOptions()

        childImage.setupImageViewer(
            urls: urlObjects,
            initialIndex: initialIndex,
            options: options
        )
    }

    private func setupImageViewerWithSingleImage(
        _ childImage: UIImageView,
        viewerTheme: ImageViewerTheme
    ) {
        guard let img = childImage.image else {
            return
        }
        let options = buildImageViewerOptions()

        childImage.setupImageViewer(images: [img], options: options)
    }

    private func buildImageViewerOptions() -> [ImageViewerOption] {
        let viewerTheme = theme.toImageViewerTheme()
        var options: [ImageViewerOption] = [.theme(viewerTheme)]
        let iconColor = theme.iconColor()

        if let closeIconName = closeIconName,
           let closeIconImage = UIImage(systemName: closeIconName)?
            .withTintColor(iconColor, renderingMode: .alwaysOriginal) {
            options.append(ImageViewerOption.closeIcon(closeIconImage))
        }

        if let rightIconName = rightNavItemIconName,
           let rightIconImage = UIImage(systemName: rightIconName)?
            .withTintColor(iconColor, renderingMode: .alwaysOriginal) {
            let rightNavItemOption = ImageViewerOption.rightNavItemIcon(
                rightIconImage,
                onTap: { [weak self] index in
                    self?.onPressRightNavItemIcon(["index": index])
                }
            )
            options.append(rightNavItemOption)
        }

        return options
    }
}

public enum Theme: String, Enumerable {
    case dark
    case light

    func toImageViewerTheme() -> ImageViewerTheme {
        switch self {
        case .dark:
            return .dark
        case .light:
            return .light
        }
    }

    func iconColor() -> UIColor {
        switch self {
        case .dark:
            return .white
        case .light:
            return .black
        }
    }
}

BTW Android works out of the box.

Thank you for sharing! I assume the changes were subviews related?

I've used Claude AI because I'm not a native developer 😅, so someone with experience in Swift should take a look. The final differences are:

Changed getChildImageView() implementation:

// Original
func getChildImageView() -> UIImageView? {
    guard let reactSubviews = self.reactSubviews() else { return nil }

    for reactSubview in reactSubviews {
      for subview in reactSubview.subviews {
        if let imageView = subview as? UIImageView {
          return imageView
        }
      }
    }

    return nil
}

// New - recursive search that works with both architectures
private func getChildImageView() -> UIImageView? {
    func findImageView(_ view: UIView) -> UIImageView? {
        if let imageView = view as? UIImageView {
            return imageView
        }

        for subview in view.subviews {
            if let found = findImageView(subview) {
                return found
            }
        }

        return nil
    }

    return findImageView(self)
}

Added proper initialization for EventDispatcher:

// New
public required init(appContext: AppContext? = nil) {
    onPressRightNavItemIcon = EventDispatcher()
    super.init(appContext: appContext)
}

Added Fabric lifecycle methods:

// New
public override func didUpdateReactSubviews() {
    super.didUpdateReactSubviews()
    setupImageView()
}

public override func didMoveToWindow() {
    super.didMoveToWindow()
    setupImageView()
}

Removed unnecessary insertReactSubview override

I found a fix for new architecture:
https://github.com/user-attachments/assets/78f09ebe-a03e-44e4-81b7-751b503182fe

import UIKit

import ExpoModulesCore

import ImageViewer_swift

public class GaleriaView: ExpoView {

    // Props

    var urls: [String]? {

        didSet {

            setupImageView()

        }

    }

    var initialIndex: Int? {

        didSet {

            setupImageView()

        }

    }

    var theme: Theme = .dark {

        didSet {

            setupImageView()

        }

    }

    var closeIconName: String?

    var rightNavItemIconName: String?

    let onPressRightNavItemIcon: EventDispatcher

    public required init(appContext: AppContext? = nil) {

        onPressRightNavItemIcon = EventDispatcher()

        super.init(appContext: appContext)

    }

    public override func didUpdateReactSubviews() {

        super.didUpdateReactSubviews()

        setupImageView()

    }

    public override func didMoveToWindow() {

        super.didMoveToWindow()

        setupImageView()

    }

    private func getChildImageView() -> UIImageView? {

        func findImageView(_ view: UIView) -> UIImageView? {

            if let imageView = view as? UIImageView {

                return imageView

            }

            for subview in view.subviews {

                if let found = findImageView(subview) {

                    return found

                }

            }

            return nil

        }

        return findImageView(self)

    }

    private func setupImageView() {

        let viewerTheme = theme.toImageViewerTheme()

        guard let childImage = getChildImageView() else {

            return

        }

        if let urls = self.urls, let initialIndex = self.initialIndex {

            setupImageViewerWithUrls(

                childImage,

                urls: urls,

                initialIndex: initialIndex,

                viewerTheme: viewerTheme

            )

        } else {

            setupImageViewerWithSingleImage(childImage, viewerTheme: viewerTheme)

        }

    }

    private func setupImageViewerWithUrls(

        _ childImage: UIImageView,

        urls: [String],

        initialIndex: Int,

        viewerTheme: ImageViewerTheme

    ) {

        let urlObjects = urls.compactMap(URL.init(string:))

        let options = buildImageViewerOptions()

        childImage.setupImageViewer(

            urls: urlObjects,

            initialIndex: initialIndex,

            options: options

        )

    }

    private func setupImageViewerWithSingleImage(

        _ childImage: UIImageView,

        viewerTheme: ImageViewerTheme

    ) {

        guard let img = childImage.image else {

            return

        }

        let options = buildImageViewerOptions()

        childImage.setupImageViewer(images: [img], options: options)

    }

    private func buildImageViewerOptions() -> [ImageViewerOption] {

        let viewerTheme = theme.toImageViewerTheme()

        var options: [ImageViewerOption] = [.theme(viewerTheme)]

        let iconColor = theme.iconColor()

        if let closeIconName = closeIconName,

           let closeIconImage = UIImage(systemName: closeIconName)?

            .withTintColor(iconColor, renderingMode: .alwaysOriginal) {

            options.append(ImageViewerOption.closeIcon(closeIconImage))

        }

        if let rightIconName = rightNavItemIconName,

           let rightIconImage = UIImage(systemName: rightIconName)?

            .withTintColor(iconColor, renderingMode: .alwaysOriginal) {

            let rightNavItemOption = ImageViewerOption.rightNavItemIcon(

                rightIconImage,

                onTap: { [weak self] index in

                    self?.onPressRightNavItemIcon(["index": index])

                }

            )

            options.append(rightNavItemOption)

        }

        return options

    }

}

public enum Theme: String, Enumerable {

    case dark

    case light

    func toImageViewerTheme() -> ImageViewerTheme {

        switch self {

        case .dark:

            return .dark

        case .light:

            return .light

        }

    }

    func iconColor() -> UIColor {

        switch self {

        case .dark:

            return .white

        case .light:

            return .black

        }

    }

}

BTW Android works out of the box.

Wow nice work! Just in time cause I came back to this lib for a project and was experiencing the flickering issue you mentioned with the latest version. Will try your fix and see how it goes!


BlLineElement seems to not react to click events

Try this:
BlLineElement new
	border: (BlBorder paint: Color blue width: 2);
	when: BlClickEvent do: [:e | e halt ]

And then click on the line.

Solved via https://github.com/feenkcom/gtoolkit/issues/1168


Update README.md

I examined the project here on GitHub and didn't realize what I should do.  The Readme seems to have been written under the assumption that the only way to get to it is by logging into maps4all.org.  Since I didn't do that, I figure others also might not do it, so the text I added will help them proceed.

This request should be rejected and replaced with the other one I made.


Anyone started working on the homework problems?

@s4il3sh Yes, do you have any questions?

Yes, I used the same values.
Did you find any issues with those values?
@s4il3sh

yes
I'm working on the 1st 2 configurations
the cubic and the pentagon

Yes, I used the same values. Did you find any issues with those values? @s4il3sh

@tirthbha Are we supposed to use the formula given in the paper to calculate potential energy?

yeah, i did all 7 configs


Update COPYRIGHT

removed extra blank space
NOTE: Please read the CONTRIBUTING.md guidelines before submitting your patch,
and ensure you followed them all:
https://github.com/Kong/kong/blob/master/CONTRIBUTING.md#contributing
Summary
SUMMARY_GOES_HERE
Full changelog

[Implement ...]
[Add related tests]
...

Issues resolved
Fix #XXX

Hi,
This file is auto-generated by an internal tool of ours, and should not be modified by hand. We should probably include a note stating this at the top of this file. Unfortunately, we cannot accept contributions to do this at the moment since, as stated, this tool is internal.
(cc @coopr on considering adding or backlogging somewhere the "do not edit" note in the generator).
Thank you


RAC-5031 - Conversion and testing of CIT Skupack tests

Reworked skupack_tests.py to better handle post/put/patch.
Created skupack_node_updates.py to test sku attachement and de-attachment
flake8 corrections

@jimturnquist @hohene @johren

test this please

BUILD RackHD #265 : FAILURE

test this please

test this please

BUILD RackHD #321 : FAILURE


Manpage for docker-inspect uses invalid syntax for getting container instance IP address

To get a container instance's IP address, the manpage for docker-inspect says to run:
$ docker inspect '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' d2cc496561d6
But this command returns an error on Docker v1.10.0:
"Error: No such image or container: {{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}"
The "--format=" flag appears to be missing, so the syntax should be:
$ docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' d2cc496561d6
Tested on Ubuntu 14.04x64 with docker version:
Client:
Version:      1.10.0
API version:  1.22
Go version:   go1.5.3
Git commit:   590d5108
Built:        Thu Feb  4 18:36:33 2016
OS/Arch:      linux/amd64
Server:
Version:      1.10.0
API version:  1.22
Go version:   go1.5.3
Git commit:   590d5108
Built:        Thu Feb  4 18:36:33 2016
OS/Arch:      linux/amd64

If you are reporting a new issue, make sure that we do not have any duplicates already open. You can ensure this by searching the issue list for this repository. If there is a duplicate, please close your issue and add a comment to the existing issue instead.
If you suspect your issue is a bug, please edit your issue description to include the BUG REPORT INFORMATION shown below. If you fail to provide this information within 7 days, we cannot debug your issue and will close it. We will, however, reopen it if you later provide the information.
For more information about reporting issues, see CONTRIBUTING.md.
You don't have to include this information if this is a feature request
(This is an automated, informational response)

BUG REPORT INFORMATION
Use the commands below to provide key information from your environment:
docker version:
docker info:
Provide additional environment details (AWS, VirtualBox, physical, etc.):
List the steps to reproduce the issue:
1.
2.
3.
Describe the results you received:
Describe the results you expected:
Provide additional info you think is important:
----------END REPORT ---------
#ENEEDMOREINFO


Active TCP candidates?

In some cases, I will use Pion instead of the browser as the client to push data to the server. When the server only supports tcp-type ice links, the candidate address generated by Pion needs to be an active-mode tcp address. Tried examples/ice-tcp, the current tcp candidate addresses only include passive mode addresses, and I didn’t find any configuration items that can change this.
The phenomenon I encountered is that Pion generates tcp passive candidate addresses, and the server’s candidate addresses only have tcp passive mode, and they always fail to connect.
When I use the browser as a client, it generates tcp's active mode candidates and works fine.
I guess the reason for the inability to connect may be related to the active mode and passive mode. I am sorry that I am a novice in webrtc, and I am not very clear about some underlying principles.
If Pion already supports this function, can you tell me how to make this function take effect?
Thanks.

Hi @ahaooahaz, it is not supported yet.
Here is draft PR for the feature: https://github.com/pion/ice/pull/394

#565 has been merged. 🥳

@ahaooahaz I just tagged v3.2.3 which has Active TCP support, would you mind testing it out. Thank you!

@Sean-Der @stv0g @ashellunts Great works!
I has tested publish video to TCP-only webrtc server, I can see the ICE-TCP connected, but when transport SRTP packets there always auth failed.
here is the TCP-only server logs which publish client is<EMAIL_ADDRESS>2023-05-19 03:04:50.473 D [MediaServer] [7-event poller 3] DtlsTransport.cpp:1018 SendPendingOutgoingDtlsData | 75 bytes of DTLS data ready to sent to the peer
2023-05-19 03:04:50.473 D [MediaServer] [7-event poller 3] DtlsTransport.cpp:1207 CheckRemoteFingerprint | valid remote fingerprint
2023-05-19 03:04:50.473 D [MediaServer] [7-event poller 3] DtlsTransport.cpp:1381 GetNegotiatedSrtpCryptoSuite | chosen SRTP crypto suite: SRTP_AEAD_AES_256_GCM
2023-05-19 03:04:50.473 I [MediaServer] [7-event poller 3] WebRtcTransport.cpp:137 OnDtlsTransportConnected |
2023-05-19 03:04:50.474 D [MediaServer] [7-event poller 3] DtlsTransport.cpp:1056 SetTimeout | DTLS timer set in 99ms
2023-05-19 03:04:50.490 W [MediaServer] [7-event poller 3] SrtpSession.cpp:246 DecryptSrtp | srtp_unprotect() failed:authentication failure (srtp_err_status_auth_fail)
2023-05-19 03:04:50.490 W [MediaServer] [7-event poller 3] SrtpSession.cpp:246 DecryptSrtp | srtp_unprotect() failed:authentication failure (srtp_err_status_auth_fail)

here is the TCP-only server logs which publish client is Chrome:
2023-05-19 03:09:32.697 D [MediaServer] [7-event poller 3] DtlsTransport.cpp:1456 OnSslInfo | DTLS handshake done
2023-05-19 03:09:32.697 D [MediaServer] [7-event poller 3] DtlsTransport.cpp:1018 SendPendingOutgoingDtlsData | 67 bytes of DTLS data ready to sent to the peer
2023-05-19 03:09:32.697 D [MediaServer] [7-event poller 3] DtlsTransport.cpp:1207 CheckRemoteFingerprint | valid remote fingerprint
2023-05-19 03:09:32.697 D [MediaServer] [7-event poller 3] DtlsTransport.cpp:1381 GetNegotiatedSrtpCryptoSuite | chosen SRTP crypto suite: SRTP_AEAD_AES_256_GCM
2023-05-19 03:09:32.697 I [MediaServer] [7-event poller 3] WebRtcTransport.cpp:137 OnDtlsTransportConnected |
2023-05-19 03:09:32.697 D [MediaServer] [7-event poller 3] DtlsTransport.cpp:1056 SetTimeout | DTLS timer set in 99ms
2023-05-19 03:09:32.796 D [MediaServer] [7-event poller 3] DtlsTransport.cpp:1472 OnTimer | handshake is done so return
2023-05-19 03:09:32.846 W [MediaServer] [7-event poller 3] WebRtcTransport.cpp:923 inputRtp | unknown rtx rtp, rid:, ssrc:1590349209, codec:H264, seq:5814
2023-05-19 03:09:32.848 I [MediaServer] [7-event poller 3] WebRtcTransport.cpp:866 createRtpChannel | create rtp receiver of ssrc:1062276153, rid:, codec:H264
2023-05-19 03:09:32.850 D [MediaServer] [7-event poller 3] MediaSink.cpp:137 emitAllTrackReady | all track ready use 153ms
2023-05-19 03:09:32.850 T [MediaServer] [7-event poller 3] MediaSink.cpp:259 addMuteAudioTrack | mute aac track added
2023-05-19 03:09:32.850 I [MediaServer] [7-event poller 3] MultiMediaSourceMuxer.cpp:368 onAllTrackReady | stream: rtc://<IP_ADDRESS>:80/1/2?app=1&stream=2&type=push&session=43-72 , codec info: mpeg4-generic[8000/1/16] H264[320/180/0]
2023-05-19 03:09:32.856 I [MediaServer] [7-event poller 3] MediaSource.cpp:523 emitEvent | 媒体注册:rtmp://__defaultVhost__/1/2
2023-05-19 03:09:32.856 I [MediaServer] [7-event poller 3] MediaSource.cpp:523 emitEvent | 媒体注册:rtsp://__defaultVhost__/1/2
2023-05-19 03:09:32.896 D [MediaServer] [7-event poller 3] DtlsTransport.cpp:1472 OnTimer | handshake is done so return
2023-05-19 03:09:33.492 D [MediaServer] [7-event poller 3] DtlsTransport.cpp:1472 OnTimer | handshake is done so return

Hi @ahaooahaz would you please try again with v3.2.4
I believe you hit an unrelated bug. thank you!

@Sean-Der I changed to v3.2.4 and it works! :partying_face: