replace CRLF to LF

replace fille with CRLF to LF
once it done ,will merge this changes to #1 , and do code review for linter changes.
as CRLF to LF changes have too many file changes and hard to do code review.

there is no any code changes and only update all the files with CRLF to LF.
just merge it and for future works.

there is an CodeQL error with enum import itself.
solution:

rename backports/enum.py to backports/myenum.py
update all the local import ,changes diff as below

diff --git a/custom_components/midea_ac_lan/midea/core/device.py b/custom_components/midea_ac_lan/midea/core/device.py
index f9d95c8..1eaa24f 100644
--- a/custom_components/midea_ac_lan/midea/core/device.py
+++ b/custom_components/midea_ac_lan/midea/core/device.py
@@ -2,7 +2,7 @@ import threading
 try:
     from enum import StrEnum
 except ImportError:
-    from ..backports.enum import StrEnum
+    from ..backports.myenum import StrEnum
 from enum import IntEnum
 from .security import LocalSecurity, MSGTYPE_HANDSHAKE_REQUEST, MSGTYPE_ENCRYPTED_REQUEST
 from .packet_builder import PacketBuilder
diff --git a/custom_components/midea_ac_lan/midea/devices/a1/device.py b/custom_components/midea_ac_lan/midea/devices/a1/device.py
index d8b708f..4cc990a 100644
--- a/custom_components/midea_ac_lan/midea/devices/a1/device.py
+++ b/custom_components/midea_ac_lan/midea/devices/a1/device.py
@@ -7,7 +7,7 @@ from .message import (
 try:
     from enum import StrEnum
 except ImportError:
-    from ...backports.enum import StrEnum
+    from ...backports.myenum import StrEnum
 from ...core.device import MiedaDevice

 _LOGGER = logging.getLogger(__name__)
diff --git a/custom_components/midea_ac_lan/midea/devices/ac/device.py b/custom_components/midea_ac_lan/midea/devices/ac/device.py
index 220335b..977c605 100644
--- a/custom_components/midea_ac_lan/midea/devices/ac/device.py
+++ b/custom_components/midea_ac_lan/midea/devices/ac/device.py
@@ -14,7 +14,7 @@ from .message import (
 try:
     from enum import StrEnum
 except ImportError:
-    from ...backports.enum import StrEnum
+    from ...backports.myenum import StrEnum
 from ...core.device import MiedaDevice

 _LOGGER = logging.getLogger(__name__)
diff --git a/custom_components/midea_ac_lan/midea/devices/b0/device.py b/custom_components/midea_ac_lan/midea/devices/b0/device.py
index 4bfee5a..c1f5f6e 100644
--- a/custom_components/midea_ac_lan/midea/devices/b0/device.py
+++ b/custom_components/midea_ac_lan/midea/devices/b0/device.py
@@ -6,7 +6,7 @@ from .message import (
 try:
     from enum import StrEnum
 except ImportError:
-    from ...backports.enum import StrEnum
+    from ...backports.myenum import StrEnum
 from ...core.device import MiedaDevice

 _LOGGER = logging.getLogger(__name__)
diff --git a/custom_components/midea_ac_lan/midea/devices/b1/device.py b/custom_components/midea_ac_lan/midea/devices/b1/device.py
index cd030cd..4f62e6a 100644
--- a/custom_components/midea_ac_lan/midea/devices/b1/device.py
+++ b/custom_components/midea_ac_lan/midea/devices/b1/device.py
@@ -6,7 +6,7 @@ from .message import (
 try:
     from enum import StrEnum
 except ImportError:
-    from ...backports.enum import StrEnum
+    from ...backports.myenum import StrEnum
 from ...core.device import MiedaDevice

 _LOGGER = logging.getLogger(__name__)
diff --git a/custom_components/midea_ac_lan/midea/devices/b3/device.py b/custom_components/midea_ac_lan/midea/devices/b3/device.py
index 3d26da0..41fe63c 100644
--- a/custom_components/midea_ac_lan/midea/devices/b3/device.py
+++ b/custom_components/midea_ac_lan/midea/devices/b3/device.py
@@ -6,7 +6,7 @@ from .message import (
 try:
     from enum import StrEnum
 except ImportError:
-    from ...backports.enum import StrEnum
+    from ...backports.myenum import StrEnum
 from ...core.device import MiedaDevice

 _LOGGER = logging.getLogger(__name__)
diff --git a/custom_components/midea_ac_lan/midea/devices/b4/device.py b/custom_components/midea_ac_lan/midea/devices/b4/device.py
index 41b1976..56e53d6 100644
--- a/custom_components/midea_ac_lan/midea/devices/b4/device.py
+++ b/custom_components/midea_ac_lan/midea/devices/b4/device.py
@@ -6,7 +6,7 @@ from .message import (
 try:
     from enum import StrEnum
 except ImportError:
-    from ...backports.enum import StrEnum
+    from ...backports.myenum import StrEnum
 from ...core.device import MiedaDevice

 _LOGGER = logging.getLogger(__name__)
diff --git a/custom_components/midea_ac_lan/midea/devices/b6/device.py b/custom_components/midea_ac_lan/midea/devices/b6/device.py
index 325db06..c9d68a1 100644
--- a/custom_components/midea_ac_lan/midea/devices/b6/device.py
+++ b/custom_components/midea_ac_lan/midea/devices/b6/device.py
@@ -8,7 +8,7 @@ from .message import (
 try:
     from enum import StrEnum
 except ImportError:
-    from ...backports.enum import StrEnum
+    from ...backports.myenum import StrEnum
 from ...core.device import MiedaDevice

 _LOGGER = logging.getLogger(__name__)
diff --git a/custom_components/midea_ac_lan/midea/devices/bf/device.py b/custom_components/midea_ac_lan/midea/devices/bf/device.py
index 2f0b568..225cba8 100644
--- a/custom_components/midea_ac_lan/midea/devices/bf/device.py
+++ b/custom_components/midea_ac_lan/midea/devices/bf/device.py
@@ -6,7 +6,7 @@ from .message import (
 try:
     from enum import StrEnum
 except ImportError:
-    from ...backports.enum import StrEnum
+    from ...backports.myenum import StrEnum
 from ...core.device import MiedaDevice

 _LOGGER = logging.getLogger(__name__)
diff --git a/custom_components/midea_ac_lan/midea/devices/c2/device.py b/custom_components/midea_ac_lan/midea/devices/c2/device.py
index e41bcb7..580f4b9 100644
--- a/custom_components/midea_ac_lan/midea/devices/c2/device.py
+++ b/custom_components/midea_ac_lan/midea/devices/c2/device.py
@@ -9,7 +9,7 @@ from .message import (
 try:
     from enum import StrEnum
 except ImportError:
-    from ...backports.enum import StrEnum
+    from ...backports.myenum import StrEnum
 from ...core.device import MiedaDevice

 _LOGGER = logging.getLogger(__name__)
diff --git a/custom_components/midea_ac_lan/midea/devices/c3/device.py b/custom_components/midea_ac_lan/midea/devices/c3/device.py
index 7dc3969..cc8ba68 100644
--- a/custom_components/midea_ac_lan/midea/devices/c3/device.py
+++ b/custom_components/midea_ac_lan/midea/devices/c3/device.py
@@ -9,7 +9,7 @@ from .message import (
 try:
     from enum import StrEnum
 except ImportError:
-    from ...backports.enum import StrEnum
+    from ...backports.myenum import StrEnum
 from ...core.device import MiedaDevice

 _LOGGER = logging.getLogger(__name__)
diff --git a/custom_components/midea_ac_lan/midea/devices/ca/device.py b/custom_components/midea_ac_lan/midea/devices/ca/device.py
index b2a0e60..8d05ad6 100644
--- a/custom_components/midea_ac_lan/midea/devices/ca/device.py
+++ b/custom_components/midea_ac_lan/midea/devices/ca/device.py
@@ -6,7 +6,7 @@ from .message import (
 try:
     from enum import StrEnum
 except ImportError:
-    from ...backports.enum import StrEnum
+    from ...backports.myenum import StrEnum
 from ...core.device import MiedaDevice

 _LOGGER = logging.getLogger(__name__)
diff --git a/custom_components/midea_ac_lan/midea/devices/cc/device.py b/custom_components/midea_ac_lan/midea/devices/cc/device.py
index 70bd471..a82a5fb 100644
--- a/custom_components/midea_ac_lan/midea/devices/cc/device.py
+++ b/custom_components/midea_ac_lan/midea/devices/cc/device.py
@@ -7,7 +7,7 @@ from .message import (
 try:
     from enum import StrEnum
 except ImportError:
-    from ...backports.enum import StrEnum
+    from ...backports.myenum import StrEnum
 from ...core.device import MiedaDevice

 _LOGGER = logging.getLogger(__name__)
diff --git a/custom_components/midea_ac_lan/midea/devices/cd/device.py b/custom_components/midea_ac_lan/midea/devices/cd/device.py
index 917a00b..8de65e5 100644
--- a/custom_components/midea_ac_lan/midea/devices/cd/device.py
+++ b/custom_components/midea_ac_lan/midea/devices/cd/device.py
@@ -8,7 +8,7 @@ from .message import (
 try:
     from enum import StrEnum
 except ImportError:
-    from ...backports.enum import StrEnum
+    from ...backports.myenum import StrEnum
 from ...core.device import MiedaDevice

 _LOGGER = logging.getLogger(__name__)
diff --git a/custom_components/midea_ac_lan/midea/devices/ce/device.py b/custom_components/midea_ac_lan/midea/devices/ce/device.py
index a4e394b..f040e27 100644
--- a/custom_components/midea_ac_lan/midea/devices/ce/device.py
+++ b/custom_components/midea_ac_lan/midea/devices/ce/device.py
@@ -8,7 +8,7 @@ from .message import (
 try:
     from enum import StrEnum
 except ImportError:
-    from ...backports.enum import StrEnum
+    from ...backports.myenum import StrEnum
 from ...core.device import MiedaDevice

 _LOGGER = logging.getLogger(__name__)
diff --git a/custom_components/midea_ac_lan/midea/devices/cf/device.py b/custom_components/midea_ac_lan/midea/devices/cf/device.py
index 12a5987..273e397 100644
--- a/custom_components/midea_ac_lan/midea/devices/cf/device.py
+++ b/custom_components/midea_ac_lan/midea/devices/cf/device.py
@@ -7,7 +7,7 @@ from .message import (
 try:
     from enum import StrEnum
 except ImportError:
-    from ...backports.enum import StrEnum
+    from ...backports.myenum import StrEnum
 from ...core.device import MiedaDevice

 _LOGGER = logging.getLogger(__name__)
diff --git a/custom_components/midea_ac_lan/midea/devices/da/device.py b/custom_components/midea_ac_lan/midea/devices/da/device.py
index 1979abe..305b7bb 100644
--- a/custom_components/midea_ac_lan/midea/devices/da/device.py
+++ b/custom_components/midea_ac_lan/midea/devices/da/device.py
@@ -8,7 +8,7 @@ from .message import (
 try:
     from enum import StrEnum
 except ImportError:
-    from ...backports.enum import StrEnum
+    from ...backports.myenum import StrEnum
 from ...core.device import MiedaDevice

 _LOGGER = logging.getLogger(__name__)
diff --git a/custom_components/midea_ac_lan/midea/devices/db/device.py b/custom_components/midea_ac_lan/midea/devices/db/device.py
index 9288c75..0ef737c 100644
--- a/custom_components/midea_ac_lan/midea/devices/db/device.py
+++ b/custom_components/midea_ac_lan/midea/devices/db/device.py
@@ -8,7 +8,7 @@ from .message import (
 try:
     from enum import StrEnum
 except ImportError:
-    from ...backports.enum import StrEnum
+    from ...backports.myenum import StrEnum
 from ...core.device import MiedaDevice

 _LOGGER = logging.getLogger(__name__)
diff --git a/custom_components/midea_ac_lan/midea/devices/dc/device.py b/custom_components/midea_ac_lan/midea/devices/dc/device.py
index 9b6282e..b78c121 100644
--- a/custom_components/midea_ac_lan/midea/devices/dc/device.py
+++ b/custom_components/midea_ac_lan/midea/devices/dc/device.py
@@ -8,7 +8,7 @@ from .message import (
 try:
     from enum import StrEnum
 except ImportError:
-    from ...backports.enum import StrEnum
+    from ...backports.myenum import StrEnum
 from ...core.device import MiedaDevice

 _LOGGER = logging.getLogger(__name__)
diff --git a/custom_components/midea_ac_lan/midea/devices/e1/device.py b/custom_components/midea_ac_lan/midea/devices/e1/device.py
index 21a2674..afc3d4c 100644
--- a/custom_components/midea_ac_lan/midea/devices/e1/device.py
+++ b/custom_components/midea_ac_lan/midea/devices/e1/device.py
@@ -9,7 +9,7 @@ from .message import (
 try:
     from enum import StrEnum
 except ImportError:
-    from ...backports.enum import StrEnum
+    from ...backports.myenum import StrEnum
 from ...core.device import MiedaDevice

 _LOGGER = logging.getLogger(__name__)
diff --git a/custom_components/midea_ac_lan/midea/devices/e2/device.py b/custom_components/midea_ac_lan/midea/devices/e2/device.py
index dfa46fb..fc8ca31 100644
--- a/custom_components/midea_ac_lan/midea/devices/e2/device.py
+++ b/custom_components/midea_ac_lan/midea/devices/e2/device.py
@@ -10,7 +10,7 @@ from .message import (
 try:
     from enum import StrEnum
 except ImportError:
-    from ...backports.enum import StrEnum
+    from ...backports.myenum import StrEnum
 from ...core.device import MiedaDevice

 _LOGGER = logging.getLogger(__name__)
diff --git a/custom_components/midea_ac_lan/midea/devices/e3/device.py b/custom_components/midea_ac_lan/midea/devices/e3/device.py
index ebd8a10..0b708f0 100644
--- a/custom_components/midea_ac_lan/midea/devices/e3/device.py
+++ b/custom_components/midea_ac_lan/midea/devices/e3/device.py
@@ -10,7 +10,7 @@ from .message import (
 try:
     from enum import StrEnum
 except ImportError:
-    from ...backports.enum import StrEnum
+    from ...backports.myenum import StrEnum
 from ...core.device import MiedaDevice

 _LOGGER = logging.getLogger(__name__)
diff --git a/custom_components/midea_ac_lan/midea/devices/e6/device.py b/custom_components/midea_ac_lan/midea/devices/e6/device.py
index 7510966..951125d 100644
--- a/custom_components/midea_ac_lan/midea/devices/e6/device.py
+++ b/custom_components/midea_ac_lan/midea/devices/e6/device.py
@@ -7,7 +7,7 @@ from .message import (
 try:
     from enum import StrEnum
 except ImportError:
-    from ...backports.enum import StrEnum
+    from ...backports.myenum import StrEnum
 from ...core.device import MiedaDevice

 _LOGGER = logging.getLogger(__name__)
diff --git a/custom_components/midea_ac_lan/midea/devices/e8/device.py b/custom_components/midea_ac_lan/midea/devices/e8/device.py
index c479e37..abaaada 100644
--- a/custom_components/midea_ac_lan/midea/devices/e8/device.py
+++ b/custom_components/midea_ac_lan/midea/devices/e8/device.py
@@ -6,7 +6,7 @@ from .message import (
 try:
     from enum import StrEnum
 except ImportError:
-    from ...backports.enum import StrEnum
+    from ...backports.myenum import StrEnum
 from ...core.device import MiedaDevice

 _LOGGER = logging.getLogger(__name__)
diff --git a/custom_components/midea_ac_lan/midea/devices/ea/device.py b/custom_components/midea_ac_lan/midea/devices/ea/device.py
index b5d22fc..aa4fbc4 100644
--- a/custom_components/midea_ac_lan/midea/devices/ea/device.py
+++ b/custom_components/midea_ac_lan/midea/devices/ea/device.py
@@ -6,7 +6,7 @@ from .message import (
 try:
     from enum import StrEnum
 except ImportError:
-    from ...backports.enum import StrEnum
+    from ...backports.myenum import StrEnum
 from ...core.device import MiedaDevice

 _LOGGER = logging.getLogger(__name__)
diff --git a/custom_components/midea_ac_lan/midea/devices/ec/device.py b/custom_components/midea_ac_lan/midea/devices/ec/device.py
index 2bc71ec..c6eed5b 100644
--- a/custom_components/midea_ac_lan/midea/devices/ec/device.py
+++ b/custom_components/midea_ac_lan/midea/devices/ec/device.py
@@ -6,7 +6,7 @@ from .message import (
 try:
     from enum import StrEnum
 except ImportError:
-    from ...backports.enum import StrEnum
+    from ...backports.myenum import StrEnum
 from ...core.device import MiedaDevice

 _LOGGER = logging.getLogger(__name__)
diff --git a/custom_components/midea_ac_lan/midea/devices/ed/device.py b/custom_components/midea_ac_lan/midea/devices/ed/device.py
index 68903f6..4aa1e4f 100644
--- a/custom_components/midea_ac_lan/midea/devices/ed/device.py
+++ b/custom_components/midea_ac_lan/midea/devices/ed/device.py
@@ -8,7 +8,7 @@ from .message import (
 try:
     from enum import StrEnum
 except ImportError:
-    from ...backports.enum import StrEnum
+    from ...backports.myenum import StrEnum
 from ...core.device import MiedaDevice

 _LOGGER = logging.getLogger(__name__)
diff --git a/custom_components/midea_ac_lan/midea/devices/fa/device.py b/custom_components/midea_ac_lan/midea/devices/fa/device.py
index c4c47ae..58dea3e 100644
--- a/custom_components/midea_ac_lan/midea/devices/fa/device.py
+++ b/custom_components/midea_ac_lan/midea/devices/fa/device.py
@@ -8,7 +8,7 @@ from .message import (
 try:
     from enum import StrEnum
 except ImportError:
-    from ...backports.enum import StrEnum
+    from ...backports.myenum import StrEnum
 from ...core.device import MiedaDevice

 _LOGGER = logging.getLogger(__name__)
diff --git a/custom_components/midea_ac_lan/midea/devices/fb/device.py b/custom_components/midea_ac_lan/midea/devices/fb/device.py
index 7465eb4..c7b614a 100644
--- a/custom_components/midea_ac_lan/midea/devices/fb/device.py
+++ b/custom_components/midea_ac_lan/midea/devices/fb/device.py
@@ -7,7 +7,7 @@ from .message import (
 try:
     from enum import StrEnum
 except ImportError:
-    from ...backports.enum import StrEnum
+    from ...backports.myenum import StrEnum
 from ...core.device import MiedaDevice

 _LOGGER = logging.getLogger(__name__)
diff --git a/custom_components/midea_ac_lan/midea/devices/fc/device.py b/custom_components/midea_ac_lan/midea/devices/fc/device.py
index 2f55265..e428251 100644
--- a/custom_components/midea_ac_lan/midea/devices/fc/device.py
+++ b/custom_components/midea_ac_lan/midea/devices/fc/device.py
@@ -8,7 +8,7 @@ from .message import (
 try:
     from enum import StrEnum
 except ImportError:
-    from ...backports.enum import StrEnum
+    from ...backports.myenum import StrEnum
 from ...core.device import MiedaDevice

 _LOGGER = logging.getLogger(__name__)
diff --git a/custom_components/midea_ac_lan/midea/devices/fd/device.py b/custom_components/midea_ac_lan/midea/devices/fd/device.py
index 771533f..b3f010f 100644
--- a/custom_components/midea_ac_lan/midea/devices/fd/device.py
+++ b/custom_components/midea_ac_lan/midea/devices/fd/device.py
@@ -7,7 +7,7 @@ from .message import (
 try:
     from enum import StrEnum
 except ImportError:
-    from ...backports.enum import StrEnum
+    from ...backports.myenum import StrEnum
 from ...core.device import MiedaDevice

 _LOGGER = logging.getLogger(__name__)
diff --git a/custom_components/midea_ac_lan/midea/devices/x13/device.py b/custom_components/midea_ac_lan/midea/devices/x13/device.py
index 2a4e1e1..50843ec 100644
--- a/custom_components/midea_ac_lan/midea/devices/x13/device.py
+++ b/custom_components/midea_ac_lan/midea/devices/x13/device.py
@@ -8,7 +8,7 @@ from .message import (
 try:
     from enum import StrEnum
 except ImportError:
-    from ...backports.enum import StrEnum
+    from ...backports.myenum import StrEnum
 from ...core.device import MiedaDevice

 _LOGGER = logging.getLogger(__name__)
diff --git a/custom_components/midea_ac_lan/midea/devices/x26/device.py b/custom_components/midea_ac_lan/midea/devices/x26/device.py
index 5a4408f..2230154 100644
--- a/custom_components/midea_ac_lan/midea/devices/x26/device.py
+++ b/custom_components/midea_ac_lan/midea/devices/x26/device.py
@@ -8,7 +8,7 @@ from .message import (
 try:
     from enum import StrEnum
 except ImportError:
-    from ...backports.enum import StrEnum
+    from ...backports.myenum import StrEnum
 from ...core.device import MiedaDevice

 _LOGGER = logging.getLogger(__name__)
diff --git a/custom_components/midea_ac_lan/midea/devices/x34/device.py b/custom_components/midea_ac_lan/midea/devices/x34/device.py
index 6097128..a1cb1ef 100644
--- a/custom_components/midea_ac_lan/midea/devices/x34/device.py
+++ b/custom_components/midea_ac_lan/midea/devices/x34/device.py
@@ -9,7 +9,7 @@ from .message import (
 try:
     from enum import StrEnum
 except ImportError:
-    from ...backports.enum import StrEnum
+    from ...backports.myenum import StrEnum
 from ...core.device import MiedaDevice

 _LOGGER = logging.getLogger(__name__)
diff --git a/custom_components/midea_ac_lan/midea/devices/x40/device.py b/custom_components/midea_ac_lan/midea/devices/x40/device.py
index b49a0bc..f7d33fd 100644
--- a/custom_components/midea_ac_lan/midea/devices/x40/device.py
+++ b/custom_components/midea_ac_lan/midea/devices/x40/device.py
@@ -8,7 +8,7 @@ from .message import (
 try:
     from enum import StrEnum
 except ImportError:
-    from ...backports.enum import StrEnum
+    from ...backports.myenum import StrEnum
 from ...core.device import MiedaDevice

 _LOGGER = logging.getLogger(__name__)


Tooltip delay timer resets each time the cursor moves just 1 pixel over the widget it's bound to

Hi. The delay timer resets each time the cursor is moved one pixel over the widget that the tooltip is bound to.  With a small delay, it appears to flicker, but it's just the delay timer resetting.
The flickering issue exists even when using no delay, but it's harder to notice because it refreshes so fast.
https://user-images.githubusercontent.com/89231731/168720840-438e712b-a9c7-4e0f-bcbd-ed7a299f6047.mp4
ToolTip(self, msg="0.1s delay restarts for\nevery pixel of movement", follow=False, delay=0.1)

I'm not currently working on my tkinter project at the moment so I'm not in any need for this to be resolved.. but I do think this should still be fixed at some point.  No other implementations of a tooltip, that I can think of, behaves this way.
In the current implementation, the tooltip "follows" the cursor regardless of the follow property.  Enabling follow simply makes the follow effect smoother.
A tooltip should not be allowed to reactivate on the same underlying object until one of two conditions are met:  1) the mouse cursor exits the boundaries of the underlying object which initially activated the tip, or 2) the auto-hide timer expires - whichever event occurs first.  Until one those conditions are met, the tooltip position should remain static, in the location of the mouse cursor at the moment it was initially activated.
As it is currently implemented, the tooltip is permitted to reactivate every time the cursor moves even just 1 pixel around the same object, thus resetting the position, and the auto-hide timer.  Right now, is essentially "following" the cursor at a slower rate, even though follow is turned off.  This is what's causing the flickering effect.
Just my 2c.  It's 100% your project and your call, but I think fixing this would be viewed as an improvement by just about anyone.
Cheers

Original Comment via @0x199x

I'm not currently working on my tkinter project at the moment so I'm not in any need for this to be resolved.. but I do think this should still be fixed at some point. No other implementations of a tooltip, that I can think of, behaves this way.
In the current implementation, the tooltip "follows" the cursor regardless of the follow property. Enabling follow simply makes the follow effect smoother.
A tooltip should not be allowed to reactivate on the same underlying object until one of two conditions are met: 1) the mouse cursor exits the boundaries of the underlying object which initially activated the tip, or 2) the auto-hide timer expires - whichever event occurs first. Until one those conditions are met, the tooltip position should remain static, in the location of the mouse cursor at the moment it was initially activated.
As it is currently implemented, the tooltip is permitted to reactivate every time the cursor moves even just 1 pixel around the same object, thus resetting the position, and the auto-hide timer. Right now, is essentially "following" the cursor at a slower rate, even though follow is turned off. This is what's causing the flickering effect.
Just my 2c. It's 100% your project and your call, but I think fixing this would be viewed as an improvement by just about anyone.
Cheers

I am not sure what happened to your comment but regardless,  I understand what your feature request is. However, you have to keep in mind that this is a little project I made for one of my code projects back in 2014, it's free and more importantly open-source. If you want to add a feature, feel free to open a Pull Request :slightly_smiling_face:.


Helm Uninstall Context Menu

adds uninstall context menu to Helm release explorer.
have included an confirmation dialog to avoid any accidents.
added option to copy release name as only having Uninstall in the context menu could lead to accidentally clicking on that option only.
part of the feature request #748

@lstocchi thank you for your comments. I have incorporated your feedback. Also noticed I had a couple of linting issues so fixed those too.

Thanks @shreyu86. It looks good to me. I saw that you also want to add other features. Do you want to keep this PR opened and add more stuff here or this can be merged?

@lstocchi I am still experimenting with rollback. I think if it's possible this would be phase 1 and can be merged. I'll open other MR soon.

Ok, merging this then. Thanks again @shreyu86

Awesome! Thank you! Looking forward to additional context menus for helm 😊


[C++][Parquet] Bad DCHECK For Intermixed Dictionary Encoding

Parquet CPP has a DCHECK for a dictionary encoded page coming after a non-dictionary encoded page. This is bad because the DCHECK can be triggered by Parquet files that have a column that has a dictionary page, then a non-dictionary encoded page, then a page of dictionary encoded values(indices). Fuzzing found such a file. While this could be turned into an exception, I don't see anything in the Parquet specification that prohibits such an occurrence of pages.
This situation has brought up on the mailing list before(https://lists.apache.org/thread/3bzymmbxvmzj12km7cjz1150ndvy9bos) and it seems like this is valid but nobody is doing it.
In the PR that added this check(https://github.com/apache/parquet-cpp/pull/73) it was noted that the check is probably not needed.
Reporter: William Butler / @tachyonwill
Assignee: William Butler](https://issues.apache.org/jira/secure/ViewProfile.jspa?name=willb_google) / @tachyonwill
PRs and other links:

GitHub Pull Request #76
GitHub Pull Request #12427

Note: This issue was originally created as PARQUET-2124. Please see the migration documentation for further details.

Antoine Pitrou / @pitrou:
Issue resolved by pull request 12427
https://github.com/apache/arrow/pull/12427


Fixed FilesystemPath::isFile return value.

Resolves #490
@metthal I went ahead and implemented your suggestions. I also split it into a separate branch and removed these changes from the other pull request as I should have done in the first place.
Regards,
Andrew Strelsky

Thank you! LGTM. I'll just wait for TeamCity to finish all builds and then I will merge it. AppVeyor will probably fail as we have problems with timeouts in it right now but no worries.

The AppVeyor build failure can be ignored as it timeouted (again...). We will have to do something with it.

Thank you for your contribution. I've merged your changes.


Release

First release version, now including:

Readme with installation and getting started instructions.
Demo notebooks with example outputs and visualizations.
Example bare bones training script.
Improved documentation.

Running checks first on a released version, running our scripts again on a fresh install to make sure everything works. Changes in functionality aren't expected, so please review for instructions/documentation/etc.

Should train_demo.py be updated to make it for quicker checks whether everything works?
E.g. to see quicker results:

Printing/tqdm for batch loop
Reduced number of epochs
Smaller dataset (would have to generate a smaller demo split in qcardia-data demo?)

Since those were the things I changed before testing to not waste time...

I guess it isn't strictly required but the requirements needs torchview to run the visualization

In qcardia-data we assume the config is already in the working directory - i.e that the working directory is demo (explore_config_path = Path("explore-config.yaml")).
But in qcardia-models we assume the working directory is above demo in train_demo.py (config_path = Path("demo/train-demo-config.yaml"))
Is this intentional because you expect to use script and notebooks differently?

I guess it isn't strictly required but the requirements needs torchview to run the visualization

Yes, but it also needs Graphviz, both the Python package and the actual program on your system. As mentioned (pretty hidden imo) in their installation instructions:

"For python interface of graphiz to work, you need to have dot layout command working in your system"

For Windows, this means installing Graphviz from their website, with the executable location added to your Path. I think it works similarly on Linux/MacOS. The torchview installation instructions mention to use other package managers to install it, but I don't really like having to install even more stuff. Since I don't really like the torchview instructions we would also have to add instructions to install/use these package managers...
Since it wouldn't work anyways with just additional torchview Python package requirements, I didn't include them at all and put a short explanation in the notebook. That explanation wasn't added to the public package version yet at the time of your comment, but should be there now. Maybe we should add some more specific instruction there? Would take more work and testing (for both of us) to have good and complete instructions for Windows, Linux, and MacOS.

In qcardia-data we assume the config is already in the working directory - i.e that the working directory is demo (explore_config_path = Path("explore-config.yaml")).
But in qcardia-models we assume the working directory is above demo in train_demo.py (config_path = Path("demo/train-demo-config.yaml"))
Is this intentional because you expect to use script and notebooks differently?

Yes this is intentional, it is indeed a distinction between Python notebooks and scripts, not between packages.

https://github.com/q-cardIA/qcardia-models/blob/b1b417d805290dc4d7b7c29824b9abe910c71586/src/qcardia_models/losses/dice_ce_loss.py#L74
The code crashes on mac at this line. The reason is .get_device() returns 0 if GPU and -1 if CPU and not actually the name of device. If 0 PyTorch assumes CUDA even if it's not available. .device instead returns the actual device name. So changing to the below fixes it for me:
self.class_weights = self.class_weights.to(outputs.device)
@RobdeMooij can you check this doesn't break anything for you

https://github.com/q-cardIA/qcardia-models/blob/b1b417d805290dc4d7b7c29824b9abe910c71586/src/qcardia_models/losses/dice_ce_loss.py#L74
The code crashes on mac at this line. The reason is .get_device() returns 0 if GPU and -1 if CPU and not actually the name of device. If 0 PyTorch assumes CUDA even if it's not available. .device instead returns the actual device name. So changing to the below fixes it for me:
self.class_weights = self.class_weights.to(outputs.device)
@RobdeMooij can you check this doesn't break anything for you?

Still works for me

Nice, then is the only thing missing to shorten the runtime of train_demo (in terms of iterations/epochs)? then I will do a final review

Limiting the number of batches in a dataloader is messy, so I hard forced it with break and enumerate. Since tqdm doesn't work with this hardforce, tqdm is used on the 10 epochs, all with very few batches. The training is now heavily bottlenecked by the dataloading, so the first epoch takes far longer than the others, but the training should still finish in <1 minute.

also works


Remove add-radiation branch in tests

Pull Request Checklist:

[ ] This PR addresses an already opened issue (for bug fixes / features)

This PR fixes #xyz

[ ] Tests for the changes have been added (for bug fixes / features)

[ ] (If applicable) Documentation has been added / updated (for bug fixes / features)

[ ] HISTORY.rst has been updated (with summary of main changes)

[ ] Link to issue (:issue:number) and pull request (:pull:number) has been added

What kind of change does this PR introduce?

Remove the custom add-radiation branch reference in UTCI tests as it was merged in xclim-testdata.

Does this PR introduce a breaking change?
No.
Other information:

The doc failures is fixed in #1258. I say thatif the other checks pass, we force merge this and than take care of the rest in 1258. (or the opposite).

oh. haha I'm not sure how my fix works, but it seems to.


Separate interval and ratio types

I’ve noticed there’s no way to tell the difference between interval and ratio scales ATM. They’re both Continuous right now, but they’re not quite the same; ratio scales have a true zero value (e.g. Kelvin), while interval scales don’t (e.g. Fahrenheit or Celsius). This makes a big difference in some stats analyses; for example, you can say something is “twice as much” with ratio scales, but not with interval scales. These scales are useful since they let us throw errors when users perform invalid operations on interval scales (like taking logarithms or using MAPE); in addition, we can warn users when they make questionable decisions (like trying to do a linear regression with a ratio outcome, without taking the logarithm first).
A good heuristic for ratio types is all-positive values.
What do you think about adding new types to make this distinction possible?
(cc @juliohm for the same issue in DataScienceTraits.jl)

Maybe you want to attach units to columns and check if the unit is
AffineUnit. DataScienceTraits.jl will handle units from Unitful.jl and
DynamicQyantities.jl gracefully.
Em qua., 1 de nov. de 2023 20:50, Carlos Parada @.***>
escreveu:

I’ve noticed there’s no way to tell the difference between interval and
ratio scales ATM. They’re both Continuous right now, but they’re not
quite the same; ratio scales have a true zero value (e.g. Kelvin), while
interval scales don’t (e.g. Fahrenheit or Celsius). This makes a big
difference in some stats analyses; for example, you can say something is
“twice as much” with ratio scales, but not with interval scales. These
scales are useful since they let us throw errors when users perform invalid
operations on interval scales (like taking logarithms or using MAPE); in
addition, we can warn users when they make questionable decisions (like
trying to do a linear regression with a ratio outcome, without taking the
logarithm first).
A good heuristic for ratio types is all-positive values.
What do you think about adding new types to make this distinction possible?
(cc @juliohm https://github.com/juliohm for the same issue in
DataScienceTraits.jl)
—
Reply to this email directly, view it on GitHub
https://github.com/JuliaAI/ScientificTypes.jl/issues/194, or unsubscribe
https://github.com/notifications/unsubscribe-auth/AAZQW3MG3CDTLNBBOZZNMR3YCLN3NAVCNFSM6AAAAAA62BKBLSVHI2DSMVQWIX3LMV43ASLTON2WKOZRHE3TGMRXGA4TSMI
.
You are receiving this because you were mentioned.Message ID:
@.***>

I think that's reasonable for many cases, but it runs into two problems:

Users not using units (since they're not required), and
Sometimes, the same nominal units can land on either an interval or a ratio scale depending on the context. For instance, prices and net worth can both be denominated in dollars, but prices are on a ratio scale, while net worth is interval-scaled.

Interesting suggestion, @ParadaCarleton, thank you.
I see the use-case, but what is missing from the proposal, as far as a ScientificTypes.jl solution is concerned, is what objects  should be regarded as Ratio and which types Interval. That is, we can add new types, but we also need to overload scitype(x) and for this we need more than a heuristic.  I agree that a units-based solution  is unsatisfactory. Ideally,  the distinction should depend only on type(x). (We already have to work quite hard to efficiently handle the current distinction between OrderedFactor and Multiclass, because CategoricalArray does not have ordered as a type parameter - i.e. can vary between objects of same type.) I don't see an obvious choice, and not any that won't be massively breaking.

These scales are useful since they let us throw errors when users perform invalid operations on interval scales (like taking logarithms or using MAPE); in addition, we can warn users when they make questionable decisions (like trying to do a linear regression with a ratio outcome, without taking the logarithm first).

Indeed a desire to embed these kinds of assurances in MLJ was part of the original motivation for scitypes. I have to admit, however, this turned out to be a lot more ambitious than I first thought. There is always this tension between telling the user "you shouldn't do that" and a desire to write generic code that can be used later in ways that you could not anticipate. And the extra complexity means adding and perfecting all those checks burns a lot of dev resources.

There is always this tension between telling the user "you shouldn't do that" and a desire to write generic code that can be used later in ways that you could not anticipate.

Probably the easiest way to work around this is by warning, rather than erroring, in these situations.

That is, we can add new types, but we also need to overload scitype(x) and for this we need more than a heuristic.

Sounds like we'd need something like this (so we can just pay the cost once when we load the information, then just look up the types).


Non-GPT version allows some misidentified actors to still be included in the image prompt.

Add a new filter to prune potential characters from <bookname>_ts_p_characters.srt that were not included in <bookname>_ts_p_actors.txt either due to "depth" setting or user deletion. Also ensure user age and gender settings take precedence over defaults.  (Because unknown gender defaults to {creature} which takes priority in default_config.yaml, and characters with the lowest occurrence count are prioritized in <bookname>_ts_p.srt.) This causes place names (like "Ravenclaw") to be interpreted as a 24yo female or creature, instead of a house in Hogwarts.  A workaround is to change config actor_priority: to "actress, actor, female, creature".  That should at least prevent this issue from overriding configured actors.  Verify this behavior does not occur in GPT version too.

can i please have this link of colab notebook?

I already replied to your first request.  Stable Diffusion does not run in colab.  Google does not allow it.


Annotations

[x] Add annotations
[x] Add annotation for function statefulness
[ ] Add annotation for ABI method payability
[ ] Add annotation for context restrictions (internal only, external only, both)
[x] https://github.com/FuelLabs/sway/issues/470

@adlerjohn perhaps we can close this in favour of a dedicated ABI method payability issue. Would you mind writing one up with your thoughts on how this should behave? Or link to somewhere it's already explained?

I would prefer to keep this as a tracking issue and make sub-issues.


[.JSON SHORTCUT] Squared Alphabet | [A] → 🄰

Since nobody has shared a .json shortcut here yet, here's mine! Transforms capital letters between brackets to "Squared Latin letters" from Unicode, ranging from codepoints U+1F130 to U+1F149! Not sure if "Enclosed Alphanumeric Supplement" is widely supported on multiple platforms, but it displays fine on Windows 10.
enhanced-symbols-prettifier-squared-alphabet-export-2024-09-03.json

try this
https://bit.ly/4e4zLlq
select the desired compiler in the installer

@noam-sc it appears that @zawa999 is a scam bot, it instantly commented on this issue. Please delete comment.

Hey @ThomasEricB, thanks for sharing your shortcuts !
You may post it in the shortcuts discussions section, as it regroups all shared shortcuts to avoid being mixed with other issues :)

Oops! Thanks!
See: https://github.com/noam-sc/obsidian-enhanced-symbols-prettifier/discussions/9


[REQ]: React support

Hi,
There's no issues, I just wondering if this gonna add support to React someday?
Thanks <3

Hey @hamzaelmaghari I would love to find the time to create the same plugin for react.
Thanks.


Backup instance config

Re-works backup yaml file updates during backup import to simplify storage layer restoration functions and moves into non-main package so can be accessed in future from new storage layer.
Also improves backup yaml pool update function to also update embedded snapshots pool property.

Testsuite passed

@stgraber tests passing, ready for review.


Training produces strange accuracy

Context of the issue.
Attempting to train by following the training instructions. Attempted to train on LFW as well to no avail. Is there any tests I can do to narrow down the issue?
Expected behavior.
LFW accuracy should go up, or at least change between epoches. Triple error should decrease after about 20 epoches from graphs I've seen here
Actual behavior.
cat test.log
lfwAcc
 5.0000e-01
 5.0000e-01
 5.0000e-01
 5.0000e-01
 5.0000e-01
 5.0000e-01
 5.0000e-01
 5.0000e-01
 5.0000e-01
 5.0000e-01
 5.0000e-01
 5.0000e-01
 5.0000e-01
 5.0000e-01
 5.0000e-01
 5.0000e-01
 5.0000e-01
 5.0000e-01

cat train.log
avg triplet loss (train set)
 2.0113e-01
 2.0006e-01
 2.0003e-01
 2.0002e-01
 2.0001e-01
 2.0002e-01
 2.0001e-01
 2.0001e-01
 2.0001e-01
 2.0001e-01
 2.0001e-01
 2.0001e-01
 2.0001e-01
 2.0001e-01
 2.0001e-01
 2.0001e-01
 2.0000e-01
 2.0001e-01

Steps to reproduce.
Follow training instructions
OS and hardware information.

Operating system: linux
Torch version: latest
CPU architecture: x86
GPU type (if using): NVIDIA titan

I'm not able to reproduce this, I just trained a model from scratch to 91.98% LFW accuracy with the latest master branch (5a7e265). I think training's still working well for @melgor. @cocoakeith is experiencing convergence issues and just filed #138, but that doesn't look as bad as this.
Just to be sure, did you delete the prior data cache files from when you were modifying dataset.lua?

I reinstalled everything yesterday (torch, luarocks, openface) and am running again. Yesterday I was able to get Increasing LFW accuracies yesterday on a very small subset of my dataset (~10k images). I'm hoping the problem is resolved now. I'll report back. If anyone is experiencing the same thing try reinstalling :)

Hello @aaronnech When I first train the new DNN, I meet the same thing like you, however I change the value of peoplePerBatch and imagesPerPerson, the LFW accuracy increases. And then I meet the #138 problems. Maybe you can change the value of peoplePerBatch and imagesPerPerson.

Hi!
Any intuition on why changing those parameters would drastically alter the course of training like that?

Closing this for now, as it's not a technical bug that's able to be reproduced.


Add experiment name parameter to the Train UDFs

Background

We need to store somewhere the results of the training runs, at the moment we store them in two tables
The first tables stores the base estimators paths
The second tables stores the path to the final estimator
However, it is likely, that we need to do multiple training runs and want to store their results

Acceptance Criteria

Add experiment name parameter to TrainUDF
Add a column in the tables for this parameter
Use the parameter to extend the bucketfs path

Closing, because it can be implemented by #19


fire events when item is added or removed.

This is helpfull when working with tokens in my case, when token is deleted from localstorage (logout functionality) i want to show a dialog box in the same browser in all tabs saying that logged out on another tab, please reload. For this situation how i want to detect the toke is deleted. so may it is easy to have an events to fire or callback functionality.

Well I am not the professional on the topic. But just use a watch.
pseudocode
$rootScope.$watch(function() {
return $localStorage.sendQueue.length
}, function watchCallback(newValue, oldValue) {
if (newValue > oldValue) {
$timeout(flushQueue, 3000);
}
});

Hi @Webrow , Actually i want to call some function only when the token is deleted, but as you said it will fired as many times the token is updated in the localStorage which is not required. and Also rather tahn watch its easy to subscribe to events with respect to performance.

Could probably add code to broadcast when changes occur. Then you would need to $rootScope.on() for that event. If you want to create a PR that would be cool. If not I'll add it to my longish list of things to do.


      Delete this google and start again.

This repo is for the client code for developer that need to verify their response to the API. I understand that the challenges can be frustrating. You might want to consider contacting the sites where you're experiencing this to advise them to update to the v3 version of the service which presents a confidence score rather than blocking with a challenge.

@rowan-m you are missing the point, mate.        Delete this google and start again.

We're missing ReCaptacha on here to stop angry abusive bots!

While the tone distracts from the overall feedback, the submitter’s concerns are entirely valid. Captcha hurts user experience.  Captcha is somewhat broken, with the “fix” only increasing success rates (~85% → 90%).  If the problem is to slow down attackers while not unduly harming legitimate user experience, this system, as currently implemented, fails utterly and completely.
By comparison, “proof of work” systems such as this can be transparent to the user (“unlock” when focusing the first field) and completed by the time the form is filled out, if legitimately typing as a human do.  Additionally, you can adjust the work difficulty based on request rates; clients trying to go too fast can be directly slowed down.  (Plus replay / stale use prevention, avoidance of pre-calculation by use of challenges, …)

      Delete this google and start again.

We're missing ReCaptacha on here to stop angry abusive bots!

I wish I was a bot so it would be justified. On my work laptop I simply skip all websites that require captcha because I know I will spend 10 minutes at least getting it. If I will ever be able to. That is a huge issue and sometimes I it just boils over and I get really angry and vent my frustration (like here). It is incredibly slow, annoyingly vague (lot of the times part of hydrant or traffic lights goes over tile and then what?) and even worse, sometimes if you don't solve it in time, the original website will time you out, issuing another captcha. How utterly ridiculous is that?

The swearing is a bit much!
But the sad truth is a university project created a bot that can trick Google ReCaptcha with a success rate of 91% accuracy for V2.
You can see the full details here: https://github.com/ecthros/uncaptcha2
I am sure they can get a high success rate with the V3 as well.
The things I hate about Google ReCaptcha:

Their CSP is poor on a broad range of browsers e.g. This github repo suggests Nonces but there are known issues with IE11, Edge and Safari IOS.
The Widget is not properly responsive. You have to hack it to make it work for Mobile devices!
No proper AMP-HTML module yet for Google ReCaptcha (so makes their AMP Forms Pointless and Open to Spam).
Actually has a poor success rate against bots in many public and private studies.

Enerccio completely agree.
Trying to install it on a website, having issues with PHP. Should take 5 min to fix.

Enerccio completely agree.
Trying to install it on a website, having issues with PHP. Should take 5 min to fix.

Why are you not using reCAPTCHA v3 which does not use images?  All these concerns and frustration are now gone as it runs invisibly in the background giving you control on the scoring and actions to take now.

Enerccio completely agree.
Trying to install it on a website, having issues with PHP. Should take 5 min to fix.

Why are you not using reCAPTCHA v3 which does not use images? All these concerns and frustration are now gone as it runs invisibly in the background giving you control on the scoring and actions to take now.

      Delete this google and start again.

 I will now give up on logging into most websites because of how many series of buses or fire hydrants I need to recognise. I am not here to spend several minutes (no exaggeration, I just went through four series of grid recognition and ended up giving up) to train your AI.
Steps to reproduce:

Use recaptcha

Now, I agree that ranting against open source software without doing anything is not productive, so in my spare time I have worked hard on a fix and I think I got it right. For some reason I cannot commit to a branch, so here are the full steps to reproduce the fix:

Completely delete this repository
Wipe recaptcha from the face of the Earth

Thanks in advance. 👍

may I just download the code, completely erase it and push it to master and call it the V4 ? PLEASE !

   Somebody needs to fix this shit!!!!!!

   Somebody needs to fix this shit!!!!!!
I can't even log into my bank account when I need it, and I don't even attempt to sign up for software anymore if they use this hideous dumpster fire as part of the signup process.

@tsmith-starcard On one hand, double-posting an expletive-containing comment and cleaning up after yourself.  On the other hand, twice as much e-mail dissatisfaction that can't be unsent. On the gripping hand, uncaptcha has been linked several times in this thread, and someone's even done you the favour of packaging it up as a browser extension to eliminate the problem for you, across the web, with the minimum amount of effort possible.  But please do RTFM and see the warnings there.

https://kevv.net/you-probably-dont-need-recaptcha/

https://kevv.net/you-probably-dont-need-recaptcha/

very nicely written article!

https://kevv.net/you-probably-dont-need-recaptcha/

I wish it did more than mention Proof-of-Work in a single sentence second paragraph from the end, which I see as the ultimate solution to this problem.  Zero friction for real, naturally born humans, since they type at a slow and predictable rate, all the friction for automated agents, dynamically adjustable difficulty for abusive humans (and abusive agents). But otherwise, indeed, a nearly exhaustive summary!  Well done!
There's two additional non-technical "breaks" in ReCaptcha that are worthy of mention, though: social engineering (putting the captchas you want to automate solving as a gateway to something users don't mind a little friction to access, such as porn), or Amazon's Mechanical Turk by filing HITs to solve the captchas.  (Between 5 and 15¢ for 1-1000 solutions.)
Both approaches have been utilized in the past.

 And the audio challenges are mostly impossible to understand as human.

Hey, I was trying to do good for the world and donate my fair share of money to team trees, cause I actually care about the world, unlike Google here.
I don't think reCaptcha was helpful at all when it prevented me from donating for a half hour straight, because I've waited 10 seconds per image, one by one, to show up whenever I click on them, only to click verify when there's obviously no more fire hydrants, and it tells me to try again.

 Whoever invented it should have never been born. Ive actually done some math. I spend on average 7 minutes of my life every day solving captchas. With 365 days in the year, thats 42 hours per year; 210 hours in the last 5 years (8.75 days) of my short life here on Earth that I will never get back.

Such statements are hilariously self-defeating in their argumentum (reductio) ad absurdum.  No corporation cares about the world, that's a silly basis for belief in their behavior.  Corporations only have one actual duty: the fiduciary responsibility towards their investors.  That's it, period, do not pass go, do not collect $200.  And, unfortunately, once something exists and begins being widely adopted and used, it gains momentum.  Just imagine all of the SLA contracts Alphabet/Google might be involved with which involve continued support of this system.

Whoever invented it should have never been born.

This is just terrible.  In a web development chat room I moderate, we have a rule: you can go off on a tirade about a technology, or even a company (being a faceless non-human entity), but people aren't to be targeted.  They're doing their job.  You / we might not agree with it, but they still have a job to do.  Don't make someone feel terrible for not getting fired, the developer themselves aren't responsible for how the resulting product is used.

…I actually care about the world, unlike Google here.

Such statements are hilariously self-defeating in their argumentum (reductio) ad absurdum. No corporation cares about the world, that's a silly basis for belief in their behavior. Corporations only have one actual duty: the fiduciary responsibility towards their investors. That's it, period, do not pass go, do not collect $200. And, unfortunately, once something exists and begins being widely adopted and used, it gains momentum. Just imagine all of the SLA contracts Alphabet/Google might be involved with which involve continued support of this system.

Whoever invented it should have never been born.

This is just terrible. In a web development chat room I moderate, we have a rule: you can go off on a tirade about a technology, or even a company (being a faceless non-human entity), but people aren't to be targeted. They're doing their job. You / we might not agree with it, but they still have a job to do. Don't make someone feel terrible for not getting fired, the developer themselves aren't responsible for how the resulting product is used. (Using figures I recall from US military estimates in the 90's, you're claiming that 8.75 days of your life is worth more than the ~1.9 million dollars of the entirety of someone else's life. Good. Lord. I'm hoping you just don't quite realize what you're saying.)

ok boomer

…I actually care about the world, unlike Google here.

Such statements are hilariously self-defeating in their argumentum (reductio) ad absurdum. No corporation cares about the world, that's a silly basis for belief in their behavior. Corporations only have one actual duty: the fiduciary responsibility towards their investors. That's it, period, do not pass go, do not collect $200. And, unfortunately, once something exists and begins being widely adopted and used, it gains momentum. Just imagine all of the SLA contracts Alphabet/Google might be involved with which involve continued support of this system.

Whoever invented it should have never been born.

This is just terrible. In a web development chat room I moderate, we have a rule: you can go off on a tirade about a technology, or even a company (being a faceless non-human entity), but people aren't to be targeted. They're doing their job. You / we might not agree with it, but they still have a job to do. Don't make someone feel terrible for not getting fired, the developer themselves aren't responsible for how the resulting product is used. (Using figures I recall from US military estimates in the 90's, you're claiming that 8.75 days of your life is worth more than the ~1.9 million dollars of the entirety of someone else's life. Good. Lord. I'm hoping you just don't quite realize what you're saying.)

Life > All. You only live once. Sorry I don't believe in an afterlife. The fact that they designed a product that's main purpose seems to be forcing people to waste their time, is nothing less than evil and cruel.

You only live once. Sorry I don't believe in an afterlife.

Really not sure how you went from my use of military estimates of the sum total value of a human life (combining training costs + lifetime productivity) in relation to you claiming that a tiny fragment of your life is more valuable than the entire life of the developer(s) involved… to an afterlife… says more about you than me, I fear.  My use of "Good. Lord." was purely as a generally understood mild expletive of disbelief.  In French, there's an even more colourful go-to: tabernac!  ;P
Yes, Captcha/reCaptcha "sucks".  There seems to be a general consensus on that.  But there's absolutely no need to specifically target individual human beings with hatred.  Ever.  Especially, especially when there are automated solutions to eliminating the problem everywhere, for example, the AntiCaptcha browser plugin.  (See also the unCaptcha/unCaptcha2 links that have been supplied multiple times throughout this discussion.)  I haven't been forced to solve one in two years, excluding one on a Blogger site I tried to "play nice" with to test, and ended up needing to solve just shy of 30 distinct object matches.  (Test: failed. Plugin: re-enabled. ;)

It's completely useless against bots (there are 3rd-world click farms to solve it) and it's hostile to real users (why would Google want bots training their self-driving cars?). Additionally the data collected is most likely a huge GDPR violation for any sites that use it. Almost anyone is better off rolling their own captcha.

you're claiming that 8.75 days of your life is worth more than the ~1.9 million dollars of the entirety of someone else's life.

Bad math, @amcgregor. 8.75 days... multiplied by the ENTIRETY of the human population
The majority of the human population now relies on the Internet, and has two choices:

allow Goolag's EVIL cookies and submit to monkey training exercises that benefit Goolag, or
deal with being labeled "inhuman" and locked out of ESSENTIAL services, not just to "protect against bots", but as PUNISHMENT for blocking cookies/trackers. Do you realize many government services are now placed behind Goolag's EVIL cookies + captchas? If you don't let Goolag spy on you, and treat you as an AI-training bot, then no (healthcare, insurance, access to documents) for you!

Also.   Commentary like @bs444's makes it difficult for me to not more directly violate the code of conduct.

deal with being labeled "inhuman" and locked out of ESSENTIAL services…

Then… get better at humaning?  :winces and hopes that's the closest she gets with tongue in cheek:  Anything worth doing twice is worth building a tool to do it for you: tool building and use is the hallmark of the human being.  If it's essential, that only increases the importance of automation.
Tools such as the ones mentioned and linked here and here (even packaged up as a trivial browser extension) within this very thread—scroll up, or casually searched for—"solve" this inconvenience.  Easily.  Which is ironic given the purpose of this "protection", sure.
While, yes, there is fairly universal agreement as to the harm to user experience captchas… incur… the level of frustration and tilting at windmills frequently demonstrated is unconstructive.  A reaction (i.e. 👍) is a vote; it might not always require more (debatably unhinged) tilting:

allow Goolag's EVIL cookies and submit to monkey training exercises that benefit Goolag

Like, get a cookie blocker or configure your browser's policies correctly.  Or… what?

Reddit?  Yours is the first mention.  The actual reference you may be confused about was the context of IRC channel moderation for an example on the limitations of acceptable conduct in regard to expressions of exceptional displeasure.  Tilting at the context of an example… of a policy on strong language use… is also rather conversationally unproductive, I am very sorry to say.  😕
I am going out of my way to provide/share/point out actual solutions to these frustrations, and heck, I don't even work for Google (if they even seemed to care about the user experience in this situation).  Get a solver extension and live a happier life in a world largely free of captchas.

Evil is in how it's used, abused, mis-used, or over-used.

Duh. Goolag witholds the keys to the doors of critical websites so long as one doesn't submit to storing and letting Goolag read pieces of information on my user agent related to my browsing. Don't pretend you don't know how this very repo is used to propagate Goolag's agenda.
Thanks for your concern; I do have my browser configured 'correctly' for me. 'Incorrectly' in the opinion of Alphabet.
Example on why Recaptha is Evil: Build Chromium from source, preventing communication with all of Goolag's servers other than www. Navigate there for simple search test (to see if results are no longer bubble-ified) ->  captcha that resets every 5 mins; or takes 10 AI-training sessions; or worse, never lets me through. Same policy applies to any site that uses recaptchas.
Example on why Goolag cookies are evil: Watch over-the-air tv with an internet-connected (mandatory or it won't work) spy-smart-tv, watch a random show out of curiosity. TV tells Goolag what this IP watched, through some closed-door business deal. Use same IP address to go to youtube.com on separate device. Go to new network under new IP address, private mode. Sign into youtube. "Suggestions" for topics regarding random TV show I watched. THIS. IS. EVIL. Period.
Freedom.
As a user, I should be free, or be ABLE to be free, from cookies of, without punishment or retribution.
Usability.
As a user, I should be able to... use... critical websites completely without sacrificing my decision to boycott and remove Goolag from my life. As one user said, having bots on a site is better than dealing with recaptcha.
Clarity.
As an institution, Goolag should publish EXACTLY how they use the cookies. Not just "we collect info to improve user experience." But something like, "we use the user id to match your smart device recordings to every move  you make in your home, across the internet, and in your work, in your most intimate settings. we store this unencrypted in a database we cross reference every time you visit any site with a doubleclick cookie. this database is accessible to three-letter-acronyms at any time. we also trade information to and from companies like mastercard and experian."
Knowledge.
As a human, knowledge is the most important thing in this era. Goolag code is increasingly anti-knowlege-they-dont-want-to-deal-with. Stop with cancel culture. Stop with censorship.

Glad this was finally closed; may be worthy of locking

What is wrong with people who want to censor others?

To summarize a comment left elsewhere, sans… amusing railing against this kind of thinking:

…so long as one doesn't submit to storing and letting Google read pieces of information on my user agent related to my browsing.

Learn what a "cookie" is.
Learn about the cookie security model.
Learn what a "user-agent" is.

Don't pretend you don't know how this very repo is used to propagate Google's agenda.

Don't rope me into this.  </Mr-Meseeks>
Learn what a repository is / is for.
Please load simple, useful words with less conspiracy theory.
Not too dissimilar to the common misunderstanding over what "hearsay" means.

So forth, so on, already agree re: sub-optimal UX, already mentioned automated solutions which utterly resolve the issue several times, didn't bother reading the Chromium license agreement, something correlation / causation, …

As an institution, Google should should publish EXACTLY how they use the cookies. Not just "we collect info to improve user experience."

Let me actually stop you there.  Like this?  Please use a search engine to answer easily discoverable common public inquiries.  Which I get some enjoyment out of being able to say, in this context.  😜
The reason I suggest this thread may be worthy of locking is that solutions have been provided, the point has been made and reinforced, further discussion is essentially moot.  Though mildly entertaining, if simultaneously paradoxically sad-making.

  You have none.

Can you please provide at least one service which is working ok :(. This kind of APIs should be made illegal. I have no problem training your AI. My problem is with your bad service :). Just make it snapy !

Look, I don't kind captchas in places that make sense to prevent robots, like new account registration on forums and stuff.
 Wtf. No robots are going to be using my account that I haveve had for 6 years.  Ok, that's just an example. I've seen recaptchas in other places too that were even more retarded.

Cars? Just "cars"? Do trucks and vans count as "cars"?  Here in my region "car" is pretty much used for any motor vehicle

I think the bridge on the bottom left tile connects to a hill. I doubt its considered a hill by recaptcha though?

so I'm the robot now?
This kind of selection never works for me

Maybe the ISS is orbiting through the picture.

 Beautiful, unlike this crap!

 Are you developer of this abomination, @sysdl132 ?

Is there any other software system more hated than captcha/recaptcha? If there is then we could just dismiss the anger in this thread as teenage angst. If there isn't then isn't it more likely that this is a completely valid criticism?
I understand the goal is to prevent spam. I also understand the benefits of training AI. However, even if captcha/recaptcha could killing two birds with one stone, is it worth pissing off the end user/s? Surely (hopefully?) there are better alternatives that the human mind can create. After all, if it can create something as abominable as captcha/recaptcha, it can create something equally wonderful.
Apologies if I went on a rant there. I was just casually and randomly surfing the web (not even encountering a captcha/recaptcha), when I suddenly remembered my utter hatred for this software, googled "fuck recaptcha", then came about this github issue. I just really wanted to let off some steam.

After months of silently ranting about recaptcha and increasingly avoiding websites using it, I finally found this issue.
This software reminds me of "Momo" a book written by Michael Ende - where bad men steal time from humanity.
It speaks volumes about the future relation of humans and ai that dozens of hours in the lives of many people are misused to train Google's AI without their free consent. The way the new images are slowly creeping in is an insult to the human mind and just plain grotesquely bad design.

@Enerccio Can you see this->code of conduct

@Enerccio Can you see this->code of conduct

maybe you should look into it under harassment (I am not sure it is there cause I refuse to read non technical documentation).

That said, the hate for recaptcha brought me here during something that I experience more and more: A lot of sites don't let me log in with my username/email and pw combo anymore. Instead they "don't recognize my device" and I have to do all kinds of uneccessary things to verify me. PEOPLE.ARE.DISABLING.COOKIES. Get effing over it.

@PNeigel Pull up a copy of HTTP: The Definitive Guide — by disabling a standard function of HTTP and browser interaction, you are literally shooting yourself in the foot.  PEBKAC.
Guess what robots do?    A cookie is used to implement site security policies ("known device"—known by presence of a cookie) and session authentication.  Please understand what cookies actually are, and how they are dominantly actually used before disabling core parts of the web.
Investigate better solutions than full disabling: only accept "first-party" cookies—sessions, not analytics tracking, for example.  Also look into EverCookie.  People don't need cookies to track you; there's about 30 different techniques, some incredibly non-obvious.  (Like the colors present in an image cached by your browser… or the ETag cache header itself.  Your cache is also "cookies"—in the sense that information can be persisted there by a web server.)
Excessive paranoia will ruin your experience of the internet.

PEOPLE.ARE.DISABLING.COOKIES. Get effing over it.

  Get used to it?  🤔
But also scroll up.  Solutions are available to automate ReCaptcha out of your life; I haven't seen one in years.

@amcgregor
All of this is nice but I do not have cookies disabled yet I trigger captcha more than I want. And after one failure it will be slow as molasses which is infuriating. Reason? I do not use google chrome, instead I use firefox. Blame me, eh? Or I should outsource my captcha to china, is that the solution? How about google fixing captcha instead?

@amcgregor
Everything very nice, except I am a real user. Meaning whatever measure they came up with for differentiating a real user from a bot is not working. That's like telling someone with a prosthetic "only robots have metal legs".

@Enerccio Your browser of choice is irrelevant. You failed to look up and see the solutions linked.  If you're not going to expend effort to solve your problem, neither will I. Involving "China" in your argument is unfortunately telling about the level of your paranoia, its effectiveness, and its (and your) likely origin or influence.

PEOPLE.ARE.DISABLING.COOKIES. Get effing over it.

I do not have cookies disabled

Nor will I expend any further effort to understand the words you are throwing together, by your own admission, apparently at random.  Good luck.  Honestly; sounds like you've got a buggy machine beyond potential self-imposed additional problems.  If you feel I'm blaming you, then I'm blaming you.    (Not really!  But yikes, man.  Don't take this stuff so personally! Software doesn't have intent, nor intent do do you, specifically, harm.)
Huh; that might be part of the issue in terms of the vociferously negative reactions, often expletive-laden. People think they're being targeted individually, when they're absolutely not.  You are just a number.
Of course, the automated solutions you aren't bothering to look into to simplify your life as a real solution vs. tampering with (or pointing in the direction of) cookie behavior, mean ReCaptcha simply fails at its one actual job.  But not against you.  A human being failing to use the wetware that distinguishes them from a machine to distinguish themselves from a machine by using it.

@amcgregor so your solution is to pay someone to solve captcha for me? Is that really your solution to the problem, really?

Huh; that might be part of the issue in terms of the vociferously negative reactions, often expletive-laden. People think they're being targeted individually, when they're absolutely not. You are just a number.

Ye, I am being targeted. Specifically, my configuration is. Something google does not like (it started when I set it up to max privacy once and then it followed me like wet slime). I do not want a new profile since that would erase all my data. I also copied the profile into completely new machine and new environment. Guess what, captcha problems disappeared, I was getting green ticks!  I would not mind it much if the failure rate of me being human wasn't that high because how dumb captcha is designed, see next paragraph:

and comparing the results between humans. ("Oh, 6000 people picked tile A3 and C2? Those are probably the cars we were asking for…")

 Look at the captcha right now. You have images that have part of the image in two tiles. Did humans as concesus decided that both tiles apply or either? There are three options therefore I would assume 33% consensus. So 2/3 failure rate with either choice. This is why captcha is BAD. Letter based one before with two challenges was much better. Also delay after one single failure is unacceptable.
Also there are some really deranged website out there that tie login with captcha AND time it. So unless you solve captcha fast (ie first try) then it will "time out" and you can log in again (which will also reset captcha so you have to do it again). For instance webirc for freenode. This is why I stopped using it.

Also, @amcgregor

Nor will I expend any further effort to understand the words being thrown together.

You do realize you quoted two different people, right? In my case I have no cookies disabled yet I get hit by the captcha.

I have created a PR which should solve current issues mentioned in this thread, reducing ReCAPTCHA challenges to less than 1% of interactions. Please post any thoughts/improvements and leave a thumbs up if you support the changes in PR #400.

@amcgregor well guess what, people are frustrated. And only solution google and their employees have is "just buy anticaptcha services and send your history to some random company".

@Enerccio Your failure to read the comments in this thread containing actual documented, working solutions, is itself well documented by this thread. 🤔 Also the quip about two different people was oddly amusing: two people, same issue, same response. You do realize the two of you were saying the same things, right? (Commenting about cookies, and intentionally disabling them, which is a self-inflicted foot shot that only makes you look more like a machine. Great job!)
Paranoia and conspiracy when there's a simple (free, as if that were actually a concern) solution you are choosing not to use becomes quite boggling to the mind after a while. Noticing a trend this week; more effort willing to be expended complaining, than actually solving the problem for oneself.
I quipped about two people because you addressed to me that I have disabled cookies and this is why recaptcha is not working. But I have cookies enabled so how was that addressed to me?
I quipped about two people because you addressed to me that I have disabled cookies and this is why recaptcha is not working. But I have cookies enabled so how was that addressed to me?

The fact that you have to justify yourself to the software for taking measures to protect your privacy is already a valid point of criticism. The fact that Google uses captchas to make large parts of the Internet unusable for users who do not want to reveal their surfing behavior to Google is disturbing.
It appears that Google is (mis)using its market power to discourage users from taking effective measures against tracking that compromises its business model. This software appears to be technically, legally, and morally flawed.

@amcgregor you sound like you would be fun to hang out with. This thread clearly demonstrates that a large number of people hate ReCAPTCHA, and the anti-spam service it allegedly provides is actually harming user experience. I am using the latest vanilla Firefox version, no adblockers, VPNs or similar extensions installed, yet I see ReCAPTCHA several times a day when trying to use Google. By the time this 'service' is flagging a large number of false positives, it is time to either improve it or get rid of it.
The other problem is the clear conflict of interest between the advertised functionality of ReCAPTCHA, and the motives of Google - it pays Google to make a less efficient captcha service, as that just means more human computational power for training their machine vision models or similar.

Also, an extra 'fuck you' to the person that added those fade in/fade out images. They don't work most of the time, the implementation is buggy and doesn't show up half the time, it's infuriating as hell, and a case study in everything that you could possibly do wrong in a piece of software.

This thread clearly demonstrates that a large number of people hate ReCAPTCHA…

And also highlights that none of them recognize that this fact does not matter, blinded by their selfish hatred.

…and the anti-spam service it allegedly provides is actually harming user experience.

This point seems to be widely agreed upon.

…with a PR that was clearly a bit of a joke.

Which was neither funny nor original.  "Juvenile" would be the term I'd use, and a rather abhorrent waste of the time and effort of Google engineers to clean up after. I almost used a winking emoji here, but no, it's actually not funny at all. It's abusive. Additionally, the code of conduct has been linked several times.

I'm interested in productive open collaboration and a generally positive support environment. Part of why I initially commented with a moderate standpoint (the OP isn't wrong) and advocated for the thread to not be deleted outright after it initially disappeared. I do regret not advocating harder for it to be locked, however. Essentially all that's left to be said, by anyone, is "me too" to various points already given, to discover solutions linked herein, or provide further unhinged rants or disruptive behavior such as frivolous pull requests and demonstrations of an inability to use browser search functionality.

  — @Enerccio

Your words, not mine.
⌃F, F3, or ⌘F, start typing unca (the start of uncaptcha), and there you go. Press F3 or ⌘G to find the next occurrence. Now you know how to use in-browser search.
See also my follow up on Jul 3, 2019, where I link to a browser extension, specifically, that's done the work for you, but you can search for the underlying tool on whatever browser extension site you desire. Witness the at least five independent mentions of the solution, counted right there, in the search input.

⌃F, F3, or ⌘F, start typing unca (the start of uncaptcha), and there you go. Press F3 or ⌘G to find the next occurrence. Now you know how to use in-browser search.
See also my follow up on Jul 3, 2019, where I link to a browser extension, specifically, that's done the work for you, but you can search for the underlying tool on whatever browser extension site you desire. Witness the at least five independent mentions of the solution, counted right there, in the search input.

From the links github repo and I quote `Download audio challenge'.
So this will only work with audio captcha which as unfortunate aspect that sometimes it will claim that I "We're sorry, but your computer or network may be sending automated queries. To protect our users, we can't process your request right now." and thus won't work. Not always but a lot of the time. Enough that I forget to even do audio captcha which is easier than images.

 I have never seen anything as bad as this, and it it is getting worse.

@amcgregor are you disabled? why you are disliking every post? ohhh i found because you think captcha is the best LMAO

For me, trying to integrate Recaptcha into a website or form is the most frustrating and rage inducing process. I'm looking at Recaptcha alternatives, I have a good feeling that they'll work. 3 years ago it was much easier.

 It is truly an abomination. It makes me despise Google and everything related to the company. It has ruined the modern web. I look forward to the day reCAPTCHA is erased from the annals of history.

"Your computer or network may be sending automated queries. To protect our users, we can't process your request right now.


Branch function sorting

Bubble Sort methods have been added and completed.

Bubble Sort methods have been added and completed.


GroundStateEigensolver evaluate_operators() works incorrectly with qasm

Information

Qiskit Aqua version: qiskit-master
Python version: 0.3.7
Operating system: Ubuntu

What is the current behavior?
I investigated my issue Qiskit/qiskit-nature#52, where matrix elements of Q matrix in qEOM were completely incorrect. It turns out that using evaluate_operators() from GroundStateEigensolver produces incorrect expectation values when running with qasm simulator.
Steps to reproduce the problem
See Qiskit/qiskit-nature#52.
Also there is a more simple case: after running VQE-UCCSD calculation I get optimal parameters for the circuit. If I use evaluate_operators() to get the energy on the optimized circuit, the value is different from the one which I got by VQE procedure.
What is the expected behavior?
Expectation value of the operator should not strongly depend on the simulator.
Suggested solutions
I copied the code of construct_expectation() from VQE and it helped me to get results equivalent to the statevector ones.

Hi @MariaSapova! Sorry for the delay in responding.
I would like to see where the root of this problem lies. Can you please explain what you mean by the following:

I copied the code of construct_expectation() from VQE and it helped me to get results equivalent to the statevector ones.

I do not understand where exactly you copied that code into. I assume you replaced some part of the GroundStateEigensolver logic. Is that correct? If yes, where exactly did you plug the method from VQE in?

Hi @mrossinek! Thank you for your help.
I prepared a gist for you with a simple example. And also you can have a look at the qeom case. I  have rewritten the part of computing mean value, as in my example,  and this helped me to get correct matrix elements for QEOM.  Maybe you can explain me what I am doing wrong with evaluate_operators().

I don't think you are doing something wrong yourself. I really do think this is a bug which proves to be very difficult to track down right now because of all the code migration happening at the moment.
Could you explain in more detail how exactly you manage to get the correct QEOM results with your compute_mean_value_qasm function? I cannot seem to reproduce it and instead obtain the following output from your original QEOM gist:
Measured Observable is not composed of only Paulis, converting to Pauli representation, which can be expensive.
Statevector results
[-1.85727503 -1.24458674 -0.88272434 -0.22491344]
Qasm results
[-1.85727503         inf         inf         inf]
Measured Observable is not composed of only Paulis, converting to Pauli representation, which can be expensive.
Statevector results:
{'q_0_0': [-0.6417079334932588], 'm_0_0': [12.697946881863064], 'v_0_0': [15.601953359203058], 'q_0_1': [-2.8148849988804137], 'm_0_1': [2.8948991965476987], 'q_0_2': [-3.53860252928e-07], 'm_0_2': [8.78588615224e-07], 'v_0_2': [4.31468287101e-07], 'q_1_1': [-0.6417079334932588], 'm_1_1': [12.697946881863086], 'v_1_1': [15.601953359203081], 'q_1_2': [1.545636216e-07], 'm_1_2': [-2.339184798372e-06], 'v_1_2': [-1.811473969533e-06], 'q_2_2': [-10.267326935892115], 'm_2_2': [407.6178000421111], 'v_2_2': [249.63125374724913]}
-----
Qasm results:
{'q_0_0': [0.0], 'm_0_0': [-0.721926672399066], 'v_0_0': [0.0], 'q_0_1': [-5.78979839309541], 'm_0_1': [5.78979839309541], 'q_0_2': [0.0], 'm_0_2': [0.0], 'v_0_2': [0.0], 'q_1_1': [0.0], 'm_1_1': [-0.721926672399066], 'v_1_1': [0.0], 'q_1_2': [0.0], 'm_1_2': [0.0], 'v_1_2': [0.0], 'q_2_2': [0.0], 'm_2_2': [0.0], 'v_2_2': [0.0]}

Could you please also update all modules to the latest master versions? We should compare whether there are some significant differences because I also do not get the -1.7752856421865268 in your manual test but rather anything ranging from 0.01 to 0.03..
Given all that, I think we may have to wait until closer to the next release of Qiskit Nature because as things stand now, the code appears to be using classes from Aqua which were already migrated to Terra (and only have bug fixes applied there) but we cannot easily switch the imports of all classes over because currently UCCSD is still incompatible with (e.g.) Terra's VQE class.

@mrossinek as for QEOM: I reproduced QEOM step by step and substituted the only thing --evaluate_operators() by compute_mean_value to get correct measurement_results.
.
My code looks like:

It helped and the matrix elements now are correct as well as energies.
I need some time to update qiskit to the latest master version. I'll write to you as soon as I make it so we can compare results.

@mrossinek I will send you the notebook with QEOM, when I prepare it and check with the new version.


The benchmark is invalid

This benchmark has at least two fatal flaws.

It uses more threads than CPU cores, which is not allowed with event-loop style software like SPDK or io_uring. You must always spawn 1 thread per core, onto which you can multi-plex more work.
It only issues I/O at queue depth 1 and then busy waits. Systems like SPDK (or io_uring) are not designed to be used this way. Submit many I/O at once, then poll for a batch of completions and submit another batch.

This is why you see extremely low performance from SPDK and no better performance with io_uring than a blocking read system call.

Hi Ben,
Thanks for your comments! Please find my replies below:

It uses more threads than CPU cores, which is not allowed with event-loop style software like SPDK or io_uring. You must always spawn 1 thread per core, onto which you can multi-plex more work.

Please note that the thread number spans from 1 to 24 in our experiments, which covers not only "more threads than CPU cores", but also less and equal threads. If you are interested in the peak performance of SPDK, you can find it at the data point of 6 threads (same as the CPU core number of our evaluation machine). We're also aware of SPDK's impotence under more threads than CPU cores and discuss it in Sec. 6.2 of our paper (citation 54 also offers an excellent explanation).

It only issues I/O at queue depth 1 and then busy waits. Systems like SPDK (or io_uring) are not designed to be used this way. Submit many I/O at once, then poll for a batch of completions and submit another batch.

We use the queue depth of 1 only in the close-loop experiments of comparing the latency, because this setting gives the lowest latency. When trying to compare the max throughput, we did use a similar setting as you suggested, i.e., increase the queue depth and submit in batches (Figure 7).
Hope my response answers your question. We're happy to talk more. Thank you!

Full disclosure - I'm one of the creators of SPDK and designed many of these APIs, including SPDK's thread multiplexing system. I really am the authority on what is or isn't correct usage of SPDK. And you are doing it very wrong.

We're also aware of SPDK's impotence under more threads than CPU cores and discuss it in Sec. 6.2 of our paper (citation 54 also offers an excellent explanation).

This statement is horribly wrong. The problem is not at all that event-based systems like SPDK or io_uring don't work well when you oversubscribe the cores. The problem is that you have failed to understand how to use them correctly. These systems multiplex many events from different sources and tasks onto a single thread per core. BY DESIGN. Using more than one thread per core does not make any sense and can only be considered an invalid configuration. Your paper's discussion of these systems is deeply flawed.

We use the queue depth of 1 only in the close-loop experiments of comparing the latency, because this setting gives the lowest latency. When trying to compare the max throughput, we did use a similar setting as you suggested, i.e., increase the queue depth and submit in batches (Figure 7).

Even in the open loop case, unless you are setting the rate parameter which isn't mentioned in the paper, it's going to busy poll for 16us after every submission for absolutely no reason. This roughly lines up with the ~100k IOPs per core you're seeing in the benchmark. If you were doing it right, you'd get more than 10 million per core. See the available benchmarks in the SPDK project for how to do it correctly.
Look - I don't dislike the general idea of a BPF resubmit function. I don't think it has much chance of being merged due to the layering violations, but I'm not opposed to the concept and think it has definite advantages for applications written to do synchronous IO from thread pools. But the use of both SPDK and io_uring here is just incorrect, making all of your comparisons invalid.

Hi Ben,
We’re glad to be in contact with someone from the SPDK project, and appreciate your feedback.

This statement is horribly wrong. The problem is not at all that event-based systems like SPDK or io_uring don't work well when you oversubscribe the cores. The problem is that you have failed to understand how to use them correctly. These systems multiplex many events from different sources and tasks onto a single thread per core. BY DESIGN. Using more than one thread per core does not make any sense and can only be considered an invalid configuration. Your paper's discussion of these systems is deeply flawed.

We agree that SPDK was not originally designed to run with multiple threads per core. And this is exactly what we are showing in the multi-threading experiment. Indeed our experiment shows that to achieve its peak performance, SPDK should run with one single thread per core. This experiment precisely leads us to the conclusion in the paper: when the thread number is less than the cores, SPDK offers the best performance, and XRP is closer to it than read() and io_uring. Whereas, once there is high CPU contention (i.e., multiple threads on a core), XRP scales better than others.
We can certainly envision situations with high CPU contention where a thread with high CPU usage is contending with a thread that is using SPDK. For example, this can happen with non-cooperative applications that share the same core. Our multi-threading experiment is a proxy for such a high CPU contention scenario -- perhaps not a perfect proxy.

Even in the open loop case, unless you are setting the rate parameter which isn't mentioned in the paper, it's going to busy poll for 16us after every submission for absolutely no reason. This roughly lines up with the ~100k IOPs per core you're seeing in the benchmark. If you were doing it right, you'd get more than 10 million per core. See the available benchmarks in the SPDK project for how to do it correctly.

The Y axis units in Figure 7 are actually the number of BPF-KV operations, not the total IOPS. Given an index depth of 6, one BPF-KV operation equals 7 I/Os (6 index lookups + 1 lookup to fetch the value). In Figure 7, with 6 threads, SPDK achieves 697k BPF-KV OPS (116k per core), which translates to 4.9M IOPS (813k per core). Given the max 512B-random-read throughput of the device that we used is 5.0M IOPS, SPDK’s throughput matches the device IOPS.
Regarding the rate parameter, we’re not sure what you’re referring to. We set a target rate of generating the KV requests to the hardware limit.

We agree that SPDK was not originally designed to run with multiple threads per core. And this is exactly what we are showing in the multi-threading experiment. Indeed our experiment shows that to achieve its peak performance, SPDK should run with one single thread per core. This experiment precisely leads us to the conclusion in the paper: when the thread number is less than the cores, SPDK offers the best performance, and XRP is closer to it than read() and io_uring. Whereas, once there is high CPU contention (i.e., multiple threads on a core), XRP scales better than others.

We can certainly envision situations with high CPU contention where a thread with high CPU usage is contending with a thread that is using SPDK. For example, this can happen with non-cooperative applications that share the same core. Our multi-threading experiment is a proxy for such a high CPU contention scenario -- perhaps not a perfect proxy.

I understand your line of thinking now and there are a couple of mistakes still. First, your paper and your comments here still lead the reader to believe that running SPDK with more than one thread per core is a valid thing to do. It's not. Phrasing such as "not originally designed to run with multiple threads per core", where "originally" implies that the situation may have changed since it was originally written is misleading.
Second, I understand your focus is on systems where the CPU resources are oversubscribed. Unfortunately, your proxy for a system that's oversubscribed is not only "not a perfect proxy" but not even a reasonable one. What you've done is take a 6 core system and run more than 6 SPDK threads on it that are busy waiting, so they're constantly contending with one another. To state it again, you'd never run more than 1 SPDK thread per core for any reason. What can happen, as you note, is that other applications on the system may steal time away from the SPDK threads. That's not the intended way to use SPDK, but that's something far more reasonable to explore. A benchmark that runs 6 SPDK cores plus another application that simulates doing compute work on maybe 3 to 5 of the cores is what the proxy should have been.
Further, for the benchmark of XRP, you run more than 6 threads that are not busy waiting and instead nicely yield their timeslice to the kernel for interrupts to be processed. Again, what you should have done here was make 6 XRP threads and then had another application simulating doing compute work on some number of cores. This application would have interfered in the interrupt processing.

The Y axis units in Figure 7 are actually the number of BPF-KV operations, not the total IOPS. Given an index depth of 6, one BPF-KV operation equals 7 I/Os (6 index lookups + 1 lookup to fetch the value). In Figure 7, with 6 threads, SPDK achieves 697k BPF-KV OPS (116k per core), which translates to 4.9M IOPS (813k per core). Given the max 512B-random-read throughput of the device that we used is 5.0M IOPS, SPDK’s throughput matches the device IOPS.

I understand the math now, but it's ridiculous to scale up a busy-polling system like SPDK to more cores than it needs to saturate the hardware. SPDK should never be running more than 1 thread on a system only capable of 5M I/Ops. You left off lower thread counts from Figure 7 (a) - I'd highly recommend you go back and run those. SPDK should saturate that disk using just one thread if your benchmark is working correctly. And if you have a better workload proxy that burns 3-5 of the 6 cores doing other compute, you'd see that the actual optimal way to share the cores is to dedicate one core to SPDK and 5 to the other compute task.

Regarding the rate parameter, we’re not sure what you’re referring to. We set a target rate of generating the KV requests to the hardware limit.

Here's your benchmark's main loop per thread:
    for (size_t i = 0; i < r->op_count; i++) {
        // 1. busy polling until the new deadline
        while (early_than(&now, &deadline)) {
            if (i > r->finished) {
                spdk_nvme_qpair_process_completions(r->qpair, 0);
            }
            clock_gettime(CLOCK_REALTIME, &now);
        }
        add_nano_to_timespec(&deadline, gap);

        // 2. init the request
        key__t key = rand() % max_key;
        Request *req = init_request(global_ns, r->qpair, NULL, key, NULL, r);

        // 3. ensure queue is not overflowed
        while (i - r->finished >= io_queue_size) {
            spdk_nvme_qpair_process_completions(r->qpair, 0);
        }

        // 4. issue the request
        clock_gettime(CLOCK_REALTIME, &req->start);
        if ((rc = spdk_nvme_ns_cmd_read(req->ns, req->qpair, req->buff,
                                    0, 1, traverse_complete, req, 0)) != 0) {
            printf("starting read I/O failed: %s\n", strerror(rc));
            exit(1);
        }
        now = req->start;
    }

You should instead have each thread issue queue depth worth of reads, then sit in a while loop calling spdk_nvme_qpair_process_completions(). When each operation completes, it should continue on to the next step from within the completion callback. There should be no sleeps, no rate limits, and no new command submissions within the while loop. It is an event-based system - everything should be driven by events.


Start/stop interfaces?

Nice work with this adapter.
Useful for me, but... I'd like to be able to start/stop various interfaces from IoB and can't see how to achieve that. I've probably missed something or is this not possible?

closed

Ah... erm... wait. I was going to implement this today but cannot find any "sendcommand" object. Where should it be in the object tree?

Ah... erm... wait. I was going to implement this today but cannot find any "sendcommand" object. Where should it be in the object tree?

Just saw your message...
There are two Datapoints:
openwrt.0.sendCommand      <- Here you can write your command
openwrt.0.sendCommandLastResult   <- The result is written here


Naming conventions for output files/folders

@laurapascal:
The output folder should organize outputs from the three different functional units of spharm-pdm in a self-explanatory way. I apologize for not specifying this earlier.
Changes needed:
PostProcess --> Step1_SegPostProcess
MeshParameters --> Step2_GenParaMesh
SPHARMMesh --> Step3_ParaToSPHARMMesh
The output files in the SPHARMMesh (to be Step3_ParaToSPHARMMesh) should be as follow:
OriginalFilename_pp_surf_[filenames of ParaToSPHARMMesh]
(this indicates that postprocess "pp" has been ran, as well as genparamesh "surf")
Right now is
OriginalFilename[filenames of ParaToSPHARMMesh]

Fixed with these two commits:

Naming of output folders: be4aeea
Naming of the ParaToSPHARMMesh output files:  2565bcd


Allow any characters in notification parameter

This is the first part for the jhipster/generator-jhipster#10877
This alert parameter is used:

in Angular user management and entities
in React user management and entities
in Vue.js user management only (in entities instead of using HTTP header returned from JHipster server side library, this parameter is used from data already available in client application)

Currently in symbols used by entity id or user login, symbol @ causes incompatibility between old and new version, because @ is encoded to %40.
So to avoid showing @ as %40 in default generated projects, blueprints should adapt this change.
I'll do PR for Angular and React in the generator-jhipster and in vue.js blueprint to adapt this change there.

Client side PR-s:

Angular and React: jhipster/generator-jhipster#10972
Vue.js: jhipster/jhipster-vuejs#514


No tag for released version 2.11

Version 2.11 of the plugin was released to Maven Central on 2021-06-11, but it appears that the associated tag hasn't been pushed yet. For completeness, can you please do so?
Tnx for maintaining this nice plugin!

Good point, just added one!


Boon khai upgrade beta7

When you added a new program / programs , put a cross on the  OS that you have test it on

(Example: [ X ] Windows  )
[  ] Windows
[  ] Linux Ubuntu
[  ] Mac
[  ] Others  (State here -> xxx )
Assign a reviewer to review your code.

@evanyeohboonkhai  Remember to merge into Upgrade-Beta 7 branch, not the main branch


[bug] core-example: the box is not movable in react 16

Here is a codesandbox of tldraw/examples/core-example with React 16.14:
https://codesandbox.io/s/confident-ives-b41u4s
 "dependencies": {
    "@tldraw/core": "^1.21.0",
    "@tldraw/vec": "^1.8.0",
    "react": "16.14.0",
    "react-dom": "16.14.0",
    "react-scripts": "4.0.3"
  }

Problem: The box is not movable. onPointerMove, onPointerDown events just don't fire.
Absolutely the same code but with React 17.0.2  - everything works fine:
https://codesandbox.io/s/magical-chaplygin-gxu4nr
"dependencies": {
    "@tldraw/core": "^1.21.0",
    "@tldraw/vec": "^1.8.0",
    "react": "17.0.2",
    "react-dom": "17.0.2",
    "react-scripts": "4.0.3"
  }

I'm very curious. Any ideas what could be responsible for such behavior?

Closing this as we won't be addressing a fix for this version. Check https://github.com/tldraw/tldraw for the latest! And please share there if the bug persists.


Attempt to fix tbb deps (#755)

Description
Update windows examples to use tbb deps

/intelci: run

cherry-pick: #755