Which USB to RS485 converter to use

Hi @Frankkkkk
Would you mind letting us know what hardware you are using to communicate with the Pylontech batteries. For example, which USB to RS485 cable you are using, which OS/Hardware etc.
I'm struggling with a Raspberry Pi 3B+ and USB to RS485 adapter (https://www.amazon.com/gp/product/B08RDZVP49)
Cheers!

PS: I don't know the pinout on the one you showed, but I'm pretty sure that it doesn't match the Pylontech RJ45 pinout ! You'd need a custom RJ45 patch cable (easy to crimp).
It's easy to do with the one I showed above because you can just take a standard RJ45/ethernet cable, cut it in half and take the two strands you're interested in

Awesome, thanks @Frankkkkk - I've ordered exactly the same from Amazon. I also asked the question to the seller regarding the pinout for the converter I have... no response yet. I'll keep you posted... thanks again!

Hi @Frankkkkk ,
I managed to get my hands on the USB RS485 adapter you referenced above. Also, made a new cable from some CAT6 on to a RJ45 (568b). As per the Pylontech manual it says pin 7 and 8 are recommended for RS485, so converting that to 568b we get (Pin 7: brown/white, Pin 8: brown).
I get the following when trying to run the library:
`>>> import pylontech

p = pylontech.Pylontech()
print(p.get_values())
Traceback (most recent call last):
File "", line 1, in
File "/home/pi/python-pylontech/pylontech/pylontech.py", line 211, in get_values
d = self.get_values_fmt.parse(f.info[1:])
File "/home/pi/.local/lib/python3.7/site-packages/construct/core.py", line 288, in parse
return self.parse_stream(io.BytesIO(data), **contextkw)
File "/home/pi/.local/lib/python3.7/site-packages/construct/core.py", line 300, in parse_stream
return self._parsereport(stream, context, "(parsing)")
File "/home/pi/.local/lib/python3.7/site-packages/construct/core.py", line 312, in _parsereport
obj = self._parse(stream, context, path)
File "/home/pi/.local/lib/python3.7/site-packages/construct/core.py", line 2120, in _parse
subobj = sc._parsereport(stream, context, path)
File "/home/pi/.local/lib/python3.7/site-packages/construct/core.py", line 312, in _parsereport
obj = self._parse(stream, context, path)
File "/home/pi/.local/lib/python3.7/site-packages/construct/core.py", line 2653, in _parse
return self.subcon._parsereport(stream, context, path)
File "/home/pi/.local/lib/python3.7/site-packages/construct/core.py", line 312, in _parsereport
obj = self._parse(stream, context, path)
File "/home/pi/.local/lib/python3.7/site-packages/construct/core.py", line 2413, in _parse
e = self.subcon._parsereport(stream, context, path)
File "/home/pi/.local/lib/python3.7/site-packages/construct/core.py", line 312, in _parsereport
obj = self._parse(stream, context, path)
File "/home/pi/.local/lib/python3.7/site-packages/construct/core.py", line 2120, in _parse
subobj = sc._parsereport(stream, context, path)
File "/home/pi/.local/lib/python3.7/site-packages/construct/core.py", line 312, in _parsereport
obj = self._parse(stream, context, path)
File "/home/pi/.local/lib/python3.7/site-packages/construct/core.py", line 2653, in _parse
return self.subcon._parsereport(stream, context, path)
File "/home/pi/.local/lib/python3.7/site-packages/construct/core.py", line 312, in _parsereport
obj = self._parse(stream, context, path)
File "/home/pi/.local/lib/python3.7/site-packages/construct/core.py", line 2413, in _parse
e = self.subcon._parsereport(stream, context, path)
File "/home/pi/.local/lib/python3.7/site-packages/construct/core.py", line 312, in _parsereport
obj = self._parse(stream, context, path)
File "/home/pi/.local/lib/python3.7/site-packages/construct/core.py", line 703, in _parse
obj = self.subcon._parsereport(stream, context, path)
File "/home/pi/.local/lib/python3.7/site-packages/construct/core.py", line 312, in _parsereport
obj = self._parse(stream, context, path)
File "/home/pi/.local/lib/python3.7/site-packages/construct/core.py", line 1041, in _parse
data = stream_read(stream, self.length, path)
File "/home/pi/.local/lib/python3.7/site-packages/construct/core.py", line 91, in stream_read
raise StreamError("stream read less than specified amount, expected %d, found %d" % (length, len(data)), path=path)
construct.core.StreamError: Error in path (parsing) -> Module -> GroupedCellsTemperatures
stream read less than specified amount, expected 2, found 1`

I also switched the brown/brown-white wires around on the RS485-to-USB adapter to see if I got a different output, I did...:
`>>> p = pylontech.Pylontech()

print(p.get_values())
Traceback (most recent call last):
File "", line 1, in
File "/home/pi/python-pylontech/pylontech/pylontech.py", line 208, in get_values
f = self.read_frame()
File "/home/pi/python-pylontech/pylontech/pylontech.py", line 167, in read_frame
f = self._decode_hw_frame(raw_frame=raw_frame)
File "/home/pi/python-pylontech/pylontech/pylontech.py", line 148, in _decode_hw_frame
assert got_frame_checksum == int(frame_chksum, 16)
ValueError: invalid literal for int() with base 16: b''`

Any thoughts?
Thanks again for your help! Really appreciate it.

Hi,
How are your dip switches set ? They should be all four off (down). Which pylontech modules have you got (model) ?
It would be great to show the received raw frame by either adding a print(f) after here or by launching wireshark and dumping the serial port (that would be really great !).
Cheers !

I suppose that your first wiring must be correct as the frame passed the checksum validation.
Maybe your setup is a bit different than mine and we must change the frame protocol. If you can manage to dump the raw frame I can try to check the differences and patch the lib ;-)

Hi @Frankkkkk , thanks for getting back to me.

All DIP switches are down: https://imgur.com/a/pIJbQBH
I have 1x US3000 Plus and 1x US2000 Plus
I've switched back the wires to be the first way around

Debug out from printing L169:
b'~2002460010F011020F0CCD0CCE0CCC0CCE0CCB0CCC0CCD0CCC0CCD0CCB0CCC0CCD0CCD0CCE0CCC050BE10BCD0BCD0BD70BCDFFC3BFFDFFFF04FFFF0234007F300121100F0CCA0CCA0CCB0CCC0CCA0CCC0CCB0CCB0CCB0CCB0CCB0CCA0CCC0CCC0CCB050BEB0BCD0BCD0BCD0BC3FFD1BFE5FFFF04FFFF0292005FB400C350C4A7\r'
Cheers

Well, I managed to decode part of the frame:
Container:
    NumberOfModules = 2
    Module = ListContainer:
        Container:
            NumberOfCells = 15
            CellVoltages = ListContainer:
                3.277
                3.278
                3.276
                3.278
                3.275
                3.276
                3.277
                3.276
                3.277
                3.275
                3.276
                3.277
                3.277
                3.278
                3.276
            NumberOfTemperatures = 5
            AverageBMSTemperature = 30.41
            GroupedCellsTemperatures = ListContainer:
                30.21
                30.21
                30.31
                30.21
            Current = -6.1
            Voltage = 49.149
            Power = -299.8089
            RemainingCapacity = 65.535
            TotalCapacity = 65.535
            CycleNumber = 564
    foobar = 16
    Module2 = ListContainer:
        Container:
            NumberOfCells = 15
            CellVoltages = ListContainer:
                3.274
                3.274
                3.275
                3.276
                3.274
                3.276
                3.275
                3.275
                3.275
                3.275
                3.275
                3.274
                3.276
                3.276
                3.275
            NumberOfTemperatures = 5
            AverageBMSTemperature = 30.51
            GroupedCellsTemperatures = ListContainer:
                30.21
                30.21
                30.21
                30.11
            Current = -4.7
            Voltage = 49.125
            Power = -230.88750000000002
            RemainingCapacity = 65.535
            TotalCapacity = 65.535
            CycleNumber = 658
    greedy = ListContainer:
        0
        95
        180
        0
        195
        80
    TotalPower = -299.8089
    StateOfCharge = 1.0

But I specified the protocol manually:
    get_values_fmt = construct.Struct(
        "NumberOfModules" / construct.Byte,
        "Module" / construct.Array(1, construct.Struct(
            "NumberOfCells" / construct.Int8ub,
            "CellVoltages" / construct.Array(construct.this.NumberOfCells, ToVolt(construct.Int16sb)),
            "NumberOfTemperatures" / construct.Int8ub,
            "AverageBMSTemperature" / ToCelsius(construct.Int16sb),
            "GroupedCellsTemperatures" / construct.Array(construct.this.NumberOfTemperatures - 1, ToCelsius(construct.Int16sb)),
            "Current" / ToAmp(construct.Int16sb),
            "Voltage" / ToVolt(construct.Int16ub),
            "Power" / construct.Computed(construct.this.Current * construct.this.Voltage),
            "RemainingCapacity" / DivideBy1000(construct.Int16ub),
            "_undef1" / construct.Int8ub,
            "TotalCapacity" / DivideBy1000(construct.Int16ub),
            "CycleNumber" / construct.Int16ub,
        )),
        "foobar" / construct.Int8ub,
        "foobar" / construct.Int8ub,
        "foobar" / construct.Int8ub,
        "foobar" / construct.Int8ub,
        "foobar" / construct.Int8ub,
        "foobar" / construct.Int8ub,
        "Module2" / construct.Array(1, construct.Struct(
            "NumberOfCells" / construct.Int8ub,
            "CellVoltages" / construct.Array(construct.this.NumberOfCells, ToVolt(construct.Int16sb)),
            "NumberOfTemperatures" / construct.Int8ub,
            "AverageBMSTemperature" / ToCelsius(construct.Int16sb),
            "GroupedCellsTemperatures" / construct.Array(construct.this.NumberOfTemperatures - 1, ToCelsius(construct.Int16sb)),
            "Current" / ToAmp(construct.Int16sb),
            "Voltage" / ToVolt(construct.Int16ub),
            "Power" / construct.Computed(construct.this.Current * construct.this.Voltage),
            "RemainingCapacity" / DivideBy1000(construct.Int16ub),
            "_undef1" / construct.Int8ub,
            "TotalCapacity" / DivideBy1000(construct.Int16ub),
            "CycleNumber" / construct.Int16ub,
        )),
        "greedy" / construct.GreedyRange(construct.Byte),
        "TotalPower" / construct.Computed(lambda this: sum([x.Power for x in this.Module])),
        "StateOfCharge" / construct.Computed(lambda this: sum([x.RemainingCapacity for x in this.Module]) / sum([x.TotalCapacity for x in this.Module])),

    )

There seems to be some extra bytes sent after the first module (written as foobar in the construct proto). So, my questions are:

Is the first module an US3000 ?
Can you try launching the program with only the US2000 connected (do a powercycle first) ? Do it work ?
Same question for US3000
Can you try by swapping the master/slave modules ?

Interesting though
Cheers !

And the code if you want to try manually:
    def get_values(self):
        #self.send_cmd(2, 0x42, b'FF')
        #f = self.read_frame()
        rf =  b'~2002460010F011020F0CCD0CCE0CCC0CCE0CCB0CCC0CCD0CCC0CCD0CCB0CCC0CCD0CCD0CCE0CCC050BE10BCD0BCD0BD70BCDFFC3BFFDFFFF04FFFF0234007F300121100F0CCA0CCA0CCB0CCC0CCA0CCC0CCB0CCB0CCB0CCB0CCB0CCA0CCC0CCC0CCB050BEB0BCD0BCD0BCD0BC3FFD1BFE5FFFF04FFFF0292005FB400C350C4A7\r'
        ff = self._decode_hw_frame(raw_frame=rf)
        f = self._decode_frame(ff)
        print(f)
        print(f.info[1:])

        # infoflag = f.info[0]
        d = self.get_values_fmt.parse(f.info[1:])
        return d

Hi @Frankkkkk ,
Apologies for the delay in getting back to you:

Is the first module an US3000 ? - Yes
Can you try launching the program with only the US2000 connected (do a powercycle first) ? Do it work ? - It DOES work perfectly with just the US2000 connected!!
Same question for US3000 - It does work perfectly with the US3000 on it's own as well!!!
Can you try by swapping the master/slave modules ? - I'll read up on how to do this now and get back to you.

Thanks for your help on this, it's really is appreciated

I believe I've switched the US2000 to become the master, however, the documentation says to always use the US3000 as the primary when you have a mixture of US2000's/US3000's.
Here is the output:
`
Container:
NumberOfModules = 2
Module = ListContainer:
Container:
NumberOfCells = 15
CellVoltages = ListContainer:
3.287
3.289
3.288
3.287
3.287
3.289
3.289
3.288
3.286
3.287
3.287
3.288
3.288
3.287
3.288
NumberOfTemperatures = 5
AverageBMSTemperature = 30.11
GroupedCellsTemperatures = ListContainer:
30.11
30.11
30.21
30.11
Current = -1.8
Voltage = 49.315
Power = -88.767
RemainingCapacity = 29.0
TotalCapacity = 50.0
CycleNumber = 659
Container:
NumberOfCells = 15
CellVoltages = ListContainer:
3.288
3.289
3.289
3.288
3.289
3.288
3.288
3.29
3.289
3.289
3.289
3.289
3.289
3.29
3.289
NumberOfTemperatures = 5
AverageBMSTemperature = 30.21
GroupedCellsTemperatures = ListContainer:
30.21
30.21
30.31
30.21
Current = -1.7
Voltage = 49.333
Power = -83.86609999999999
RemainingCapacity = 43.66
TotalCapacity = 8.464
CycleNumber = 565
TotalPower = -172.63309999999998
StateOfCharge = 1.242816091954023
`
I'm not sure how much I believe some of the numbers, "StateOfCharge" for example...?

Hi,
No problem for the delays ! :-)
Interesting results :thinking:
I suppose we could patch the decoding to handle US3000 as primary modules.. It's strange though. Sadly I don't have one so I can't really test this edge case. Maybe we could add a warning in the readme as a workaround.
As for the StateOfCharge, it's meant to be a percent (0-1: sum(all remaining capacities)/sum(total capacities)). However in your case  the US3000 states a RemainingCapacity of 43 but a TotalCapacity of... 8.464 :frowning: which thus skews the calculation
If that's okay with you, I'll just add a warning for this edge case in the readme, and maybe in the future we can fix the US3000-US2000 bug ?
Cheers

I would like to assist on this, what would be the preferred next steps. I have both US2000 and US3000 with the 3000 as the primary right now

Hello,
using a cable like mentioned above I get the following error message:
Traceback (most recent call last):
  File "/usr/lib/python3/dist-packages/thonny/backend.py", line 1171, in wrapper
    result = method(self, *args, **kwargs)
  File "/usr/lib/python3/dist-packages/thonny/backend.py", line 1158, in wrapper
    return method(self, *args, **kwargs)
  File "/usr/lib/python3/dist-packages/thonny/backend.py", line 1232, in _execute_prepared_user_code
    exec(statements, global_vars)
  File "/home/pi/syncthing/Lixy/Python/Pylontech/pylontech/Pylontech-test.py", line 6, in <module>
    print(p.get_values())
  File "/home/pi/syncthing/Lixy/Python/Pylontech/pylontech/pylontech.py", line 273, in get_values
    f = self.read_frame()
  File "/home/pi/syncthing/Lixy/Python/Pylontech/pylontech/pylontech.py", line 203, in read_frame
    f = self._decode_hw_frame(raw_frame=raw_frame)
  File "/home/pi/syncthing/Lixy/Python/Pylontech/pylontech/pylontech.py", line 184, in _decode_hw_frame
    assert got_frame_checksum == int(frame_chksum, 16)
ValueError: invalid literal for int() with base 16: b'\xbf\xff\xff\xff'

If I insert a print(raw_frame) in _decode_hw_frame() I get the result
b'\xf0\xff\xff\xff\xff\xbf\xff\xff\xff\xff\xff\xbf\xff\xff\xff\x1f'
Do you have any idea what could be wrong?
I have a single US3000C connected on port "B/RS485" and I only wired pins 7 and 8.

Without any change now I get the following result as raw_data:
b'\xf0\xff\xff\xff\xff\xbf\xff\xff\xff\xff\xff\xff\xff\xbf\xf7\xf7\x1f~20024600F07A11020F0CF80CF80CF80CF80CF90CF80CF80CF80CF80CF80CF90CF90CF90CF90CF9050B9D0B7A0B770B770B8D0000C28EFFFF04FFFF000000DBB0012110E1B6\r\x00'
What does the header mean or how can I remove it?

Hi @michaelhutter Indeed it is strange as part of the second frame looks valid enough. Is your cable shielded or near high-enough EM radiations ? Did you try changing your USB-rs485 converter ? Cheers

The first adapter which I bought did not work at all. The second adapter is working but gives these extra bytes in the beginning.
I think I try to change your code a little bit, so that it removes all chars until the first occurence of '~'. May be using a regex or so.
I am experienced in other languages, but not in Python. So would it be possible for you to give me a hint about which Python commands could do me the job? Is there a command like "FindFirstOccurence(haystack, needle)" and "right(string, pos)"?

I am still struggling with my Pylontech US3000C.
If I run print(p.get_values()) then raw_frame in _decode_hw_frame() has the value
b'\xf0\xff\xff\xff\xff\xbf\xff\xff\xff\xff\xff\xbf\xff\xff\xff\x1f'
If I run print(p.get_values_single(2)) then raw_frame in _decode_hw_frame() has the value
b'\xf0\xff\xff\xff\xff\xbf\xff\xff\xff\xff\xff\xff\xff\xbf\xf7\xf7\x1f~20024600F07A11020F0CF60CF60CF60CF60CF60CF60CF60CF60CF60CF60CF60CF60CF60CF60CF6050B8F0B710B6E0B6E0B7E0000C26AFFFF04FFFF000000D8CC012110E1CB\r\x00'
@Frankkkkk Can you explain what is the difference between get_values() and get_values_single(2)?
What does the parameter (2) mean?
In both cases the CRC does not match and I don't get any result.
I tried a lot of things but unfortunately was not successful until now :-(

@michaelhutter i not python guy but I want to create pylontech emulator and investigate this scripts and pylon protocol description. Get_values and get_values_single is the same command but values hardcoded address as 255. I didn't find this address descruption in pylontech documentation.  2 is number of battery if we have more than one pattery.
Do you have real battery? Could you try to execute requests on real battery  with Hterm an provide responses?
These request ask for protocol version from master battery from grpup 0, 1, 2, 3, 4, 5.
52 => 7E 30 30 35 32 34 36 34 46 30 30 30 30 46 44 39 35 0D
42 => 7E 30 30 34 32 34 36 34 46 30 30 30 30 46 44 39 36 0D
32 => 7E 30 30 33 32 34 36 34 46 30 30 30 30 46 44 39 37 0D
22 => 7E 30 30 32 32 34 36 34 46 30 30 30 30 46 44 39 38 0D
12 => 7E 30 30 31 32 34 36 34 46 30 30 30 30 46 44 39 39 0D
02 => 7E 30 30 30 32 34 36 34 46 30 30 30 30 46 44 39 41 0D
Could you execute these requests with HTerm 9https://www.der-hammer.info/pages/terminal.html) on real battery? Just copy 7E .. OD an send to battery?

Hello, unsure if I should make a new issue.
I tried using an ethernet - USB adapter and the unit (US3000c) just beeps like crazy.
So probably it's the wrong adapter?
Thanks!

Hi @EmCeBeh , yes please create a new issue. When does it start beeping ? How did you connected it ? Thanks and cheers


[QUESTION]: Remote Control

Consent

[X] I have searched the existing issues and verified that there is no open issue for the same subject.
[X] I understand that the YTMDesktop Elgato Plugin has NO affiliation with Google, YouTube or the YTMDesktop application.

Question
Hello,
hello is it possible to control the Youtube Music Player with the plugin over multiple PCs ?
So here is the setup I have.
2x PCs + 2 Loupdeck ct+
I would like to control the Youtube player on PC02 with the Loupdeck on PC01. Unfortunately I can't get a connection although I entered port, host and password.
According to the firewall I can also listen to port 9863 from PC01, so nothing is blocked locally by the firewall.
Does anyone know if this works at all or is it due to a configuration.
Many greetings and thanks for the cool app

Hey and thank you for opening this issue.
The plugin should have the possibility to do this (but I haven't tested it, nor do I "officially" support it). The most important parts for this to work are:

PC 1/2 must can communicate with PC 2/1. Also they must be able to access the "Remote Control" page themselves (see screenshot)
Host has to be the same as "Ethernet" on the remote control page (see marked spot on screenshot)
Port must be right

This also probably means: You've to enable it in the firewall and port forwarding/routing in your router/modem (example: FritzBox)

Hi thanks for the quick feedback so I could test it now.
I think that when Loupdeck starts it can't connect because maybe because in this time Loupdeck starts too fast.
What I did is change the IP address of the host on PC01 from 192.x.x.110 to 192.x.x.99 and then back to 192.x.x.110.
With this I could see 2 devices in the webpanel but unfortunately still not control them via loupdeck.
A restart of Loupdeck did not help either. Since now only 1 Device was shown to me, so I had to repeat the IP procedure.
The plugin still shows that no connection could be established, even after the IP test.
According to the website are two devices available but primarily it can only control 1 Loupdeck and that is what runs locally PC02!
I have then denoch tried to press the PC01 "Next Track" in the hope that the connection exists it Loupdeck has not realized. Unfortunately, I get a crash from the Loupdeck software and stand again at the beginning.
https://steamuserimages-a.akamaihd.net/ugc/2115059309497494426/235D2E20AA11A00D741D4929E8D9AA12234FF20B/

Hey! Small update:

I've just now noticed you're in the wrong repository lol :D you're in the StreamDeck Version, but this update also applies to you
V2 (StreamDeck) is very near to completion and the Loupedeck Version follows ASAP.
With the next update your issue should work as expected
Due to the fact that this is in the wrong repository, I'll gonna /close it here but I'll still double checking it in the Loupedeck Version, after the V2 migration is done.


"make" gets error

When I do make, I got error like
>> make
bin/sbt package
Unrecognized VM option 'MaxPermSize=256M'
Error: Could not create the Java Virtual Machine.
Error: A fatal exception has occurred. Program will exit.
Makefile:32: recipe for target 'package' failed
make: *** [package] Error 1

For information, I am using Ubuntu 16.04 and
>> java -version
openjdk version "9-internal"
OpenJDK Runtime Environment (build 9-internal+0-2016-04-14-195246.buildd.src)
OpenJDK 64-Bit Server VM (build 9-internal+0-2016-04-14-195246.buildd.src, mixed mode)

Please install the official Oracle JDK instead of the OpenJDK.

Thanks! It helped me a lot.
For those who may have same questions: I followed this link. https://www.digitalocean.com/community/tutorials/how-to-install-java-with-apt-get-on-ubuntu-16-04
See Installing the Oracle JDK section.


chore: bdd-nh-1593168004 to 0.0.1

chore: Promote bdd-nh-1593168004 to version 0.0.1

[APPROVALNOTIFIER] This PR is NOT APPROVED
This pull-request has been approved by:
To fully approve this pull request, please assign additional approvers.
We suggest the following additional approvers:
If they are not already assigned, you can assign the PR to them by writing /assign  in a comment when ready.
The full list of commands accepted by this bot can be found here.
The pull request process is described here

Needs approval from an approver in each of these files:

OWNERS

Approvers can indicate their approval by writing /approve in a comment
Approvers can cancel approval by writing /approve cancel in a comment


Corrected authors in package.json.

I think this is "correct".

Warnings

:warning:
Did you forget to update CHANGELOG.md?

  Generated by :no_entry_sign: dangerJS

I don't think we need changelog for this ;)

My pleasure.


Adds the limit for the deferred stream's queue size

Fixes the issue with streaming: if the rate of consuming data by the client is slower than the rate of streaming data by the server, the server prefetches too much data from the source.
Proposed solution is to limit the queue size (size of the result buffer) in DeferredWorkState.
Changes:

size of the queue in DeferredWorkState has a limit now;
action of registering DeferredExecutionTask is unbound from its starting with new TaskDispatcher class;
previous DeferredExecutionTask has to complete before starting the new one in DeferredStream.

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

We still have this on the back log. I will soon start work on the defer / stream part and then we will have a look at this.


chore: correct the wrong contents of the readme

Description

correct the wrong contents of the readme
'react custom notion' -> 'notionpresso'

P1: I did fix all legacy word (including react-notion-custom)


No "please wait" message on preview in gdrive

:tada: This issue has been resolved in version 6.12.4 :tada:
The release is available on:

GitHub release
v6.12.4

Your semantic-release bot :package::rocket:


Suggestions for the Node system

History
I've read many threads here where people argue about the nodes system,
compare it with components and so on. They suggest removing scripts
from nodes or adding multiple scripts. I like the Godot architecture logic
except several small things, which can be corrected with minimal effort
to try to resolve inconsistencies.
Suggestions
I have found two inconsistencies, which for me do not seem logical
and seem to mess with otherwise logical architecture.
1. Automatic Nodes in list

CS scripts extending Nodes should appear automatically as GDScript ones do, or
GDScript ones should not do it

Description
I used only C# for some time and then tried GDScript. I created a custom node type, imported as addon. Then I suddenly saw that this node appears twice in the list: as imported custom one and as automatic one, and I could not understand why I have this second - the same - node type (because with c# I have never seen it). It looked like a strange bug for me. So, to solve this inconsistency, either both languages should do the same (of course, c# after building), or neither should do it at all (it is just a shortcut to a node with a script).
2. Custom Nodes

Custom nodes should be packed

Description
With this I mean that custom nodes, defined with add_custom_type, should not have a script attached, because the same could be accomplished with just a script, and using a plugin architecture adds only an icon (even no tree stacking, as I describe in #28890 ). It would be much better and logical, if custom nodes defined in plugins, with all that additional configuration and scripts, would be truly custom: a node with a custom script built-in and an empty script field exposed to add one more script - that is, like the built-in nodes do. Otherwise, it is not logical that add_custom_type does not really add a custom type, because everywhere inheritance demands only "true" types like Node or Spacial (#28890 and #28908), and "not true" just-scripts can be created without any plugin system.
Why not
Of course, I don't mean that addons should compile to native or c++ core scripts as we write them. I mean that custom nodes should have two "script" fields, one of them hidden - that should be much simpler to implement.

I second that as I also find it very confusing that the custom type that was added using "add_custom_type" is listed twice in the tree of available nodes.
Also, I would rather see that custom types added to a scene tree do not have the original script attached. This always requires me to having to select the "extend script" option from the context menu.

The first one of adding GDScript to the list only happens when you set a class_name and on C# it's WIP for future releases.
The second one of having multiple scripts has already been discussed to death in various issues and the answer has been No so I don't think that even makes sense anymore.

@swarnimarun and what about keeping an internal reference from nodes in your scene tree that reference custom nodes. I think that this is what is happening under the hood for built-in types.
This would be very convenient as the user will no longer be presented with the original script that implements the custom node, causing him or her to accidentally change the original source while he or she just wanted to extend upon it.

@swarnimarun ,

The first one of adding GDScript to the list only happens when you set a class_name and on C# it's WIP for future releases.

Do you think that it's normal to have nodes appearing twice in the list? Also, class_name nests and custom type does not nest at all.

The second one of having multiple scripts has already been discussed to death in various issues and the answer has been No so I don't think that even makes sense anymore.

You have misunderstood the question. It's not about having multiple scripts, on the contrary - it's about hiding a script linked to a node of custom type. That is, to make custom types behave at least a bit more like built-in ones.

ATM when adding a custom control to the scene, you get
[node name="RyeCCPSection" type="Control" parent="VBoxContainer"]
margin_right = 1024.0
margin_bottom = 600.0
size_flags_horizontal = 3
size_flags_vertical = 3
script = ExtResource( 1 )

Here, the original script is enforced.
Why not just
[node name="RyeCCPSection" type="RyeCCPSection" parent="VBoxContainer"]
margin_right = 1024.0
margin_bottom = 600.0
size_flags_horizontal = 3
size_flags_vertical = 3

That way, I will be required to extend upon the original script which was registered by add_custom_type?

@silkentrance In case of built-in Nodes they are not scripts but complete Scripts and we handle all the code in GDScript as Scripts cause it's not compiled to C++ but is a runtime execution.

@ismslv Yes adding two scripts and hiding one is also not desirable, you don't really understand the situation do you? Let me put it in Layman's terms, adding any more than one Script to any Node impossible at the moment and is too much work to do otherwise, and the decision of the Devs is clearly to not get into the mess of adding such a feature.

As for the first one, I will take another look into understanding what you mean. And Then hat it would mean for the Engine, and will discuss it further.

@swarnimarun which does not prevent us from thinking out of the box, or does it?

@swarnimarun have got any pointers on how autoload singletons and plugins will be manifested during runtime? I am currently having a hard time figuring this out. Maybe it is just in the GDScript module, which would prevent these definitions from being shared with other parts of the system, namely C#, but then again, I am just guessing.

@silkentrance Singletons/Autoloads are quite simple actually a node is added to the top of the tree and then a script is added to it. The name is used to refer to this node/script and then you got it. :P
This is what enables you do use everything like _process, _ready and all inside a autoload. Really nice.
I hadn't been following along Godot much for a while so I am not sure about the state of C# but C# needs marshalling to access GDScript, and usually it would need to do it through a Script object. Unless this feature(there was an issue about it iirc), was added to make it simpler.

As for plugins it's the same Editor ones are loaded with the Editor load and custom types and all are just specific nodes with Scripts.
C# also has ability to be made into tool scripts and theoretically should work well for Editor Plugins but haven't done it so I can't elaborate on it.

Not sure about the first one, but the second suggestion already has an issue: #6067
Especially this comment comes with a nice solution: https://github.com/godotengine/godot/issues/6067#issuecomment-469575425

So, Godot currently has two separate "custom named script" systems: The Custom Types and the Script Classes.
Custom Types came before and added a simple icon+script auto-attachment to a type in the editor. Only the editor is aware of this system (no runtime support of the name) and scripts don't have any way to access this information at design-time (no API exposed for it). It is just a shortcut, as you've stated, with the benefit that, at the time, it was relatively easy to implement and worked generically for all scripting languages.
With 3.1, reduz added a feature to use Script Classes which allow an individual scripting language to add support for exposing a name for the script and registering it to a runtime singleton in the core. This then allows scripting languages to access the information globally, from design-time and runtime, as well as allows the editor to take advantage of it. What's more, because scripting languages are the ones that expose this data, the scripts themselves can define it without needing an EditorPlugin or some editor setting to configure the name.
Thus, reduz gave GDScript the class_name keyword to define a name/icon and I gave NativeScript the script_class_name/icon properties to define the same for NativeScript resource files. GDScript also goes the extra mile and generates global variables for all script classes.
Now, the editor's CreateDialog will generate an entry for every Custom Type and Script Class, so if you have a GDScript in an EditorPlugin that is registered as a CustomType with add_custom_type, and then you ALSO give that script a name via the class_name keyword, then you are registering it to both systems and it will show up twice. I believe this is what you are doing to see that behavior.
The truly optimized solution, imo, is to add support for Script Classes in CSharpScript, PluginScript, and VisualScript (none of which I really knew how to do at the time I was implementing most of this stuff), and then to deprecate/remove the CustomType system from Godot entirely in the 4.0 release so that there is only one named script system. That would also stand to clean up a lot of code in the engine which currently has to check both systems when handling scripted types.

As for the notion of having two scripts, one hidden and one overriding, I have already attempted, on numerous occasions (that horse has been beaten was past death at this point) to argue for a position like this, but reduz is adamant that a script should not and will never be hidden or made to look any different from other scripts in the editor, the argument being that users are smart and we shouldn't try to hide or manipulate truthful information from them. And on that point, he's right. The truth of the matter is, you have objects and you have scripts on them.
Even if you have a "custom type" or "script class", that script is not grafted onto the underlying class in any way. At runtime, if you just do set_script(null), it reverts back to being the underlying C++ class, no matter what. I once even went through the effort of re-implementing the Object core so that it would fully simulate such double-script behaviors and the PR was rejected because of its truth-hiding nature.

Feature and improvement proposals for the Godot Engine are now being discussed and reviewed in a dedicated Godot Improvement Proposals (GIP) (godotengine/godot-proposals) issue tracker. The GIP tracker has a detailed issue template designed so that proposals include all the relevant information to start a productive discussion and help the community assess the validity of the proposal for the engine.
The main (godotengine/godot) tracker is now solely dedicated to bug reports and Pull Requests, enabling contributors to have a better focus on bug fixing work. Therefore, we are now closing all older feature proposals on the main issue tracker.
If you are interested in this feature proposal, please open a new proposal on the GIP tracker following the given issue template (after checking that it doesn't exist already). Be sure to reference this closed issue if it includes any relevant discussion (which you are also encouraged to summarize in the new proposal). Thanks in advance!

To be more specific, this is tracked in godotengine/godot-proposals#22 which I am working on.


Short write to (null) when fuzzing sip protocol

Hi, I  met a problem when using AFLNET to fuzzing kamailio (SIP protocol implementation). Here is the screenshot. Can yo help me? Thank you.

It might be fixed by my recent commit (https://github.com/aflnet/aflnet/commit/b7a3d1cb82937341c84c94599649ed7d4c6ab17c). It would be great if you could try it and let me know the result. I cannot reproduce the problem on my computer.

I had the same problem recently when using Profuzzbench's outdated version of AFLnet to fuzz my own application. The error almost always occured within the first hour of fuzzing.
As Profuzzbench's version is missing (among others) your patch b7a3d1c, i locally added your patch and could since then fuzz over 80 hours without interruption.


Iterators cannot be used with range-v3

What is the issue you have?
(Apologies if this should have been a discussion item and not a bug report.)
I have a JSON object and would like to extract the keys (preferably as a set). (In jsoncpp this is accomplished with .getMemberNames())
Ideally this would work with range-v3, but the iterator of this library does not seem to be compatible:

json.items() | ranges::views::keys

/Projects/solidity/test/libsolidity/StandardCompiler.cpp:1255:39: error: invalid operands to binary expression ('const nlohmann::basic_json<>::value_type' (aka 'const nlohmann::basic_json<>') and 'const view_closure<ranges::views::keys_fn>')
                (optimizer["details"]["yulDetails"] | ranges::views::keys | ranges::to<set>) ==
                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ^ ~~~~~~~~~~~~~~~~~~~

ranges::subrange(json.begin(), json.end()) || ranges::views::keys

/Projects/solidity/test/libsolidity/StandardCompiler.cpp:1255:4: error: no viable constructor or deduction guide for deduction of template arguments of 'subrange'
                (ranges::subrange(optimizer["details"]["yulDetails"].begin(), optimizer["details"]["yulDetails"].end()) | ranges::views::keys | ranges::to<set>) ==
                 ^

json.items() | ranges::views::transform([](auto&& _v) { return _v.key(); })

/Projects/solidity/test/libsolidity/StandardCompiler.cpp:1254:100: error: no member named 'key' in 'nlohmann::basic_json<>'
        auto x = optimizer["details"]["yulDetails"] |  ranges::views::transform([](auto&& _v) { return _v.key(); });
                                                                                ~~ ^

Please describe the steps to reproduce the issue.
As above ^^
Can you provide a small but working code example?

What is the expected behavior?

And what is the actual behavior instead?

Which compiler and operating system are you using?

Compiler: gcc + clang
Operating system: linux + macOS

Which version of the library did you use?

[x] latest release version 3.10.4
[x] other release - please state the version: 3.10.2
[ ] the develop branch

If you experience a compilation error: can you compile and run the unit tests?

[x] yes
[ ] no - please copy/paste the error message below

I did some digging here.  The more easily resolved issues are that iteration_proxy_value and iteration_proxy have user-specified constructors and thus the default constructor, copy constructor, move constructor, move assignment operator and copy assignment operator are disabled.
They can all be defaulted, except for the copy assignment operators.  For iteration_proxy that's because it has a reference to the container instead of a pointer to the container, so it can't be rebound.  For iteration_proxy_value, it's due to const string_type empty_value;
Also, iteration_proxy_value needs the post-increment operator iteration_proxy_value operator++(int) const and a const version of operator*.
That makes it an input_range.  For it to be used with a view, it needs to be a viewable_range and to fix that, I had to specialize ranges::enable_borrowed_range.  I don't like that.
The major problem with using it for json.items() | ranges::views::keys is that requires that the dereferenced thing from the iterator have .first and .second data members.  There's a possibility that ranges::elements<> could be customized for json.  I've gone as far as I can for now.
This part works though:
auto items = j.items();
auto keys = items | ranges::views::transform([](auto&& _v) { return _v.key(); });

You can't do it with j.items() |  because that returns a temporary and views won't bind to a temporary.

explicit iteration_proxy_value() {}
iteration_proxy_value(iteration_proxy_value const &) = default;
iteration_proxy_value(iteration_proxy_value &&) = default;

// THIS CAN'T BE DEFAULTED BECAUSE OF empty_str.  This could potentially be
// fixed by making that a static.  That would also get rid of potential lifetime
// issues due to the iterator proxy going away while someone was holding a reference
// to the string.  Not sure why key() returns const string& instead of string.
// Probably a performance thing.
iteration_proxy_value &operator=(iteration_proxy_value const &v) {
    anchor = v.anchor;
    array_index = v.array_index;
    array_index_last = v.array_index_last;
    array_index_str = v.array_index_str;
    return *this;
}

iteration_proxy_value &operator=(iteration_proxy_value &&) = default;

/// dereference operator (needed for range-based for)
iteration_proxy_value& operator*()
{
    return *this;
}

/// dereference operator (needed for range-based for)
iteration_proxy_value& operator*() const
{
    return *this;
}

/// increment operator (needed for range-based for)
iteration_proxy_value& operator++()
{
    ++anchor;
    ++array_index;

    return *this;
}

/// increment operator (needed for range-based for)
iteration_proxy_value operator++(int) const
{
    iteration_proxy_value v(*this);
    v++;
    return v;
}

explicit iteration_proxy() {}
iteration_proxy(iteration_proxy const &) = default;
iteration_proxy(iteration_proxy &&) = default;

// THIS IS WRONG.  THIS COPIES r's CONTAINER INTO THIS CONTAINER RATHER THAN CHANGING THE REFERENCED CONTAINER
// Fixing this requires something like changing the type of `container` to be a pointer.
iteration_proxy &operator=(iteration_proxy const &r) { container = r.container; return *this; }

iteration_proxy &operator=(iteration_proxy &&) = default;

I will have a look at this soon. I hope we can fix iteration_proxy without breaking changes.

operator* for iteration_proxy_value would be better defined as
const iteration_proxy_value& operator*() const
{
    return *this;
}

This makes the iterator const-dereferenceable, which is assumed for all iterators.
For empty_str, if you could assume C++17 or later, you would just make it static inline const string_type empty_str, but since you don't assume that your best bet is to fake it with
static const string_type & empty_str() {
    static const string_type value;
    return value;
}

This resolves some lifetime issues and means you don't have to store an extra empty string in each instance. If you are feeling really fancy, you can annotate it as
    [[clang::no_destroy]] static const string_type value;

See https://clang.llvm.org/docs/AttributeReference.html#no-destroy
The mutable data members are pretty weird, since it means your allegedly const functions aren't actually const when it comes to reasoning about thread safety. But since you support getting the key as a string representation of the array index for array members, there's not an easy way around this.
It's also a little strange that you cannot call begin or end on a const iteration_proxy. That's technically allowed by C++20 and range-v3, but it's an unnecessary restriction. Given that this is intended as a reference type to the json object, I would also mark begin and end as const.

I just noted that the things described in this issue are still not solved. I thought that it might work, because the issue got already closed. However, I also see that there are right now 3/5 tasks implemented, so I guess this issue is still not solved.


The package uploaded to npm is not licensed

The npm distribution of this package is not properly licensed. It does not contain full license text, which is an issue - see https://github.com/babel/babel/pull/7308#issuecomment-367615152
Effectively, this way the source code distributed on npm is unlicensed and cannot be used by anyone else (or, to be more precise, by anyone who cares about licensing).

license field in package.json: MIT
GitHub repository license file: license
npm package contents license: (missing) :warning:

To reproduce this issue:
$ mkdir /tmp/foobar
$ cd /tmp/foobar
$ npm install is-epub
$ ls -al ./node_modules/is-epub/  # look for a license file

Related issue: https://github.com/sindresorhus/ama/issues/537

Done


fix(feature-flag): name convention for dinghyIgnoreRegexp2Enabled.

https://armory.atlassian.net/browse/BOB-30595

Coverage remained the same at 54.242% when pulling 7fc6850da5c07f0897166d6f815cde05c6647ed2 on BOB-30595 into f671b77dd50937f95dbaff5845bed3acc62a5229 on master.


Clipboard sync only works 1-way in Gnome

Server: Windows 10, latest Barrier
Client: Arch Gnome 41, latest Waynergy
Input: raw-keymap
wl-clipboard installed
Startup log:
Dropping gid from 1001 to 1000
0.000000160: [INFO] Log initialized at level 4

0.000023211: [DEBUG] Property syn_raw_key_codes not found in INI
0.000038011: [DEBUG] requiring wait() on SIGCHLD
wl-clipboard 2.0.0
Copyright (C) 2019 Sergey Bugaev
License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Child died:
81547
Status:
0
0.001138459: [DEBUG] Found wl-paste
wl-clipboard 2.0.0
Copyright (C) 2019 Sergey Bugaev
License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Child died:
81548
Status:
0
0.002145195: [DEBUG] Found wl-copy
0.002157435: [DEBUG] not requiring wait() on SIGCHLD
Child died:
81549
Status:
1
0.029776427: [WARN] Could not kill lingering wlpaste instances: -1

0.030992427: [DEBUG] Mutating output...
0.031011237: [DEBUG] Got output at position 3072,194
0.031027627: [DEBUG] Got current mode: 2560x1440@144000*
0.031038647: [DEBUG] Mutating output...
0.031050968: [DEBUG] Got scale factor for output: 1
0.031060898: [DEBUG] Mutating output...
0.031066668: [INFO] Output updated: 2560x1440 at 3072, 194 (scale: 1)
0.031079848: [DEBUG] Mutating output...
0.031093048: [DEBUG] Got output at position 0,0
0.031110239: [DEBUG] Got current mode: 3840x2160@59996*
0.031121009: [DEBUG] Mutating output...
0.031132799: [DEBUG] Got scale factor for output: 2
0.031145379: [DEBUG] Mutating output...
0.031156789: [INFO] Output updated: 3840x2160 at 0, 0 (scale: 2)
0.031172150: [DEBUG] All outputs updated, triggering event
0.031181930: [INFO] Geometry updated: 5632x2160
0.031197120: [DEBUG] Got xdg output position: 3072, 194
0.031208420: [DEBUG] Mutating output from xdg_output event
0.031221600: [DEBUG] Got xdg output size: 2560x1440
0.031235221: [DEBUG] Mutating output from xdg_output event
0.031249791: [DEBUG] Got xdg output name: DP-2
0.031259871: [DEBUG] Mutating output from xdg_output event
0.031272701: [DEBUG] Got xdg output desc: LG Electronics 27"
0.031284621: [DEBUG] Mutating output from xdg_output event
0.031300732: [INFO] Output name: DP-2
0.031309652: [INFO] Output description: LG Electronics 27"
0.031319592: [INFO] Output updated: 2560x1440 at 3072, 194 (scale: 1)
0.031329512: [DEBUG] All outputs updated, triggering event
0.031336222: [INFO] Geometry updated: 5632x2160
0.031353833: [DEBUG] Got xdg output position: 0, 0
0.031362483: [DEBUG] Mutating output from xdg_output event
Watch mode requires a compositor that supports wlroots data-control protocol
0.031371623: [DEBUG] Got xdg output size: 3072x1728
0.031387233: [DEBUG] Mutating output from xdg_output event
0.031396693: [DEBUG] Got xdg output name: DP-3
0.031405013: [DEBUG] Mutating output from xdg_output event
0.031412843: [DEBUG] Got xdg output desc: BenQ Corporation 32"
0.031421884: [DEBUG] Mutating output from xdg_output event
0.031429334: [INFO] Output name: DP-3
0.031436014: [INFO] Output description: BenQ Corporation 32"
0.031445624: [INFO] Output updated: 3072x1728 at 0, 0 (scale: 2)
0.031455194: [DEBUG] All outputs updated, triggering event
0.031464464: [INFO] Geometry updated: 5632x1728
0.031474594: [DEBUG] Trying KDE fake input protocol for input
0.031481115: [DEBUG] Fake input not supported
Child died:
81550
Status:
1
0.031964882: [INFO] Using uinput
0.031979022: [INFO] Using uinput for virtual input
0.032004883: [DEBUG] Property xkb_keymap not found in INI
Watch mode requires a compositor that supports wlroots data-control protocol
Child died:
81551
Status:
1
0.037927188: [WARN] uinput does not support xkb keymaps -- use raw-keymap instead
0.037955098: [DEBUG] max key: 255
0.037994809: [DEBUG] max key update: 332
0.038013649: [DEBUG] max key update: 334
0.038031559: [DEBUG] max key update: 337
0.038048230: [DEBUG] max key update: 348
0.038063900: [DEBUG] max key update: 349
0.038083020: [DEBUG] Got value from INI: raw-keymap/offset: 8
0.038097260: [DEBUG] Using INI value for raw-keymap/offset: 8
0.038120571: [DEBUG] Property xkb_key_offset not found in INI
0.038148551: [DEBUG] Initial raw key offset: 8
0.038168572: [DEBUG] Property offset_on_explicit not found in INI
0.038192452: [DEBUG] set raw key map: 331 = 113
0.038207892: [DEBUG] set raw key map: 328 = 111
0.038223752: [DEBUG] set raw key map: 333 = 114
0.038238893: [DEBUG] set raw key map: 336 = 116
0.038254863: [DEBUG] set raw key map: 347 = 133
0.038270393: [DEBUG] set raw key map: 348 = 134
0.038285953: [DEBUG] set raw key map: 69 = 127
0.038301214: [DEBUG] set raw key map: 338 = 118
0.038316164: [DEBUG] set raw key map: 339 = 119
0.038331094: [DEBUG] set raw key map: 327 = 110
0.038355555: [DEBUG] set raw key map: 335 = 115
0.038371765: [DEBUG] set raw key map: 329 = 112
0.038387115: [DEBUG] set raw key map: 337 = 117
0.038402465: [DEBUG] set raw key map: 312 = 108
0.038418176: [DEBUG] set raw key map: 285 = 105
0.038433696: [DEBUG] set raw key map: 311 = 107
0.038452866: [DEBUG] got idle inhibit request
0.038467366: [WARN] Idle inhibit request, but no idle manager support
0.038483057: [INFO] Going to connect to <IP_ADDRESS> at port 24800
0.042534011: [INFO] Server is Barrier 1.6
0.042566922: [INFO] Connected as client "MYRDL17241L"
0.418941400: [DEBUG] Got CALV
0.420253811: [DEBUG] Got CALV
3.047435298: [DEBUG] Got CALV
6.048764714: [DEBUG] Got CALV
9.048696894: [DEBUG] Got CALV
Child died:
81558
Status:
0
12.049649831: [DEBUG] Got CALV
15.049868385: [DEBUG] Got CALV
18.050054200: [DEBUG] Got CALV
21.050075892: [DEBUG] Got CALV
24.050577003: [DEBUG] Got CALV

I can do clipboard sync from server to client just fine, but not the other way around. Is this expected for my configuration?

As far as I can tell there isn't really a way to monitor the clipboard properly via Wayland for any unfocused application, though I'll leave this open as I think there might be a way to pull it off by abusing Xwayland. I should be able to get around to trying it in the near future.


API changes for v3

Get rid of:

LoadFromFile (replacement = strings)
LoadFromUri: the web is a lot different than it used to be. Having ical.net handle the download logic takes specific dependencies on specific framework elements. It reduces the library's ability to iterate. I would prefer to leave HttpClient out of it, which some client profiles may not support. Application developers can provide their own download-from-source implementation if they wish.

VTimeZone:

Just make the user specify a time zone string. Get rid of the FromSystemTimeZone and FromLocalTimeZone stuff which isn't well-defined in a cross-platform world.

Attachment:

Data properties on Attachments should be getter-only
There should be a constructor flavor that takes a byte[] that does the right thing WRT to base64-encoding on both serialization and deserialization

Misc:

Target netstandard 1.1

Getting rid of HttpClient dependencies is a good idea. As long as iCal.NET can produce a byte[] I think most, if not all developers will be happy.

You may be interest in this:
http://rianjs.net/2016/07/api-changes-for-ical-net-v3

(Moving from https://github.com/rianjs/ical.net/issues/37 )
I am not hugely familiar with the library, and I may have missed important features of the library in which case I apologise. Assigning values to properties with a limited number of valid values under the spec seems inconsistent.
The Event property Class is a string, and the developer must know (or look up) valid values are "PUBLIC" or "PRIVATE", the same for an Attendee property Role (e.g. "REQ-PARTICIPANT").
the Event properties Transparency and Status are Enums.
An Attendee ParticipationStatus string property can be assigned from the const strings in the ParticipationStatus namespace. The same applies to the Calendar Method property and the CalendarMethods namespace
It would seem ideal if the above 6 properties all had a similar method of asignment.
Thanks
@mcshaz

another part of the potential roadmap, but should the stated objective of V3 be to offer compliance with RFC 5545 (see differences with RFC 2445)?

Properties such as Created, LastModified &  DtStamp are meant to be UTC under the spec. Once you have worked out how you want to implement IDateTimes, it would be worth considering how to convey this to the user is not familiar with the spec. options include:

Changing names to CreatedUtc, LastModifiedUtc etc.
Having some kind of UtcDateTime type which inherits from CalDateTime or its new & improved form.

Apparently GetOccurrences is a thing at the CalendarCollection level... that seems wrong. C.f. #148

Calendar Name property is public, but should probably be internal. Via email:
Event Test = new Event();
Test.Description = "Some additional info";
Test.Name = "a NAme";
Test.Summary = "a Test"; //The real Name
var Time = new DateTime(2016, 10, 7, 8, 0, 0);
Test.DtStart = new CalDateTime(Time);
Test.Transparency = TransparencyType.Transparent;
Test.IsAllDay = true;
var calendar = new Calendar();
calendar.Events.Add(Test);
calendar.Name = "ANAmeForACalender";

var serializer = new CalendarSerializer(new SerializationContext());
var serializedCalendar = serializer.SerializeToString(calendar);

I would like to tell you that in version 2.2.14 of Ical.Net the Name property of the class Event and Calender should be private. Because it leads to an issue with the .ics format.


How do I  Get results on a test dataset

When I run the evaluation script, this is clearly the result of the training set

Hi, How did you manage to run the evaluation script?

Hello, I also have the same confusion, how to perform indicator evaluation on val data set, how did you solve this problem


Cascade doesn't trigger events

Hi,
I was wondering if this is an issue or an expected behavior.
Whenever i drag an item, the grid cascade the other items to make way for the item being dragged but even onItemChange is only triggered on the item being dragged and not on the other items that were moved automatically by the grid as an effect of cascade.
Is there a way to get the corresponding events triggered on other items too?
Like if one item is resized to right, all the items the were moved by the grid's cascade should trigger something so that the new position can be captured and saved.
If i may also ask here, how can i specify customized info on NgGridItemEvent.payload?
Thanks a lot,
Toni

any fix for this?

I also need a fix for this


Video and WebRTC support

Is your feature request related to a problem? Please describe.

A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]

Does the libresbc is supporting Video calls and WebRTC?
Describe the solution you'd like

A clear and concise description of what you want to happen.

Describe alternatives you've considered

A clear and concise description of any alternative solutions or features you've considered.

Additional context

Add any other context or screenshots about the feature request here.

SIP over Websocket is in roadmap already.
For Video can you elaborate more on the usecase?

closed as no replied.


chore: setup semantic release

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

npm package (@latest dist-tag)
GitHub release

Your semantic-release bot :package::rocket:


Any example adding extra settings

Hi. Give me please any example of adding extra setting in json to AC?
switch.{DEVICEID}_screen_display
Can't understand how to enable display switch.
Thank you!

Same here, did you ever figure it out?
For another entity, I was able to go to "advanced" settings and enable disabled entities but that's not working for this integration.

OK I figured it out:
Got to Settings -> Devices and Services -> click "CONFIGURE" on the Midea one, and enable the fields you want.


clean-css-cli: 5.6.2 -> 5.6.3

Description of changes

Updated 5.6.2 to 5.6.3

https://github.com/clean-css/clean-css-cli/compare/v5.6.2...v5.6.3

Formatted via nixfmt-rfc-style
Removed unnecessary rec (ref: https://nix.dev/guides/best-practices#recursive-attribute-set-rec)
Moved pkgs/development/tools to pkgs/by-name

I also add myself to the maintainer list of this package, as it was empty.
Things done

Built on platform(s)

[ ] x86_64-linux
[ ] aarch64-linux
[ ] x86_64-darwin
[x] aarch64-darwin

For non-Linux: Is sandboxing enabled in nix.conf? (See Nix manual)

[ ] sandbox = relaxed
[x] sandbox = true

[ ] Tested, as applicable:

NixOS test(s) (look inside nixos/tests)
and/or package tests
or, for functions and "core" functionality, tests in lib/tests or pkgs/test
made sure NixOS tests are linked to the relevant packages

[x] Tested compilation of all packages that depend on this change using nix-shell -p nixpkgs-review --run "nixpkgs-review rev HEAD". Note: all changes have to be committed, also see nixpkgs-review usage
[x] Tested basic functionality of all binary files (usually in ./result/bin/)
24.11 Release Notes (or backporting 23.11 and 24.05 Release notes)

[ ] (Package updates) Added a release notes entry if the change is major or breaking
[ ] (Module updates) Added a release notes entry if the change is significant
[ ] (Module addition) Added a release notes entry if adding a new NixOS module

[x] Fits CONTRIBUTING.md.

Add a :+1: reaction to pull requests you find important.

Result of nixpkgs-review pr 346160 run on x86_64-linux 1

1 package built:

clean-css-cli


Fixing gcc-6 compilation problem: (-Werror=shift-negative-value)

This would fix the following 3 compilation errors in GCC-6

In function ‘char bn::impl::{anonymous}::extract_partial_bits(char, unsigned int, unsigned int)’:
basen.hpp:61:28: error: left shift of negative value [-Werror=shift-negative-value]
char t2 = t1 & ~(-1 << bits_count);

In function ‘char bn::impl::{anonymous}::extract_overlapping_bits(char, char, unsigned int, unsigned int)’:
basen.hpp:71:58: error: left shift of negative value [-Werror=shift-negative-value]
char t2 = next >> (8 - bits_count_in_next) & ~(-1 << bits_count_in_next) ;

basen.hpp:72:32: error: left shift of negative value [-Werror=shift-negative-value]
return (t1 | t2) & ~(-1 << bits_count);

Thanks for letting me know of the bug. I will take the liberty of fixing it slightly differently: instead of explicitly using 0xF..F I'll replace -1 with -1U. I don't  think that either is better, I just have slight stylistic preference for keeping -1 to designate a mask of ones.


First install -> Daemon startup error while following instructions on Debian 18

 mina version
Commit a42bdeef6b0c15ee34616e4df76c882b0c5c7c2a on branch master
root@li1057-26:~# mina daemon --generate-genesis-proof true --peer-list-url https://storage.googleapis.com/mina-seed-lists/mainnet_seeds.txt
2021-08-07 14:46:14 UTC [Info] Coda daemon is booting up; built with commit "a42bdeef6b0c15ee34616e4df76c882b0c5c7c2a" on branch "master"
2021-08-07 14:46:14 UTC [Info] Created daemon lockfile "/root/.mina-config/.mina-lock"
2021-08-07 14:46:14 UTC [Info] Registering async shutdown handler: "Remove daemon lockfile"
2021-08-07 14:46:14 UTC [Info] Daemon will expire at "2024-12-10 14:00:00-07:00"
2021-08-07 14:46:14 UTC [Info] Booting may take several seconds, please wait
2021-08-07 14:46:14 UTC [Info] Reading configuration files $config_files
	config_files: [ "/var/lib/coda/config_a42bdeef.json", "/root/.mina-config/daemon.json" ]
2021-08-07 14:46:14 UTC [Warn] Could not read configuration from "/root/.mina-config/daemon.json": $error
	error: {
  "commit_id": "a42bdeef6b0c15ee34616e4df76c882b0c5c7c2a",
  "exn_name": "Async_kernel__Monitor.Error_",
  "exn": [
    "monitor.ml.Error",
    [
      "Unix.Unix_error", "No such file or directory", "open",
      "((filename /root/.mina-config/daemon.json) (mode (O_RDONLY O_CLOEXEC)) (perm 0o0))"
    ],
    [
      "Raised at file \"src/result.ml\", line 158, characters 17-26",
      "Called from file \"src/deferred1.ml\", line 17, characters 40-45",
      "Called from file \"src/job_queue.ml\" (inlined), line 131, characters 2-5",
      "Called from file \"src/job_queue.ml\", line 171, characters 6-47",
      "Caught by monitor try_with_or_error"
    ]
  ]
}
2021-08-07 14:46:14 UTC [Info] Initializing with runtime configuration. Ledger name: "mainnet"
2021-08-07 14:46:14 UTC [Info] Using the compiled constraint constants
2021-08-07 14:46:25 UTC [Info] Genesis proof file $path does not exist
	path: "/root/.mina-config/genesis/genesis_proof_ef3659d87a794d5c0159273bc7e596fe7a92b766a0aeb4be3437f582e716697a"
2021-08-07 14:46:25 UTC [Info] Genesis proof file $path does not exist
	path: "/var/lib/coda/genesis_proof_ef3659d87a794d5c0159273bc7e596fe7a92b766a0aeb4be3437f582e716697a"
2021-08-07 14:46:25 UTC [Info] Genesis proof file $path does not exist
	path: "/usr/local/var/coda/genesis_proof_ef3659d87a794d5c0159273bc7e596fe7a92b766a0aeb4be3437f582e716697a"
2021-08-07 14:46:25 UTC [Info] Genesis proof file $path does not exist
	path: "/tmp/s3_cache_dir/genesis_proof_ef3659d87a794d5c0159273bc7e596fe7a92b766a0aeb4be3437f582e716697a"
2021-08-07 14:46:25 UTC [Info] Genesis proof file $path does not exist
	path: "/tmp/coda_cache_dir/genesis_proof_ef3659d87a794d5c0159273bc7e596fe7a92b766a0aeb4be3437f582e716697a"
2021-08-07 14:46:25 UTC [Info] Genesis proof file $path does not exist
	path: "/var/lib/coda/genesis_proof_ef3659d87a794d5c0159273bc7e596fe7a92b766a0aeb4be3437f582e716697a"
2021-08-07 14:46:25 UTC [Info] Could not download genesis proof file from $uri: $error
	uri: "https://s3-us-west-2.amazonaws.com/snark-keys.o1test.net/genesis_proof_ef3659d87a794d5c0159273bc7e596fe7a92b766a0aeb4be3437f582e716697a"
	error: {
  "commit_id": "a42bdeef6b0c15ee34616e4df76c882b0c5c7c2a",
  "exn_name": "Async_kernel__Monitor.Error_",
  "exn": [
    "monitor.ml.Error",
    [
      "Process.run failed",
      [
        [ "prog", "curl" ],
        [
          "args",
          [
            "--fail", "--silent", "--show-error", "-o",
            "/tmp/s3_cache_dir/genesis_proof_ef3659d87a794d5c0159273bc7e596fe7a92b766a0aeb4be3437f582e716697a",
            "https://s3-us-west-2.amazonaws.com/snark-keys.o1test.net/genesis_proof_ef3659d87a794d5c0159273bc7e596fe7a92b766a0aeb4be3437f582e716697a"
          ]
        ],
        [ "exit_status", [ "Exit_non_zero", "22" ] ],
        [ "stdout", "" ],
        [
          "stderr",
          [
            "curl: (22) The requested URL returned error: 404 Not Found", ""
          ]
        ]
      ]
    ],
    [
      "Raised at file \"src/error.ml\" (inlined), line 9, characters 14-30",
      "Called from file \"src/or_error.ml\", line 72, characters 17-32",
      "Called from file \"src/deferred1.ml\", line 17, characters 40-45",
      "Called from file \"src/job_queue.ml\" (inlined), line 131, characters 2-5",
      "Called from file \"src/job_queue.ml\", line 171, characters 6-47"
    ]
  ]
}

2021-08-07 14:46:25 UTC [Info] No genesis proof file was found for $base_hash, generating a new genesis proof
	base_hash: "ef3659d87a794d5c0159273bc7e596fe7a92b766a0aeb4be3437f582e716697a"
Transaction_snark.system: 8.921s
^C^C

Hello,
I get the exact same error, is a solution available to this ?

Closing as stale. Please open new one in case of any new issues observed. Thank you.


Koadic wont install

very new to frameworks. i paste the install command and i get this response

im doing this in the Root Terminal of TailsOS because its the place where the book im reading tells me to do this
any help is much appriciated!

Looks like DNS error. That is an environment issue that is out of scope for this project to debug.


Paper suggestions

My only suggestion is to be consistent with the name of the library. We have a library called LightRiver, so I think it makes sense to call this one DeepRiver. I've changed names in the paper for consistency. I hope that's ok!

I will leverage this PR to leave my comments :)
My only suggestion would be to cite some well-established concept drift literature when things like "data changes over time" appear in the text. Thus, we link the phenomenon with its most widely used nomenclature and a huge body of related literature. What do you think, @kulbachcedric ?

Hi all,
thanks for you feedback!
@MaxHalford, Good point!
@smastelini, I added your suggestions. :-)
Wenn ever you have more citations, just add them as comment or commit to this PR
Best
Cedric


[Wait for #1228] [Fix] Prevent creating multiout for split

[Pending commit: #1228]

[Fix] Prevent creating multiout for split

This patch make an exception for split layer to not create multiout
layer. While fixing trivial build error of sign compare

**Self evaluation:**
1. Build test: [X]Passed [ ]Failed [ ]Skipped
2. Run test: [X]Passed [ ]Failed [ ]Skipped

Signed-off-by: Jihoon Lee<EMAIL_ADDRESS>

:memo: TAOS-CI Version: 1.5.20200925. Thank you for submitting PR #1230. Please a submit 1commit/1PR (one commit per one PR) policy to get comments quickly from reviewers. Your PR must pass all verificiation processes of cibot before starting a review process from reviewers. If you are new member to join this project, please read manuals in documentation folder and wiki page. In order to monitor a progress status of your PR in more detail, visit http://nnstreamer.mooo.com/.


Fix CAPX Addon docs CNI/CSI typo

CAPX docs across all versions had a typo in a subheading in the addons section conflating CSI with CNI.

/assign @yannickstruyf3
/assign @tuxtof


Record mode

Record mode is a simple way to save part of an interactive session into a script. Like MS office macros, or Vim's recording with q.
Hit ^R to start and stop recording:
~> ^R
RECORD 1 ~> var $a String
RECORD 2 ~> set $a = `lala`
RECORD 3 ~> echo $a
lala
RECORD 4 ~> ^R
save as (^C for discard): a.elv

(Some style could be applied to RECORD #)

The solution is to clone the history listing functionality of ptpython.

Tracking in #63.


Use the existing sync method.

@toregge What happened here ?

Why did this one not make it in the first merge ?


⚠ SpeakUpConference.com has degraded performance

In 406cf6c, SpeakUpConference.com (https://www.speakupconference.com) experienced degraded performance:

HTTP code: 200
Response time: 8413 ms

Resolved: SpeakUpConference.com performance has improved in 030744e after 11 minutes.


AddFile reads the passed in stream twice

When using the admin client to upload a file to FSS, it reads the stream twice. This is bad as it means that if the stream is from a download (e.g. from Azure Blob Storage), the whole file has to be downloaded twice.
This cause of this issue is that the client is reading the whole stream once to calculate the MD5 Hash, and then a second time to actually upload the file to the FSS.
Options:

Ideally, the MD5 Hash would be calculated by the library during the single stream operation (i.e. as it is streamed up to FSS). Possibly the passed in stream could be wrapped with a 'CryptoStream' of some form, which would calculate the Hash while streaming the data. possibly something like: https://gist.github.com/sinbad/27ebf01bd79d588518f20b7d526cb295

We could provide an overloaded method that takes the Hash as a second parameter, so the user can provide the hash rather than the library calculating.

This may also provide an easy way to calculate the hash while streaming:
https://stackoverflow.com/questions/4725507/calculate-hash-when-writing-to-stream
Specifcally:
SHA256 hashAlg = new SHA256Managed();
CryptoStream cs = new CryptoStream(_out, hashAlg, CryptoStreamMode.Write);
// Write data here
cs.FlushFinalBlock();
byte[] hash = hashAlg.Hash;


close app afterEach test

Summary
Resolves #2020
In every controller test, we init the app beforeEach to have a "clean" instances for testing. Theoretically, we should close these before initialising a new one.
Many tests close the current instance only afterAll tests have run, calling init before every test. This moves all close calls to afterEach.
Changes

Move all calls to close the app from afterAll to afterEach

Question: Why do we need to create a new module beforeEach? What about creating a new module beforeAll?

Question: Why do we need to create a new module beforeEach? What about creating a new module beforeAll?

I'd assume it's to ensure all mocks are cleared correctly/each test has a new app instance.

Question: Why do we need to create a new module beforeEach? What about creating a new module beforeAll?

I'd assume it's to ensure all mocks are cleared correctly/each test has a new app instance.

In that case, I suggest using jest.clearAllMocks or jest.resetMocks, depending on the use case. My concern is that creating a module before each test can add unnecessary overhead and slow down the tests.

In that case, I suggest using jest.clearAllMocks or jest.resetMocks, depending on the use case. My concern is that creating a module before each test can add unnecessary overhead and slow down the tests.

Due to the way in which we architected test modules (using jest.fn), the mocks do not successfully clear between each test by having one instance throughout (currently). It would require substantially more effort to achieve that. I do, however, think it's the better approach.
I'm going to close this for now and we can discuss if/how we want to proceed at a later stage.


support hessian

Can it tracing the project connected by hessian
Thank you !

@chenzdong
You're welcome.
Thank you.


Make PasswordHasher use Argon2id

Also introduce hash type agility to stay backward compatible.
C.f. https://tools.ietf.org/html/draft-irtf-cfrg-argon2-03#section-4
Fixes #33

So what happens when an attacker does get to mess with that record?

I’ve added a blurb reinforcing that argon2_cffi does not expect malicious hashes.

Additionally, you may want to make the types parameterizable and expose the fact that the password is not complaint with the current standard (be it type or either kind of cost) via an API, documenting the way people could upgrade their existing password stores that way

I’ve opened #35 and #36 for that if I understand you correctly.

As an aside, I'm not happy that somehow we had a PHC to finally get this right and apparently the answer is "choose between these 3 subtly different things based on specialized knowledge you're not supposed to have".

Ironically, it seems like we’ve just arrived there with Argon2id. :)

I made some updates (including stressing some more, that (ye)script is fine. It would be great if you could give it one last glance!

The last remaining question for me is the recommended hash verification time. Some people say 0.5ms others 500ms which is…quite the spread. :| I don't run anything at massive scale, so I'm not sure what to recommend?

Re: #35, #36: yep, that's a start, but not the entirety of it. One part is "given a token I am willing to accept and a password that hashes to it, should I re-hash the password to these new parameters?". That's #36 and #35 is a necessary prereq. The other question is: "given this token, should I be willing to attempt to validate a password against it at all"? I.e. what happens when the token tells me to allocate eleventy gajillion jiggabytes? That doesn't seem captured in either ticket.
Re: 5ms vs 500ms,more is better, but UX is the limiting factor. Some guidance:

No setting will save you from an awful password. At 500ms, the top 10k passwords still only take me less than two hours to try if I have no concurrency at all.
500ms is pretty high. .5ms seems low. I get what you're saying, don't have ranges. I'd suggest 50ms as a default, but document that people have suggested anywhere from .5ms (the blog post) to 500ms (the RFC), and the real answer is "more is better and UX is the limiting factor", and 50ms is a good trade-off for most people. (Similarly I think the memory default is pretty high, but I'm OK with secure defaults :))

Some more concrete advice: libsodium has this nice thing where they have presets:

I’ve added a clarification – thanks for you help! <3


[question] about array and space

Hi,
My table use this array data format
[
  ["First Item", 196476, "88%", 172980, 23496, 167005, 5976, -272, 1],
  ["Second Item", 196480, "89%", 172980, 23496, 167005, 5976, -272, 1],
]

The problem I'm getting is because of the space between the colon and the value.
What setting should I use to get it filtered?
I would like to see some array example on your demo too.
Thanks

Hi,
Please provide a minimal test case on jsfiddle

Hi,
Please provide a minimal test case on jsfiddle

I will find the time to do it.
I forgot to mention tat I'm using Select2 (multi-select) and display data to the table using
var dataSet =[
  ["First Item", 196476, "88%", 172980, 23496, 167005, 5976, -272, 1],
  ["Second Item", 196480, "89%", 172980, 23496, 167005, 5976, -272, 1],
]

The space between the colon and the value seem to prevent the data to get filled in Select2 dropdown.
I have a lot of items to display at leat 200.
I was thinking removing the space frome the array but I was wondering in there was specific Yadcf settings for the arrays.

I will find the time to do it.
I forgot to mention tat I'm using Select2 (multi-select) and display data to the table using
var dataSet =[
  ["First Item", 196476, "88%", 172980, 23496, 167005, 5976, -272, 1],
  ["Second Item", 196480, "89%", 172980, 23496, 167005, 5976, -272, 1],
]

The space between the colon and the value seem to prevent the data to get filled in Select2 dropdown.
I have a lot of items to display at leat 200.
I was thinking removing the space frome the array but I was wondering in there was specific Yadcf settings for the arrays.

Sorry the problem was related to something else.

Sorry the problem was related to something else.


Cache deleted on reload page

Hi everyone,
I'm facing a really strange issue and i need a little help.
I'm trying to cache some urls on the fly (user action). This point works well, all my urls which have the same base url (/rest/events/...), are inserted in the cache storage.
But when the page is reload only one is still there and the other one seem to be remove during the toolbox init phase.
Does anyone have an idea to solve this issue ?
Thanks

can you share an example project or URL that shows this behavior?

Hello,
Sorry for the delay but you can see the code on this gist https://gist.github.com/ptiswitz/ef40a69eb8b3d730f7d9853c77fd6a24
There is no live example, i'm sorry :)

I debug step by step the toolbox script and i found that during the active phase the renameCache function is called.
It's literally replace the "previous" cache by a new one without getting back any request stored in it.
Does it have a reason to do that ?

the activate phase means that the previous precached resources are no longer in use and can be deleted while the newly precached assets (which is performed in the install event) will be used now.

You might find workboxjs.org a better option to achieve what you are doing as you're using toolbox and sw-precache to precache assets and I think you would be better suited to using a specific cache for your on the fly caching which I'm not sure how you can do that in sw-toolbox.


A couple of tweaks to enable building examples with SDL on OSX.

I have only tested this on my mac which is currently running Catalina (10.15.2), but all the examples build and run using clang/llvm (standard Mac toolchain).
All the code changes should be protected by suitable preprocessor #ifdef's but I have not verified that I didn't accidentally break builds on Linux or Mingw.

Thank you for this. Much appreciated!
I've reviewed the code and you should see a comment above.

@johnmccabe if you're satisfied that this is good to go, then I'll merge post-haste.

Missed this earlier, I'll run through the process on my Mojave based back at lunch to sanity check on the last OS release.


.HTA file execution doesn't call back

Hi,
Currently I'm generating a RAW payload in Cobalt Strike for a windows/beacon/reverse_https listener. Output is a standard payload.bin file, which is then used as input to SharpShooter as follows:
SharpShooter.py --stageless --dotnetver 4 --payload hta --output test --rawscfile payload.bin
I've also tried the following variation:
SharpShooter.py --stageless --dotnetver 2 --payload hta --output foo --rawscfile payload.bin --smuggle --template mcafee
However every time I try to run the HTA file on Windows, the payload fails to call back. Windows Defender is disabled for all of this testing, and no other AV is present. Network monitoring with Wireshark confirms too that the payload is not calling out. I have tried modifying the harness.hta template to just take the payload.bin as input, without any base64 encoding or the rc4 encipherment to check if it works, however the payload still refuses to call out or even make a network connection attempt.
Am I being obtuse or can someone confirm these findings? I have tried with both Internet Explorer and of course Microsoft (R) HTML Application Host.

I am having the exact same issue. I have tried both js and HTA call backs using both dotnetver vversion variable and neither seems to call back to Cobalt Strike.

same here

I came across sharpshooter, after playing with the JSWebMeter project. I faced a similar issue there,  defender was switched off from the console but debugging the script showed anti malware was still interfering, could be the AMSI picking up my script. This helped
https://www.windowscentral.com/how-permanently-disable-windows-defender-antivirus-windows-10


⚠ PrivateHD has degraded performance

In 78a1872, PrivateHD ($PHD) experienced degraded performance:

HTTP code: 200
Response time: 1809 ms

Resolved: PrivateHD performance has improved in d379155.


Test "Coordinated seq test" failed

Mode : NATIVE
branch :master_1327
commit : 5fa2c6495ef7af136bd528d89f9516f5a0b5a023
Logs:
server https://gist.github.com/evabishchevich/48ec5204bbe2c16d347d03d333fd1fc8
nexus 1 https://gist.github.com/evabishchevich/adfadf8647bb105d67042babf7a8a635
nexus 2 https://gist.github.com/evabishchevich/6477ea8a35b07b34a16946f5e9471e69
s7 https://gist.github.com/evabishchevich/7b9522e9aec3e0fb9a3fd30389518432

Fixed. Bluetooth was turned off


Screen scrolls down below position after selecting item in Picker.

Hi I'm using the KeyOverlap plugin in my XF .NET Standard project. As mentioned in the documentation, I have deployed the plugin only in the iOS project.
I have a login page consisting of input fields, namely: 'Username', 'Password', a Picker for 'Location' and a Login button. Everything works well when I tap on the Entry's. The screen scrolls up and then back to position when I tap anywhere outside of the Entrys. However, when I tap the Picker, select an item and then tap 'Done', the screen scrolls below position i.e. the login button gets hidden. The screenshots below should give you an idea.

Any ideas on how to resolve this?

Hello! I have a similar problem - I attach a screencast. Did you manage to solve it somehow?

You can fix this by modifying ShiftPageDown in the KeyboardOverlapRenderer like this:
void ShiftPageDown(nfloat keyboardHeight, double activeViewBottom)
{
    var pageFrame = Element.Bounds;
    Element.LayoutTo(new Rectangle(pageFrame.X, 0, pageFrame.Width, pageFrame.Height));
    _pageWasShiftedUp = false;
}

The calculated newY coordinate seems to be what caused this.

Just found a better alternative. The newY issue seems to be as a result of a bug with the _isKeyboardShown bool property. If you remove this bool you can leave the newY coordinate as it should be. This also fixes the issue where the keyboard may hide the entry on the first attempt.
Here is a commit that details the steps: https://github.com/paulpatarinski/Xamarin.Forms.Plugins/pull/148/commits/d586d01562b23bee34a568cc81aa5f9b3a3f9f45
To note: There still seems to be shifting issues with custom keyboards, stock keyboard works fine.

Hey guys. I had no idea how to implement Zanesc's solution, so I was thinking about just disabling the whole plugin when I noticed there was one page in my app that didn't have the problem. All I had to do was narrow down why one page worked, and the other didn't.
So a few hours of beating my head against the wall and I found the offending bit. It makes NO SENSE to me, so I created an account to post the solution here for you, maybe someone else can explain.
The offending code:
<?xml version="1.0" encoding="UTF-8"?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:locale="clr-namespace:DuplimarkApp.Locales"
             xmlns:iOSSpecific="clr-namespace:Xamarin.Forms.PlatformConfiguration.iOSSpecific;assembly=Xamarin.Forms.Core"
             x:Class="DuplimarkApp.Views.Contacts.NewContact"
             xmlns:views="clr-namespace:DuplimarkApp.Views"
             BackgroundColor="#E9EAEE">
    <ContentPage.Content>
        <StackLayout HorizontalOptions="FillAndExpand">
            <ContentView>
                <views:TopNav x:Name="NavBar">
                </views:TopNav>
            </ContentView>
            <StackLayout Orientation="Horizontal" HorizontalOptions="FillAndExpand">
                <Label x:Name="lblTitle" Text="{locale:Translate Text=PointClass5}" Margin="10,10,10,5" />
                <StackLayout Orientation="Horizontal" HorizontalOptions="EndAndExpand">
                    <Button x:Name="btnCancel" Text="{locale:Translate Text=Cancel}" TextColor="#4A90E2" HeightRequest="20" BackgroundColor="Transparent" Clicked="btnCancel_Clicked" Margin="0,0,15,0" />
                </StackLayout>
            </StackLayout>
            <Frame CornerRadius="5" HasShadow="False" VerticalOptions="Start" Margin="10,0" Padding="20">
                <StackLayout BackgroundColor="White" VerticalOptions="Center">
                    <Image x:Name="imgContact" Margin="0,0,0,10">
                        <Image.Source>
                            <OnPlatform x:TypeArguments="ImageSource" iOS="Contacts/Info/Photo.png" Android="contacts_info_photo.png" />
                        </Image.Source>
                    </Image>
                    <Entry x:Name="entFirstname" Placeholder="{locale:Translate Text=FirstName}" ReturnType="Next" />
                    <Entry x:Name="entLastname" Placeholder="{locale:Translate Text=LastName}" ReturnType="Next" />
                    <Entry x:Name="entPhone" Placeholder="{locale:Translate Text=MobileNumber}" ReturnType="Next" />
                    <Entry x:Name="entEmail" Placeholder="{locale:Translate Text=EmailAddress}" ReturnType="Next" />
                    <!--<Button HorizontalOptions="FillAndExpand" BackgroundColor="Transparent" TextColor="#4A90E2" Text="More" IsEnabled="False" />-->
                    <Label Text="{locale:Translate Text=Notes}" FontSize="Small" Margin="0,10,0,0" />
                    <Frame CornerRadius="5" HasShadow="False" BorderColor="Silver" Padding="0" VerticalOptions="FillAndExpand" HeightRequest="80">
                        <Editor x:Name="entNotes" VerticalOptions="FillAndExpand" />
                    </Frame>
                    <StackLayout x:Name="pnlOptions" IsVisible="false">
                    <Frame CornerRadius="0" HasShadow="False" BorderColor="Silver" Padding="0" Margin="0,20,0,0">
                        <Picker x:Name="pkStatus" Title="{locale:Translate Text=SelectStatus}" ItemDisplayBinding="{Binding Title}" ItemsSource="{Binding ContactStatuses}" iOSSpecific:Picker.UpdateMode="WhenFinished">
                            <Picker.HeightRequest><OnPlatform iOS="30" Android="40" /></Picker.HeightRequest>
                        </Picker>
                    </Frame>
                    <Frame CornerRadius="0" HasShadow="False" BorderColor="Silver" Padding="0">
                        <Picker x:Name="pkGroup" Title="{locale:Translate Text=SelectGroup}" ItemDisplayBinding="{Binding Title}" ItemsSource="{Binding UserGroups}"  iOSSpecific:Picker.UpdateMode="WhenFinished">
                            <Picker.HeightRequest><OnPlatform iOS="30" Android="40" /></Picker.HeightRequest>
                        </Picker>
                    </Frame>
                    </StackLayout>
                    <Button x:Name="btnDone"
                            HorizontalOptions="FillAndExpand"
                            Margin="0,20,0,0"
                            BackgroundColor="#4A90E2"
                            BorderRadius="5"
                            TextColor="White"
                            Text="{locale:Translate Text=Save}"
                            Clicked="btnDone_Clicked" />
                </StackLayout>
            </Frame>
        </StackLayout>
    </ContentPage.Content>
</ContentPage>

The solution:
Change the VerticalOptions on the frame at line 21 from VerticalOptions="Start" to VerticalOptions="FillAndExpand"... O-O

I guess it is because after selecting a new value, the UI is completely reloaded. If ShiftPageDown is then executed, the page moves down. I solved the problem for me in the following way:
	private void OnKeyboardHide(NSNotification notification)
	{
		if (!IsViewLoaded)
			return;

		_isKeyboardShown = false;
		var keyboardFrame = UIKeyboard.FrameEndFromNotification(notification);

		if (_pageWasShiftedUp && Element.Y != 0)
		{
			ShiftPageDown(keyboardFrame.Height, _activeViewBottom);
		}

		_activeViewBottom = 0; //me
	}

if Element.Y = 0 then the page has already been reloaded and the shift does not need to be executed again.


Refactor spo folder retentionlabel ensure to use util instead of calling other command, Closes #5278

Closes #5278

Thanks for another awesome PR 💪👍. You are on 🔥 today. We will review it ASAP

Hi @nicodecleyre, I've picked up issue https://github.com/pnp/cli-microsoft365/issues/4633, which meant quite some work on refactoring the retention label endpoints. In doing so I also moved the code of those commands to utils. Which means we'll need to close this one instead of merge it unfortunately! Still: we'll certainly merge the rest!


Open jdk fix

Fix openjdk-7 and fio package installations on Azure Ubuntu. It replace the addresses in source.list on Azure vms  with official Ubuntu addresses after failed installation.

PTAL.

LGTM.


Do you have a change log?

I have and previous version of your plugin 2.1.1. Visual Studio tell me that you have a newer version 2.3.0 but I couldn't find the change log of your project or any release, here in github neither in npmjs.com.
Do you have a changelog ?
It will be nice to see what new I can do with this awesome plugin.

I saw that you start to manage releases.
Nice job @dapriett


update dumper.js to support bigints.

Q
A

Bug fix?
yes/

New feature?
/no

Breaking change?
/no

Deprecations?
/no

Tests added?
/no

Fixed issues
1918

License
Apache-2.0

add bigint support

fixes https://github.com/jsdoc/jsdoc/issues/1918

In 9489a447b4135af0b2ee9e58aaea4baa9cf0cfd4 you globally change the BigInt prototype. I believe this is a bad solution for the module (possible conflicts). And by the way, your toJSON code does not work correctly. It always returns the string "n" for all BigInt values.
I think in this case you need a more comprehensive solution like in #1103592370.

I can't actually find where the bigints are displayed. The output doesn't change, the change just clears the error.
It also appears console.log doesn't work, only console.trace.
Also main branch isn't current, only 4.0, so it's a challenge to determine what to change.
I updated teh code based on the feedback. thanks.


Rendering Speed Issue + Slow GUI Response

First off, I love this program! I've been looking for something like this for ages after getting sick of Red Giant/Maxon's stuff. This really does look absolutely amazing and the parameters you can tweak really look authentic. Kudos!
Issues:

I rendered a 3 minute test video yesterday and it ended up taking 1.5 - 2 hrs on my PC (i7-12700k/Nvidia A4000 GPU/64gb RAM)
If you could somehow improve those rendering speeds I would be so grateful!

the GUI is a bit slow sometimes - using the sliders also feels imprecise. I'd love to be able to manually type in number values into each parameter too!

Such a wonderful program though! Absolutely love it.

same


571/edit contacts

This PR:
Resolves #571
Can now edit contacts clicking the icon, and changing just their given or last names. OIDC and Username are inferred from the PodUrl.

Adds editing state to AddContactModal
Selectively displays oidc and username inputs if editing
Added parsePodUrl helper function to extract the oidc and the username from the existing podurl when editing a contact

Extension of the work done at #613
Future work:
parsePodUrl can probably be improved if the need arises, the function right now assumes all oidc's will be standard url's which I hope is the case.

Failing tests don't seem to be related to this PR.

Failing tests don't seem to be related to this PR.

Yeah, the tests are from an earlier PR that needs to be fixed.

I'm unable to edit the contact as the Edit Contact button stays disabled. Requesting changes as a safety measure to ensure it does indeed function as intended.
The issue says the web ID should be editable as well, though that is trickier.

What does the test user you're using look like? Are you using a different provider than localhost potentially?

@JaeGif I'm using solidcommunity for both the account I'm logged in with as well as the contacts I try to edit

I see. It looks like the different provider formats the podURL differently. I found the schema for the different podURL possibilities and will update the parsing function.

@JaeGif I'm using solidcommunity for both the account I'm logged in with as well as the contacts I try to edit

I see. It looks like the different provider formats the podURL differently. I found the schema for the different podURL possibilities and will update the parsing function.

Yeah, the format for webIds on solidcommunity.net uses a https://<username>.<provider>/ instead of the usual https://<provider>/<username>/ format from community solid server

I'm unable to edit the contact as the Edit Contact button stays disabled. Requesting changes as a safety measure to ensure it does indeed function as intended.
The issue says the web ID should be editable as well, though that is trickier.

What does the test user you're using look like? Are you using a different provider than localhost potentially?

I believe I've fixed the issue you had.
As for the WebID, I'm not convinced that it's something that should be "editable" as my understanding is that it's a unique identifier of a user.
If we are sure we do want this though, I believe I can add this functionality quickly.

@JaeGif Will take another look soon. Have you tested other pod providers, like opencommons?
The issue states to be able to edit the Web Id too. If we don't think parts of an issue are important, it would be best to mention that and open for discussion beforehand.

The issue states to be able to edit the Web Id too. If we don't think parts of an issue are important, it would be best to mention that and open for discussion beforehand.

There's additional context to that issue. As stated since webIds is the identifier for the object, updating webId would likely require deleting the old entry and adding a new one anyways. The solution here is fine.
If users want to, they could simply make a new contact with the new webId. It's like adding a person's gmail account and their yahoo account onto contacts.

It can just be mentioned in the PR that some part intentionally wasn't added because you don't think it's actually needed. It's good to have more communication and ensure that nothing appears to be an oversight or anything.

Hey @JaeGif @andycwilliams, would like to check up with you guys. What's the current status of this PR?

Hey @JaeGif @andycwilliams, would like to check up with you guys. What's the current status of this PR?

Once it's possible to update the contact regardless of OIDC Provider I'm ready to approve

Hey @JaeGif @andycwilliams, would like to check up with you guys. What's the current status of this PR?

Once it's possible to update the contact regardless of OIDC Provider I'm ready to approve

Hey @JaeGif @andycwilliams, would like to check up with you guys. What's the current status of this PR?

Once it's possible to update the contact regardless of OIDC Provider I'm ready to approve

I've checked with all the current oidc providers, and parsePodUrl successfully parsed all providers on the VITE_OIDC_WEBIDS list.
I'm not particularly good at tests so I'm uncertain how to best write a unit test for this as the parsePodUrl function is inside of the AddContactModal. Everything I can think of needs a separate test for each OIDC which doesn't feel like the best way to do it.
I've tested the function by separating parsePodUrl to it's own file locally, and iterating across VITE_OIDC_WEBIDS. All oidc's and usernames are parsed out correctly in this way.

I've checked with all the current oidc providers, and parsePodUrl successfully parsed all providers on the VITE_OIDC_WEBIDS list.
I'm not particularly good at tests so I'm uncertain how to best write a unit test for this as the parsePodUrl function is inside of the AddContactModal. Everything I can think of needs a separate test for each OIDC which doesn't feel like the best way to do it.
I've tested the function by separating parsePodUrl to it's own file locally, and iterating across VITE_OIDC_WEBIDS. All oidc's and usernames are parsed out correctly in this way.

If it works for all providers then this is pretty much ready. The only remaining thing is that the development branch has since gotten new merges, so this will need updating. Shouldn't be too much though, just adding the same functionality as a menu item for the mobile version of the contacts table.
As for tests, yes normally we want them completed with each PR. However, I'm making an exception for MVP by creating an issue (#662) to address all failing tests. So if you can write them, or just as much as you can, then that's great, but otherwise it ought to be covered by that.

I've checked with all the current oidc providers, and parsePodUrl successfully parsed all providers on the VITE_OIDC_WEBIDS list.
I'm not particularly good at tests so I'm uncertain how to best write a unit test for this as the parsePodUrl function is inside of the AddContactModal. Everything I can think of needs a separate test for each OIDC which doesn't feel like the best way to do it.
I've tested the function by separating parsePodUrl to it's own file locally, and iterating across VITE_OIDC_WEBIDS. All oidc's and usernames are parsed out correctly in this way.

If it works for all providers then this is pretty much ready. The only remaining thing is that the development branch has since gotten new merges, so this will need updating. Shouldn't be too much though, just adding the same functionality as a menu item for the mobile version of the contacts table.
As for tests, yes normally we want them completed with each PR. However, I'm making an exception for MVP by creating an issue (#662) to address all failing tests. So if you can write them, or just as much as you can, then that's great, but otherwise it ought to be covered by that.

Sounds good. Just reconciled the branches. Some slight changes had to be made to fit the new layout, made the minor changes and tested in every way I can think of and got it working.


Split "membership" and "administration" views

We should have them in bootstrap tabs or similar.

Closed with #219


Multi-Cluster support

Issue is when running, oc is assumed to be logged into cluster you want to configure.
Would like ability to specify the .kube/config file using oc --config xyz.  But need it on ALL the "oc" lines.  This way I can have multiple configs for each cluster and run as local user.
I am currently separating tower to run these as different users, each having pre configured kube config which are auto logged in.  Issue with current solution is because ansible is remote (only way to force new user/privs), it has to copy all the files over, and takes over 20 minutes to configure my cluster.  Very inefficient.
Other ideas welcome.  If no other ideas, I'll branch and offer to add the config file or context as a var for all "oc" commands as I'm really wanting to configure 4+ clusters simutaneously without having to worry if "oc" is pointing to wrong cluster during run, all with same user.

Please see this WIP (which has been open for a loooong time) around multi-cluster support:
https://github.com/redhat-cop/openshift-applier/pull/13
... basically setting the KUBECONFIG env variable to point to the "correct" cluster before applying content.
Since the WIP has been open for this long, I'm sure there are multiple areas that requires re-work, but just wanted to call it out as something that has been considered and something that can potentially be completed.
BTW: the remote v.s. local execution -  the openshift-applier has support for this and will copy necessary files to the target system if/when needed. As you mentioned, this can increase the execution time quite drastically, however.

I wanted to throw an alternative solution out there.... more and more, I am seeing value in trying to make applier as kubernetes-native as possible (i.e. making the openshift-specific bits optional. see #129 ). So what if, rather than doing anything with oc login, we added to applier the ability to set the current-context within a kubeconfig file?
Here's an example:
openshift_cluster_content:
  - object: Stuff that goes everywhere
    cluster-contexts:
      - "default/cluster-dev-myorg-com:6443/kube:admin"
      - "default/cluster-int-myorg-com:6443/kube:admin"
      - "default/cluster-prd-myorg-com:6443/kube:admin"
    content:
      ....
  - object: Dev Only
    cluster-contexts:
      - "default/cluster-dev-myorg-com:6443/kube:admin"
    content:
       ....

so the user's responsibility is to make sure they are logged in to all 3 clusters before running applier, and then applier doesn't have to manage credentials of any kind.

Yes, I do like the idea of using the context aspect - e.g: just passing the --context flag would do for oc and kubectl. I know k8s ansible modules also supports this - i.e.: k8s_facts, so I think that would align well.