Если вам не нужен полноценный скриптовый язык, а нужно вычислить выражение, проверить правило, сгенерировать структуру, etc., то я бы посоветовал обратить внимание на https://github.com/google/cel-go. Интерпретатор написан на чистом go, неплохо кастомизируется. Крутим в проде больше полугода, полёт нормальный.
Поделюсь тогда и своими результатами по Midea, модель пульта RG10B(B)/BGEF. Из интересного: для выключения нужно отправить специальную комбинацию параметров, а не просто поменять определенный бит, как может показаться. Также для кодирования некоторых параметров используется кастомный код Грея. Зачем такие заморочки, не очень понятно.
С пультами от телевизоров всё довольно просто ещё. Куда интереснее имхо пульты от кондиционеров. Отличаются они тем, что имеют состояние и отпрвляют целиком его при нажатии. Соответственно, надо вычислить, как кодируется режим работы, температура, скорость вентилятора и прочее. Реверсил не так давно такой при помощи Flipper Zero и Excel, собрав в итоге под первый отдельное приложение. Забавное занятие вышло, однако.
Я подобное предусматривал: запуск пропатченного бинарника происходит силами библиотеки, все аргументы пробрасываются без изменений, дополнительно делать ничего не требуется.
Чтобы не мучаться с перезаписью кода в памяти уже работающего приложения, я попробовал другой метод: сделать копию бинарника, в котором тело (даже не всё, хватило самого начала) "оригинальной" функции поменять на JMP в ту, на которую подменяем и запустить уже его с дополнительной переменной. Это делается существенно проще, однако теряется возможность вызвать оригинал. Даже библиотеку написал под это.
У task, в отличие от make, есть огромный плюс - он максимально кроссплатформенный засчет того, что, во-первых, тоже написан на go, а во-вторых - имеет внутри bash интерпретатор, засчет чего скрипты одинаково работают на всех платформах, включая винду.
Попробовать заменить провайдерскую ONU можно модулями, которые упоминаются вот тут https://github.com/Anime4000/RTL960x. Эти модули позволяют прописать все нужные идентификаторы в себя, чтобы от провайдерского терминала было никак не отличить. Но понадобится либо роутер с sfp, либо "медиаконвертер" с sfp.
Более того, он умеет добавлять ключи в ssh-агент, а при блокировке базы удалять. Что, по моему мнению, тоже повышает безопасность, так как с диска его уже не прочитать.
Можно еще добавить, что фильтр Блума дает возможность свести объединение и пересечение множеств к побитовому "или" и побитовому "и" соответственно. Но при условии, что наборы хеш-функций и длины векторов одинаковы.
Вместо преобразования указателя к uintptr лучше использовать https://pkg.go.dev/unsafe#Add (и в описании к Ponter сказано, почему) Получится примерно такое
dstAddr := unsafe.Pointer(&dstPaletted.Pix[0])
srcAddr := unsafe.Add(unsafe.Pointer(&srcRGBA.Pix[0])), 2)
for y := 0; y < imageHeight; y++ {
for x := 0; x < imageWidth; x++ {
*(*uint8)(dstAddr) = *(*uint8)(srcAddr)
dstAddr = unsafe.Add(dstAddr, 1)
srcAddr = unsafe.Add(srcAddr, 4)
}
}
Вот тут https://github.com/tidwall/hashmap/ есть реализация на основе открытой адресации. Судя по бенчмаркам, оно иногда даже быстрее, чем стандартная мапа. Возможно, это связано с тем, что при последовательном расположении элементов кеш процессора работает эффективнее.
Уже давно существуют смарт-часы со стрелками. Сам такие ношу (Garmin Vivomove Style), кто в первый раз видит, думает, что ничего необычного нет, но потом удивляются.
Я сделал так: порты 80, 8080, 8888, 443 tcp и 443 udp для всех адресов, кроме ru, направил в впн. Можно ещё icmp добавить, чтобы корректно работал traceroute. Список ru подсетей берётся тут https://stat.ripe.net/data/country-resource-list/data.json?resource=RU и обновляется периодически по крону. Конкретная реализация - openwrt, wireguard, mwan3, ipset. Спокойно работает на обычном домашнем роутере.
И оно не только у вас https://archive.ph/dvKkB
Если вам не нужен полноценный скриптовый язык, а нужно вычислить выражение, проверить правило, сгенерировать структуру, etc., то я бы посоветовал обратить внимание на https://github.com/google/cel-go. Интерпретатор написан на чистом go, неплохо кастомизируется. Крутим в проде больше полугода, полёт нормальный.
Поделюсь тогда и своими результатами по Midea, модель пульта
RG10B(B)/BGEF. Из интересного: для выключения нужно отправить специальную комбинацию параметров, а не просто поменять определенный бит, как может показаться. Также для кодирования некоторых параметров используется кастомный код Грея. Зачем такие заморочки, не очень понятно.С пультами от телевизоров всё довольно просто ещё. Куда интереснее имхо пульты от кондиционеров. Отличаются они тем, что имеют состояние и отпрвляют целиком его при нажатии. Соответственно, надо вычислить, как кодируется режим работы, температура, скорость вентилятора и прочее. Реверсил не так давно такой при помощи Flipper Zero и Excel, собрав в итоге под первый отдельное приложение. Забавное занятие вышло, однако.
Более того, эти самые арены в Go есть, но экспериментальные и под флагом https://go.dev/src/arena/arena.go
Я подобное предусматривал: запуск пропатченного бинарника происходит силами библиотеки, все аргументы пробрасываются без изменений, дополнительно делать ничего не требуется.
Чтобы не мучаться с перезаписью кода в памяти уже работающего приложения, я попробовал другой метод: сделать копию бинарника, в котором тело (даже не всё, хватило самого начала) "оригинальной" функции поменять на JMP в ту, на которую подменяем и запустить уже его с дополнительной переменной. Это делается существенно проще, однако теряется возможность вызвать оригинал. Даже библиотеку написал под это.
У task, в отличие от make, есть огромный плюс - он максимально кроссплатформенный засчет того, что, во-первых, тоже написан на go, а во-вторых - имеет внутри bash интерпретатор, засчет чего скрипты одинаково работают на всех платформах, включая винду.
Имхо пока что самое понятное и детальное объяснение проблемы установления соединений через NAT и способы ее решения описаны у Tailscale https://tailscale.com/blog/how-nat-traversal-works/.
Чтобы убрать пути, надо использовать флаг -trimpath
Попробовать заменить провайдерскую ONU можно модулями, которые упоминаются вот тут https://github.com/Anime4000/RTL960x.
Эти модули позволяют прописать все нужные идентификаторы в себя, чтобы от провайдерского терминала было никак не отличить.
Но понадобится либо роутер с sfp, либо "медиаконвертер" с sfp.
Более того, он умеет добавлять ключи в ssh-агент, а при блокировке базы удалять. Что, по моему мнению, тоже повышает безопасность, так как с диска его уже не прочитать.
Порекомендую также посмотреть на https://github.com/sourcegraph/conc
субъективно, оказалось удобнее, чем errgroup и semaphore
Возможно еще вот этот проект https://efidroid.org/ вам будет интересен.
Можно еще добавить, что фильтр Блума дает возможность свести объединение и пересечение множеств к побитовому "или" и побитовому "и" соответственно. Но при условии, что наборы хеш-функций и длины векторов одинаковы.
Вместо преобразования указателя к uintptr лучше использовать https://pkg.go.dev/unsafe#Add (и в описании к Ponter сказано, почему)
Получится примерно такое
А вообще, проблеме с удалением bounds check уже немало лет, https://github.com/golang/go/issues/14808
Вот тут https://github.com/tidwall/hashmap/ есть реализация на основе открытой адресации. Судя по бенчмаркам, оно иногда даже быстрее, чем стандартная мапа. Возможно, это связано с тем, что при последовательном расположении элементов кеш процессора работает эффективнее.
Уже давно существуют смарт-часы со стрелками. Сам такие ношу (Garmin Vivomove Style), кто в первый раз видит, думает, что ничего необычного нет, но потом удивляются.
Это, мягко говоря, не совсем так (https://github.com/golang-standards/project-layout/issues/117#issue-854742264).
Я сделал так: порты 80, 8080, 8888, 443 tcp и 443 udp для всех адресов, кроме ru, направил в впн. Можно ещё icmp добавить, чтобы корректно работал traceroute. Список ru подсетей берётся тут https://stat.ripe.net/data/country-resource-list/data.json?resource=RU и обновляется периодически по крону. Конкретная реализация - openwrt, wireguard, mwan3, ipset. Спокойно работает на обычном домашнем роутере.