Windws Server 2019 RemoteApp disconnect

Error connecting to Windows 2019 RemoteAPP with Windows Client.
Success connecting to Windows 2016 RemoteAPP with Windows Client.
Success connecting to Windows 2016/2019 RemoteAPP with macOS client.
apt install -y --no-install-recommends  ninja-build build-essential debhelper cdbs dpkg-dev autotools-dev cmake \
pkg-config xmlto libssl-dev docbook-xsl xsltproc git libsystemd-dev libz-dev ffmpeg libavutil-dev libavcodec-dev \
libavresample-dev libcairo-dev libpulse-dev libxkbfile-dev libx11-dev libwayland-dev libxrandr-dev libxi-dev \
libxrender-dev libxext-dev libxinerama-dev libxfixes-dev libxcursor-dev libxv-dev libxdamage-dev libxtst-dev \
libcups2-dev libpcsclite-dev libasound2-dev libjpeg-dev libgsm1-dev libusb-1.0-0-dev libudev-dev \
libdbus-glib-1-dev uuid-dev libxml2-dev libgstreamer1.0-dev libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev \
libgstreamer-plugins-base1.0-dev libfaad-dev libfaac-dev libswscale-dev clang-format

git clone -b 2.7.0 https://github.com/FreeRDP/FreeRDP /opt/FreeRDP
cd /opt/FreeRDP

cmake -DCMAKE_BUILD_TYPE=Release -DWITH_PROXY_MODULES=ON -DCHANNEL_URBDRC=OFF -DWITH_PROXY=ON -DWITH_SHADOW=OFF -DWITH_SERVER=ON -DBUILD_SHARED_LIBS=OFF -DPROXY_PLUGINDIR=/opt/freerdp
cmake --build . -j $(nproc)
cmake --build . --target install

# config.ini
[Server]
Host = <IP_ADDRESS>
Port = 3389

[SessionCapture]
Enabled = TRUE
CapturesDirectory = "/opt/freerdp/data/captures"

[Target]
; If this value is set to TRUE, the target server info will be parsed using the
; load balance info setting at runtime. The format is
; "Cookie: msts=<target server>", and can be set in an rdp file for windows/mac,
; and the /load-balance-info: CLI option for xfreerdp. Otherwise, the server
; will always connect to the same target, using the configured values of `Host`
; and `Port`.
; FixedTarget = TRUE
UseLoadBalanceInfo = FALSE
Host = <IP_ADDRESS>
Port = 3389

[Input]
Mouse = TRUE
Keyboard = TRUE
Multitouch = TRUE

[Security]
ServerNlaSecurity = TRUE
ServerTlsSecurity = TRUE
ServerRdpSecurity = TRUE
ClientTlsSecurity = TRUE
ClientRdpSecurity = TRUE
ClientNlaSecurity = TRUE
ClientAllowFallbackToTls = TRUE

[Channels]
GFX = TRUE
DisplayControl = TRUE
Clipboard = TRUE
AudioInput = TRUE
AudioOutput = TRUE
RemoteApp = TRUE
DeviceRedirection = TRUE
VideoRedirection = TRUE
CameraRedirection = TRUE
PassthroughIsBlacklist = TRUE
; a list of comma seperated static channels that will be proxied. This feature is useful,
; for example when there's a custom static channel that isn't implemented in freerdp/proxy, and is needed to be proxied when connecting through the proxy.
Passthrough = ""

[Clipboard]
TextOnly = FALSE
MaxTextLength = 0

[GFXSettings]
DecodeGFX = FALSE

[Plugins]
; An optional, comma separated list of paths to modules that the proxy should load at startup.
;
; Modules = "proxy-demo-plugin.so"
; Modules = "capture"

; An optional, comma separated list of required plugins (names),
; that the proxy won't start without having them loaded.
;
; Required = "demo"
; Required = "capture"

[08:48:39:469] [18:18] [INFO][proxy.server] - freerdp-proxy version info:
[08:48:39:469] [18:18] [INFO][proxy.server] - 	FreeRDP version: 2.7.0
[08:48:39:469] [18:18] [INFO][proxy.server] - 	Git commit: 2.7.0
[08:48:39:469] [18:18] [INFO][proxy.config] - Proxy configuration:
[08:48:39:469] [18:18] [INFO][proxy.config] - 	Server:
[08:48:39:469] [18:18] [INFO][proxy.config] - 		Host: <IP_ADDRESS>
[08:48:39:469] [18:18] [INFO][proxy.config] - 		Port: 3389
[08:48:39:469] [18:18] [INFO][proxy.config] - 		SessionCapture: TRUE
[08:48:39:469] [18:18] [INFO][proxy.config] - 	Target:
[08:48:39:469] [18:18] [INFO][proxy.config] - 		TargetHost: <IP_ADDRESS>
[08:48:39:469] [18:18] [INFO][proxy.config] - 		TargetPort: 3389
[08:48:39:469] [18:18] [INFO][proxy.config] - 	Input:
[08:48:39:469] [18:18] [INFO][proxy.config] - 		Keyboard: TRUE
[08:48:39:469] [18:18] [INFO][proxy.config] - 		Mouse: TRUE
[08:48:39:469] [18:18] [INFO][proxy.config] - 	Server Security:
[08:48:39:469] [18:18] [INFO][proxy.config] - 		ServerTlsSecurity: TRUE
[08:48:39:469] [18:18] [INFO][proxy.config] - 		ServerRdpSecurity: TRUE
[08:48:39:470] [18:18] [INFO][proxy.config] - 	Client Security:
[08:48:39:470] [18:18] [INFO][proxy.config] - 		ClientNlaSecurity: TRUE
[08:48:39:470] [18:18] [INFO][proxy.config] - 		ClientTlsSecurity: TRUE
[08:48:39:470] [18:18] [INFO][proxy.config] - 		ClientRdpSecurity: TRUE
[08:48:39:470] [18:18] [INFO][proxy.config] - 		ClientAllowFallbackToTls: TRUE
[08:48:39:470] [18:18] [INFO][proxy.config] - 	Channels:
[08:48:39:470] [18:18] [INFO][proxy.config] - 		GFX: TRUE
[08:48:39:470] [18:18] [INFO][proxy.config] - 		DisplayControl: TRUE
[08:48:39:470] [18:18] [INFO][proxy.config] - 		Clipboard: TRUE
[08:48:39:470] [18:18] [INFO][proxy.config] - 		AudioOutput: TRUE
[08:48:39:470] [18:18] [INFO][proxy.config] - 		RemoteApp: TRUE
[08:48:39:470] [18:18] [INFO][proxy.config] - 	Static Channels Proxy:
[08:48:39:470] [18:18] [INFO][proxy.config] - 		-
[08:48:39:470] [18:18] [INFO][proxy.config] - 	Clipboard:
[08:48:39:470] [18:18] [INFO][proxy.config] - 		TextOnly: FALSE
[08:48:39:470] [18:18] [INFO][proxy.config] - 	SessionCapture:
[08:48:39:470] [18:18] [INFO][proxy.config] - 		SessionCapture: TRUE
[08:48:39:470] [18:18] [INFO][proxy.config] - 		CapturesDirectory: /opt/freerdp/data/captures
[08:48:39:471] [18:18] [INFO][com.freerdp.core.listener] - Listening on [<IP_ADDRESS>]:3389
[08:48:51:089] [18:20] [INFO][proxy.server] - [SessionID=2D536787A4EC62AE6349D7FA08465102][pf_server_handle_peer]: peer connected: <IP_ADDRESS>
[08:48:51:137] [18:20] [INFO][com.freerdp.core.connection] - Client Security: NLA:1 TLS:1 RDP:0
[08:48:51:137] [18:20] [INFO][com.freerdp.core.connection] - Server Security: NLA:0 TLS:1 RDP:1
[08:48:51:137] [18:20] [INFO][com.freerdp.core.connection] - Negotiated Security: NLA:0 TLS:1 RDP:0
[08:48:52:452] [18:20] [ERROR][com.freerdp.core.transport] - BIO_read returned a system error 104: Connection reset by peer
[08:48:52:452] [18:20] [ERROR][com.freerdp.core] - transport_read_layer:freerdp_set_last_error_ex ERRCONNECT_CONNECT_TRANSPORT_FAILED [0x0002000D]
[08:48:52:452] [18:20] [INFO][proxy.server] - [SessionID=2D536787A4EC62AE6349D7FA08465102][pf_server_handle_peer]: starting shutdown of connection
[08:48:52:452] [18:20] [INFO][proxy.server] - [SessionID=2D536787A4EC62AE6349D7FA08465102][pf_server_handle_peer]: stopping proxy's client
[08:48:52:452] [18:20] [INFO][proxy.server] - [SessionID=2D536787A4EC62AE6349D7FA08465102][pf_server_handle_peer]: freeing server's channels
[08:48:52:452] [18:20] [INFO][proxy.server] - [SessionID=2D536787A4EC62AE6349D7FA08465102][pf_server_handle_peer]: freeing proxy data
[08:48:52:452] [18:20] [ERROR][com.freerdp.core.transport] - BIO_should_retry returned a system error 32: Broken pipe
[08:48:53:783] [18:21] [INFO][proxy.server] - [SessionID=BE492CD12EECF0F1B3F979DD75529FD0][pf_server_handle_peer]: peer connected: <IP_ADDRESS>
[08:48:53:808] [18:21] [INFO][com.freerdp.core.connection] - Client Security: NLA:1 TLS:1 RDP:0
[08:48:53:808] [18:21] [INFO][com.freerdp.core.connection] - Server Security: NLA:0 TLS:1 RDP:1
[08:48:53:808] [18:21] [INFO][com.freerdp.core.connection] - Negotiated Security: NLA:0 TLS:1 RDP:0
[08:48:53:145] [18:21] [INFO][com.freerdp.core.connection] - Accepted client: XIAOBAI-PC
[08:48:53:145] [18:21] [INFO][com.freerdp.core.connection] - Accepted channels:
[08:48:53:145] [18:21] [INFO][com.freerdp.core.connection] -  rdpdr
[08:48:53:145] [18:21] [INFO][com.freerdp.core.connection] -  rdpsnd
[08:48:53:145] [18:21] [INFO][com.freerdp.core.connection] -  rail
[08:48:53:145] [18:21] [INFO][com.freerdp.core.connection] -  rail_wi
[08:48:53:145] [18:21] [INFO][com.freerdp.core.connection] -  rail_ri
[08:48:53:145] [18:21] [INFO][com.freerdp.core.connection] -  cliprdr
[08:48:53:145] [18:21] [INFO][com.freerdp.core.connection] -  drdynvc
[08:48:53:145] [18:21] [INFO][com.freerdp.core.gcc] - Active rdp encryption level: NONE
[08:48:53:145] [18:21] [INFO][com.freerdp.core.gcc] - Selected rdp encryption method: NONE
[08:48:54:189] [18:21] [INFO][proxy.server] - [SessionID=BE492CD12EECF0F1B3F979DD75529FD0][pf_server_get_target_info]: fetching target from config
[08:48:54:189] [18:21] [INFO][proxy.server] - [SessionID=BE492CD12EECF0F1B3F979DD75529FD0][pf_server_post_connect]: remote target is <IP_ADDRESS>:3389
[08:48:54:189] [18:22] [INFO][proxy.client] - [SessionID=BE492CD12EECF0F1B3F979DD75529FD0][pf_client_connect]: connecting using client info: Username: app, Domain: bj.fit2cloud.com
[08:48:54:189] [18:22] [INFO][proxy.client] - [SessionID=BE492CD12EECF0F1B3F979DD75529FD0][pf_client_pre_connect]: Loading addins
[08:48:54:189] [18:22] [INFO][proxy.client] - [SessionID=BE492CD12EECF0F1B3F979DD75529FD0][pf_client_passthrough_channels_init]: client did not connected with channel , skipping passthrough
[08:48:55:366] [18:22] [INFO][com.freerdp.crypto] - creating directory /root/.config/freerdp
[08:48:55:366] [18:22] [INFO][com.freerdp.crypto] - creating directory [/root/.config/freerdp/certs]
[08:48:55:366] [18:22] [INFO][com.freerdp.crypto] - created directory [/root/.config/freerdp/server]
[08:48:55:373] [18:22] [WARN][com.freerdp.crypto] - Certificate verification failure 'unable to get local issuer certificate (20)' at stack position 0
[08:48:55:373] [18:22] [WARN][com.freerdp.crypto] - CN = whapp01
[08:48:55:373] [18:22] [ERROR][com.freerdp.crypto] - @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
[08:48:55:373] [18:22] [ERROR][com.freerdp.crypto] - @           WARNING: CERTIFICATE NAME MISMATCH!           @
[08:48:55:373] [18:22] [ERROR][com.freerdp.crypto] - @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
[08:48:55:373] [18:22] [ERROR][com.freerdp.crypto] - The hostname used for this connection (<IP_ADDRESS>:3389)
[08:48:55:373] [18:22] [ERROR][com.freerdp.crypto] - does not match the name given in the certificate:
[08:48:55:373] [18:22] [ERROR][com.freerdp.crypto] - Common Name (CN):
[08:48:55:373] [18:22] [ERROR][com.freerdp.crypto] - 	whapp01
[08:48:55:373] [18:22] [ERROR][com.freerdp.crypto] - A valid certificate for the wrong name should NOT be trusted!
[08:48:56:977] [18:22] [INFO][proxy.client] - [SessionID=BE492CD12EECF0F1B3F979DD75529FD0][pf_client_on_activated]: client activated, registering server input callbacks
[08:48:56:977] [18:22] [ERROR][proxy.client] - [SessionID=BE492CD12EECF0F1B3F979DD75529FD0][pf_client_post_connect]: frames dir created: /opt/freerdp/data/captures/app/<IP_ADDRESS>_29-06-2022_08-48-56-977
[08:48:56:977] [18:22] [INFO][com.freerdp.gdi] - Local framebuffer format  PIXEL_FORMAT_BGRA32
[08:48:56:977] [18:22] [INFO][com.freerdp.gdi] - Remote framebuffer format PIXEL_FORMAT_BGRA32
[08:48:56:977] [18:22] [INFO][proxy.channels] - [SessionID=BE492CD12EECF0F1B3F979DD75529FD0][pf_channels_on_client_channel_connect]: Channel connected: rdpdr
[08:48:56:977] [18:22] [INFO][com.freerdp.channels.rdpsnd.client] - [static] Loaded proxy backend for rdpsnd
[08:48:56:977] [18:22] [INFO][proxy.channels] - [SessionID=BE492CD12EECF0F1B3F979DD75529FD0][pf_channels_on_client_channel_connect]: Channel connected: rdpsnd
[08:48:56:978] [18:22] [INFO][proxy.channels] - [SessionID=BE492CD12EECF0F1B3F979DD75529FD0][pf_channels_on_client_channel_connect]: Channel connected: cliprdr
[08:48:56:978] [18:22] [INFO][proxy.channels] - [SessionID=BE492CD12EECF0F1B3F979DD75529FD0][pf_channels_on_client_channel_connect]: Channel connected: rail
[08:48:56:978] [18:22] [INFO][com.freerdp.channels.drdynvc.client] - Loading Dynamic Virtual Channel rdpgfx
[08:48:56:978] [18:22] [INFO][com.freerdp.channels.drdynvc.client] - Loading Dynamic Virtual Channel disp
[08:48:56:978] [18:22] [INFO][proxy.channels] - [SessionID=BE492CD12EECF0F1B3F979DD75529FD0][pf_channels_on_client_channel_connect]: Channel connected: drdynvc
[08:48:57:893] [18:46] [INFO][proxy.channels] - [SessionID=BE492CD12EECF0F1B3F979DD75529FD0][pf_channels_on_client_channel_connect]: Channel connected: Microsoft::Windows::RDS::Graphics
[08:49:05:623] [18:22] [INFO][proxy.client] - Logon Error Info SESSION_ID [LOGON_MSG_SESSION_CONTINUE]
[08:49:07:638] [18:22] [INFO][proxy.update] - [SessionID=BE492CD12EECF0F1B3F979DD75529FD0][pf_client_save_session_info]: client logon info: Username: app, Domain: BJ
[08:49:08:894] [18:46] [INFO][proxy.channels] - [SessionID=BE492CD12EECF0F1B3F979DD75529FD0][pf_channels_on_client_channel_connect]: Channel connected: Microsoft::Windows::RDS::DisplayControl
[08:49:08:184] [18:44] [ERROR][com.freerdp.channels.rail.client] - Unknown RAIL PDU order reveived.
[08:49:08:184] [18:44] [ERROR][com.freerdp.channels.rail.client] - rail_order_recv failed with error 13!
[08:49:08:184] [18:22] [ERROR][com.freerdp.core] - rail_virtual_channel_client_thread reported an error. Error was 13
[08:49:08:184] [18:22] [ERROR][com.freerdp.core] - checkChannelErrorEvent() failed - 0
[08:49:08:184] [18:22] [ERROR][proxy.client] - Failed to check FreeRDP event handles
[08:49:08:185] [18:46] [INFO][proxy.channels] - [SessionID=BE492CD12EECF0F1B3F979DD75529FD0][pf_channels_on_client_channel_disconnect]: Channel disconnected: Microsoft::Windows::RDS::Graphics
[08:49:08:188] [18:46] [INFO][proxy.channels] - [SessionID=BE492CD12EECF0F1B3F979DD75529FD0][pf_channels_on_client_channel_disconnect]: Channel disconnected: Microsoft::Windows::RDS::DisplayControl
[08:49:08:193] [18:21] [INFO][proxy.server] - abort event is set, closing connection with peer <IP_ADDRESS>
[08:49:08:193] [18:21] [INFO][proxy.server] - [SessionID=BE492CD12EECF0F1B3F979DD75529FD0][pf_server_handle_peer]: starting shutdown of connection
[08:49:08:193] [18:21] [INFO][proxy.server] - [SessionID=BE492CD12EECF0F1B3F979DD75529FD0][pf_server_handle_peer]: stopping proxy's client
[08:49:08:193] [18:21] [ERROR][com.freerdp.core] - freerdp_abort_connect:freerdp_set_last_error_ex ERRCONNECT_CONNECT_CANCELLED [0x0002000B]
[08:49:08:193] [18:21] [INFO][proxy.server] - [SessionID=BE492CD12EECF0F1B3F979DD75529FD0][pf_server_handle_peer]: freeing server's channels
[08:49:08:193] [18:21] [INFO][proxy.server] - [SessionID=BE492CD12EECF0F1B3F979DD75529FD0][pf_server_handle_peer]: freeing proxy data

Windws Server 2019 RemoteApp disconnect.
[08:49:08:184] [18:44] [ERROR][com.freerdp.channels.rail.client] - Unknown RAIL PDU order reveived.
[08:49:08:184] [18:44] [ERROR][com.freerdp.channels.rail.client] - rail_order_recv failed with error 13!
[08:49:08:184] [18:22] [ERROR][com.freerdp.core] - rail_virtual_channel_client_thread reported an error. Error was 13
[08:49:08:184] [18:22] [ERROR][com.freerdp.core] - checkChannelErrorEvent() failed - 0
[08:49:08:184] [18:22] [ERROR][proxy.client] - Failed to check FreeRDP event handles

# freerdp-proxy.rdp
full address:s:<your_proxy_server>:3389
username:s:administrator
use multimon:i:0
session bpp:i:32
audiomode:i:0
disable wallpaper:i:0
disable full window drag:i:0
disable menu anims:i:0
disable themes:i:0
shell working directory:s:
authentication level:i:2
connect to console:i:0
disable cursor setting:i:0
allow font smoothing:i:1
allow desktop composition:i:1
redirectprinters:i:0
prompt for credentials on client:i:0
autoreconnection enabled:i:1
bookmarktype:i:3
use redirection server name:i:0
smart sizing:i:1
screen mode id:i:1
domain:s:
remoteapplicationmode:i:1
remoteapplicationprogram:s:"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe"
remoteapplicationname:s:Chrome

https://github.com/FreeRDP/FreeRDP/blob/2.7.0/channels/rail/client/rail_orders.c#L972

		case TS_RAIL_ORDER_GET_APPID_RESP_EX:
			return rail_recv_get_application_id_extended_response_order(rail, s);

		default:
			WLog_ERR(TAG, "Unknown RAIL PDU order reveived.");
			WLog_Print(rail->log, WLOG_ERROR,
			           "Ignore Unknown RAIL PDU order: Received %s PDU, length:%" PRIu16 "",
			           rail_get_order_type_string(orderType), orderLength);
			// return ERROR_INVALID_DATA;
	}

	return CHANNEL_RC_OK;

Unknown RAIL PDU order reveived.
Received Ststen Command PDU, length:20
Unknown RAIL PDU order reveived.
Received Ststen Command PDU, length:20

@wojiushixiaobai which PDU type did you receive? (you omitted that information in your logs) (e.g. the output of "Ignore Unknown RAIL PDU order: Received %s PDU, length:%" PRIu16 "", from your changes)

@akallabeth
Sorry, full log.
[15:40:52:164] [13:67] [INFO][proxy.channels] - [SessionID=E8BEAC7FB23C1FEA4557E12894B3BF93][pf_channels_on_client_channel_connect]: Channel connected: Microsoft::Windows::RDS::DisplayControl
[15:40:53:432] [13:65] [ERROR][com.freerdp.channels.rail.client] - Unknown RAIL PDU order reveived.
[15:40:53:432] [13:65] [ERROR][com.freerdp.channels.rail.client] - Ignore Unknown RAIL PDU order: Received System Command PDU, length:20
[15:42:21:088] [13:65] [ERROR][com.freerdp.channels.rail.client] - Unknown RAIL PDU order reveived.
[15:42:21:088] [13:65] [ERROR][com.freerdp.channels.rail.client] - Ignore Unknown RAIL PDU order: Received System Command PDU, length:20

@akallabeth
Merge #8009 log.
[17:33:10:361] [46:50] [ERROR][proxy.client] - [SessionID=C1AD38CCA14B0DE8BE4101CDAE611745][pf_client_post_connect]: frames dir created: /opt/freerdp/data/captures/app/<IP_ADDRESS>_29-06-2022_17-33-10-361
[17:33:10:361] [46:50] [INFO][com.freerdp.gdi] - Local framebuffer format  PIXEL_FORMAT_BGRA32
[17:33:10:361] [46:50] [INFO][com.freerdp.gdi] - Remote framebuffer format PIXEL_FORMAT_BGRA32
[17:33:10:361] [46:50] [INFO][proxy.channels] - [SessionID=C1AD38CCA14B0DE8BE4101CDAE611745][pf_channels_on_client_channel_connect]: Channel connected: rdpdr
[17:33:10:361] [46:50] [INFO][com.freerdp.channels.rdpsnd.client] - [static] Loaded proxy backend for rdpsnd
[17:33:10:361] [46:50] [INFO][proxy.channels] - [SessionID=C1AD38CCA14B0DE8BE4101CDAE611745][pf_channels_on_client_channel_connect]: Channel connected: rdpsnd
[17:33:10:361] [46:50] [INFO][proxy.channels] - [SessionID=C1AD38CCA14B0DE8BE4101CDAE611745][pf_channels_on_client_channel_connect]: Channel connected: cliprdr
[17:33:10:362] [46:50] [INFO][proxy.channels] - [SessionID=C1AD38CCA14B0DE8BE4101CDAE611745][pf_channels_on_client_channel_connect]: Channel connected: rail
[17:33:10:362] [46:50] [INFO][com.freerdp.channels.drdynvc.client] - Loading Dynamic Virtual Channel rdpgfx
[17:33:10:362] [46:50] [INFO][com.freerdp.channels.drdynvc.client] - Loading Dynamic Virtual Channel disp
[17:33:10:362] [46:50] [INFO][proxy.channels] - [SessionID=C1AD38CCA14B0DE8BE4101CDAE611745][pf_channels_on_client_channel_connect]: Channel connected: drdynvc
[17:33:11:265] [46:74] [INFO][proxy.channels] - [SessionID=C1AD38CCA14B0DE8BE4101CDAE611745][pf_channels_on_client_channel_connect]: Channel connected: Microsoft::Windows::RDS::Graphics
[17:33:20:437] [46:50] [INFO][proxy.client] - Logon Error Info SESSION_ID [LOGON_MSG_SESSION_CONTINUE]
[17:33:23:714] [46:50] [INFO][proxy.update] - [SessionID=C1AD38CCA14B0DE8BE4101CDAE611745][pf_client_save_session_info]: client logon info: Username: app, Domain: BJ
[17:33:23:290] [46:74] [INFO][proxy.channels] - [SessionID=C1AD38CCA14B0DE8BE4101CDAE611745][pf_channels_on_client_channel_connect]: Channel connected: Microsoft::Windows::RDS::DisplayControl
[17:33:24:268] [46:72] [ERROR][com.freerdp.channels.rail.client] - Unknown RAIL PDU TS_RAIL_ORDER_COMPARTMENTINFO[0x0012] received.
[17:33:24:268] [46:72] [ERROR][com.freerdp.channels.rail.client] - rail_order_recv failed with error 13!
[17:33:24:268] [46:50] [ERROR][com.freerdp.core] - rail_virtual_channel_client_thread reported an error. Error was 13
[17:33:24:268] [46:50] [ERROR][com.freerdp.core] - checkChannelErrorEvent() failed - 0
[17:33:24:268] [46:50] [ERROR][proxy.client] - Failed to check FreeRDP event handles
[17:33:24:269] [46:74] [INFO][proxy.channels] - [SessionID=C1AD38CCA14B0DE8BE4101CDAE611745][pf_channels_on_client_channel_disconnect]: Channel disconnected: Microsoft::Windows::RDS::Graphics
[17:33:24:271] [46:74] [INFO][proxy.channels] - [SessionID=C1AD38CCA14B0DE8BE4101CDAE611745][pf_channels_on_client_channel_disconnect]: Channel disconnected: Microsoft::Windows::RDS::DisplayControl
[17:33:24:276] [46:49] [INFO][proxy.server] - abort event is set, closing connection with peer <IP_ADDRESS>
[17:33:24:276] [46:49] [INFO][proxy.server] - [SessionID=C1AD38CCA14B0DE8BE4101CDAE611745][pf_server_handle_peer]: starting shutdown of connection
[17:33:24:276] [46:49] [INFO][proxy.server] - [SessionID=C1AD38CCA14B0DE8BE4101CDAE611745][pf_server_handle_peer]: stopping proxy's client
[17:33:24:276] [46:49] [ERROR][com.freerdp.core] - freerdp_abort_connect:freerdp_set_last_error_ex ERRCONNECT_CONNECT_CANCELLED [0x0002000B]
[17:33:24:277] [46:49] [INFO][proxy.server] - [SessionID=C1AD38CCA14B0DE8BE4101CDAE611745][pf_server_handle_peer]: freeing server's channels
[17:33:24:277] [46:49] [INFO][proxy.server] - [SessionID=C1AD38CCA14B0DE8BE4101CDAE611745][pf_server_handle_peer]: freeing proxy data

Debug log.
[17:38:33:808] [80:108] [DEBUG][com.freerdp.codec.progressive] - ProgressiveFrameEnd
[17:38:33:856] [80:84] [DEBUG][proxy.update] - pf_client_begin_paint
[17:38:33:856] [80:84] [DEBUG][com.freerdp.core.update] - Alternate Secondary Drawing Order [0x0b] Windowing
[17:38:33:856] [80:84] [DEBUG][com.freerdp.core.update] - WindowUpdate windowId=0x65850 [ex]style=<0x16cf0000, 0x100 visible thickframe border caption>
[17:38:33:856] [80:84] [DEBUG][proxy.update] - pf_client_window_update
[17:38:33:856] [80:84] [DEBUG][proxy.update] - pf_client_end_paint
[17:38:33:856] [80:84] [DEBUG][com.freerdp.core.update] - sending 1 orders
[17:38:33:856] [80:84] [DEBUG][proxy.update] - pf_client_begin_paint
[17:38:33:856] [80:84] [DEBUG][com.freerdp.core.update] - Alternate Secondary Drawing Order [0x0b] Windowing
[17:38:33:856] [80:84] [DEBUG][com.freerdp.core.update] - WindowUpdate windowId=0x65850 [ex]style=<0xb0000, 0x0> title
[17:38:33:856] [80:84] [DEBUG][proxy.update] - pf_client_window_update
[17:38:33:856] [80:84] [DEBUG][proxy.update] - pf_client_end_paint
[17:38:33:856] [80:84] [DEBUG][com.freerdp.core.update] - sending 1 orders
[17:38:33:893] [80:108] [DEBUG][com.freerdp.channels.drdynvc.client] - order_recv: Cmd=0x2, Sp=1 cbChId=0
[17:38:33:894] [80:108] [DEBUG][com.freerdp.channels.drdynvc.client] - process_data_first: Sp=1 cbChId=0, ChannelId=7 Length=4717
[17:38:33:894] [80:108] [DEBUG][com.freerdp.channels.drdynvc.client] - order_recv: Cmd=0x3, Sp=1 cbChId=0
[17:38:33:894] [80:108] [DEBUG][com.freerdp.channels.drdynvc.client] - order_recv: Cmd=0x3, Sp=1 cbChId=0
[17:38:33:945] [80:106] [DEBUG][com.freerdp.channels.rail.client] - Received TS_RAIL_ORDER_COMPARTMENTINFO[0x0012] PDU, length:20
[17:38:33:945] [80:106] [ERROR][com.freerdp.channels.rail.client] - Unknown RAIL PDU TS_RAIL_ORDER_COMPARTMENTINFO[0x0012] received.
[17:38:33:945] [80:106] [ERROR][com.freerdp.channels.rail.client] - rail_order_recv failed with error 13!
[17:38:33:945] [80:84] [DEBUG][proxy.update] - pf_client_begin_paint
[17:38:33:945] [80:84] [DEBUG][proxy.update] - pf_client_send_pointer_cached
[17:38:33:945] [80:84] [DEBUG][proxy.update] - pf_client_end_paint
[17:38:33:945] [80:84] [ERROR][com.freerdp.core] - rail_virtual_channel_client_thread reported an error. Error was 13
[17:38:33:945] [80:84] [ERROR][com.freerdp.core] - checkChannelErrorEvent() failed - 0
[17:38:33:945] [80:84] [ERROR][proxy.client] - Failed to check FreeRDP event handles
[17:38:33:946] [80:108] [INFO][proxy.channels] - [SessionID=714CC64F494EA1C3F81368F49C412254][pf_channels_on_client_channel_disconnect]: Channel disconnected: Microsoft::Windows::RDS::Graphics
[17:38:33:949] [80:108] [DEBUG][com.freerdp.channels.drdynvc.client] - close_channel_iface: id=7
[17:38:33:949] [80:108] [INFO][proxy.channels] - [SessionID=714CC64F494EA1C3F81368F49C412254][pf_channels_on_client_channel_disconnect]: Channel disconnected: Microsoft::Windows::RDS::DisplayControl
[17:38:33:949] [80:108] [DEBUG][com.freerdp.channels.drdynvc.client] - close_channel_iface: id=9
[17:38:33:954] [80:83] [INFO][proxy.server] - abort event is set, closing connection with peer <IP_ADDRESS>
[17:38:33:954] [80:83] [INFO][proxy.server] - [SessionID=714CC64F494EA1C3F81368F49C412254][pf_server_handle_peer]: starting shutdown of connection
[17:38:33:954] [80:83] [INFO][proxy.server] - [SessionID=714CC64F494EA1C3F81368F49C412254][pf_server_handle_peer]: stopping proxy's client
[17:38:33:955] [80:83] [DEBUG][proxy.client] - [SessionID=714CC64F494EA1C3F81368F49C412254][pf_client_client_stop]: aborting client connection
[17:38:33:955] [80:83] [ERROR][com.freerdp.core] - freerdp_abort_connect:freerdp_set_last_error_ex ERRCONNECT_CONNECT_CANCELLED [0x0002000B]
[17:38:33:955] [80:83] [DEBUG][proxy.client] - [SessionID=714CC64F494EA1C3F81368F49C412254][pf_client_client_stop]: waiting for client thread to finish
[17:38:33:955] [80:83] [DEBUG][proxy.client] - [SessionID=714CC64F494EA1C3F81368F49C412254][pf_client_client_stop]: thread finished
[17:38:33:955] [80:83] [INFO][proxy.server] - [SessionID=714CC64F494EA1C3F81368F49C412254][pf_server_handle_peer]: freeing server's channels
[17:38:33:955] [80:83] [INFO][proxy.server] - [SessionID=714CC64F494EA1C3F81368F49C412254][pf_server_handle_peer]: freeing proxy data

[17:38:33:945] [80:106] [DEBUG][com.freerdp.channels.rail.client] - Received TS_RAIL_ORDER_COMPARTMENTINFO[0x0012] PDU, length:20
[17:38:33:945] [80:106] [ERROR][com.freerdp.channels.rail.client] - Unknown RAIL PDU TS_RAIL_ORDER_COMPARTMENTINFO[0x0012] received.
[17:38:33:945] [80:106] [ERROR][com.freerdp.channels.rail.client] - rail_order_recv failed with error 13!
[17:38:33:945] [80:84] [DEBUG][proxy.update] - pf_client_begin_paint
[17:38:33:945] [80:84] [DEBUG][proxy.update] - pf_client_send_pointer_cached
[17:38:33:945] [80:84] [DEBUG][proxy.update] - pf_client_end_paint
[17:38:33:945] [80:84] [ERROR][com.freerdp.core] - rail_virtual_channel_client_thread reported an error. Error was 13
[17:38:33:945] [80:84] [ERROR][com.freerdp.core] - checkChannelErrorEvent() failed - 0
[17:38:33:945] [80:84] [ERROR][proxy.client] - Failed to check FreeRDP event handles

The problem is still happening, do I need to continue opening it?
@akallabeth

@wojiushixiaobai the log must have changed then, what does it say now?

@wojiushixiaobai ok, found another missing piece, TS_RAIL_ORDER_COMPARTMENTINFO can now be sent from server to client too.
Added that in #8012 and #8011

thk. @akallabeth
Merge #8012 is worked.


Vulnerability CVE-2021-3121

The github.com/gogo/status:v1.1.0 dependency includes a  vunerability by using outdated protobuf github.com/gogo/protobuf v1.2.0
CVE-2021-3121
An issue was discovered in GoGo Protobuf before 1.3.2. plugin/unmarshal/unmarshal.go lacks certain index validation, aka the "skippy peanut butter" issue.
https://nvd.nist.gov/vuln/detail/CVE-2021-3121

SDK is using 1.3.2 for a while now.
Here is dependency graph:
❯ go mod graph | grep "gogo/protobuf"
go.temporal.io/sdk<EMAIL_ADDRESS><EMAIL_ADDRESS><EMAIL_ADDRESS><EMAIL_ADDRESS><EMAIL_ADDRESS><EMAIL_ADDRESS><EMAIL_ADDRESS><EMAIL_ADDRESS><EMAIL_ADDRESS><EMAIL_ADDRESS><EMAIL_ADDRESS><EMAIL_ADDRESS><EMAIL_ADDRESS><EMAIL_ADDRESS><EMAIL_ADDRESS>
Latest gogo/status is still relying on v1.2.0, which I believe is why we see this version in the go.sum as well.
But since we have v1.3.2 in the go.mod file, it is the on that is actually in use.
❯ go list -m -json all | grep -A2 "gogo/protobuf"
	"Path": "github.com/gogo/protobuf",
	"Version": "v1.3.2",
	"Time": "2021-01-10T08:01:47Z",
	"Dir"<EMAIL_ADDRESS>	"GoMod"<EMAIL_ADDRESS>	"GoVersion": "1.15"
}

I'm going to close this one, please let me know if you have more questions.


add send little msg

Wechaty Contributors Nomination
Link to https://github.com/wechaty/PMC/issues/16

Thank you very much for your contribution!
You are welcome to join Wechaty Contributor Program
1. Join Wechaty Organization

You've invited zhuzhu to Wechaty! They'll be receiving an email shortly. They can also visit https://github.com/wechaty to accept the invitation.

I have invited you to join our Wechaty GitHub Organization, please accept it by following the above message. (See also: wechaty/PMC#16)
2. Update Your Wechaty Contributor Profile

Please open Contributor Hall of Fame and add yourself to the end of the list, so that other contributors will know you better!
Please add yourself to our Website Contributors by creating a PR and refer to this PR link as well.

3. Join The Contributor Only WeChat Room
We also have a WeChat room for contributors only which can discuss Wechaty at a deeper level, you are welcome to join and if you are interested.
Please add @lijiarui wechat: ruirui_0914 and send her this pr link. She will invite you into Wechaty Contributor Room
Cheers!


Josie branch

Current Bids linked to Nav Tab, working on Auctions.jsx and contact.jsx to link to their tabs, implements styles to most of the pages and components. Looking into the update function on profile (isnt working). Updating Acceptance Criteria and User Story in the Readme. Auctions and Contact are connect and forms within the pages are created.

I am working on the css for the new pages that were created and if this style works for yall and the layout of the nav tabs


Experiments with database migrations under peewee

General findings

peewee-moves not tested yet with Python 3.8, PR submitted
flask CLI integration (flask db) puts migrations into flask/boxwise_flask/migrations/, not configurable
with the peewee-db CLI there are more options but it requires database access info: peewee-db --directory boxwise_flask/migrations --database mysql://root:dropapp_root@mysql:3306/dropapp_dev status
any migration beyond creating a new table has to be written as Python script

Related packages
peewee

the base library peewee itself has support for schema migrations. This does not come with any logic taking care of migration history.
peewee-moves wraps around a SchemaMigrator. Hence the peewee migrate API is also accessible in peewee-moves migration files.

peewee-migrate

peewee-migrate provides the same functionality as peewee-moves, uses a very similar concept, and also wraps around peewee's native migrate module
latest version of peewee it is tested against: 3.3.3 (boxtribute uses 3.13.3)
documentation of the API is basically non-existent as pointed out in several issues... we'd have to read the source, and tests if we have detailed scenarios
last commit to the Github repo was April 2019; there's already an active fork

flask-pw

flask-pw brings an integration of peewee-migrate into flask projects, similar to what peewee-moves offers with the flask db CLI
several config options
not compatible with peewee < 3.0
last commit in Nov 2018

Playground
Preparation
Start services
docker-compose up mysql
docker-compose up flask

Open shell in flask container
docker-compose exec flask sh

Experiments
Query migrations
flask db status

Output: No migrations found
Show database info
flask db info

Output: some lines about the MySQL database, configuration, and access
Create empty migration file
flask db revision empty_migration

results in boxwise_flask/migrations/0001_empty_migration
"""
empty_migration
date created: 2020-11-27 20:11:28.804903
"""

def upgrade(migrator):
    pass

def downgrade(migrator):
    pass

flask db status

now displays: [ ] 0001_empty_migration
Apply migration
flask db upgrade

flask db status

now displays: [x] 0001_empty_migration
Create a model
Limitation: Only for models that are not part of the db yet!
E.g. if boxwise_flask/models/developer.py existed:
from peewee import CharField

from boxwise_flask.db import db

class Developer(db.Model):
    name = CharField(null=True)

we could run
flask create boxwise_flask.models.developer

which creates boxwise_flask/migrations/0003_create_table_developer.py
"""
create table developer
date created: 2020-11-27 21:03:19.282704
"""

def upgrade(migrator):
    with migrator.create_table('developer') as table:
        table.primary_key('id')
        table.char('name', max_length=255, null=True)

def downgrade(migrator):
    migrator.drop_table('developer')

which we apply via
flask db upgrade

We can now apply queries from the mysql CLI to the developer table
docker-compose exec mysql mysql -u root -p

use dropapp_dev;
insert into developer (name) values ("Alex");
select * from developer;

Advanced migrations
Not possible via CLI! See this issue. We have to code them in Python.
Add a column to a table
Create empty migration
flask db revision table_box_add_color_column

and modify the created migration script to
"""
table_box_add_color_column
date created: 2020-11-27 21:19:34.821372
"""

def upgrade(migrator):
    migrator.add_column("stock", "color", "char", default="")

def downgrade(migrator):
    migrator.drop_column("stock", "color")

Note that we have to use the MySQL table names.
Modify a color to the box in the MySQL CLI:
use dropapp_dev;
update stock set color="red" where id=999
select id,color from stock

When adding a new migration, we should test whether an upgrade can be immediately reverted to detect errors in the downgrade function:
flask db downgrade

 Write an experimental migration Using Peewee Moves #small

 Set up Peewee Moves #small

Thanks for the very detailed research @pylipp. I definitely want to discuss this with you on our next sync up call.

Thanks @pylipp for the exploratory PR. Very interesting behavior.
What I learned

It is possible to generate a migration based on the peewee model definitions (Nice), but only for a model that did not exist before.
we cannot configure
Any edits to the db tables we must write ourselves as python scripts. (I expected that and we are doing this in the legacy migration handler, too.)
It is not supported(/tested) for python 3.8 and you created a PR for that one :)

What I would like you to do before merging

please test how to add and drop a foreign key
how does the migration handler keep track of which migrations were applied and which not. Does it create an additional table in the db?
write up a basic documentation in flask/README.md

Don't put it in the readme yet. I want to discuss the possibility of using
some alternative options.
On Sun, Nov 29, 2020, 10:20 PM HaGuesto<EMAIL_ADDRESS>wrote:

Thanks @pylipp https://github.com/pylipp for the exploratory PR. Very
interesting behavior.
What I learned

It is possible to generate a migration based on the peewee model
definitions (Nice), but only for a model that did not exist before.
we cannot configure
Any edits to the db tables we must write ourselves as python
scripts. (I expected that and we are doing this in the legacy migration
handler, too.)
It is not supported(/tested) for python 3.8 and you created a PR for
that one :)

What I would like you to do before merging

please test how to add and drop a foreign key
how does the migration handler keep track of which migrations were
applied and which not. Does it create an additional table in the db?
write up a basic documentation in flask/README.md

—
You are receiving this because you commented.
Reply to this email directly, view it on GitHub
https://github.com/boxwise/boxtribute/pull/9#issuecomment-735402012, or
unsubscribe
https://github.com/notifications/unsubscribe-auth/ABP2BFGFITQZD6G34QS2XCDSSJKBJANCNFSM4UFK2KHQ
.

Thanks @pylipp for the exploratory PR. Very interesting behavior.
What I learned

It is possible to generate a migration based on the peewee model definitions (Nice), but only for a model that did not exist before.

we cannot configure

peewee-moves does not come with configuration files or related environment variables or similar, that's true. We could write our own wrapper around the package (with a central DatabaseManager but's there's barely an advantage over the peewee-db CLI.

Any edits to the db tables we must write ourselves as python scripts. (I expected that and we are doing this in the legacy migration handler, too.)

It is not supported(/tested) for python 3.8 and you created a PR for that one :)

Your learnings are correct :)

What I would like you to do before merging

please test how to add and drop a foreign key

Will do!

how does the migration handler keep track of which migrations were applied and which not. Does it create an additional table in the db?

I answered this in the Trello card: a migration history is generated by peewee-moves using a dedicated table named 'migration_history' in the DB. Migration history can be queried using the CLI 'flask db status'

write up a basic documentation in flask/README.md

Will wait a bit as @aerinsol suggested.

@aerinsol @HaGuesto Added a section about related packages to the first comment above.

Advanced migrations (cont.)
Managing foreign keys
This was a bit of a journey yet helped me to gain a lot of understanding for the workings of peewee-moves and peewee.
The scenario I put up was to add a foreign key to the camps (term in boxtribute app: Base) table into the genders (ProductGender) table (regardless whether that makes sense or not...).
I first tried to make it work using the peewee-moves library. Had some trouble because the docs don't exactly match the implementation, so I jumped into the source code rather. This brought me closer to the native peewee source code (the migrate module) since peewee-moves wraps around it. So I tried to use that API directly but somehow the generated SQL was not accepted by the database. Final option, writing successful queries in the mysql CLI, and run them from Python (still possible using the peewee-moves framework!). That worked so I tried to go upwards level by level. It helped me to enable peewee's logging of the SQL it generates out of the ORM code one writes.
Long story short, below is a migration script that can run the same up/downgrade functionality in three different ways:

using raw SQL commands
using native peewee interface
using peewee-moves interface
Regardless of the method, the execution happens in the context of peewee-moves, meaning that the up/downgrade is recorded in the migration history.

Some findings (beyond the ones commented into the script below):

did not manage to run to SQL commands in one call to execute_sql (boils down to peewee)
our table primary keys are unsigned integer. peewee-moves/peewee assume signed by default. Having mismatching types leads to the Mysql error 'cannot add foreign key constraint' because it is attempted to refer a signed foreign key field (camp_id) to an unsigned primary key (camps.id).
ON DELETE/UPDATE handling is possible but I did not experiment with it. By default, peewee does a CASCADE when dropping a column
the operations of the native peewee migrate module are only effective when they are being .run() or passed into the convenience runner function migrate() (peewee-moves makes this unnecessary by wrapping native peewee)
also, peewee-moves slightly abstracts the native peewee implementation for e.g. adding columns of various types (compare upgrade_native_peewee/upgrade_peewee_moves below; the former requires a Field variable to be defined but the latter internally creates it)

Conclusion
I think peewee-moves meets our requirements. It nicely integrates into the flask-based project. It offers some level of abstraction of native peewee (plus the migration history management), yet it is flexible (native peewee migrate API can be used as well as raw SQL).
Let me know if there's more questions :)
"""
table_genders_add_foreign_key_camps
date created: 2020-11-27 21:19:34.821372
"""
from peewee import ForeignKeyField, SQL
from playhouse import migrate
from boxwise_flask.models import base
import logging
logger = logging.getLogger('peewee')
logger.addHandler(logging.StreamHandler())
logger.setLevel(logging.DEBUG)
Select either of "sql", "peewee_moves", or "native_peewee"
METHOD = "sql"
def upgrade(migrator):
"""Execute globally specified upgrade function."""
globals()f"upgrade_{METHOD}"
def downgrade(migrator):
"""Execute globally specified downgrade function."""
globals()f"downgrade_{METHOD}"
def upgrade_sql(migrator):
cursor = migrator.execute_sql("ALTER TABLE genders ADD camp_id INT(11) UNSIGNED;")
cursor.close()
cursor = migrator.execute_sql("ALTER TABLE genders ADD CONSTRAINT fk_camp_id FOREIGN KEY (camp_id) REFERENCES camps(id);")
cursor.close()
def downgrade_sql(migrator):
cursor = migrator.execute_sql("ALTER TABLE genders DROP FOREIGN KEY fk_camp_id;")
cursor.close()
cursor = migrator.execute_sql("ALTER TABLE genders DROP COLUMN camp_id")
cursor.close()
def upgrade_native_peewee(migrator):
field = ForeignKeyField(
model=base.Base,
# if omitted: 'Foreign keys must specify a field'
# use Field type, not name ("id")
# otherwise: 'str object has no attribute column_name'
field=base.Base.id,
# if omitted: 'camp_id is not null but has no default'
null=True,
# Crucial! Otherwise: 'Cannot add foreign key constraint'
constraints=[SQL("UNSIGNED")],
# on_delete="CASCADE",
# on_update="SET NULL",
)
# alternative for constraints:
# https://github.com/coleifer/peewee/issues/542#issuecomment-393831940
# not relevant
# migrator.migrator.explicit_create_foreign_key = True

# effectively runs
# 'ALTER TABLE `genders` ADD COLUMN `camp_id` INTEGER UNSIGNED'
# 'ALTER TABLE `genders` ADD CONSTRAINT `fk_genders_camp_id_refs_camps` FOREIGN KEY (`camp_id`) REFERENCES `camps` (`id`)'
# 'CREATE INDEX `genders_camp_id` ON `genders` (`camp_id`)'
operation = migrator.migrator.add_column("genders", "camp_id", field)
migrate.migrate(operation)  # or operation.run()

def downgrade_native_peewee(migrator):
# effectively runs
# 'ALTER TABLE genders DROP FOREIGN KEY fk_genders_camp_id_refs_camps'
# 'ALTER TABLE genders DROP COLUMN camp_id CASCADE'
migrator.migrator.drop_column("genders", "camp_id").run()
def upgrade_peewee_moves(migrator):
# raw SQL commands run are identical to those of upgrade_native_peewee()
migrator.add_column(
"genders", "camp_id", "foreign_key",
model=base.Base,
field=base.Base.id,
null=True,
constraints=[SQL("UNSIGNED")],
)
def downgrade_peewee_moves(migrator):
# raw SQL commands run are identical to those of downgrade_native_peewee()
migrator.drop_column("genders", "camp_id")
def upgrade_peewee_moves_ineffective(migrator):
# with 'safe=False' error: Table exists
with migrator.create_table("genders", safe=True) as table:
table.foreign_key("integer", "camp_id", "camps.id")

Due to the lack of testing on Python 3.8, I'm not sure I want to move forward with merging this into master yet, despite @pylipp extensive exploration on workarounds. There are some other options that do not work with Peewee per se, but change the database itself (e.g., https://www.liquibase.org/).
Perhaps there is a way to easily cascade direct DB changes into Peewee models? It's at least worth exploring.

Due to the lack of testing on Python 3.8, I'm not sure I want to move forward with merging this into master yet, despite @pylipp extensive exploration on workarounds. There are some other options that do not work with Peewee per se, but change the database itself (e.g., https://www.liquibase.org/).

I ran the CI tests for Python 3.8 on my fork, and it passes, so I don't think we should be concerned about (it's not that the library claims to break in 3.8, rather it's simply not automatically tested on 3.8).

our table primary keys are unsigned integer. peewee-moves/peewee assume signed by default. Having mismatching types leads to the Mysql error 'cannot add foreign key constraint' because it is attempted to refer a signed foreign key field (camp_id) to an unsigned primary key (camps.id).

Unfortunately, our database is a still a bit of a mess in certain parts since it is still mostly based on the first prototype we created in 2016/2017. Not all primary keys are unsigned. It is a mix.

Okay, we have to take care to pass the correct options when creating a ForeignKey then.

the add_column operation results in two SQL commands: add a camp_id column to the genders table, then add reference between that column and the camps table. If e.g. upgrade_peewee_moves was faulty (missing constraints argument leading to the problem above), the first command is executed but the second fails. peewee-moves does not record the upgrade as applied. This means that running flask db downgrade will run the previous downgrade operation but not the one from the current script. The database however is altered, and has to be cleaned up manually (alter table genders drop column camp_id). I thought that wrapping the add_column part into a transaction remedies this but it doesn't.

annoying stuff. It feels like raw SQL commands seem the best choice for updating existing foreign keys and adding foreign keys to existing tables. I do not see any options to do this properly with native peewee or peewee-moves.
If we create a new column with a foreign key, the peewee-moves command looks the best way to do, but we need to properly test it against the production database before we deploy to make sure that no error occurs which we cannot properly roll back.

I still enjoy the API of peewee-moves over raw SQL commands. Using the ORM makes database interaction more secure overall.

the table-based operations of peewee-moves are ineffective when the table already exists

* adding and droping existing tables works in peewee-moves

* adding and droping existing columns works in peewee-moves

* adding and droping indexes works in peewee-moves

* adding and droping NULL constraints works in peewee-moves

* renaming existing columns and tables work

* adding droping foreign keys to existing columns can only be down with raw SQL

* altering table and column definitions (like defaults) besides above can only be done with raw raw SQL

did I understand you correctly?
I'm not sure what you're trying to say. Do you want me to do the remaining experiments for all the cases you listed?

Sorry for the confusing comments.
With the following list I just wanted to summarize what I learned from your tests and check if I am correct. I'm trying to rephrase now:
I learned that

we can add and drop tables with peewee-moves
we can add and drop columns with peewee-moves
we can add Foreign Keys with peewee-moves only when the column is created (we cannot add a Foreign Key with peewee-moves to an existing column)
we can drop Foreign Keys with peewee-moves only if we drop the column as well (we cannot drop a Foreign Key alone with peewee-moves)
we have to use raw SQL to add and drop Foreign Keys to existing columns.
we can rename columns and tables with peewee-moves
we cannot alter table and column definitions (like defaults or data types) with peewee-moves and have to use raw SQL.

If I get a yes to the statements from above @pylipp then we can merge it. If my statements are wrong please tell me what I misunderstood.

Just adding one last comment that most of my concerns around using Peewee moves have been alleviated, but would be better if we had some extra support in maintaining Peewee. Will be talking to @pylipp privately to see what options we have here


Topological sorting of the Graph

When running the training, before the initial epoch I get a log like:
2019-08-02 08:32:55.251530: E tensorflow/core/grappler/optimizers/dependency_optimizer.cc:666] Iteration = 0, topological sort failed with message: The graph couldn't be sorted in topological order.
2019-08-02 08:32:55.305719: E tensorflow/core/grappler/optimizers/dependency_optimizer.cc:666] Iteration = 1, topological sort failed with message: The graph couldn't be sorted in topological order.
2019-08-02 08:32:56.161844: E tensorflow/core/grappler/optimizers/dependency_optimizer.cc:666] Iteration = 0, topological sort failed with message: The graph couldn't be sorted in topological order.
2019-08-02 08:32:56.213568: E tensorflow/core/grappler/optimizers/dependency_optimizer.cc:666] Iteration = 1, topological sort failed with message: The graph couldn't be sorted in topological order.

Although, I don't have any problem with the final model accuracy. I think, this is related to the fact that there are multiple heads in the Functional definition of the model. Do you also get the same when you run the script? Which Keras/tensorflow version do you use?
The versions, I am using are:

tensorflow-gpu: 1.12.0
Keras: 2.2.4
CUDA Version: 9.0.176

I run a training script on following environment:

tensorflow-gpu==1.12.0
keras==2.2.4
CUDA==9.0

and OOM error occured but no error about topological sort.
The model's graph does not contain any loop so error about topological sort should not occur.
Reducing batch size or disabling gpu might suppress the error.


feat: Added one more stroke width preset (#3693)

A proposed solution to: #3693

I feel adding one more option for stroke is not really needed, however we might want to think about updating the thing stroke from 1 to 0.5 instead if needed.
cc / @dwelle

I feel adding one more option for stroke is not really needed, however we might want to think about updating the thing stroke from 1 to 0.5 instead if needed.

Agreed. As for the change, I proposed what would need to be done here https://github.com/excalidraw/excalidraw/issues/3693#issuecomment-1024999153 but there may be other options I'm missing. Nevertheless, it's not a deal breaker, just needs a bit of work & thinking through.


Exemple to use RequiresPagingLinks()

Hi Folks, Is there any sample using ItemsLinkContainer with RequiresPagingLinks?

There isn't one at present. If you're really struggling I could make one fairly easily. Let me know if this is still causing you problems.


Log warning when no operations are found and add number of operations matched during generation

When generating a persisted query manifest file, its possible that no operations were found during manifest generation, which could be due to a misconfiguration of the glob pattern used to search for operations. Currently the user has to run the command, then open the manifest file to see if operations were added which can be pretty cumbersome. This PR updates the terminal output to list the number of matched operations. If none were found, a warning is displayed as well.

merge https://github.com/apollographql/apollo-utils/pull/346 when this is merged?

Yes!


Removed unnecessary css code and icons form footer section

Fixes:  #1656
Description
I have removed the unnecessary CSS code displaying from footer of About Us page, and also the repeated icon from it.
#1656
Type of PR
Bug fix
Screenshots / videos (if applicable)

Checklist:
[ X] I have made this change from my own.
[X ] My code follows the style guidelines of this project.
[ X] I have performed a self-review of my own code.
[ X] My changes generate no new warnings.
[X ] I have tested the changes thoroughly before submitting this pull request.
[ X] I have provided relevant issue numbers and screenshots after making the changes.

@anuragverma108 @RishabhDhawad Sir please review this PR.

This branch has conflicts that must be resolved  and create new PR!!
Conflicting files
assets/html/about.html


Breaking change did all pass in the API readiness app, API readiness signoff shows passed and ready for signoff

I tested 2 scenarios with slightly different results.

Serverless Validation Screen shows that everything is green.

Serverless - Breaking Change fails with option to request suppression.

Serverless API readiness signoff shows breaking changes are completed, which is confusing because there was error shown on the breaking change screen.

Discovery and Assessment of Spring Boot apps to Azure Spring Apps - Breaking change fails but no option to request suppression.

Discovery and Assessment of Spring Boot apps to Azure Spring Apps shows breaking changes is completed, which is confusing becaues there was error shown on the breanking change review screen.

Modified the logic to show breaking change status based on GitHub checkrun status instead of labels.


Map reference data between GHG protocol and Coco Pharmaceuticals reference data

The link to where the sample should be stored:
https://github.com/odpi/egeria-samples-api/tree/main/cataloguing-data/map-data-GHG


move e2e test in regular build

Pull Request Test Coverage Report for Build<PHONE_NUMBER>

0 of 0   changed or added relevant lines in 0 files are covered.
No unchanged relevant lines lost coverage.
Overall coverage remained the same at 60.966%

Totals

Change from base Build<PHONE_NUMBER>:
0.0%

Covered Lines:
745

Relevant Lines:
1222

💛  - Coveralls


remove(container-definitions): Deprecated DeltaManager events

These events have been deprecated for more than 18 months. Before we cut our release candidate branch, we should remove them.

This is used internally more than I anticipated. We aren't quite ready for this change, so I am abandoning the PR. A better solution will likely be to make DeltaManager altogether internal.


ClassName with Swift Frameworks

I'm pulling Realm and RBQFetchedResultsController into our swift app that uses a bunch of in-house frameworks. In particular we have a RLMObject that we call RealmCourse that lives in the Swift framework CourseKit. Thus for namespacing, the correct class name is "CourseKit.RealmCourse". However when this gets put through:+ (NSString *)classNameForObject:(RLMObject *)object the className gets set to "Courses.RealmCourse", where "Courses" is the name of our app, as opposed to the framework the RealmCourse actually lives in. This causes our fetched results controller to always return nil because of the improper naming. I was able to fix it on our side by simply adding a category on RBQObjectCacheObject:
#import "RBQObjectCacheObject+SwiftFrameworkNaming.h"

@implementation RBQObjectCacheObject (SwiftFrameworkNaming)

+ (instancetype)createCacheObjectWithObject:(RLMObject *)object
                        sectionKeyPathValue:(NSString *)sectionValue
                                  className:(NSString *)className
{

    RBQObjectCacheObject *cacheObject = [RBQObjectCacheObject createCacheObjectWithObject:object sectionKeyPathValue:sectionValue];
    cacheObject.className = className;

    return cacheObject;
}

@end

And in RBQFetchedResultsController I changed createCacheWithRealm:cacheName:forFetchRequest:sectionNameKeyPath: to call my new category method:
            RBQObjectCacheObject *cacheObject = [RBQObjectCacheObject createCacheObjectWithObject:object
                                                                              sectionKeyPathValue:currentSectionTitle
                                                                                className:fetchRequest.entityName];

So just an fyi. It's working for me with my little fix.

Thanks for letting me know about this. I didn't think about how frameworks come into play with the class names. I am not sure if there is a way to detect that the RLMObject lives in a framework and get the framework name versus the app name. I will look into this because that would be ideal. The alternative is to have a method where you can "register" the framework name when creating a FRC instance, and that would be used instead of the app name.

Is there a reason not to read it in From the fetchRequest. Is my solution going to break something?

Actually it will break the creation of the RBQSafeRealmObjects too, which are what get passed around in the notifications. I actually have a fix that I will push to a branch for you to test.

Ok, try this branch of FRC: https://github.com/Roobiq/RBQFetchedResultsController/tree/swift-frameworks
This uses the latest code that I pushed to RealmUtilities submodule. I am pretty sure it should work fine, the issue is that I was just using the main bundle to get the "app name" since Swift classes are appName.className, but the "app name" is really just the name of the main bundle, which frameworks have their own so I should just use the bundle name that corresponds to the class. Luckily NSBundle has an easy class method to figure this out.
If it works for you then I will merge into master for FRC.
The change was pretty simple:
NSBundle *classBundle = [NSBundle bundleForClass:[object class]];

NSString *bundleName = [classBundle objectForInfoDictionaryKey:@"CFBundleName"];

NSString *swiftClassName = [NSString stringWithFormat:@"%@.%@",bundleName,className];

versus
NSString *appName = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleName"];

NSString *swiftClassName = [NSString stringWithFormat:@"%@.%@",appName,className];

I tried that fix, and unfortunately it didn't work for me. It was still doing Courses.Course. I checked target membership and Course is in CourseKit, not in Courses.

Hmm, does:
NSBundle *classBundle = [NSBundle bundleForClass:[object class]];

return a different bundle than the main bundle when you pass in your RLMObject that lives in CourseKit?

No unfortunately not.
(lldb) po classBundle
NSBundle </Users/nperry/Library/Developer/CoreSimulator/Devices/691FC960-E9DF-4DE5-8BB9-8BE5D4396613/data/Containers/Bundle/Application/091B376E-5BD6-4C47-9126-297CC10400FF/Assignments.app> (loaded)

(lldb) po [NSBundle mainBundle]
NSBundle </Users/nperry/Library/Developer/CoreSimulator/Devices/691FC960-E9DF-4DE5-8BB9-8BE5D4396613/data/Containers/Bundle/Application/091B376E-5BD6-4C47-9126-297CC10400FF/Assignments.app> (loaded)

Randomly when I do bundleForClass for RLMObject it does work:
(lldb) po [NSBundle bundleForClass:[RLMObject class]]
NSBundle </Users/nperry/Library/Developer/CoreSimulator/Devices/691FC960-E9DF-4DE5-8BB9-8BE5D4396613/data/Containers/Bundle/Application/091B376E-5BD6-4C47-9126-297CC10400FF/Assignments.app/Frameworks/Realm.framework>

Ok, let me look into this a bit further. Really would like to have the plugin do this transparently rather than having to register the className through an API.

Ok, I think I have a fix. Testing now...

Ok, pull the latest from the swift-frameworks branch. This has code to get the original class from the RLMObject subclass and not the dynamically generated class which is what gets returned if you just call:
[object class]

Let me know if that works.

The original class is in the object's objectSchema but is a private property. So had to hack around to get access to. Here's the relevant code:
+ (NSString *)classNameForObject:(RLMObject *)object
{
...
@try {
        Class objectClass = [object.objectSchema valueForKey:@"objectClass"];

        NSBundle *classBundle = [NSBundle bundleForClass:objectClass];

        NSString *bundleName = [classBundle objectForInfoDictionaryKey:@"CFBundleName"];

        NSString *swiftClassName = [NSString stringWithFormat:@"%@.%@",bundleName,className];

        return swiftClassName;
    }
    @catch (NSException *exception) {
        if (exception.name == NSUndefinedKeyException) {
            @throw [NSException exceptionWithName:@"RBQException"
                                           reason:@"RLMObjectSchema doesn't contain original objectClass. Please file a GitHub issue regarding this."
                                         userInfo:nil];
        }
        else {
            @throw;
        }
    }

    @throw [NSException exceptionWithName:@"RBQException"
                                   reason:@"Class name for the RLMObject could not be found."
                                 userInfo:nil];

That fixed my problem thanks!

Awesome, I will merge it into the FRC repo.

FRC now has changed merged in: https://github.com/Roobiq/RBQFetchedResultsController/releases/tag/v1.8.5


Allow forcing colors via KUBECOLOR_FORCE_COLORS env var

Description
This allows colors to be displayed when kubecolor is invoked via the 'watch' command. All you need is the following alias:
  alias watch='KUBECOLOR_FORCE_COLORS=true watch --color '

Type of change

[x] New feature (non-breaking change which adds functionality)

What you changed

introduced env var equivalent of the --force-colors flag
slightly simplified related unit test

Why you think we should change it
Without this change, getting colorized output when invoking kubecolor via watch required the following command:
watch --color kubecolor get pods --force-colors

With this change (and the above alias), all you need to type is:
watch kubecolor get pods

let me review this and test it... to me, the package used to parse flags should support associated env vars out of the box...

Code was merged. thanks for the contribution !


Bad Plotting with "Page Refresh" and Memory leaks leading to Webview2 crashing

This is in reference to PowerBI Community subject
https://community.fabric.microsoft.com/t5/Desktop/Deneb-Visual-Vegalite-Bad-Plotting-with-quot-Page-Refresh-quot/m-p/3344987#M1115514
If you need access to the environment to test and troubleshoot please let me know

Hi and thanks for raising here. As stated on that post, your setup seems to be very unique to the problem, we don't know the profile of your data and I don't have financial or time resources to set up a DirectQuery implementation. I would also need your spec and data so that I can understand the plotting issue - there are still some things that it might be, but it's hard to tell without being able to see the point-in-time data when things go "wrong".
Regarding the refresh issue, I would also need detailed steps as to how this is set up and being triggered to run every few seconds - as far as I am aware, visual datasets don't auto-update unless there's some form of external stimulus like a web page refresh in the Service, setting up the Play Axis slicer to cycle through a lot of data points (ensuring no caching of the result set), or using auto page refresh in Desktop (as mentioned above I don't have the ability to test this as it only becomes available for supported data sources).
You can provide access details privately if needs be at<EMAIL_ADDRESS>To manage your expectations: Deneb is a free and open-source project and I only have a limited amount of available time to investigate bugs. This particular issue might be very complicated due to the number of moving parts and I'm not sure at this time just what might be involved in debugging and/or fixing it. I will look into it and see what I can find out, but I can't provide any solid ETA on when it might be fixed.

I made some performance-tuning improvements in 1.6 that should have resolved this issue. I tested this with the OP's dataset and report and confirmed that it had much more stable uptime from my end, but they never replied whether it was resolved for them. I'll assume that no news is good news.

We have tested it, although not for an extended period of time, but the issue seems to be solved.
Thanks Daniel.

From: Daniel Marsh-Patrick @.>
Sent: Wednesday, May 22, 2024 6:36 AM
To: deneb-viz/deneb @.>
Cc: Aquilahm Support @.>; Author @.>
Subject: Re: [deneb-viz/deneb] Bad Plotting with "Page Refresh" and Memory leaks leading to Webview2 crashing (Issue #328)
I made some performance-tuning improvements in 1.6 that should have resolved this issue. I tested this with the OP's dataset and report and confirmed that it had much more stable uptime from my end, but they never replied whether it was resolved for them. I'll assume that no news is good news.
—
Reply to this email directly, view it on GitHubhttps://github.com/deneb-viz/deneb/issues/328#issuecomment-2123760873, or unsubscribehttps://github.com/notifications/unsubscribe-auth/BBXO4ZT7CYPKOLHKDR5B6ZDZDQACJAVCNFSM6AAAAAA3FDJBNGVHI2DSMVQWIX3LMV43OSLTON2WKQ3PNVWWK3TUHMZDCMRTG43DAOBXGM.
You are receiving this because you authored the thread.Message ID: @.***>


Add stale PR policy

First cut at a stale PR policy. Happy to make changes and alter as necessary.

lgtm

lgtm

Should this be merged before it becomes stale? :D


Do we support dependent fields?

Hi, Thank you, this is very useful library.
I have a question that is there any example about dependent fields, let's say I have country and cities dropdown field, the cities field depends on the country's. How can we handle that case?
If we don't have it now but you plan to have it, let me know, I really want to help.

What do you want to do with that? I mean.. you can just react to the onChange method of country and fetch your cities.

Ya, you're right. I overthink it.
I will open it again when there is a good circumstance

Thanks for the question, @khanghoang. Yep, since RRF just deals with plain JS object/array models, you can just conditionally render the list of cities based on the chosen country. For instance, if you have a <Field model="address.country"> you can just have a custom function that renders the correct cities and call it in a map: { getCities(address.country).map(city => ...) }


[BUG] Active_Directory_Disable_Account_Dispatch

If you have a Splunk Support contract, creating a support case for your issue may result in faster resolution.
Describe the bug
There are two bugs:
The playbook has a decision block called "observable output filter" which is not functioning as a filter.
The playbook has a decision block at the beginning called "username filter" which is not functioning as a filter and it is checking for a field called "act" which does not appear to be relevant to the playbook.
Expected behavior
A filter block would follow the decision block and all downstream blocks would use the filtered block.
Screenshots
Existing structure:

Recommended structure:

App Version:
N/A
Additional context
Add any other context about the problem here.

Resolved in linked PR


Fixes #602 - allow to change console banner

As per @longinoa suggestion in #602, I've added additional constructor to Page and made a fallback to existing banner. It's still is a constant String so no packaging changes required.

I've signed it


Rendering is slow when re-using a component

#!/usr/bin/env ruby

require "phlex"
require "benchmark/ips"

class NavComponent < Phlex::Component
  def template
    nav id: "main_nav" do
      ul do
        li { a "Home", href: "/" }
        li { a "About", href: "/about" }
        li { a "Contact", href: "/contact" }
      end
    end
  end
end

nav_component = NavComponent.new

Benchmark.ips do |x|
  x.report("NavComponent1") { NavComponent.new.call }
  x.report("NavComponent2") { nav_component.call }
end

% bundle exec bench/nav.rb
Warming up --------------------------------------
       NavComponent1     3.399k i/100ms
       NavComponent2    39.000  i/100ms
Calculating -------------------------------------
       NavComponent1     35.428k (± 0.9%) i/s -    180.147k in   5.085325s
       NavComponent2     95.413  (±16.8%) i/s -    468.000  in   5.037483s

The reason for this is call isn't designed to be idempotent, it leaves a lot of state behind. Probably a good fix for this would be resetting the @children instance variable at the beginning of call.


Overview section

This PR addresses the main confirmations flow (with all the warnings and "I accept" buttons) when you follow the CTA to become a validator.
Major updates include

Giving the terminal its own step: You need to be able to use a terminal to run a validator
Relabelling
Adding a subtitle that explains the purpose of the section

Question:

What is the main purpose of the KeysSigning step? I'm unsure whether this is something a user needs to know at this stage. It's less "something you should be aware of" and more just explaining an upcoming step. Unless I'm misunderstanding the point, maybe we should remove this step.


[fix] prerender in subprocess

fixes https://github.com/sveltejs/kit/issues/5306
the first half of this was done in https://github.com/sveltejs/kit/pull/5659. this finishes the job

https://github.com/sveltejs/kit/pull/5686 should be merged before this PR


Core: strip away types for JS Output

As per #511, we want to support 2 approaches (& maybe a 3rd one in the future):

allow mitosis build to output plain JS files
allow mitosis build to output TS files
allow mitosis build to output plain JS files + .d.ts (optional/unlikely given that we'd need to configure multiple n TS projects, one per output, with the proper npm dependencies, TS configuration, etc.)

As part of getting TS support working, we started adding type outputs to various generators. Our generated code is somewhat in-between plain JS and TS, depending on the generator.
Currently, the MitosisComponent JSON generated by our JSX parser holds on to type information in all code blocks. To successfully implement a "js-only" mode, we'd need to:

make sure that interfaces/types are not injected
run every code block through a babel/esbuild transform that strips away any typescript code

yeah this is a good idea. in the generators the code would be simpler if we knew the output should be js or ts. I don't think Mitosis needs to generate the .d.ts for now and rely on the typescript compiler to figure that out


Cleanup - part I

This is a first part of some minor cleanup and improvements.
The most interesting part is perhaps commit 5b85ace2 which refactors coercions, allowing only trivial ones - a deeper
review of this part would be appreciated.

After this refactoring, it feels much more stable, following script used to crash / hang:
testcases := (RPackageOrganizer default packageNamed: 'MachineArithmetic-Tests') definedClasses select:[:c|(c inheritsFrom: TestCase) and:[c isAbstract not]].

suite := TestSuite named: 'MachineArithmetic'.
testcases do:[:tc | suite addTests: tc buildSuite tests].

Transcript clear.
1 to: 1000 do:[:i|
	| r |
	Transcript show: i; show: ': '.
	suite tests shuffle.
	r := suite run.
	Transcript show: r; cr.
]

Commit 36e0e75 did not crashed on my machine.


Images are marked up with html instead of markdown

Not a huge issue, but it would be helpful at least for the intro to jupyter notebook if images or figures from RST were translated to the ![alt text](path/to/image) syntax instead of <img src=.... Currently thinking for that notebook it might be best to just generate the ipynb, hand tune it, and place it directly in notebooks/ rather than having it auto-translated.
It also occurred to me I think markdown's handling of image size is a bit limited compared to RST, so that might be why.

Ok, we can adjust as needed. I think after finishing a few notebooks the needed workflow will be clearer.

This is fine. We ended up showing them both anyway.


Use semver-tool to bump version numbers with script

Write a script to allow us to easily bump major/minor/patch semvers in our project.

read in the file, parse out the current version number, shoot that over to this semver script, then write the result back into the file

Can leverage this:
https://github.com/fsaintjacques/semver-tool

This is done


v1.9: Fix link to podman installation

The current link currently 404s. This changes it to an alternative link.

@JoshVanL can you pull in the build fix we pushed to v1.9?


Adjust test suite to cluster size

vSphere and single-node used to have issues with resources. Reduce the deployment size to give more resources for tests.
Extend test coverage for platforms where scaling the cluster is possible: GCP, Azure, AWS-OVN
Reduce test coverage for OSD, Hypershift until https://issues.redhat.com/browse/SRVKS-1187 is fixed.

/lgtm


84 remove redundant docstrings

Fix #84.
We trade "a list of annoying warnings on sphinx-build" for "not having to maintain redundant unit tests or docstrings in child classes." The problem seems to be due to a glitch in sphinx.
I'll make a subsequent issue with a dump of the errors.

I've removed the redundant methods and unit tests from HDDDM, CDBD, and ADWINOutcome.
The attribute docstrings are still redundant, but that's something to do with either sphinx being glitched out, or our setup not being exactly right; in any case, the time tradeoff seems favorable to this change.

Turns out the error messages were because drift_state is a property, so it triggers the "this is redundant!" error in a way that the non-property attribs do not. I can remove those, and kill that error.
Going further, we could make properties of total_* and *_since_reset, so that they'd also be inherited. I guess we could make sure they're always integers when set.
It remains pretty silly that we can't just have sphinx drop the parent's attributes downward, though.

Flipped all of these to properties and cleaned up the documentation. Adding the "member-order": "groupwise" option (NOT the autodoc_member_order option) clusters these a little bit better, too.
I think it'd be preferable to have these properties attributes show at the top, instead of the bottom, but this works for now.
Opened #87 to note the problems with this solution.


Doesn't work on Windows

It works fine on unix and mac, but.....

try replacing your environment variables that look like this:

with this (windows specific):

Thanks isc30,
Now it seems to work better (even though i had to slightly change the command like this : )

Thanks for the tip, you just saved my day in prod !

Thanks, works on Windows. But I still have a problem in WSL.

Found it.


added few more new patterns to exclude

Added few more patterns to exclude from default griffon output.

LGTM and thx!


Why is 'Hot Reloadind' not ticked?

Just tried hot reload and it seemed to work. Is there a reason it's not ticked in the readme? :)

IMO the solution which is implemented is more a Live Reloading. I want Hot Reloading like in React-Native or Flutter where I change a styling and immediately see the output without compiling and refreshing the whole app.


ServicePrincipalCredentials Using Certificate

I tried to search in python sdk but could not find anything on using service principal credentials through cert based authentication. Could you please help or point in that direction?

Document Details
⚠ Do not edit this section. It is required for docs.microsoft.com ➟ GitHub issue linking.

ID: 06b12410-3d72-8cc9-be6c-3b8e8521b90d
Version Independent ID: 9ef477fb-8321-4763-d340-0fee977f4beb
Content: Create an Azure data factory using Python
Content Source: articles/data-factory/quickstart-create-data-factory-python.md
Service: data-factory
GitHub Login: @sharonlo101
Microsoft Alias: shlo

@sunnygitacc
Thanks for the feedback! We are currently investigating and will update you shortly.

@sunnygitacc I see the same thing, there is no documentation on this feature in Python as it is not supported at this time.  This would be a good request to submit to the Azure feedback portal, for increased visibility by the product group and where the community can upvote it:
https://feedback.azure.com/forums/169401-azure-active-directory


Add m parameter documentation

Closes #366

I think it will fail on linting again, do you have a script to run linting or should I just manually do it ?

The CI workflow is here (https://github.com/allenai/scispacy/blob/main/.github/workflows/main.yml). We use black for autoformatting, but the line length of comments isn't formatted by black, so fixing that is manual.

@danielkingai2 fixed now, I also addressed a bunch of these in #368

@danielkingai2 this should be ready now.


ERROR in ./node_modules/easy-volume/dist/execCommand.js Module not found: Error: Can't resolve 'child_process'

Hi,
I am trying to use this module in an angular application running in electron.
I run npm install easy-volume and later import it in my TS file with import { getVolume } from "easy-volume";
But after trying to build, I get these errors ->
Error: Module not found: Error: Can't resolve 'child_process' in '/Users/path-to-app/node_modules/easy-volume/dist'
Error: Module not found: Error: Can't resolve 'os' in '/Users/path-to-app/node_modules/easy-volume/dist'
BREAKING CHANGE: webpack < 5 used to include polyfills for node.js core modules by default.
This is no longer the case. Verify if you need this module and configure a polyfill for it.

If you want to include a polyfill, you need to:
	- add a fallback 'resolve.fallback: { "os": require.resolve("os-browserify/browser") }'
	- install 'os-browserify'
If you don't want to include a polyfill, you can use an empty module like this:
	resolve.fallback: { "os": false }

Error: Module not found: Error: Can't resolve 'path' in '/Users/abhinavram.ananth/LinkDesktop/RLDC-app/call-popout-app/node_modules/easy-volume/dist/platforms/windows'
BREAKING CHANGE: webpack < 5 used to include polyfills for node.js core modules by default.
This is no longer the case. Verify if you need this module and configure a polyfill for it.

If you want to include a polyfill, you need to:
	- add a fallback 'resolve.fallback: { "path": require.resolve("path-browserify") }'
	- install 'path-browserify'
If you don't want to include a polyfill, you can use an empty module like this:
	resolve.fallback: { "path": false }

I tried adding those resolve lines to my package.json but I guess I am not adding them using proper syntax.
Anyway to solve these issues?
Thanks

Hey, thank you so much for using easy-volume!
Do you use this library in the renderer process? If so, then it's the cause of the problem - you don't expose the child_process and os libraries (which are available on the main process). You can for example try to set the nodeIntegration: true in webPreferences for mainWindow, but I don't recommend it.
The recommended approach would be to use easy-volume in your main process and then call the functions via IPC channels. This is much safer and will solve many of your additional problems.
Have an amazing day and I'm always here if you need any day!

If everything works then please tell me, so that I can close the issue

Thanks for your quick reply!
Yes nodeIntegration is indeed set to false for our project.
Let me quickly try to import it in the main process and report if it works or not.

Another question, totally unrelated to this issue, is there any plans to implement like a volume change event listener? My current requirement is to get the current system volume and use it within our application. So it would be nice to have some kind of a channel for "volume-change" that our application can listen to and take action accordinly.
Thanks for your great effort on this module!

Hi seems it was some node version / type issue. It seems to be working for me now. Thanks!

@abhinavram98 Hey, thank you so much! I'm so happy your issue was solved.
When it comes to your question about future plans, about implementing the volume change event - it seems like a great idea! I'll definitely consider it and do my best to find some time to implement this feature. Thank you so much for the suggestion!


pyautogui is an unnecessary dependency

This project depends on pyautogui. It's used only for figuring out the size of a window:
class Window:
    def __init__(self):
        self.root = Tk()
        ...
        self.height, self.width = pyautogui.size()

You can use winfo_width() and winfo_height() instead. I find that it's sometimes necessary to .update() before that to make sure that the window is actually as big as it's going to be, because otherwise you might get the size of a window that isn't ready yet. This would allow getting rid of pyautogui.
class Window:
    def __init__(self):
        self.root = Tk()
        ...
        self.root.update()
        self.width = self.root.winfo_width()
        self.height = self.root.winfo_height()

There's also winfo_reqwidth() and winfo_reqheight(). I don't know which of those is what pyautogui.size() does.

you are totally right, I used pyautogui because at that time I was still learning tkinter ,anyway I fixed it.


Problem with the photo, header too large

I don't know what the reason is, but now every time I use the script it creates some images with a header with a lot of height, I have downloaded the code again but the same thing keeps happening to me. As I have indicated I have returned to the code and it is still happening, the .conf I have not changed.
I attach the images in imgur
https://imgur.com/a/6NF6e8k
Commands to used:
python C:\pyvideothumbnailer\pyvideo.py  '.\Sin salida M1080.atomixhq.link.mkv'
python C:\pyvideothumbnailer\pyvideo.py  --background-color black --header-font-color white --columns 5 --rows 4 '.\Sin salida M1080.atomixhq.link.mkv'
python3 C:\pyvideothumbnailer\pyvideo.py  --background-color black --header-font-color white --width 1680 --columns 5 --rows 4 '.\Sin salida M1080.atomixhq.link.mkv'
I used Window 11

Thank you for reporting this bug. I apologize for the inconvenience.
I think, I accidentally introduced this bug with commit 10d1286ef798e453945616e6c49c1f44c4a1ad33. I replaced a now deprecated method from PIL and misunderstood proper usage of the replacement. It seems to me that I somehow used the previous version 1.1.1 of pyvideothumbnailer when testing it as everything looked fine to me.
Please have a look at the new release pyvideothumbnailer 1.1.3 and provide feedback if everything is to your expectations.

Thank you very much, yes version 1.1.13 works perfectly for me. Thank you for solving it and more being these dates.

Thank you for the immediate feedback. Good to have confirmation that it works again as it is supposed to work.


the 3D data

may I ask if the  dataset of the USSOCOM 3D challenge has been canceled in spacenet?

Apologies for not seeing this issue from last year. Sorry about that. Yes, it is still there. However, it moved buckets but the links weren't updated on the SpaceNet page.
The new bucket is: s3://spacenet-dataset/Hosted-Datasets/Urban_3D_Challenge/.


Generic namespaces

REVISED: My initial proposal was wrong, here is a revised version.
I have a library that exports a collection of interrelated interfaces, classes, and functions, which operate collaboratively on a single generic type. For instance, you can use them to perform operations on bot messages, game actions, or IoT events, but typically you'd only ever be working with one of those at a time. So the fact that the library is generic gives it broad appeal to a wide variety of developers, but is not itself of value to a given developer. (Contrast with RxJS where solid generic support has specific value to a given developer, because they will likely use it with a wide variety of types in a given project.)
An unfortunate consequence of the way the components of this library come together is that they are sometimes very resistant to type inference, so many invocations end up requiring a type decoration, which creates an enormous amount of visual noise. It's a terrible developer experience.
What I have now is:
// Library
export class Class<T> {
}
export function func<T>(..) {
}

// Library Consume
import { Class, Interface, func  } from 'my-library';

// frequently need to spell out Class<Bot>, Interface<Bot>, and func<Bot>

Type aliases help a little, because I can do:
type BotInterface = Interface<Bot>;

But there is no equivalent for functions and classes. And even if there were, that would still make it painful to write my library, because it would be using generics everywhere when what I really want to do is write my library with just a single top-level generic. And it would still make it overly painful to consume my library, because aliases would have to be manually created for every component in the library. What I want is a generic namespace:
// Library
export namespace<T> {
    export class Class {
    }
    export function func(...) {
    }
}

// Library Consumer
import { MyNamespace } from 'my-library';
const { Class, Interface, func } = MyNamespace<Bot>;

// just use Class, Interface, and func

Workarounds: I tried mimicking this by creating a generic factory class, but it is a huge hack and not powerful enough. There is a good reason namespaces exist in TypeScript, and adding generics would make them much more powerful. As it stands, the only real workaround -- which I have been forced to take, and is obviously unsustainable and unmaintainable -- is to fork the library into one version for each type.

Maybe allowing a type alias in a class would help here?
class MyStackModule<T> {
    type Stack = T[];
    create(): Stack { return []; }
    push(s: Stack, value: T) { s.push(value); }
    pop(s: Stack): T | undefined { return s.pop(); }
}

const NumStack = new MyStackModule<number>();
const stack: NumStack.Stack = NumStack.create();
NumStack.push(stack, 1);
const one = NumStack.pop(stack);

More practically, it might help to know why type inference isn't working for func.

The functions are mostly just helper object factories to cut down on typing/noise. Here's a cartoon of the library:
// Library
export class Class<T> {
    constructor(private lambda: (t: T) => void);
    twice(): Class<T> {
       return new Class<T>(t => {
           this.lambda(t);
           this.lambda(t);
        });
    }
    static makeTwice<T>(lambda: (t: T) => void): Class<T> {
        return new Class(lambda).twice();
    }
}
export const func = <T>(lambda: (t: T) => void) => new Class<T>(lambda);

// Library consumer
import { Class, func } from 'my-library';

// the consumer creates lots of objects like this
const object = func<Bot>(t => t.reply("I hear you, brother"));
// or
const object = func((t: Bot) => t.reply("I hear you, brother"));

There's no way to infer the Bot type when object is created. It has to be declared somewhere so that lambda has typed access to t.reply(). And it it a characteristic of the way this library is used that there could be a lot of these. And, again, the type will always be the same for a given library consumer. The poor bot developer has to litter her code with <Bot>.
This also might explain why allowing a type alias in a class won't help. I'm not using classes to build data structures. I'm using them as bags of methods that operate on lambdas whose parameters are always the same type. There are several classes, and they need access to each's constructors, static methods, and types.
It's worth mentioning that, although this proposal is primarily aimed at simplifying the experience of the library consumer, it would also radically simplify the experience of the library author, yours truly, by eliminating the need for every single instance of<T> and adding just one, in the namespace declaration. Selfless soul that I am, I declined to emphasize this in the original proposal.

Seems like the general problem is generic variables.

@aluanhaddad can you expand on that thought?

@billba Seems like you could replace namespace with class:
a.ts
export class Class<T> {
    constructor(private lambda: (t: T) => void) {}
    twice(): Class<T> {
       return new Class<T>(t => {
           this.lambda(t);
           this.lambda(t);
        });
    }
    static makeTwice<T>(lambda: (t: T) => void): Class<T> {
        return new Class(lambda).twice();
    }
}

export default class Library<T> {
    func(lambda: (t: T) => void): Class<T> {
        return new Class<T>(lambda);
    }
}

b.ts:
import Library from "./a";
const lib = new Library<number>();

lib.func(n => { n.toExponential() });

That's interesting. It doesn't solve the general problem, because sometimes the developer will need access to the interfaces and/or fundamental classes, which would still require type decorations. But all the helper functions could be piled into Library, which would probably cover most of the common use cases. I'll ponder that.
Thanks for the info about namespaces.

The slightly annoying thing about the "put the helper functions in a generic class" approach is that the generated JS includes an unnecessary object creation. But it does work.

@billba I meant that allowing a namespace to be generic is a special case of allowing a variable to be generic.
Consider the following which is currently not possible.
declare const Promise: Promise<T>

Yeah, this is the heart of the matter. Ultimately what I'm looking for here, and I don't think I'm alone, is a way to "clamp" a generic class or function or module to a specific type.
I think this would require a new kind of alias:
a.ts
export class GenericClass <T> { ... }
export function genericFunction <T> { ...}

b.ts
import { GenericClass, genericFunction } from './a';
export alias StringClass = GenericClass<string>;
export alias stringFunction = genericFunction<string>;

c.ts
import { StringClass, stringFunction } from './b';
const stringClass = new StringClass(...);
stringFunction(...);

These are essentially macros. They are immutable, and every time TypeScript sees the alias, it substitutes in its value. If you mouse over StringClass you see GenericClass<String>. A given alias would be correct syntax if and only if is value would also be correct syntax. Like type aliases they are importable and exportable.
The nice thing about the alias approach is that it doesn't generate any JavaScript.

For a class you can do e.g. class StringArray extends Array<string> {}. I don't think there's an equivalent for a function that doesn't involve redeclaring the type.

With functions you can create a delegating function that fixes the type parameter. With type-inference it's actually rather terse.
export const stringFunction = (x: string) => genericFunction(x);

Of course this creates an extra value but if we're talking about extending classes it's reasonable.

Right but this is all a lot of unnecessary JS to get around a simple typing operation.

Basically if you're working in JS then you can just import the classes and functions from my library and you're done. Intuitively, using TypeScript shouldn't be harder or heavier weight than adding a type declaration.

Actually, this would be covered by #17574

Closing in favor of #17574


Enabled a couple measurement tests

:tada: This PR is included in version 5.12.1 :tada:
The release is available on:

npm package (@latest dist-tag)
GitHub release

Your semantic-release bot :package::rocket:


Update rainbond.md

点击Rainbond访问按钮，弹出页面报404错误

Purpose of the pull request

Brief change log

Verify this pull request

This pull request is code cleanup without any test coverage.
(or)
This pull request is already covered by existing tests, such as (please describe tests).
(or)
This change added tests and can be verified as follows:

(or)
If your pull request contain incompatible change, you should also add it to docs/docs/en/guide/upgrede/incompatible.md

This is an issue on rainbond side. The better practice is to submit a PR to rainbond and fix the broken url.
Next time when you try to update a doc, please update both Chinese and English versions.

Thanks : )

close due to this, thanks for your contribution


Allow overriding backend configuration

Currently, the role seems to always start the vault service with the templated vault_main.hcl which has a hard-wired consol-backend. This makes it impossible to properly use the role with any other backend because starting the service fails.
It should be possible to either configure the backend.

Thanks, much appreciated!

Am I missing something or is this broken now? It seems to me the consul backend is one again hardwired in vault_listener.hcl.j2


Get Reference to Map / Generate Place Details...

Hello
I am trying to fire this from another component in order to generate place details and do routing and stuff later:
new google.maps.places.PlacesService(map)
It requires a reference to the map. I tried passing along the map reference from onGoogleApiLoaded={({map, maps}) => this.startMap(map, maps)}
I am able to console log the map reference, which is an object named 'tg', but it seems that is not enough. Any suggestions?
Thanks in advance! :)

I reread 3 times but havent understand the question at all ;-)

ah haha ok ill try to be more clear:

i have a map rendered and am also using the places library to autocomplete places
when clicking on one of those places, i would like to get the place details
in order to do that, i must call new google.maps.places.PlacesService(map) with a reference to the map
as per the documentation, i can get the map instance from onGoogleApiLoaded={({map, maps}) => this.startMap(map, maps)} - which im doing and passing that up to the parents state.
i am retrieving that and am able to log it to the console, but it doesnt seem to fire my places.PlacesServices call.

I have published a preview (only works on desktop for now) here so you can see better what im talking about: https://ridezulu-uvbnuoercx.now.sh/ride
right now its limited to switzerland, but (if you are in switzerland) you can edit the 'from' address and click one of the suggestions below. it should log the place data to the console, but does not.
i guess the easier question is this: if i want to get place details or plot routes on the map, what is the best way to do that?
Thank you in advance! your plugin is awesome so far :)

I don't understand what this.startMap means, BTW the idea is simple.
At first the argument of PlacesService as I know is not map but some HTML element,
I usually use some fake element
onGoogleApiLoaded={({map, maps})  => {
   const fakeElt = document.createElement('div');
   this.placesService  = new maps.places.PlacesService(fakeElt);
}

so now you can use this.placesService in your class methods, just don't forget to check on undefined as onGoogleApiLoaded is called asynchronously

I've just took a look into google docs, and seems like it must work with map instead of fakeElt BTW have no time to check.

ah ok i thought it was a reference to the javascript map instance but instead it is a reference to the dom element. thanks! ill try it out and let you know the outcome.
btw, this.startMap is just my function to initialize the map and pass to the application state mapLoaded = true
thanks for you help and your awesome work! :)

hey here is an update:
I tried adding a fake dom element reference as well as a reference to the real dom element. neither of them work and just produce the error INVALID_REQUEST
ill keep digging around trying to make this work. thanks for your help!

https://jsbin.com/hoyesaguqo/3/edit?js,console,output

Oops jsbin does not save

https://jsbin.com/velisenuco/1/edit?js,console,output

I found the problem!!!!!
In a lot of the documentation it says to reference the place by the placeId, like the following:
var request = {
placeId: placeId
};
but that is not the right syntax.  its actually by the place.reference, like the following:
var request = {
reference: placeReference
};
I hope that helps anyone else coming up against this problem!!! it was driving me crazy!!! And thanks @istarkov for the quick replies and the amazing react plugin!!!


Add small note that nil values are bypassed in custom types.

Fixes https://github.com/elixir-ecto/ecto/issues/2576

Thanks for the PR @namxam! Since this applies to all operations and not only dump, maybe we should move the note to the moduledoc instead?

:heart: :green_heart: :blue_heart: :yellow_heart: :purple_heart:


ImportError: dynamic module does not define module export function (PyInit_somewhat)

Not issue or bug, just a silly question since i am new to python

Windows 10 LTSC 2021 x64
Python 3.9.10, maybe any version
Question: after compiling py to pyd, will not be able to use pyd file if i simply rename it. Why and is there anyway i can bypass this.
Example, rename example1.pyd to example2.pyd, from example2 import * will show the error

This is completely expected. When Python imports example1.pyd it looks for a function called PyInit_example1 (which Cython generates). When you rename the file the mechanism no longer works.


MSAL version of Silent Auth?

[Enter feedback here]
ADAL is deprecated; is there an MSAL sample for Silent Auth?

Document Details
⚠ Do not edit this section. It is required for docs.microsoft.com ➟ GitHub issue linking.

ID: f2e66ffa-ec00-4a84-a43d-d47e3c138b32
Version Independent ID: 47e9a383-ac6a-dc7d-2d91-a9e09626fdab
Content: Silent authentication - Teams
Content Source: msteams-platform/tabs/how-to/authentication/auth-silent-aad.md
Product: msteams
GitHub Login: @laujan
Microsoft Alias: lajanuar

@GauravES , Hi This sample has implementation of MSAL authentication this. Let me know if you are still facing issues.

@GauravES , Could you please look at following sample codes built using MSAL library? Let me know if this helps you or not


Datasets

this reinstates the variable downloader, and fixes an error in the population variable for the acs

all tests pass except for the tutorials. One notebook there is failing because of https://github.com/pysal/segregation/issues/96

i'm going to go ahead and merge because this has lots of important changes, including migrating to the new quilt bucket


Can't alter response in event hook

Since #460 I can't return a different response in on_response. I'm trying to add CORS headers like so:
class CORSHook:
    headers = {
        "Access-Control-Allow-Origin": "*",
        "Access-Control-Allow-Methods": "*",
        "Access-Control-Allow-Headers": "*",
    }

    def on_response(self, request: http.Request, response: http.Response, exc: Exception):
        if isinstance(exc, exceptions.MethodNotAllowed) and request.method == 'OPTIONS':
            return http.Response('', status_code=204, headers=self.headers)  # <== this does run

        response.headers["Access-Control-Allow-Origin"] = "*"
        response.headers["Access-Control-Allow-Methods"] = "*"
        response.headers["Access-Control-Allow-Headers"] = "*"
        return response

Output is still a 405 Method Not Allowed

for CORS, there is the apistar_cors and the apistar_cors_hooks packages (which I've made literally 2 days ago, based on apistar_cors and wsgicors). I didn't have any issues modificating the response headers. could you take a look at it and see if there is any difference in the implementation, please? :)
https://github.com/lucianoratamero/apistar_cors_hooks

You should mutate the response object, rather than returning a new one.
Any of the following will work.
response.content = ...
response.status_code = ...
response.headers = ...

You can actually also return a different response if you annotate the event hook with -> http.Response, but we're not documenting that at the moment, and I wouldn't rely on it.

Ah okay. Thanks!
@lucianoratamero thanks, but just those couple of lines will do for me now. No need for another package ;)