Bug: Filename can't contains Chinese characters on Windows

I use the command python -m pyftpdlib -wp 21 to launch the FTP server on a Windows platform with a Chinese locale. However, I found that it does not work when the file or folder name contains Chinese characters; the file name string becomes unreadable:

When I made this change, it worked again:
import glob
for file in glob.glob('pyftpdlib/*.py'):
    with open(file) as f:
        text = f.read()
    with open(file, 'w') as f:
        f.write(text.replace("'utf8'", "'gbk'"))

However, I don't know if this is the minimal change needed for the bug fix, and it obviously won't work on non-Chinese locale platforms.
So, can you fix this bug in the library? Although I have already fixed this bug by changing the local source code, the solution feels like a dirty workaround. :<
Maybe hardcoding "gbk" could be replaced by using the function locale.getpreferredencoding(False) to get the setting. I don't know if this will work universally.
I can test it on a Chinese version of the Windows platform.

This happens because pyftpdlib uses UTF-8 by default, and it currently does not give the ability to change the encoding to something different. A long time has gone by, but I think I did that on purpose because https://datatracker.ietf.org/doc/html/rfc2640 mandates that. To put it another way, there is not way for the FTP client to tell the server "please use encoding XXX instead of UTF8", so the server should always assumes UTF-8.
With that said, when exactly do you experience the problem? When you LIST the files? When you download a file?

This happens because pyftpdlib uses UTF-8 by default, and it currently does not give the ability to change the encoding to something different. A long time has gone by, but I think I did that on purpose because https://datatracker.ietf.org/doc/html/rfc2640 mandates that. To put it another way, there is not way for the FTP client to tell the server "please use encoding XXX instead of UTF8", so the server should always assumes UTF-8.

To @giampaolo :
The pyftpdlib library can implement standard-required extensions, such as adding a switch to modify the default encoding.
Additionally, I believe that setting up an FTP server on Windows is a fairly common requirement, making this a widely encountered issue.

With that said, when exactly do you experience the problem? When you LIST the files? When you download a file?

The problem occurs when listing files, uploading files, and downloading files. In the screenshots, the Chinese "新建文件夹" means "New Folder", which is the default name for newly created folders on Windows.
Of course, it's not just these characters; other Chinese characters in file names also encounter garbled text.

The pyftpdlib library can be extended on a standard basis, such as adding a switch to modify the default encoding.

That seems fair. We can expose a configurable option(s) to set an encoding different than UTF8. Still, I expect most clients to still send UTF-8 paths by default though, so I'm not sure how to do this exactly. It must be noted that there are 2 encodings at play here though:

The protocol encoding (FTPHandler class), aka how are path names represented and transmitted both by client and server. I suspect this should be configurable but should almost always be set to UTF-8, unless also the client config is changed in the same manner.
the filesystem encoding (AbstractedFS class), aka how paths are represented at filesystem-level. Perhaps the AbstractedFS class should use sys.getfilesystemencoding() as the default instead of utf8, but I'm not sure.

>>> import sys
>>> sys.getfilesystemencoding()
'utf-8'

This is not an easy topic. I definitively should re-read https://datatracker.ietf.org/doc/html/rfc2640. Also http://www.proftpd.org/docs/modules/mod_lang.html could be used as a guidance.

@giampaolo
Addiction: I tested setting up a server on Linux and accessing the FTP server by using Explorer on Windows, but the garbled text issue still exists. However, on Ubuntu, both methods ( "locale.getpreferredencoding(False)" and "sys.getfilesystemencoding()" ) result is "UTF-8".
So, this seems to automatically prove that proper encoding from the server side is impossible. Adding an option to set the "correct" encoding might be the only way to solve the problem.

Mmmm I doubt server-side encoding is broken on Linux. It seems more likely that it's Windows Exporer which is at fault here (wouldn't be a first). Can you try with FileZilla client?

@giampaolo
On FileZilla, both upload and download is ok:

This is what Windows Explorer sends:
[D 2024-06-21 21:18:15] <IP_ADDRESS>:53151-[anonymous] <- opts utf8 on
[D 2024-06-21 21:18:15] <IP_ADDRESS>:53151-[anonymous] -> 501 Invalid argument.

opts utf8 on is not a valid command, but perhaps the fact that pyftpdlib replies with 501 makes Windows Explorer think that the encoding is ASCII or something. Can you try this for me? It forces the server to reply with 2XX:
import os

from pyftpdlib.authorizers import DummyAuthorizer
from pyftpdlib.handlers import FTPHandler
from pyftpdlib.servers import FTPServer

class Handler(FTPHandler):
    def ftp_OPTS(self, line):
        self.respond('200 OK')

def main():
    authorizer = DummyAuthorizer()
    authorizer.add_user('user', '12345', '.', perm='elradfmwMT')
    authorizer.add_anonymous(os.getcwd(), perm='elradfmwMT')
    handler = Handler
    handler.authorizer = authorizer
    address = ('', 2121)
    server = FTPServer(address, handler)
    server.serve_forever()

if __name__ == '__main__':
    main()

Amazing! It worked.
By the way, to make the program work, I need to change the line:
address = ('<IP_ADDRESS>', 2121)

And I tried to reproduce the problem after I modified the line:
handler = FTPHandler  # I think this will make nothing happen

Doing so will reproduce the garbled problem.

Windows Explorer think that the encoding is ASCII or something

I think it should be ANSI encoding, ANSI encoding is explained as gbk encoding in Chinese computers, and in Japan or South Korea, it will explained as their national encodings.

@giampaolo Bad news!
I found that files containing specific Chinese nouns failed to be copied, and it has nothing to do with the content of the file.
I tested with the following code:
import os
import logging

from pyftpdlib.authorizers import DummyAuthorizer
from pyftpdlib.handlers import FTPHandler
from pyftpdlib.servers import FTPServer

logging.basicConfig(level=logging.DEBUG)

class Handler(FTPHandler):
    def ftp_OPTS(self, line):
        self.respond('200 OK')

def main():
    authorizer = DummyAuthorizer()
    authorizer.add_user('user', '12345', '.', perm='elradfmwMT')
    authorizer.add_anonymous(os.getcwd(), perm='elradfmwMT')
    handler = Handler
    handler.authorizer = authorizer
    address = ('<IP_ADDRESS>', 2121)
    server = FTPServer(address, handler)
    server.serve_forever()

if __name__ == '__main__':
    main()

I try to copy the following files separately, one at a time, the first three copies failed, and the last one succeeded, as a comparison:
硬件检测.txt
装机单.txt
任务管理器.txt
新建文本文档.txt

When the copy fails, it will prompt an error like this:

Translate:
FTP folder error
An error occurred while copying the file to the FTP server, check if you have permission to put the file on the server.
Details:
...

The debug log message is:
Warning (from warnings module):
  File "K:\git\oppo\pyftpdlib-1.5.9\pyftpdlib\authorizers.py", line 108
    self._check_permissions(username, perm)
RuntimeWarning: write permissions assigned to anonymous user.
INFO:pyftpdlib:concurrency model: async
INFO:pyftpdlib:masquerade (NAT) address: None
INFO:pyftpdlib:passive ports: None
DEBUG:pyftpdlib:poller: 'pyftpdlib.ioloop.Select'
DEBUG:pyftpdlib:authorizer: 'pyftpdlib.authorizers.DummyAuthorizer'
DEBUG:pyftpdlib:handler: '__main__.type'
DEBUG:pyftpdlib:max connections: 512
DEBUG:pyftpdlib:max connections per ip: unlimited
DEBUG:pyftpdlib:timeout: 300
DEBUG:pyftpdlib:banner: 'pyftpdlib 1.5.9 ready.'
DEBUG:pyftpdlib:max login attempts: 3
INFO:pyftpdlib:>>> starting FTP server on <IP_ADDRESS>:2121, pid=19876 <<<
INFO:pyftpdlib:<IP_ADDRESS>:56740-[] FTP session opened (connect)
DEBUG:pyftpdlib:<IP_ADDRESS>:56740-[] -> 220 pyftpdlib 1.5.9 ready.
DEBUG:pyftpdlib:<IP_ADDRESS>:56740-[] <- USER anonymous
DEBUG:pyftpdlib:<IP_ADDRESS>:56740-[] -> 331 Username ok, send password.
DEBUG:pyftpdlib:<IP_ADDRESS>:56740-[anonymous] <- PASS ******
DEBUG:pyftpdlib:<IP_ADDRESS>:56740-[anonymous] -> 230 Login successful.
INFO:pyftpdlib:<IP_ADDRESS>:56740-[anonymous] USER 'anonymous' logged in.
DEBUG:pyftpdlib:<IP_ADDRESS>:56740-[anonymous] <- opts utf8 on
DEBUG:pyftpdlib:<IP_ADDRESS>:56740-[anonymous] -> 200 OK
DEBUG:pyftpdlib:<IP_ADDRESS>:56740-[anonymous] <- PWD
DEBUG:pyftpdlib:<IP_ADDRESS>:56740-[anonymous] -> 257 "/" is the current directory.
DEBUG:pyftpdlib:<IP_ADDRESS>:56740-[anonymous] <- CWD /new/
DEBUG:pyftpdlib:<IP_ADDRESS>:56740-[anonymous] -> 250 "/new" is the current directory.
DEBUG:pyftpdlib:<IP_ADDRESS>:56740-[anonymous] <- noop
DEBUG:pyftpdlib:<IP_ADDRESS>:56740-[anonymous] -> 200 I successfully did nothing'.
DEBUG:pyftpdlib:<IP_ADDRESS>:56740-[anonymous] <- CWD /new/
DEBUG:pyftpdlib:<IP_ADDRESS>:56740-[anonymous] -> 250 "/new" is the current directory.
DEBUG:pyftpdlib:<IP_ADDRESS>:56740-[anonymous] <- TYPE A
DEBUG:pyftpdlib:<IP_ADDRESS>:56740-[anonymous] -> 200 Type set to: ASCII.
DEBUG:pyftpdlib:<IP_ADDRESS>:56740-[anonymous] <- PASV
DEBUG:pyftpdlib:<IP_ADDRESS>:56740-[anonymous] -> 227 Entering passive mode (127,0,0,1,221,166).
DEBUG:pyftpdlib:<IP_ADDRESS>:56740-[anonymous] <- LIST
DEBUG:pyftpdlib:<IP_ADDRESS>:56740-[anonymous] -> 150 File status okay. About to open data connection.
DEBUG:pyftpdlib:[debug] call: close() (<pyftpdlib.handlers.PassiveDTP listening <IP_ADDRESS>:0 at 0x1f7fc1b3310>)
DEBUG:pyftpdlib:[debug] call: close() (<pyftpdlib.handlers.PassiveDTP <IP_ADDRESS>:0 at 0x1f7fc1b3310>)
DEBUG:pyftpdlib:[debug] starting transfer using send() (<DTPHandler(id=2164598190624, addr='<IP_ADDRESS>:56740', user='anonymous')>)
DEBUG:pyftpdlib:[debug] call: close() (<DTPHandler(id=2164598190624, addr='<IP_ADDRESS>:56740', user='anonymous')>)
DEBUG:pyftpdlib:<IP_ADDRESS>:56740-[anonymous] -> 226 Transfer complete.
DEBUG:pyftpdlib:<IP_ADDRESS>:56740-[anonymous] <- noop
DEBUG:pyftpdlib:<IP_ADDRESS>:56740-[anonymous] -> 200 I successfully did nothing'.
DEBUG:pyftpdlib:<IP_ADDRESS>:56740-[anonymous] <- CWD /new/
DEBUG:pyftpdlib:<IP_ADDRESS>:56740-[anonymous] -> 250 "/new" is the current directory.
DEBUG:pyftpdlib:<IP_ADDRESS>:56740-[anonymous] <- TYPE I
DEBUG:pyftpdlib:<IP_ADDRESS>:56740-[anonymous] -> 200 Type set to: Binary.
DEBUG:pyftpdlib:<IP_ADDRESS>:56740-[anonymous] <- PASV
DEBUG:pyftpdlib:<IP_ADDRESS>:56740-[anonymous] -> 227 Entering passive mode (127,0,0,1,221,168).
DEBUG:pyftpdlib:<IP_ADDRESS>:56740-[anonymous] <- STOR 装机�?txt
DEBUG:pyftpdlib:<IP_ADDRESS>:56740-[anonymous] -> 550 Invalid argument.
DEBUG:pyftpdlib:[debug] call: close() (<pyftpdlib.handlers.PassiveDTP listening <IP_ADDRESS>:0 at 0x1f7fc1b35b0>)
DEBUG:pyftpdlib:[debug] call: close() (<pyftpdlib.handlers.PassiveDTP <IP_ADDRESS>:0 at 0x1f7fc1b35b0>)
INFO:pyftpdlib:<IP_ADDRESS>:56745-[] FTP session opened (connect)
DEBUG:pyftpdlib:<IP_ADDRESS>:56745-[] -> 220 pyftpdlib 1.5.9 ready.
DEBUG:pyftpdlib:[debug] call: close() (<DTPHandler(id=2164598190624, addr='<IP_ADDRESS>:56740', user='anonymous')>)
DEBUG:pyftpdlib:<IP_ADDRESS>:56745-[] <- USER anonymous
DEBUG:pyftpdlib:<IP_ADDRESS>:56745-[] -> 331 Username ok, send password.
DEBUG:pyftpdlib:<IP_ADDRESS>:56745-[anonymous] <- PASS ******
DEBUG:pyftpdlib:<IP_ADDRESS>:56745-[anonymous] -> 230 Login successful.
INFO:pyftpdlib:<IP_ADDRESS>:56745-[anonymous] USER 'anonymous' logged in.
DEBUG:pyftpdlib:<IP_ADDRESS>:56745-[anonymous] <- opts utf8 on
DEBUG:pyftpdlib:<IP_ADDRESS>:56745-[anonymous] -> 200 OK
DEBUG:pyftpdlib:<IP_ADDRESS>:56745-[anonymous] <- PWD
DEBUG:pyftpdlib:<IP_ADDRESS>:56745-[anonymous] -> 257 "/" is the current directory.
DEBUG:pyftpdlib:<IP_ADDRESS>:56745-[anonymous] <- CWD /new/
DEBUG:pyftpdlib:<IP_ADDRESS>:56745-[anonymous] -> 250 "/new" is the current directory.
DEBUG:pyftpdlib:<IP_ADDRESS>:56745-[anonymous] <- DELE 装机单.txt
DEBUG:pyftpdlib:<IP_ADDRESS>:56745-[anonymous] -> 550 No such file or directory.
DEBUG:pyftpdlib:[debug] call: close() (<Handler(id=2164598190864, addr='<IP_ADDRESS>:56745', user='anonymous')>)
INFO:pyftpdlib:<IP_ADDRESS>:56745-[anonymous] FTP session closed (disconnect).
DEBUG:pyftpdlib:<IP_ADDRESS>:56740-[anonymous] <- noop
DEBUG:pyftpdlib:<IP_ADDRESS>:56740-[anonymous] -> 200 I successfully did nothing'.
DEBUG:pyftpdlib:<IP_ADDRESS>:56740-[anonymous] <- CWD /new/
DEBUG:pyftpdlib:<IP_ADDRESS>:56740-[anonymous] -> 250 "/new" is the current directory.
DEBUG:pyftpdlib:<IP_ADDRESS>:56740-[anonymous] <- noop
DEBUG:pyftpdlib:<IP_ADDRESS>:56740-[anonymous] -> 200 I successfully did nothing'.
DEBUG:pyftpdlib:<IP_ADDRESS>:56740-[anonymous] <- CWD /new/
DEBUG:pyftpdlib:<IP_ADDRESS>:56740-[anonymous] -> 250 "/new" is the current directory.
DEBUG:pyftpdlib:<IP_ADDRESS>:56740-[anonymous] <- TYPE A
DEBUG:pyftpdlib:<IP_ADDRESS>:56740-[anonymous] -> 200 Type set to: ASCII.
DEBUG:pyftpdlib:<IP_ADDRESS>:56740-[anonymous] <- PASV
DEBUG:pyftpdlib:<IP_ADDRESS>:56740-[anonymous] -> 227 Entering passive mode (127,0,0,1,221,173).
DEBUG:pyftpdlib:<IP_ADDRESS>:56740-[anonymous] <- LIST
DEBUG:pyftpdlib:<IP_ADDRESS>:56740-[anonymous] -> 150 File status okay. About to open data connection.
DEBUG:pyftpdlib:[debug] call: close() (<pyftpdlib.handlers.PassiveDTP listening <IP_ADDRESS>:0 at 0x1f7fc1b3310>)
DEBUG:pyftpdlib:[debug] call: close() (<pyftpdlib.handlers.PassiveDTP <IP_ADDRESS>:0 at 0x1f7fc1b3310>)
DEBUG:pyftpdlib:[debug] starting transfer using send() (<DTPHandler(id=2164598190624, addr='<IP_ADDRESS>:56740', user='anonymous')>)
DEBUG:pyftpdlib:[debug] call: close() (<DTPHandler(id=2164598190624, addr='<IP_ADDRESS>:56740', user='anonymous')>)
DEBUG:pyftpdlib:<IP_ADDRESS>:56740-[anonymous] -> 226 Transfer complete.
DEBUG:pyftpdlib:<IP_ADDRESS>:56740-[anonymous] <- noop
DEBUG:pyftpdlib:<IP_ADDRESS>:56740-[anonymous] -> 200 I successfully did nothing'.
DEBUG:pyftpdlib:<IP_ADDRESS>:56740-[anonymous] <- CWD /new/
DEBUG:pyftpdlib:<IP_ADDRESS>:56740-[anonymous] -> 250 "/new" is the current directory.
DEBUG:pyftpdlib:<IP_ADDRESS>:56740-[anonymous] <- TYPE I
DEBUG:pyftpdlib:<IP_ADDRESS>:56740-[anonymous] -> 200 Type set to: Binary.
DEBUG:pyftpdlib:<IP_ADDRESS>:56740-[anonymous] <- PASV
DEBUG:pyftpdlib:<IP_ADDRESS>:56740-[anonymous] -> 227 Entering passive mode (127,0,0,1,221,175).
DEBUG:pyftpdlib:<IP_ADDRESS>:56740-[anonymous] <- STOR 硬件检�?txt
DEBUG:pyftpdlib:<IP_ADDRESS>:56740-[anonymous] -> 550 Invalid argument.
DEBUG:pyftpdlib:[debug] call: close() (<pyftpdlib.handlers.PassiveDTP listening <IP_ADDRESS>:0 at 0x1f7fc1b35b0>)
DEBUG:pyftpdlib:[debug] call: close() (<pyftpdlib.handlers.PassiveDTP <IP_ADDRESS>:0 at 0x1f7fc1b35b0>)
INFO:pyftpdlib:<IP_ADDRESS>:56752-[] FTP session opened (connect)
DEBUG:pyftpdlib:<IP_ADDRESS>:56752-[] -> 220 pyftpdlib 1.5.9 ready.
DEBUG:pyftpdlib:[debug] call: close() (<DTPHandler(id=2164598190624, addr='<IP_ADDRESS>:56740', user='anonymous')>)
DEBUG:pyftpdlib:<IP_ADDRESS>:56752-[] <- USER anonymous
DEBUG:pyftpdlib:<IP_ADDRESS>:56752-[] -> 331 Username ok, send password.
DEBUG:pyftpdlib:<IP_ADDRESS>:56752-[anonymous] <- PASS ******
DEBUG:pyftpdlib:<IP_ADDRESS>:56752-[anonymous] -> 230 Login successful.
INFO:pyftpdlib:<IP_ADDRESS>:56752-[anonymous] USER 'anonymous' logged in.
DEBUG:pyftpdlib:<IP_ADDRESS>:56752-[anonymous] <- opts utf8 on
DEBUG:pyftpdlib:<IP_ADDRESS>:56752-[anonymous] -> 200 OK
DEBUG:pyftpdlib:<IP_ADDRESS>:56752-[anonymous] <- PWD
DEBUG:pyftpdlib:<IP_ADDRESS>:56752-[anonymous] -> 257 "/" is the current directory.
DEBUG:pyftpdlib:<IP_ADDRESS>:56752-[anonymous] <- CWD /new/
DEBUG:pyftpdlib:<IP_ADDRESS>:56752-[anonymous] -> 250 "/new" is the current directory.
DEBUG:pyftpdlib:<IP_ADDRESS>:56752-[anonymous] <- DELE 硬件检测.txt
DEBUG:pyftpdlib:<IP_ADDRESS>:56752-[anonymous] -> 550 No such file or directory.
DEBUG:pyftpdlib:[debug] call: close() (<Handler(id=2164598190864, addr='<IP_ADDRESS>:56752', user='anonymous')>)
INFO:pyftpdlib:<IP_ADDRESS>:56752-[anonymous] FTP session closed (disconnect).
DEBUG:pyftpdlib:<IP_ADDRESS>:56740-[anonymous] <- noop
DEBUG:pyftpdlib:<IP_ADDRESS>:56740-[anonymous] -> 200 I successfully did nothing'.
DEBUG:pyftpdlib:<IP_ADDRESS>:56740-[anonymous] <- CWD /new/
DEBUG:pyftpdlib:<IP_ADDRESS>:56740-[anonymous] -> 250 "/new" is the current directory.
DEBUG:pyftpdlib:<IP_ADDRESS>:56740-[anonymous] <- noop
DEBUG:pyftpdlib:<IP_ADDRESS>:56740-[anonymous] -> 200 I successfully did nothing'.
DEBUG:pyftpdlib:<IP_ADDRESS>:56740-[anonymous] <- CWD /new/
DEBUG:pyftpdlib:<IP_ADDRESS>:56740-[anonymous] -> 250 "/new" is the current directory.
DEBUG:pyftpdlib:<IP_ADDRESS>:56740-[anonymous] <- TYPE A
DEBUG:pyftpdlib:<IP_ADDRESS>:56740-[anonymous] -> 200 Type set to: ASCII.
DEBUG:pyftpdlib:<IP_ADDRESS>:56740-[anonymous] <- PASV
DEBUG:pyftpdlib:<IP_ADDRESS>:56740-[anonymous] -> 227 Entering passive mode (127,0,0,1,221,179).
DEBUG:pyftpdlib:<IP_ADDRESS>:56740-[anonymous] <- LIST
DEBUG:pyftpdlib:<IP_ADDRESS>:56740-[anonymous] -> 150 File status okay. About to open data connection.
DEBUG:pyftpdlib:[debug] call: close() (<pyftpdlib.handlers.PassiveDTP listening <IP_ADDRESS>:0 at 0x1f7fc1b3310>)
DEBUG:pyftpdlib:[debug] call: close() (<pyftpdlib.handlers.PassiveDTP <IP_ADDRESS>:0 at 0x1f7fc1b3310>)
DEBUG:pyftpdlib:[debug] starting transfer using send() (<DTPHandler(id=2164598190624, addr='<IP_ADDRESS>:56740', user='anonymous')>)
DEBUG:pyftpdlib:[debug] call: close() (<DTPHandler(id=2164598190624, addr='<IP_ADDRESS>:56740', user='anonymous')>)
DEBUG:pyftpdlib:<IP_ADDRESS>:56740-[anonymous] -> 226 Transfer complete.
DEBUG:pyftpdlib:<IP_ADDRESS>:56740-[anonymous] <- noop
DEBUG:pyftpdlib:<IP_ADDRESS>:56740-[anonymous] -> 200 I successfully did nothing'.
DEBUG:pyftpdlib:<IP_ADDRESS>:56740-[anonymous] <- CWD /new/
DEBUG:pyftpdlib:<IP_ADDRESS>:56740-[anonymous] -> 250 "/new" is the current directory.
DEBUG:pyftpdlib:<IP_ADDRESS>:56740-[anonymous] <- TYPE I
DEBUG:pyftpdlib:<IP_ADDRESS>:56740-[anonymous] -> 200 Type set to: Binary.
DEBUG:pyftpdlib:<IP_ADDRESS>:56740-[anonymous] <- PASV
DEBUG:pyftpdlib:<IP_ADDRESS>:56740-[anonymous] -> 227 Entering passive mode (127,0,0,1,221,181).
DEBUG:pyftpdlib:<IP_ADDRESS>:56740-[anonymous] <- STOR 任务管理�?txt
DEBUG:pyftpdlib:<IP_ADDRESS>:56740-[anonymous] -> 550 Invalid argument.
DEBUG:pyftpdlib:[debug] call: close() (<pyftpdlib.handlers.PassiveDTP listening <IP_ADDRESS>:0 at 0x1f7fc1b35b0>)
DEBUG:pyftpdlib:[debug] call: close() (<pyftpdlib.handlers.PassiveDTP <IP_ADDRESS>:0 at 0x1f7fc1b35b0>)
INFO:pyftpdlib:<IP_ADDRESS>:56759-[] FTP session opened (connect)
DEBUG:pyftpdlib:<IP_ADDRESS>:56759-[] -> 220 pyftpdlib 1.5.9 ready.
DEBUG:pyftpdlib:[debug] call: close() (<DTPHandler(id=2164598190624, addr='<IP_ADDRESS>:56740', user='anonymous')>)
DEBUG:pyftpdlib:<IP_ADDRESS>:56759-[] <- USER anonymous
DEBUG:pyftpdlib:<IP_ADDRESS>:56759-[] -> 331 Username ok, send password.
DEBUG:pyftpdlib:<IP_ADDRESS>:56759-[anonymous] <- PASS ******
DEBUG:pyftpdlib:<IP_ADDRESS>:56759-[anonymous] -> 230 Login successful.
INFO:pyftpdlib:<IP_ADDRESS>:56759-[anonymous] USER 'anonymous' logged in.
DEBUG:pyftpdlib:<IP_ADDRESS>:56759-[anonymous] <- opts utf8 on
DEBUG:pyftpdlib:<IP_ADDRESS>:56759-[anonymous] -> 200 OK
DEBUG:pyftpdlib:<IP_ADDRESS>:56759-[anonymous] <- PWD
DEBUG:pyftpdlib:<IP_ADDRESS>:56759-[anonymous] -> 257 "/" is the current directory.
DEBUG:pyftpdlib:<IP_ADDRESS>:56759-[anonymous] <- CWD /new/
DEBUG:pyftpdlib:<IP_ADDRESS>:56759-[anonymous] -> 250 "/new" is the current directory.
DEBUG:pyftpdlib:<IP_ADDRESS>:56759-[anonymous] <- DELE 任务管理器.txt
DEBUG:pyftpdlib:<IP_ADDRESS>:56759-[anonymous] -> 550 No such file or directory.
DEBUG:pyftpdlib:[debug] call: close() (<Handler(id=2164598190864, addr='<IP_ADDRESS>:56759', user='anonymous')>)
INFO:pyftpdlib:<IP_ADDRESS>:56759-[anonymous] FTP session closed (disconnect).
DEBUG:pyftpdlib:<IP_ADDRESS>:56740-[anonymous] <- noop
DEBUG:pyftpdlib:<IP_ADDRESS>:56740-[anonymous] -> 200 I successfully did nothing'.
DEBUG:pyftpdlib:<IP_ADDRESS>:56740-[anonymous] <- CWD /new/
DEBUG:pyftpdlib:<IP_ADDRESS>:56740-[anonymous] -> 250 "/new" is the current directory.
DEBUG:pyftpdlib:<IP_ADDRESS>:56740-[anonymous] <- noop
DEBUG:pyftpdlib:<IP_ADDRESS>:56740-[anonymous] -> 200 I successfully did nothing'.
DEBUG:pyftpdlib:<IP_ADDRESS>:56740-[anonymous] <- CWD /new/
DEBUG:pyftpdlib:<IP_ADDRESS>:56740-[anonymous] -> 250 "/new" is the current directory.
DEBUG:pyftpdlib:<IP_ADDRESS>:56740-[anonymous] <- TYPE A
DEBUG:pyftpdlib:<IP_ADDRESS>:56740-[anonymous] -> 200 Type set to: ASCII.
DEBUG:pyftpdlib:<IP_ADDRESS>:56740-[anonymous] <- PASV
DEBUG:pyftpdlib:<IP_ADDRESS>:56740-[anonymous] -> 227 Entering passive mode (127,0,0,1,221,185).
DEBUG:pyftpdlib:<IP_ADDRESS>:56740-[anonymous] <- LIST
DEBUG:pyftpdlib:<IP_ADDRESS>:56740-[anonymous] -> 150 File status okay. About to open data connection.
DEBUG:pyftpdlib:[debug] call: close() (<pyftpdlib.handlers.PassiveDTP listening <IP_ADDRESS>:0 at 0x1f7fc1b3310>)
DEBUG:pyftpdlib:[debug] call: close() (<pyftpdlib.handlers.PassiveDTP <IP_ADDRESS>:0 at 0x1f7fc1b3310>)
DEBUG:pyftpdlib:[debug] starting transfer using send() (<DTPHandler(id=2164598190624, addr='<IP_ADDRESS>:56740', user='anonymous')>)
DEBUG:pyftpdlib:[debug] call: close() (<DTPHandler(id=2164598190624, addr='<IP_ADDRESS>:56740', user='anonymous')>)
DEBUG:pyftpdlib:<IP_ADDRESS>:56740-[anonymous] -> 226 Transfer complete.
DEBUG:pyftpdlib:<IP_ADDRESS>:56740-[anonymous] <- noop
DEBUG:pyftpdlib:<IP_ADDRESS>:56740-[anonymous] -> 200 I successfully did nothing'.
DEBUG:pyftpdlib:<IP_ADDRESS>:56740-[anonymous] <- CWD /new/
DEBUG:pyftpdlib:<IP_ADDRESS>:56740-[anonymous] -> 250 "/new" is the current directory.
DEBUG:pyftpdlib:<IP_ADDRESS>:56740-[anonymous] <- TYPE I
DEBUG:pyftpdlib:<IP_ADDRESS>:56740-[anonymous] -> 200 Type set to: Binary.
DEBUG:pyftpdlib:<IP_ADDRESS>:56740-[anonymous] <- PASV
DEBUG:pyftpdlib:<IP_ADDRESS>:56740-[anonymous] -> 227 Entering passive mode (127,0,0,1,221,187).
DEBUG:pyftpdlib:<IP_ADDRESS>:56740-[anonymous] <- STOR 新建文本文档.txt
DEBUG:pyftpdlib:<IP_ADDRESS>:56740-[anonymous] -> 150 File status okay. About to open data connection.
DEBUG:pyftpdlib:[debug] call: close() (<pyftpdlib.handlers.PassiveDTP listening <IP_ADDRESS>:0 at 0x1f7fc1b35b0>)
DEBUG:pyftpdlib:[debug] call: close() (<pyftpdlib.handlers.PassiveDTP <IP_ADDRESS>:0 at 0x1f7fc1b35b0>)
DEBUG:pyftpdlib:[debug] call: close() (<DTPHandler(id=2164598190624, addr='<IP_ADDRESS>:56740', user='anonymous', sending-file=<_io.BufferedWriter name='K:\\git\\oppo\\pyftpdlib-1.5.9\\new\\新建文本文档.txt'>, bytes-trans=0)>)
DEBUG:pyftpdlib:<IP_ADDRESS>:56740-[anonymous] -> 226 Transfer complete.
INFO:pyftpdlib:<IP_ADDRESS>:56740-[anonymous] STOR K:\git\oppo\pyftpdlib-1.5.9\new\新建文本文档.txt completed=1 bytes=0 seconds=0.047
INFO:pyftpdlib:<IP_ADDRESS>:56740-[anonymous] -> 421 Control connection timed out.
DEBUG:pyftpdlib:[debug] call: close() (<Handler(id=2164598190624, addr='<IP_ADDRESS>:56740', user='anonymous')>)
INFO:pyftpdlib:<IP_ADDRESS>:56740-[anonymous] FTP session closed (disconnect).

@znsoooo I have created PR https://github.com/giampaolo/pyftpdlib/issues/625 which adds a new FTPHandler.encoding attribute which you can change as such:
handler = Handler
handler.authorizer = authorizer
handler.encoding = "gbk"
address = ('<IP_ADDRESS>', 2121)
server = FTPServer(address, handler)
server.serve_forever()

@giampaolo 👍
Test ok on Python-3.6.8-amd64 and Python-3.8.10-amd64. Thank you very much! :)
You may have already decided, but I would like to ask more question, do you plan to add this parameter to ArgumentParser in "__main__.py"?
If you think it's acceptable, I can offer a PR; If you don't plan to do that, then I'm talking too much.

No. :) Changing encoding is rather usual, so I don't think it's worth adding the option to the CLI.


scholarly:Exception TypeError while fetching page: ("create_cookie() got unexpected keyword arguments: ['sameSite']",)

I was using scholarly on windows 10. I installed firefox and geckodriver, and can initiate the firefox session successfully, yet after I got the captha right, the program keeps create new session. I looked into the scholarly log, found this below:
INFO:scholarly:Getting https://scholar.google.com/scholar?hl=en&q=Spatial-Temporal Synchronous Graph Convolutional Networks%3A A New Framework for Spatial-Temporal Network Data Forecasting&as_vis=0&as_sdt=0,33
INFO:scholarly:Session proxy config is {}
INFO:scholarly:Got a captcha request.
INFO:scholarly:Solving the captcha took already 10 seconds (of maximum 604800 s).
INFO:scholarly:Solving the captcha took already 20 seconds (of maximum 604800 s).
INFO:scholarly:Solving the captcha took already 30 seconds (of maximum 604800 s).
INFO:scholarly:Solving the captcha took already 40 seconds (of maximum 604800 s).
INFO:scholarly:Solved captcha in less than 50 seconds.
INFO:scholarly:Exception TypeError while fetching page: ("create_cookie() got unexpected keyword arguments: ['sameSite']",)
INFO:scholarly:Retrying with a new session.
INFO:scholarly:Session proxy config is {}
INFO:scholarly:Got a captcha request.
INFO:scholarly:Solving the captcha took already 10 seconds (of maximum 604800 s).
INFO:scholarly:Solving the captcha took already 20 seconds (of maximum 604800 s).
INFO:scholarly:Solving the captcha took already 30 seconds (of maximum 604800 s).
INFO:scholarly:Solving the captcha took already 40 seconds (of maximum 604800 s).
INFO:scholarly:Solving the captcha took already 50 seconds (of maximum 604800 s).
INFO:scholarly:Solving the captcha took already 60 seconds (of maximum 604800 s).
INFO:scholarly:Solving the captcha took already 70 seconds (of maximum 604800 s).
INFO:scholarly:Solving the captcha took already 80 seconds (of maximum 604800 s).
INFO:scholarly:Solving the captcha took already 90 seconds (of maximum 604800 s).
INFO:scholarly:Solving the captcha took already 100 seconds (of maximum 604800 s).
INFO:scholarly:Solving the captcha took already 110 seconds (of maximum 604800 s).
INFO:scholarly:Solving the captcha took already 120 seconds (of maximum 604800 s).
INFO:scholarly:Solving the captcha took already 130 seconds (of maximum 604800 s).
INFO:scholarly:Solving the captcha took already 140 seconds (of maximum 604800 s).
INFO:scholarly:Solving the captcha took already 150 seconds (of maximum 604800 s).
INFO:scholarly:Solving the captcha took already 160 seconds (of maximum 604800 s).
INFO:scholarly:Solving the captcha took already 170 seconds (of maximum 604800 s).
INFO:scholarly:Solving the captcha took already 180 seconds (of maximum 604800 s).
INFO:scholarly:Solving the captcha took already 190 seconds (of maximum 604800 s).
INFO:scholarly:Solving the captcha took already 200 seconds (of maximum 604800 s).
INFO:scholarly:Solving the captcha took already 210 seconds (of maximum 604800 s).
INFO:scholarly:Solving the captcha took already 220 seconds (of maximum 604800 s).
INFO:scholarly:Solving the captcha took already 230 seconds (of maximum 604800 s).
INFO:scholarly:Solving the captcha took already 240 seconds (of maximum 604800 s).
INFO:scholarly:Getting https://scholar.google.com/scholar?hl=en&q=Spatial-Temporal Synchronous Graph Convolutional Networks%3A A New Framework for Spatial-Temporal Network Data Forecasting&as_vis=0&as_sdt=0,33
INFO:scholarly:Session proxy config is {}
INFO:scholarly:Got a captcha request.
INFO:scholarly:Solving the captcha took already 10 seconds (of maximum 604800 s).
INFO:scholarly:Solving the captcha took already 20 seconds (of maximum 604800 s).
INFO:scholarly:Solving the captcha took already 30 seconds (of maximum 604800 s).
INFO:scholarly:Solving the captcha took already 40 seconds (of maximum 604800 s).
INFO:scholarly:Solving the captcha took already 50 seconds (of maximum 604800 s).
INFO:scholarly:Solving the captcha took already 60 seconds (of maximum 604800 s).
INFO:scholarly:Solving the captcha took already 70 seconds (of maximum 604800 s).
INFO:scholarly:Solving the captcha took already 80 seconds (of maximum 604800 s).
INFO:scholarly:Solving the captcha took already 90 seconds (of maximum 604800 s).
INFO:scholarly:Solving the captcha took already 100 seconds (of maximum 604800 s).
INFO:scholarly:Solving the captcha took already 110 seconds (of maximum 604800 s).
INFO:scholarly:Solving the captcha took already 120 seconds (of maximum 604800 s).
INFO:scholarly:Solving the captcha took already 130 seconds (of maximum 604800 s).
INFO:scholarly:Solved captcha in less than 140 seconds.
INFO:scholarly:Exception TypeError while fetching page: ("create_cookie() got unexpected keyword arguments: ['sameSite']",)
INFO:scholarly:Retrying with a new session.
INFO:scholarly:Session proxy config is {}
INFO:scholarly:Got a captcha request.
INFO:scholarly:Solving the captcha took already 10 seconds (of maximum 604800 s).
INFO:scholarly:Solving the captcha took already 20 seconds (of maximum 604800 s).
I think it's due to the mis use of create_cookie(). I'm using a python version 3.8.3.

To reproduce the issue, use scholarly.search_pubs method

I encountered the same problem. It seems the requests.cookies.create_cookie() method does not accept the field 'sameSite', which is set by Google after doing the captcha. I found a quick workaround, which is to pop that field from the cookie object before setting in the file _proxy_generator.py.
In essence, add the line
cookie.pop("sameSite", None)
below line 352 in _proxy_generator.py.

Merging this with https://github.com/scholarly-python-package/scholarly/issues/89

It seems like this fix was never merged! I still have to manually pop the sameSite cookie!

Please proceed with a pull request with the fix.

Fixed in #457


FaIR: Check allowed emissions

Replaces #33
Closes #32

[x] Tests added
[ ] Documentation added
[ ] Example added (in the documentation, to an existing notebook, or in a new notebook)
[x] Description in CHANGELOG.rst added (single line such as: (`#XX <https://github.com/openscm/openscm-runner/pull/XX>`_) Added feature which does something)

Can you give this a look @chrisroadmap?
https://github.com/openscm/openscm-runner/pull/37/commits/c9af8d042e8d067482b2fe49c4e4f0e262861498
I'm not sure what the assert was trying to guard against, but i think it's safer now by just throwing an error if there is a problem.

That looks like it will do the job.


Experiment with physical PV prediction using pvlib

This is the first step of the "new ML research direction" outlined in issue #7.
TODO:

[x] find a PV system with shading issues
[ ] predict PV power using:

[x] pvlib fed with clearsky irradiance.
[ ] pvlib fed with UKV NWP: See this stack overflow question and answer. If that fails, also see: solarforecastarbiter.pvmodel.irradiance_to_power. See this comment from Will. Also see the Forecasting section of the pvlib docs.

[ ] maybe try inferring azimuth and angle using pvanalytics.system.infer_orientation_fit_pvwatts. Also see this conversation with Will Holmgren on Twitter.

[ ] An ML model which sees a single timestep at a time:

[ ] (pvlib fed with UKV NWP) -> an ML model which "corrects" pvlib
[ ] an ML model which is pre-trained on pvlib fed with UKV NWP
[ ] an ML model on its own

[ ] a simplified Temporal Fusion Transformer which predicts one PV system at a time, and receives recent history of PV power. Maybe this could, later, be shared on HuggingFace (issue #11). This is useful to see how "good" we can get PV prediction before we start using tricks like using neighbouring PV data and satellite imagery.

[ ] compare performance of the above

Context
I'm increasingly convinced that we need to accurately model each individual PV system as accurately as possible (especially local shading and inverter clipping). For two main reasons:

When we train our ML model to infer PV power from satellite imagery, local effects like shading and inverter clipping are an unwelcome source of "noise".
Likewise when we use PV power data from nearby PV systems to help predict PV power at the PV system of interest.

I've made a start on this on Friday, and found a few PV systems with pretty obvious shading issues (the plot shows power on the y axis and time-of-day on the x axis for June):

Here's what the pvlib prediction, using clearsky irradiance (and default wind speed and air temperature) looks like:

Implemented in: https://github.com/openclimatefix/power_perceiver/blob/0f53822646da2605e4143268d6ac1be8cb4eabca/notebooks/2022-02-28_predict_pv_using_pvlib/predict_pv_using_pvlib.ipynb
Next step: Predict using NWPs

Actually, NWP irradiance isn't terrible:  (this is using the NWP irradiance produced by the most recent NWP model run).

Hmm, I think one big source of error when using pvlib is likely to be the calculation of GHI, DNI and DHI.
The issue is that the NWP doesn't provide GHI, DNI and DHI. Instead it just provides "downwards short-wave radiation flux".
The pvlib docs provide a method to compute GHI, DNI and DHI purely from NWP total cloud cover (which already makes me nervous: we know that clouds at different vertical levels affect sunlight in different ways).
If we do this, then we get something that looks quite different to the NWP DSWRF:

If we use NWP DSWRF as GHI (which I'd guess is the right thing to do?! But I'm really not sure! Especially because none of the pvlib.forecast models do this) then we get this:

9408286

Next steps:

[ ] Try predicting PV with DWSRF-as-GHI; vs GHI computed from cloud cover (directly above the point of interest).
[ ] Try computing cloud cover using the NWP pixels in the Sun's line-of-sight (see issue #13).
[ ] Try an ML model which sees the NWP pixels in the Sun's light-of-sight, plus a low res image of the pixels directly above the PV system (for light being scattered back).

MAE for predicting PV power with PVLib using NWP directly above the PV system (ignoring times when the sun is less than 10 degrees above the horizon):

using DWSRF-as-GHI: 12.52% MAPE
using GHI computed from cloud cover: 12.68% MAPE

Both these values are closer to 7% MAPE if using the complete time series (including nighttime).

to convert the vector line which represents the line-of-sight of the Sun through the lower 10 km of the atmosphere, I'm planning to adapt Xiaolin Wu's line drawing algorithm.

Give the model: solar azimuth, angle, and irradiance at the top of the atmosphere

Note to self: See the "next steps" in the ipython notebook.

Experiments computing GHI, DNI and DHI using the clouds, selecting the NWP grid boxes in the Sun's path:

taking the max of each grid point for lcc, mcc, hcc.  total_cloud_cover is the max of that. 11.37% MAPE (only using times when elevation > 10). 6.84% when using nighttime too.
taking the max of each grid point for lcc, mcc, hcc.  total_cloud_cover is the sum of that, clipped at 1. 11.19% MAPE (only using times when elevation > 10). 6.75% when using nighttime too.

Next steps:

[ ] Speed up the code that gets NWP variables along the Sun's path. Load one timestep at a time from Zarr into memory, and then grab data from the data in memory.
[ ] Train a boosted regression tree to predict PV. Try giving it PVLib's PV predictions. Or try without. The aim here is to get the best PV prediction from a model that see a single timestep. And compare ML model vs ML model fed with PVLib vs PVLib on its own.
[ ] Then try training a boosted regression tree just to learn local factors of each PV system (i.e. don't tell it anything about clouds). (Ultimately, we'll probably train a neural net to do this, and to output a distribution. This should be useful to help downstream ML network "see" the effects of clouds).
[ ] Then do the same with a deep neural net. Try training one PV system per neural net. Then try training one large neural net (giving it PV system ID) and see if it can still learn each PV system's characteristics.


[Bug]: Finalisation pop up acting onImageEditingComplete instead of onCloseEditor

Package Version
5.0.2
Flutter Version
3.24.0
Platforms
Android, iOS, Web
How to reproduce?
Edit an image with Image Editor - await for a dialog response on onImageEditingComplete that will make you either stay on the editor or leave.
The error starts acting since the new versions > 4.3.3

Logs (optional)
No response
Example code (optional)
Future<void> _onImageEditionCompleted(
    BuildContext context, {
    required Uint8List bytes,
  }) async {
    final result = await MyDialog();

    if (result == true) {
      _newImage = bytes;
    } else {
      _newImage = Uint8List(0);
    }
  }

  void _onCloseEditor(BuildContext context) {
    if (_newImage == null || _newImage!.isNotEmpty) {
      Navigator.pop(context, _newImage);
    } else {
      _newImage = null;
    }
  }

ProImageEditor.memory(
      image,
      callbacks: ProImageEditorCallbacks(
        onImageEditingComplete: (bytes) => _onImageEditionCompleted(
          context,
          bytes: bytes,
        ),
        onCloseEditor: () => _onCloseEditor(context),
      ),
      configs: configs,
    );

Device Model (optional)
No response

I'm not sure if I understand you correctly, but I think that you want that the user confirm before closing the editor. If this is the case, the confirmation should be implemented inside the onCloseEditor function, not in onImageEditingComplete. The onImageEditingComplete function is responsible for displaying the loading-dialog, which allows users to see the same loading-dialog when uploading an image to the server. Below is an example of the correct implementation:
Uint8List? _newImage;

Future<void> _onImageEditionCompleted(
  Uint8List bytes,
) async {
  _newImage = bytes;
}

void _onCloseEditor() {
  final shouldClose = await MyDialog();

  if (shouldClose) {
    Navigator.pop(context, _newImage);
  }
}

The problem with your method onCloseEditor is that you cannot differentiate if either I'm exiting my editor from my onImageEditionCompleted or my cancelButton, except if I'am doing a variable instantiation on onImageEditionCompleted but it's fine I've just removed my dialog, it is more fluid now.


Anvil Bug

They Can Use Other Type Book And Use Anvil Change Name Than Use /blacksmith To Combine To Get Free Book.
Example:
I Took 2 Snare I Book than use anvil change name to Snare II And Than use /blacksmith Combine it to snare III

Alright thanks I'll look into it.

Every time I take an enchantment book and set the level from I to II it doesn't give me a tier III book

use /blacksmith also no have?

NeverMind le the latest version already no more this bug


[FarmBot OS ImageUploader] Images larger than ~3MB fail to upload

This is specific to GCS image uploads, as uploading large images to /direct_upload/ does not error.
FarmBot OS error messages
v7:
Failed to upload /tmp/images/1539365725.jpg %Farmbot.HTTP.Response{body: "Metadata part is too large.", headers: [{"X-GUploader-UploadID", "<REDACTED>"}, {"Content-Length", "27"}, {"Date", "Fri, 12 Oct 2018 17:35:39 GMT"}, {"Server", "UploadServer"}, {"Content-Type", "text/html; charset=UTF-8"}, {"Alt-Svc", "quic=\":443\"; ma=2592000; v=\"44,43,39,35\""}], status_code: 400}. Going to retry.

v8:
Failed to upload image: {:ok, %Tesla.Env{__client__: %Tesla.Client{adapter: nil, fun: nil, post: [], pre: [{Tesla.Middleware.BaseUrl, :call, ["https://storage.googleapis.com/<REDACTED>/"]}, {Tesla.Middleware.Headers, :call, [[{"user-agent", "FarmbotOS/8.0.0-rc53 (rpi3) rpi3 ()"}]]}, {Tesla.Middleware.FormUrlencoded, :call, [[]]}]}, __module__: FarmbotExt.API, body: "Metadata part is too large.", headers: [{"date", "Fri, 12 Oct 2018 17:35:39 GMT"}, {"server", "UploadServer"}, {"content-length", "27"}, {"content-type", "text/html; charset=UTF-8"}, {"x-guploader-uploadid", "<REDACTED>"}, {"alt-svc", "quic=\":443\"; ma=2592000; v=\"44,43,39,35\""}], method: :post, opts: [], query: [], status: 400, url: "https://storage.googleapis.com/<REDACTED>/"}}

Relevant code
farmbot_os
https://github.com/FarmBot/farmbot_os/blob/staging/farmbot_ext/lib/farmbot_ext/api.ex
Farmbot-Web-App
https://github.com/FarmBot/Farmbot-Web-App/blob/staging/app/mutations/images/generate_policy.rb

Uncommenting plug(Tesla.Middleware.Logger) may help debug this issue, as the error occurs between FarmBot OS and GCS.


Fix leaderboard edge cases

The app caches the results of all games played, and then only updates the leaderboard for the current user.
There are some uncovered edge cases:

[ ] If a user plays their first game, and they are within top-10, they don't appear in the leaderboard until first hard-refresh.
[ ] if a user within top-10 clicks their way to a higher score than other top-10, the list is not re-sorted and will appear out of order.

Would be good to tackle writing tests for this component at the same time:

#22


GET channel request spec should specify possible values for "state" enum string

In the response of the GET channel request, it is unclear what the possible values for state should be.
I suggest two states:

PENDING (channel has been requested but the open has not been initiated yet. it may be none, partially, or fully paid for at this point, which the user can deduce from the amount_paid variable)
OPEN_INITIATED (the channel opening transaction has been broadcast. provides no info whether it has confirmed or is active yet)

thoughts?

these two states are intentionally broad to limit complexity for implementing state updates on the LSP side

but happy to consider more granular states if people want that

My instinct is more granular, like PAID, PARTIAL_PMT, REFUNDED, FAILED, RETRYING, or such... but I defer to our actual node admins.

Proposal. Please let me know if you are missing something or you disagree with any states:

State
Description

TO_BE_PAID
When the order has been created but the user hasn't paid yet.

PENDING
Order is paid but the channel has not been opened yet.

OPEN_INITIATED
Channel broadcast transaction is in the mempool. 0conf might skip directly to OPENED.

OPENED
Channel is open and has the necessary block confirmations.

FAILED
Any error. For example, the LSP couldn't connect to the target node.

REFUNDED
Payment has been refunded.

OFFER_EXPIRED
Order has not been paid and offer has therefore expired.

Proposal. Please let me know if you are missing something or you disagree with any states:
State	Description
TO_BE_PAID	When the order has been created but the user hasn't paid yet.
PENDING	Order is paid but the channel has not been opened yet.
OPEN_INITIATED	Channel broadcast transaction is in the mempool. 0conf might skip directly to OPENED.
OPENED	Channel is open and has the necessary block confirmations.
FAILED	Any error. For example, the LSP couldn't connect to the target node.
REFUNDED	Payment has been refunded.
OFFER_EXPIRED	Order has not been paid and offer has therefore expired.

these look great to me. only nit is I think we could come up with a cleaner name for TO_BE_PAID

these look great to me. only nit is I think we could come up with a cleaner name for TO_BE_PAID, maybe CREATED ?

Sure, let it be CREATED. Let's shortly discuss this on our next LSP call in case somebody else has an input. Otherwise, I think this can be merged.

#16


General overdue updates

[ ] Update to FAKE 5
[x] Use FSF command line tool
[ ] Update projects to the .NET SDK
[ ] Idea for paket as netcore tool

marked as WIP


Add ability to route based on request method

If you want this feature to be implemented, give it a thumbs up reaction, so that we can determine which features are important to you.
👍

Coming in v0.17.0


Fix bug that was preventing the API from picking up cover expiration events

@MilGard91 can you test this out? and eventually add some programatic tests for it

Since ethers.js does't allow to create one listener to multiple events in one go (issue) we had to divide them it into multiple listeners


The elims transform just negated the default transform and since none…

… of the things in the default transform actually belong there, I renamed it to something more appropriate, deleted the elims sender transform, and updated the places that it needed to be updated in the code. Once this gets pushed out staging will need to be updated so that they no longer have a sender transform.
This PR renames the default transform to something more appropriate, removes it from use for ELIMS, deletes the ELIMS transform since that is only used to negate the default one.
Test Steps:

Verify that the ELIMS sender is not using a sender transform anymore.
Make sure the tests still pass

Changes

Renames the default transform to something more appropriate
Removes it from use for ELIMS
Deletes the ELIMS transform since that is only used to negate the default one.

Checklist
Testing

[ X] Tested locally?
[ ] Ran ./prime test or ./gradlew testSmoke against local Docker ReportStream container?
[ ] (For Changes to /frontend-react/...) Ran npm run lint:write?
[ ] Added tests?

smoke did not pass on local, have similar failures as in CI smoke:
*** TEST FAILED*** for ignore.CSV action send:  Expecting 5 item lineage records but got 0
Test passed: for ignore.HL7 action receive:  Expecting 5 item lineage records and got 5
Test passed: for ignore.HL7 action batch:  Expecting 5 item lineage records and got 5
*** TEST FAILED*** for ignore.HL7 action send:  Expecting 5 item lineage records but got 0
Test passed: for ignore.HL7_BATCH action receive:  Expecting 5 item lineage records and got 5
Test passed: for ignore.HL7_BATCH action batch:  Expecting 5 item lineage records and got 5
*** TEST FAILED*** for ignore.HL7_BATCH action send:  Expecting 5 item lineage records but got 0
Test passed: for ignore.HL7_NULL action receive:  Expecting 5 item lineage records and got 5
Test passed: for ignore.HL7_NULL action batch:  Expecting 5 item lineage records and got 5

smoke did not pass on local, have similar failures as in CI smoke: *** TEST FAILED*** for ignore.CSV action send: Expecting 5 item lineage records but got 0 Test passed: for ignore.HL7 action receive: Expecting 5 item lineage records and got 5 Test passed: for ignore.HL7 action batch: Expecting 5 item lineage records and got 5 *** TEST FAILED*** for ignore.HL7 action send: Expecting 5 item lineage records but got 0 Test passed: for ignore.HL7_BATCH action receive: Expecting 5 item lineage records and got 5 Test passed: for ignore.HL7_BATCH action batch: Expecting 5 item lineage records and got 5 *** TEST FAILED*** for ignore.HL7_BATCH action send: Expecting 5 item lineage records but got 0 Test passed: for ignore.HL7_NULL action receive: Expecting 5 item lineage records and got 5 Test passed: for ignore.HL7_NULL action batch: Expecting 5 item lineage records and got 5

Interesting. Everything passes for me locally. I had to reload settings though. Did you try that?

when it failed for me locally, CI also failed on same errors, remember later on after some commits, the smoke tests did pass, so it should be OK now...

Please link the ticket this is addressing in the description


VUE Single file components can't access this.$option.template in beforeCreate function

What problem does this feature solve?
VUE Single file components can't access this.$option.template in beforeCreate function。
我想在通过数据动态修改模板，但是单文件组件无法访问到template，所以无法修改。
What does the proposed API look like?
Single file can access template in beforeCreate function。

动态修改模板是个完全错误的思路...

可以给slot赋值么


Examples hub scene fails to load with error "Can't load invalid scene LoadHubOnStartup"

Overview
The examples hub scene fails to load the main menu scene, throwing this error:
Can't load invalid scene LoadHubOnStartup - make sure the scene name is spelled correctly and that you have added the scene to your MixedRealitySceneSystem profile's content scenes array.
It seems this is caused by the script LoadHubOnStartup
Steps to reproduce
In latest mrtk_development...

Open MRTKExamplesHub scene
Verify the MRTK ExamplesHub is the first scene in Build settings, as specified by this documentation
Hit Play

Expected Behavior
I see the MRTK Examples hub main menu
Actual Behavior
I see nothing, and get the following two errors:
Can't load invalid scene LoadHubOnStartup - make sure the scene name is spelled correctly and that you have added the scene to your MixedRealitySceneSystem profile's content scenes array.

No valid scenes found to load.

Marking as Urgency-Soon because this is a regression in a core scene that we use to show MRTK.

@davidkline-ms could this be related to #6218 ?

could this be related to #6218 ?

Possibly, it depends on what is serialized for the scene name in the profile.


Loss of nls settings on multiple parallel requests

Whenever Apache is restarted and the mod_owa is in an uninitialized state, whenever there are multiple requests handled in parallel, there is a big chance one of the connections from the connection pool does not get the correct nls settings. This stays until the affected connection is cleaned up or forcefully closed.
We can observe this behaviour by getting "garbled characters" on the returned webpage from the module or by invalid characters in the database after write operations.
Naturally this only happens if the NLS environment from the OCI differs from that of the database. We have specified the desired NLS via OwaNLS option as can be seen from example config (the NLS charset returned from OCI is WE8MSWIN1252):
<Location /stldb_cwpdb1_cronet>
  Options         None
  SetHandler      owa_handler
  OwaUserid       ***/***@cronet_stltest
  OwaAuth         OWA_CUSTOM
  OwaCharset      utf-8
  OwaNLS          GERMAN_GERMANY.AL32UTF8
  OwaCharsize     4
  OwaPool         20
</Location>

The current workaround is to make sure apache is started with the appropriate NLS_LANG and NLS_LENGTH_SEMANTICS environment variables so no character set conversion happens.
A colleague of mine was debugging the code so we are pretty sure we found the culprit, unfortunately i cannot provide a PR right now so i'll try to explain a bit in detail:
In owahand.cs method owa_handle_request after a connection successfully connects to the database via sql_connect for one time per location nls settings are set via sql_get_nls. If any subsequent request has aquired a new connection from the pool and has already finished connecting to the database but sql_get_nls from a previous request has not finished and the request is actively waiting to aquire the mutex mowa_acquire_mutex(octx), then the nls settings will never be saved to the connection object.
The correct characterset is either set in sql_get_nls or sql_connect, but only after the former was already called once, since only then the characterset from the oci environment is read.
I can think of two possible solutions at this point:

if the connection was waiting to aquire the mutex and the connection object was just now created (i.e. not from the pool) then reevaluate the appropriate characterset
use newer OCIEnvNlsCreate instead of OCIEnvCreate to override target nls defined for the apache location

Issue has been resolved with commit 2362482bdc8d3666df5edeb6bd0867af812b18f1.


Make types available outside of the package

I think it would be useful to be able to import the types created by the package.
For example, to type an array of Airports fetched on the backend using the types on the frontend.

Solution for it would be:

Add this to: packages/ryanair/source/index.ts:

export * as airports from '~/airports/index.ts'
export * from '~/airports/types.ts'
export * as fares from '~/fares/index.ts'
export * from '~/fares/types.ts'
export * as flights from '~/flights/index.ts'
export * from '~/flights/types.ts'

Open packages/ryanair/source/flights/types.ts and remove the export statement from Fare.

Sadly I cannot open a pull request as I do not have the permission to do so.

works 👍


Remove extra newlines

Fixes #25.
I didn't think I'd make two PRs. The first two commits are duplicates of #24. I removed these in the third commit.

Ok, thanks!


Fix the the

For future archaeologists: This is the first commit that ran with a stripped flutter.framework for release mode in device lab.


Need a cmake openenclave::oe-gdb SDK target

To sign an enclave within cmake you can use openenclave::oesign for the binary name and it will pull it from the SDK bin directory.
To add a custom target to run you generally need to have a custom command to run host/host enc/enclave. No special SDK target is needed here.
However we should be able to add a custom target so I can debug. This way I should be able to add a custom target debug which calls openenclave::oe-gdb, but this does not exist.
The reason the lack of this became problematic for me is that I need to run the host as sudo and that loses the path so it cannot find it so I had to jump through hoops to get the path before I call sudo,
Adding an openenclave::oe-gdb would make this easier.

Sure, you can do that pretty easily. Just add a new install command so it gets exported. There's lots of examples in the CMake files.

That install command should look like this.


'CustomScriptExtension', and type handler version '2.0' could not be found in the extension repository."

I did as mentioned in the documentation
{
"name": "config-app",
"type": "extensions",
"location": "[resourceGroup().location]",
"apiVersion": "2015-06-15",
"dependsOn": [
"[concat('Microsoft.Compute/virtualMachines/', concat(variables('vmName'),copyindex()))]"
],
"tags": {
"displayName": "config-app"
},
"properties": {
"publisher": "Microsoft.Azure.Extensions",
"type": "CustomScript",
"typeHandlerVersion": "2.0",   ========> version
"autoUpgradeMinorVersion": true,
"settings": {
},
"protectedSettings": {
"commandToExecute": "sh hello.sh ",
"fileUris": ["https://github.com/MyProject/Archive/MyPythonScript.py"
]
}
}
}
What i did as the following :

But My api version is  "apiVersion": "2017-03-30",
I have error as the following :
{
"error": {
"code": "ArtifactNotFound",
"message": "Extension with publisher 'Microsoft.Compute', type 'CustomScriptExtension', and type handler version '2.0' could not be found in the extension repository."
}
}

But I do found the custom extension for linux vm in GitHub :
https://github.com/Azure/custom-script-extension-linux
They have version 2.0. Can't understand why they don't exist in the extension repository. I tried also the api version mentionned in the doc, it doesn't working.  I think it has nothing to do with api-version but about if archifact existing in the extension repostory, please update the documentation about this issue. Thanks
Here is the Url : https://docs.microsoft.com/en-us/azure/virtual-machines/extensions/custom-script-linux
Azure documentation issue guidance
Thanks for opening an issue in the Azure technical documentation repository.
We use GitHub issues as the primary channel for customer and community feedback about the Azure documentation.
Creating an issue
We prefer that you create documentation feedback issues using the Feedback link on the published article - the feedback control on the doc page creates an issue that contains all the article details so you can focus on the feedback part.
You can also create a feedback issue here in the repo. If you do this, please make sure your issue lists:

[ ] The relevant Azure service or technology.
[ ] A link to the published documentation article that you have feedback about.
[ ] Clear, specific feedback that the author can act on.

Pull requests and article contributions
If you know the change that is needed in an article, we encourage you to submit the changes directly using a pull request. If the change is large, or if you want to contribute an entire article, follow these guidelines:

[ ] Don't surprise us with a big pull request or a pull request with a new article! Submit an issue that describes the details of the proposed large change or new article.
[ ] Include the service or technology area.

We'll route the issue to the appropriate content team for review and discussion.
Tech support and product feedback
If you would like to contact Microsoft about other things, such as product feedback or tech support, please review these guidelines:

If you need technical support using Azure, the paid and free support options are described here: https://azure.microsoft.com/support/options/.

Each article in the Azure technical documentation contains a product feedback button - it's best to submit product feedback directly from a relevant article. Otherwise, you can submit product feedback for most Azure products in the following product feedback forum: https://feedback.azure.com/forums/34192--general-feedback.

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

Thanks @cloudmelon. I have assigned to the author to review and update the doc as appropriate.
@danielsollondon can you take a look?

I am still waiting...
Melony

On 26 Oct 2018, at 22:24, JoolsJops<EMAIL_ADDRESS>wrote:
Hi,
Has this been resolved?
—
You are receiving this because you were mentioned.
Reply to this email directly, view it on GitHub, or mute the thread.

@cloudmelon I had the same problem but I noticed one thing that did work for me.
Make sure that
publisher is set to Microsoft.Azure.Extensions VS Microsoft.Computer  and
type is set to CustomScript VS CustomScriptExtension

I am not sure if it is the same extension ( need confirmation ), I resolve this actually by keeping CustomScriptExtension but downgrade the version to 1.8 or 1.5 and it went smoothly…
Thanks @Majorvin

On 29 Oct 2018, at 23:11, majorvin<EMAIL_ADDRESS>wrote:
@cloudmelon https://github.com/cloudmelon I had the same problem but I noticed one thing that did work for me.
Make sure that
publisher is set to Microsoft.Azure.Extensions VS Microsoft.Computer and
type is set to CustomScript VS CustomScriptExtension
—
You are receiving this because you were mentioned.
Reply to this email directly, view it on GitHub https://github.com/MicrosoftDocs/azure-docs/issues/10862#issuecomment-434099918, or mute the thread https://github.com/notifications/unsubscribe-auth/AEaE-F0BNtu9HR7J6BIrEn-33ggB69feks5up3z5gaJpZM4U5wyL.

Hi,
Can I get the complete code of this.

Change Publisher and Type as @majorvin said. It worked for me. reference
$vmss = Get-AzureRmVmss -ResourceGroupName $ResourceGroupName -VMScaleSetName $vmssResource.Name     $vmss = Add-AzureRMVmssExtension -VirtualMachineScaleSet $vmss
-Name "customscript"         -Publisher "Microsoft.Azure.Extensions"
-Type "CustomScript"         -TypeHandlerVersion 2.0
-Setting $settings          -AutoUpgradeMinorVersion $true

It looks like this issue no longer exists, so I am closing this. Thanks!

same issues as @jaydrue

Same as @jaydrue and @lulzzz

I found this in the documentation: https://docs.microsoft.com/en-us/azure/virtual-machines/extensions/custom-script-windows#extension-schema
The second note in this section mentions that only one type of an extension can be installed during a deployment.
The error message although should be more informative.


ApparmorProfile should be updated in place when is complain mode and missing permissions are detected

What would you like to be added:
Typically when an apparmor profile is recorded, it is not entirely complete. Sometimes there is functionality which is not captured during the recording phase. This can lead to certain actions being denied when the profile is enforced.
A better strategy to avoid service disruptions when enforcing a profile, it is to follow these steps:

Record the big bulk of the profile with the eBPF recorder. This will allow a container to start and run in the most common cases.
Place the apparmor profile in complain mode, and assign it to the container. This will only log the unauthorized actions which are not already present in the profile permissions.
Use a profile updater (e.g. in the log enricher) which should watch the audit log, and parse the denied apparmor messages. It can add then in-place the missing permissions to the profile. It can also signal when no permissions need to be added for a certain period of time, indicating that the profile is complete and ready to be enforced.
When the profile is complete, an audit can be performed, and based on the result the profile can be placed in enforce mode.

To achieve this, the log enricher and profile recorder need to be extended in order to support apparmor profile updates when a profile is in complain mode.
Also we should consider adding a flag in the apparmorprofile status which should indicate when a profile is partial or complete. This information can be used to decide when a profile is ready to be switched from complain mode to enforce mode.
Why is this needed:
This feature is required in order to use with confidence the apparmor profile for production workloads which must not be disrupted by an incomplete profile.

cc @mhils


copying from Yippy

I don't know if it is a bug or a missing feature, but I can't copy text or images with command+c out of Yippy.
For text it is currently not that bad, but i can't get images out of Yippy. Not even through drag'n'drop.
Would be nice to copy text/images with command+c out of Yippy :)
Also dragging images should simulate copy & past to the cursor positon.

Hey @baum1234
You raise a valid point and maybe when the window is open command + c should copy the selected item however, Yippy is designed so that it works in the opposite way: If the window is open, command + c works as it normally does. So if something on the screen is selected that will copied and added to the history.
To achieve the affect that you want, you should press enter. Yippy currently functions so that when the window is opened it does not take focus away from the current window. You can then press enter to paste directly where you have focus. If there is no focus on a window where pasting works this is fine, as it still will move the item to the top of the history and put it on the clipboard.
So you can just press enter on the item in your history and then use paste as you would expect. 😄
Let me know if you find that this is not the case!

Enter works :)
Would be great to just have window with some settings, maybe replaceing command + c, like other tools like Paste does.
Also would be great to have tutorial for all features inside the app :)

Ok I will look into it 😃


Money::round method reason why is it private?

I have specific business requirements for the MoneyFormatting interface I am implementing.
It should round all Money objects to 8 digits after the decimal point and print it.
How could I achieve this?
What is the reason the Money::round function is private?
Do I need to use some Round interface to round money class?

Digging deeper I found that I should use Calculator interface.
Thansk


Fix evaluation against master Nixpkgs

This should fix #73.

Fixes the error for me.

Thanks! I've merged to master 👍


Code fragments cannot be folded or unfolded

VSCode Version:: 1.33.1 (system setup)
Node.js: 10.2.0
V8: 6.6.346.32
OS: Windows_NT x64 10.0.17134

Steps to Reproduce:

plus and minus sign disappear
2.shortcut keys also don't work

Do you have accessibility mode enabled? You can see this on the status line.
Folding is not available in accessibility mode.

Thanks for your reply,but I don't find how to open or close accessibility mode.Do you mean "Screen reader mode"?  If two modes are same,I have tried Screen reader mode when all code is expanded,but my screenshot displays 21 lines directly to 103 lines and the middle code is not expanded.

Yes, Screen Reader Optimized (in the settings it's called Accessibility mode)/
If Screen Reader Optimized is cative you will not see any folding actions (+ or minus).
is the screen shot above with 'Screen Reader Optimized' enabled, or it's the same also without 'Screen Reader Optimized' ?

OK,I get.
But,Sorry,I didn't notice that,just this happens occasionally,after it restarts will be OK.
Next time it heppens, I'll take a screenshot of the whole picture，then back this issue.
Thank you very much!

I don't know how this happened.
The same is true of other newly opened files.

I came here to report the very same problem. I started noticing it maybe a month or so ago. Every once in a while folding just stops working. Sections that were folded remain so, and I'm unable to unfold them either with the mouse (the controls don't even appear on hover) or with the keyboard shortcuts. The only solution is to exit VSCode and restart it.
I read the bit about accessibility mode. I don't use that at all, so I'm not sure it's relevant (at least I don't think so).
I wish I could provide more information that might be helpful. This happens on both my work and home computers both running Windows 10.
I really just wanted to make sure someone knew about it so that perhaps it could be worked on.
If there's any information I could grab that would be helpful the next time it happens to me, I'd be happy to provide it if I'm able.
Thanks.

dup of #75726


Add Faros CE Docker Desktop Extension

Description
Add Faros CE Docker Desktop Extension
Fixes # (issue)
Type of change

New feature (non-breaking change which adds functionality)
This change requires a documentation update

Checklist
(Delete what does not apply)

[N] Have you checked to there aren't other open Pull Requests for the same update/change?
[Y] Have you lint your code locally before submission?
[Y] Have you added an explanation of what your changes do and why you'd like us to include them?
[N] Have you written new tests for your core changes, as applicable?
[Y] Have you successfully run tests with your changes locally?

@bidzhao thank you for the contribution!
What exactly this functionality provides? Why so many files are copied over? This could become a problem to maintain.

@tovbinm I'll provide the context offline. @bidzhao I am looking at it now.

I have read the CLA Document and I hereby sign the CLA.

@tovbinm This is to introduce new feature for making Faros CE to be a Docker Desktop Extension per thomas-gerber's request. Could you please elaborate what files are copied over?

@bidzhao 2 questions:

how can we avoid the step of replacing <FAROS_CONF_DIR> ? shouldn't an .env file be picked up automatically if it is next to the compose?
certain images may change depending on the machine, like the metabase image; any idea on how to incorporate it?

@bidzhao 2 questions:
1. how can we avoid the step of replacing <FAROS_CONF_DIR> ? shouldn't an `.env` file be picked up automatically if it is next to the compose?

Docker Desktop Extension starts containers with docker compose from a temporary internal directory instead of that we run command  docker extension install. I googled a lot, but unfortunately no good solution found. So the only way I can think of is manual replacing it with absolute file path.
2. certain images may change depending on the machine, like the metabase image; any idea on how to incorporate it?
If you want to change the icon of Faros extension, then please send me the faros.svg image and I can change it (Now it is the default docker.svg). BTW, https://farosai.docker.scarf.sh/farosai/metabase-m1 looks like a websocket api, which I cannot open via browser.

@bidzhao 2 questions:
1. how can we avoid the step of replacing <FAROS_CONF_DIR> ? shouldn't an `.env` file be picked up automatically if it is next to the compose?

Docker Desktop Extension starts containers with docker compose from a temporary internal directory instead of that we run command  docker extension install. I googled a lot, but unfortunately no good solution found. So the only way I can think of is manual replacing it with absolute file path.

2. certain images may change depending on the machine, like [the metabase image](https://github.com/faros-ai/faros-community-edition/blob/main/start.sh#L88); any idea on how to incorporate it?

If you want to change the icon of Faros extension, then please send me the faros.svg image and I can change it (Now it is the default docker.svg). BTW, https://farosai.docker.scarf.sh/farosai/metabase-m1 looks like a websocket api, which I cannot open via browser.

For the image, I meant the container image; https://farosai.docker.scarf.sh/farosai/metabase-m1 is the container image we use for metabase when we detect the user is on an M1 mac.

@bidzhao 2 questions:
1. how can we avoid the step of replacing <FAROS_CONF_DIR> ? shouldn't an `.env` file be picked up automatically if it is next to the compose?

Docker Desktop Extension starts containers with docker compose from a temporary internal directory instead of that we run command  docker extension install. I googled a lot, but unfortunately no good solution found. So the only way I can think of is manual replacing it with absolute file path.

2. certain images may change depending on the machine, like [the metabase image](https://github.com/faros-ai/faros-community-edition/blob/main/start.sh#L88); any idea on how to incorporate it?

If you want to change the icon of Faros extension, then please send me the faros.svg image and I can change it (Now it is the default docker.svg). BTW, https://farosai.docker.scarf.sh/farosai/metabase-m1 looks like a websocket api, which I cannot open via browser.

For the image, I meant the container image; https://farosai.docker.scarf.sh/farosai/metabase-m1 is the container image we use for metabase when we detect the user is on an M1 mac.

Maybe the simplest given the trouble with env files is to put all the variables directly in the docker-compose file with the environment attribute.
For the local volumes, we can transform them into persistent volumes. I tested, it works (at least those that started with FAROS_CONF_DIR).

@thomas-gerber

Maybe the simplest given the trouble with env files is to put all the variables directly in the docker-compose file with the environment attribute.
Yes, I thought of this solution too. But I dropped it because that will cause lots of duplicate enviroments among containers.
For the local volumes, we can transform them into persistent volumes. I tested, it works (at least those that started with FAROS_CONF_DIR).
OK. That could be potentially good solution. Please note env_file maps host file, instead of the file inside container.

overriding CLA assistant because @bidzhao signed the CLA here, even though it was not picked up by the workflow (@ogusak FYI - maybe because the PR comes from a fork?).


Add native Windows build script

What problem does this PR solve?
Adds native Windows build script for developer usage.
It's possible to build pd in the WSL (Linux for Windows) but it's not possible to run it due to memmap differences that are known and reported. (https://github.com/etcd-io/bbolt/issues/144)
This script requires only Go, Git, and powershell to be available on the machine as far as I can tell. (I'm using a pretty basic windows machine)
Here's a demo running pd on native Windows powershell, tikv on wsl, and the client-rust on wsl as well:

Here's the --version output:

We shouldn't announce/advertise this though because we haven't done any serious benchmarking or support testing. This is simply to enable Windows users to develop on pd/tikv without needing Docker.
What is changed and how it works?
A build.ps1 file was added since a minimal windows environment does not include make (nmake is available if you use the C++ dev tools but it's not fully compatible, we might try to use it and have errors later).
A Windows user using Powershell can invoke this with ./build and will find familiar binaries at bin/*. They'll see from the script when they run it that these are created:

Check List
Tests

No code

Code changes
Side effects

Increased code complexity

Related changes

Need to be included in the release notes

I don't think I can review this sorry, I don't know the powershell syntax, nor PD.

Ok, sorry. :)

@disksing I don't really understand how this PR is causing the CI to be red. Could you PTAL?

@Hoverbear Tests are not stable. Not your fault :)

Codecov Report

Merging #1540 into master will increase coverage by 0.01%.
The diff coverage is n/a.

@@            Coverage Diff             @@
##           master    #1540      +/-   ##
==========================================
+ Coverage   67.82%   67.83%   +0.01%
==========================================
  Files         159      159
  Lines       15777    15777
==========================================
+ Hits        10701    10703       +2
+ Misses       4117     4106      -11
- Partials      959      968       +9

Impacted Files
Coverage Δ

pkg/tempurl/tempurl.go
57.14% <0%> (-14.29%)
:arrow_down:

server/schedulers/shuffle_hot_region.go
64.1% <0%> (-6.42%)
:arrow_down:

server/etcd_kv.go
65.95% <0%> (-4.26%)
:arrow_down:

server/namespace_cluster.go
81.81% <0%> (-3.9%)
:arrow_down:

server/schedule/basic_cluster.go
88.67% <0%> (-3.78%)
:arrow_down:

server/core/kv.go
73.91% <0%> (-1.45%)
:arrow_down:

server/grpc_service.go
58.79% <0%> (-1.29%)
:arrow_down:

server/leader.go
82.04% <0%> (-1.23%)
:arrow_down:

server/option.go
90.41% <0%> (-0.84%)
:arrow_down:

server/schedulers/hot_region.go
75.45% <0%> (-0.74%)
:arrow_down:

... and 8 more

Continue to review full report at Codecov.

Legend - Click here to learn more
Δ = absolute <relative> (impact), ø = not affected, ? = missing data
Powered by Codecov. Last update 9ffc18f...a813307. Read the comment docs.

Interestingly the pd-server.exe can be executed directly inside WSL 1, so you don't need to launch PowerShell to run PD.

Indeed! You can run it directly in wsl2 too. :) You could also launch it from CMD.

I believe etcd-io/bbolt#144 is already fixed in WSL 2 so we could keep using the Linux version there 😅

Sure!


[Event Request] Table 83 "Item Journal Line" –  OnAfterLookUpTrackingSummary

[Event Request] Table 83 "Item Journal Line" –  OnAfterLookUpTrackingSummary
Could we please have a publisher OnAfterLookUpTrackingSummary
in function LookUpTrackingSummary Table 83 "Item Journal Line"?
    procedure LookUpTrackingSummary(TrackingType: Enum "Item Tracking Type")
    var
        TempTrackingSpecification: Record "Tracking Specification" temporary;
        ItemTrackingCode: Record "Item Tracking Code";
        ItemTrackingDataCollection: Codeunit "Item Tracking Data Collection";
    begin
        TempTrackingSpecification.InitFromItemJnlLine(Rec);
..
            else
                OnLookUpTrackingSummaryOnCaseOrderTypeElse(Rec, TempTrackingSpecification, TrackingType);
        end;
// >>>>>>>>
        OnAfterLookUpTrackingSummary(Rec, TempTrackingSpecification, TrackingType);
// >>>>>>>>
    end;

// >>>>>>>>

    [IntegrationEvent(false, false)]
    local procedure OnAfterLookUpTrackingSummary(var ItemJournalLine: Record "Item Journal Line"; TempTrackingSpecification: Record "Tracking Specification" temporary; TrackingType: Enum "Item Tracking Type")
    begin
    end;
// <<<<<<<<

Thanks for reporting this. We agree, and we’ll publish a fix asap, either in an update for the current version or in the next major release. Please do not reply to this, as we do not monitor closed issues. If you have follow-up questions or requests, please create a new issue where you reference this one.
Build ID: 11397.


The masks we should prepare should be amodal or modal?

Dear author, thanks for such a wonderful work which may make great help to instance segmentation tasks.
I noticed that in the Readme,

Using your own dataset
If using your own dataset to train or test, you need to make sure that it contains accurate modal annotations (masks are required >and categories are optional). Inaccurate modal mask annotations, e.g., COCO original annotaions that may have large margin >between masks of occluding objects, will result in unsatisfactory results.

However, the masks in "COCOA dataset proposed in [Semantic Amodal Segmentation]" are amodal.
I am confused that, should we prepare modal masks or amodal masks?
Thanks a lot.

COCOA contains both modal and amodal masks, and the amodal masks are used in evaluation.

Thank you @XiaohangZhan , modal masks should be much easier to be prepared compared to amodal masks.


Unbreak build with wlroots 0.13.0 (master snapshot)

Tested via gtk3-demo and alacritty.
Fixes https://github.com/Hjdskes/cage/issues/171

Doh, GCC complains about -Werror=enum-compare but Clang was silent. I'll fix it shortly.

@Hjdskes ping!

wlroots 0.13.0 was released now. Some distros probably would prefer having this PR merged and a new cage release made too. Otherwise they'll have to patch their packages.

Sorry for my absence. I'll get around to this, this weekend at the latest.

Hello! I'm the Fedora maintainer and since we're getting wlroots updated, I've decided to patch cage to work with wlroots 0.13 in rawhide (the development version of Fedora) and soon Fedora 34 (since wlroots will also be updated there). I've done some testing to ensure it works, and it does with:

gedit
firefox-nightly (with sound and video)
komikku (flatpak)
gnome-text-editor (flatpak + gtk4)
alacritty (non-gtk apps)

Some were tested on a virtual machine with the latest rawhide, others with my own computer on Fedora 34.
Hope this helps :)!

This looks great @jbeich! Thanks for keeping up with the changes in wlroots, and sorry for taking so long to review this.


404 Not Found Error in chat_ui.html

i think every file is in right location.
chat_ui.html is in the root seq2seq-chatbot folder, alongside chat_web.py, chatbot_model.py, and the other python files.
Getting same error in both
http://<IP_ADDRESS>:8080/chat_ui.html
and
http://<IP_ADDRESS>:8080/

Thankyou @AbrahamSanders just solved problem.
just paste http://<IP_ADDRESS>:8080/chat_ui in place of http://<IP_ADDRESS>:8080/chat_ui.html


Binary description ACLs

JIRA Ticket: Either part of or a regression from https://fedora-repository.atlassian.net/browse/FCREPO-3825
What does this Pull Request do?
I totally missed this when fixing the other part of FCREPO-3825.
The binary description Timemap (i.e. http://localhost:8080/rest/binary/fcr:metadata/fcr:versions) is currently showing the ACL of http://localhost:8080/rest/binary/fcr:metadata/fcr:acl
This path is invalid.
This PR changes that so it now points to the ACL on the binary.
i.e. http://localhost:8080/rest/binary/fcr:acl
How should this be tested?
Before the PR get the binary description Timemap and see the ACL on the binary description. After this PR, see it is on the binary directly.
Interested parties
Tag (@ mention) interested parties or, if unsure, @fcrepo/committers

@whikloj:  I'm not sure what's going on this PR - ie why it's not building.  But it's a bit out of sync with main.   Can you rebase on main and see if it will build successfully?  When I try it locally I'm running into a compilation error.
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:testCompile (default-testCompile) on project fcrepo-http-api: Compilation failure
[ERROR] /Users/danielbernstein/code/fcrepo/fcrepo-http-api/src/test/java/org/fcrepo/integration/http/api/FedoraVersioningIT.java:[207,9] no suitable method found for verifyTimemapResponse(java.lang.String,java.lang.String,java.lang.String[],java.lang.String,java.lang.String)
[ERROR]     method org.fcrepo.integration.http.api.FedoraVersioningIT.verifyTimemapResponse(java.lang.String) is not applicable
[ERROR]       (actual and formal argument lists differ in length)
[ERROR]     method org.fcrepo.integration.http.api.FedoraVersioningIT.verifyTimemapResponse(java.lang.String,java.lang.String) is not applicable
[ERROR]       (actual and formal argument lists differ in length)
[ERROR]     method org.fcrepo.integration.http.api.FedoraVersioningIT.verifyTimemapResponse(java.lang.String,java.lang.String[],java.lang.String,java.lang.String) is not applicable
[ERROR]       (actual and formal argument lists differ in length)


Add pypubsub dependency and added service layer base code

I see you approving your own PRs 😀

whaaaaaaaaaaaaat, i would never abuse my power


No "Back to Overview" button when using simpleform.htm with form() in controller file

When using form() in controller index function instead of cbi() function to avoid the "security token is invalid or already expired" problem (#1722) no "Back to Overview" button is shown anymore.
In my model/cbi file i use
local DISP = require("luci.dispatcher")
f = SimpleForm(...)
f.redirect = DISP.build_url(...)

By having a look on  simpleform.htm I noticed
...
local display_back   = (redirect)
local display_cancel = (self.cancel ~= false and self.on_cancel)
local display_skip   = (self.flow and self.flow.skip)
local display_submit = (self.submit ~= false)
local display_reset  = (self.reset ~= false)
...
if display_back then
    %><input class="cbi-button cbi-button-link" type="button" value="<%:Back to Overview%>" onclick="location.href='<%=pcdata(redirect)%>'" /> <%
end
...

So display_back doesn't refer to self.redirect but only redirect.
By changing the redirect to self.redirect it is working again.
Is there any idea how to fix this in the model/cbi or should simpleform.htm be modified?

We haven't heard back from you, so we're going to go ahead and close the issue.
If you're still experiencing the problem, please re-open the issue.

I don't know whether it is the intended way to use it, but this is working:
_G.redirect = luci.dispatcher.build_url("...")


WIndows 11: PyRoll-run gets stuck in an endless loop due to problems with kaleido package

Summary
After the update to Windows 11 PyRoll run got stuck in an endless loop.
Problem is caused by the kaleido package.
See
https://github.com/plotly/Kaleido/issues/126
Plotly fig.to_image is stucking on windows 11. #126
Downgrading the kaleidoversion to kaleido==0.1.0post1 via pip worked for me.

No we did not fix this.

On my Windows 11 machine I do get the same issue when using the newest kaleido version and downgrading it to kaleido==0.1.0.post1 does also fix it for me.
As this is a Problem specifically with either Windows 11 or the newest kaleido version I don't think there is much we can do besides requiring the use of the older kaleido version on all Windows 11 machines.
The comments in the kaleido issue given by @GRPlan hint at the same issue and as there have been no updates to kaleido in almost three years this is unlikely to be fixed.
Is there maybe an option on our side to check if this kaleido version is installed to only then use plotly and otherwise fall back on using matplotlib?

Your on the right track so create a branch from that issue and think of way to resolve this problem.


License?

I don't see any license file. Can one be decided on and added to the repository? Would a PR help?
Here is a quote from the license. It is generally interpreted as a copy of the license in the git repository, and in any downloaded copies of the code like from npm or yarn.
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

Thanks for noticing that.
We claim that we're MIT in package configurations (see package.json files). Adding a license file to the repo makes sense; would you like to help with that?

@palkan Here's a license file! https://github.com/anycable/anycable-client/pull/19


[Bug] API cannot include symbols from external crate - even if mirrored

Describe the bug
With this api.rs file
use flutter_rust_bridge::frb;
use time::{Date, Month};

#[frb(mirror(Date))]
pub struct _Date {
    value: i32,
}

pub fn getDate() -> Date {
    Date::from_calendar_date(2022, Month::November, 24).expect("constant valid date")
}

After running the generator, cargo build gives errors
error[E0412]: cannot find type Date in this scope
Codegen logs with RUST_LOG=debug environment variable
Adding in comment - github is complaining it is too long

To Reproduce
No response
Expected behavior
The generated file should include all necessary imports.
Generated binding code
#![allow(
    non_camel_case_types,
    unused,
    clippy::redundant_closure,
    clippy::useless_conversion,
    clippy::unit_arg,
    clippy::double_parens,
    non_snake_case,
    clippy::too_many_arguments
)]
// AUTO GENERATED FILE, DO NOT EDIT.
// Generated by `flutter_rust_bridge`@ 1.49.2.

use crate::api::*;
use core::panic::UnwindSafe;
use flutter_rust_bridge::*;

// Section: imports

// Section: wire functions

fn wire_getDate_impl(port_: MessagePort) {
    FLUTTER_RUST_BRIDGE_HANDLER.wrap(
        WrapInfo {
            debug_name: "getDate",
            port: Some(port_),
            mode: FfiCallMode::Normal,
        },
        move || move |task_callback| Ok(mirror_Date(getDate())),
    )
}
// Section: wrapper structs

#[derive(Clone)]
struct mirror_Date(Date);

// Section: static checks

const _: fn() = || {
    let Date = None::<Date>.unwrap();
    let _: i32 = Date.value;
};
// Section: allocate functions

// Section: impl Wire2Api

pub trait Wire2Api<T> {
    fn wire2api(self) -> T;
}

impl<T, S> Wire2Api<Option<T>> for *mut S
where
    *mut S: Wire2Api<T>,
{
    fn wire2api(self) -> Option<T> {
        (!self.is_null()).then(|| self.wire2api())
    }
}
// Section: impl IntoDart

impl support::IntoDart for mirror_Date {
    fn into_dart(self) -> support::DartAbi {
        vec![self.0.value.into_dart()].into_dart()
    }
}
impl support::IntoDartExceptPrimitive for mirror_Date {}

// Section: executor

support::lazy_static! {
    pub static ref FLUTTER_RUST_BRIDGE_HANDLER: support::DefaultHandler = Default::default();
}

/// cbindgen:ignore
#[cfg(target_family = "wasm")]
#[path = "bridge_generated.web.rs"]
mod web;
#[cfg(target_family = "wasm")]
pub use web::*;

#[cfg(not(target_family = "wasm"))]
#[path = "bridge_generated.io.rs"]
mod io;
#[cfg(not(target_family = "wasm"))]
pub use io::*;

OS
MacOS
Version of flutter_rust_bridge_codegen
1.49.2
Flutter info
No response
Version of clang++
No response
Version of ffigen
No response
Additional context
No response

After re-reading the documentation, this is fixed by using pub use time::Date


interactive editor examples in v5 format?

Hiya,
This is possibly a silly question and I'm probably missing something somewhere, but is there an interactive editor for the newer emitter formats? The examples from the current one don't use behaviours at all (even just a repo of the examples in the new format would be amazing).
using:
"pixi.js": "^6.2.1"
"@pixi/particle-emitter": "^5.0.3"
Thanks!

The runtime is backwards compatible with the older format, so you can use the editor if you want to. However, all of the examples in it, and more, live in this repository already!

Knew I was being daft. Thanks @andrewstart !!


CAS 5.0.0: EhCacheTicketRegistry uses timeToKillInSeconds instead of maxTimeToLiveInSeconds

It seems to me that there is a problem with tickets expiration in org.apereo.cas.ticket.registry.EhCacheTicketRegistry. I configured CAS to expire ticket granting ticket after 10 seconds of inactivity or expire it after 60 seconds regardless of activity. Then I logged in successfully and tried to open login page several times after that (to emulate activity) but suddenly CAS showed me login page again in about 10 seconds after successful login, I mean CAS used value of timeToKillInSeconds property as value for maxTimeToLiveInSeconds property.
I have included the following in my report:

CAS server version: 5.0.0, Gradle overlay
Container/environment type/version: external Tomcat 8.0.30, Oracle JDK 8u60, Windows 7 Pro OS
Steps to duplicate the problem:

Set TGT expiration properties as following:

cas.ticket.tgt.timeToKillInSeconds=10
cas.ticket.tgt.maxTimeToLiveInSeconds=60

Add EhCache ticket registry to the overlay and build the project
Put resulted cas.war file into CATALINA_HOME/webapps directory and start the container
Go to https://<cas_host>:<cas_port>/cas/login -> login page appears
Enter default credentials casuser/Mellon -> CAS' generic success view appears
Wait 5 seconds and go again to https://<cas_host>:<cas_port>/cas/login -> CAS' generic success view appears
Wait 6 seconds (5+6=11>timeToKillInSeconds) and go again to https://<cas_host>:<cas_port>/cas/login -> unexpectedly login page appears instead of CAS' generic success view

cas.log says:

2016-12-13 15:38:03,113 INFO [org.apereo.inspektr.audit.support.Slf4jLoggingAuditTrailManager] - <Audit trail record BEGIN
=============================================================
WHO: casuser
WHAT: TGT-**********************************************abAhZwO5NB-key-man1
ACTION: TICKET_GRANTING_TICKET_CREATED
APPLICATION: CAS
WHEN: Tue Dec 13 15:38:03 MSK 2016
CLIENT IP ADDRESS: <IP_ADDRESS>
SERVER IP ADDRESS: <IP_ADDRESS>
=============================================================

>
2016-12-13 15:38:13,268 INFO [org.apereo.inspektr.audit.support.Slf4jLoggingAuditTrailManager] - <Audit trail record BEGIN
=============================================================
WHO: audit:unknown
WHAT: TGT-**********************************************abAhZwO5NB-key-man1
ACTION: TICKET_GRANTING_TICKET_DESTROYED
APPLICATION: CAS
WHEN: Tue Dec 13 15:38:13 MSK 2016
CLIENT IP ADDRESS: <IP_ADDRESS>
SERVER IP ADDRESS: <IP_ADDRESS>
=============================================================

>

https://github.com/cas-projects/cas-issues/pull/29

This is indeed a bug, yes. Thanks for the report.

@mmoayyed, you are welcome! By the way, I am preparing another issue with locale change interceptor.

Well... Actually, the issue still exists. But this time it can be another issue.  Let me explain a little bit.
I have just tried with the latest 5.0.2-SNAPSHOT using steps mentioned in my first post. Fail, TGT expires accurately in 10 seconds, log says.
Ok, I doubled TTI setting it to 20 seconds. Fail again, TGT expires accurately in 20 seconds, log says.
Let it be. I excluded EhCache ticket registry dependency and removed ehcache-replicated.xml from overlay project. That means I tried to reproduce with default ticket registry implementation. And the issue is still reproducible (with both TTI=10 sec and TTI=20 sec)!
Then I changed workflow a bit on steps 4, 6 and 7. I used service parameter with URL to a non-existent service https://my.service, so I had
https://<cas_host>:<cas_port>/cas/login?service=https://my.service

instead of
https://<cas_host>:<cas_port>/cas/login

This time everything worked as expected for both default and EhCache ticket registries. Although in very rare cases EhCache was not precise enough in expiration (see logs attached for details, but sorry, I was too lazy to configure additivity properly in default logger configuration XML file)
cas.log_TTL=60_TTI=20_attempt_1.txt
cas.log_TTL=60_TTI=20_attempt_3.txt
cas.log_TTL=60_TTI=20_attempt_4.txt
Also I did one more test. I tried to log in in my service which accepts default user casuser and after successful login I opened another tab in browser and went to https://<cas_host>:<cas_port>/cas/login - TGT expired in 3 seconds after successful creation, log says. I did it two times (see log attached), configuration: EhCache ticket registry, TTL=28800 seconds, TTI=28800 seconds, service pattern for default HTTPS and IMAPS service=^(https?|imaps)(:|%3a)(%2f|/){2}.*.
cas.log_TTL=28800_TTI=28800_real_service_then_login.txt
The last but not least thing. There are two versions of spring-boot-*, spring-data-* and spring-integration-* libraries in /WEB-INF/lib directory.
Regards, Yauheni.

The last but not least thing. There are two versions of spring-boot-, spring-data- and spring-integration-* libraries in /WEB-INF/lib directory.

This is a separate issue. For this, you'll need to submit an overlay and create a separate issue so it can individually tracked. Thanks.

Fail again, TGT expires accurately in 20 seconds, log says.

You'll need to attach DEBUG logs.

This is a separate issue. For this, you'll need to submit an overlay and create a separate issue so it can individually tracked. Thanks.

I have just created https://github.com/apereo/cas/issues/2241

You'll need to attach DEBUG logs.

@mmoayyed, could you specify, please, which loggers I should switch to debug level? All org.apereo.* loggers or only some specific of them? Shall I touch Spring's loggers and other 3rd-party ones?

In this case you need org.apereo.cas and the packages related to ehcache at least so we can observe the eviction policy activity in the logs. Attachs logs from startup so we can see how CAS creates expiration policies.

Do we have updates on this? Can this be closed?

I do apologize for delay.
So I used this configuration for loggers:
log4j2_eh_debug.zip
Log files:

scenario from first post (login -> wait 5 sec -> login -> wait 6 sec -> login)
cas.log_TTL=60_TTI=10_debug.txt
scenario from additional test with real service (real service login -> login)
cas.log_TTL=28800_TTI=28800_real_service_then_login_debug.txt

You need to "Attach logs from startup so we can see how CAS creates expiration policies."

I'll run through this one more time. Hang on.

So I set up:
cas.ticket.tgt.timeToKillInSeconds=10
cas.ticket.tgt.maxTimeToLiveInSeconds=60

And ran through this. What I observe is that when I log in after 10 seconds of inactivity the TGT is removed from the cache and expired. However if I actually start USING that TGT to issue service tickets and so it is only then removed after a minute. It seems like your difficulty has more to do with the concept of "ticket usage", etc. If you just sit on the login page idly, or if you just keep refreshing the page that does not constitute TGT usage.

You need to "Attach logs from startup so we can see how CAS creates expiration policies."

Oh, I am so sorry for that. I did test several times and chose improper file to attach. Although this one has the necessary information from startup.

If you just sit on the login page idly, or if you just keep refreshing the page that does not constitute TGT usage.

Thanks a lot. I've got it. But what about scenario with a real service and following login page? There were both TTI=28800 and TTL=28800, but TGT was expired in 8 seconds.

Thanks very much. Not a problem about logs; it's always the VERY FIRST thing I ask for :)

But what about scenario with a real service and following login page? There were both TTI=28800 and TTL=28800, but TGT was expired in 8 seconds.

I shall look into it.

what about scenario with a real service and following login page? There were both TTI=28800 and TTL=28800, but TGT was expired in 8 seconds.

Also unable to duplicate this.

Hi!

Also unable to duplicate this.

I have resolved this issue using property
cas.ticket.registry.ehcache.persistence=LOCALTEMPSWAP

instead of default one
cas.ticket.registry.ehcache.persistence=NONE

Thanks.


Bump hibernate-core in /Hibernate/HQL/5_Assignment5

Bumps hibernate-core from 5.4.9.Final to 5.4.24.Final.

Release notes
Changelog
Commits

updated-dependencies:

dependency-name: org.hibernate:hibernate-core dependency-type: direct:production ...

1


Routing with nextjs ?

Thanks for great demo!
One question related to routing, currently it seems impossible to read queryparams in server component.
Do you have any example/guideline for that?

Yeah, currently React Context isn’t implemented in RSC so we can’t use useRouter in server components. As a temporary workaround, router is passed to the page as a prop (same as the withRouter behavior).
But this is just a temporary workaround and RSC is still an experimental thing, this will change in future updates.

@shuding I tried to use withRouter for main component but got error
Error: This Hook is not supported in Server Components.

Do you have any guideline for it ?

@revskill10 It's already there, you don't need to wrap it with withRouter:
export default function Page({ router }) {
  ...
}

Also keep in mind that this router object only has query, route and asPath fields...

@shuding I tried with this, one concern is, i have to check if router is defined first, else return null at first render.

Also keep in mind that this router object only has query, route and asPath fields...

Thanks for the clarification. But the plans are to get back access to the context in the page, right?

This is now supported: https://github.com/vercel/next-react-server-components/blob/main/app/item/page.js#L9-L12
https://beta.nextjs.org/docs/api-reference/file-conventions/page


fail to lauch

fail to launch the latest version of 1.11.2
crash-2017-07-01_14.22.43-client.txt

Fixed fluid a few months ago, buildcraft compat.


Lift and shift update for Windows Server 2022

This is an update to the lift and shift article for Windows Server 2022 GA.

#sign-off


x/tools/go/ssa/interp: tests broken at Go CL 191198

CL 191198 changed the error message written by the compiler for unhashable types.
Apparently the tests for x/tools/go/ssa/interp were relying on the exact error message, because they are now failing in the builders:
https://build.golang.org/log/b4fad15a40867a4f25fdf2fdacbe3bcc13408bad
CC @ianthehat @randall77 @martisch

Removing Soon because ssa/interp is not heavily used, and the test is no longer a time bomb.