Долгое время у меня в кабинете на столе жил "Куб управления Aqara" — специальный беспроводной пульт умного дома, который разными жестами позволял совершать разные действия. Но по-настоящему различимых работоспособных жеста было всего 4: поворот на 90, поворот на 180, горизонтальное вращение, встряхнуть. Не хватало еще парочки.
И вот Aqara выпустила новую версию. Хотя на самом деле конечно добавить такую функциональность можно было обновлением прошивки, но маркетинг диктует необходимость продать людям тот же продукт ещё раз. В любом случае, "новая версия" умеет понимать, какой гранью вверх она находится, и отстраивать функцию от этого. В оригинале там на каждой грани нарисованы точки, как на игральной кости. Но я использовал этикеточный принтер (на удивление удачная и полезная покупка для дома) и сделал наклейки. Теперь достаточно повернуть куб нужной картинкой вверх и потрясти, тогда будет включена/выключена, например, люстра, открыты/закрыты шторы, включен рабочий компьютер и так далее. Занял все слоты, удобно.
#gadgets#life
https://wiki.python.org/moin/GlobalInterpreterLock
In #CPython, the #global#interpreter lock, or #GIL, is a mutex that prevents multiple native #threads from executing Python bytecodes at once. This lock is necessary mainly because CPython's memory management is not thread-safe. (However, since the GIL exists, other features have grown to depend on the guarantees that it enforces.)
https://docs.python.org/3/library/atexit.html
The #atexit module defines #functions to #register and #unregister cleanup functions. Functions thus registered are automatically executed upon normal interpreter termination. atexit runs these functions in the reverse order in which they were registered; if you register A, B, and C, at #interpreter#termination time they will be run in the order C, B, A.