Обновить
20
0
Владимир Столяров@xakep666

Бэкенд разработчик

Отправить сообщение

Если вам не нужен полноценный скриптовый язык, а нужно вычислить выражение, проверить правило, сгенерировать структуру, 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

Можно еще добавить, что фильтр Блума дает возможность свести объединение и пересечение множеств к побитовому "или" и побитовому "и" соответственно. Но при условии, что наборы хеш-функций и длины векторов одинаковы.

Вместо преобразования указателя к 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)
	}
}

А вообще, проблеме с удалением bounds check уже немало лет, https://github.com/golang/go/issues/14808

Вот тут https://github.com/tidwall/hashmap/ есть реализация на основе открытой адресации. Судя по бенчмаркам, оно иногда даже быстрее, чем стандартная мапа. Возможно, это связано с тем, что при последовательном расположении элементов кеш процессора работает эффективнее.

Уже давно существуют смарт-часы со стрелками. Сам такие ношу (Garmin Vivomove Style), кто в первый раз видит, думает, что ничего необычного нет, но потом удивляются.

Go-разработчики договорились

Это, мягко говоря, не совсем так (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. Спокойно работает на обычном домашнем роутере.

Информация

В рейтинге
Не участвует
Откуда
Москва, Москва и Московская обл., Россия
Зарегистрирован
Активность