Случилось - волевым движением руки перевёл большинство всякого нашего корпоративного хлама с K8S обратно на bare metal (ну точнее на bare os).
Это была какая-то бездумная мода, когда для пары скриптов на питоне создавали образ и пихали в кубик. Кубик конечно штука хорошая, но когда у вас приложение заточено конкретно под кубик и использует все его возможности, а не когда его запихнули туда насильно и заставили использовать недостатки.
В общем, опять здравствуй ansible. Давно не виделись.
Это была какая-то бездумная мода, когда для пары скриптов на питоне создавали образ и пихали в кубик. Кубик конечно штука хорошая, но когда у вас приложение заточено конкретно под кубик и использует все его возможности, а не когда его запихнули туда насильно и заставили использовать недостатки.
В общем, опять здравствуй ansible. Давно не виделись.
👍21
Опять буду ругать Lenovo и все современные ноутбуки. Мы их еще не простили за выпиливание полноценной механической клавы в Thinkpad, а они нам приготовили очередную тонну гадостей.
Система охлаждения. Фирмварь я уже обсирал, но дело не только в фирмвари. Почему я вообще занялся фирмварью? Потому что кулер постоянно фигурно свистел на первой скорости. Можно ли это починить? Можно! Кусок (синей) изоленты размером примерно 2х2 сантиметра на нижнюю решетку воздухозаборника и ничего не свистит. А при общем огромном размере решетки даже не греется.
У меня вопрос - кто-то тестировал решетки на резонансы и свисты, прежде чем поколение уехало в продакшн?
И опять система охлаждения. Прошлые поколения ноутбуков были толщиной в 28-30мм, а то и все 35. У меня до сих пор на столе лежит P17 2017 года выпуска, который холодный как рыба об лед. Но нет, давайте будем уменьшать еще! Я думал Т-серия греется потому что у нее толщина 22мм, но позвольте, Р-серия, которая позиционируется как еще более продакшн - 17 миллиметров! Законы маркетинга окончательно победили законы физики.
Кроме нескольких топовых моделей с Core i9. Там какой-то инженер старой закалки всё-таки пропихнул корпус на 30мм. Может быть даже тайно поменял чертежи перед выпуском, за что уже уволен. Спасибо тебе, добрый человек. Жаль правда на i9 моя жаба еще не заработала.
Система охлаждения. Фирмварь я уже обсирал, но дело не только в фирмвари. Почему я вообще занялся фирмварью? Потому что кулер постоянно фигурно свистел на первой скорости. Можно ли это починить? Можно! Кусок (синей) изоленты размером примерно 2х2 сантиметра на нижнюю решетку воздухозаборника и ничего не свистит. А при общем огромном размере решетки даже не греется.
У меня вопрос - кто-то тестировал решетки на резонансы и свисты, прежде чем поколение уехало в продакшн?
И опять система охлаждения. Прошлые поколения ноутбуков были толщиной в 28-30мм, а то и все 35. У меня до сих пор на столе лежит P17 2017 года выпуска, который холодный как рыба об лед. Но нет, давайте будем уменьшать еще! Я думал Т-серия греется потому что у нее толщина 22мм, но позвольте, Р-серия, которая позиционируется как еще более продакшн - 17 миллиметров! Законы маркетинга окончательно победили законы физики.
Кроме нескольких топовых моделей с Core i9. Там какой-то инженер старой закалки всё-таки пропихнул корпус на 30мм. Может быть даже тайно поменял чертежи перед выпуском, за что уже уволен. Спасибо тебе, добрый человек. Жаль правда на i9 моя жаба еще не заработала.
👍11🔥4👎1
Кто там еще с cargo воевал кстати? У меня cargo запускается так
для каждого проекта, если явно не указано, создается автоматом свой таргет в /tdata/targets и ссылка для удобства в текущей папке. в результате рабочий диск и бекапы хотя бы совершенно не захламляются.
а там уже сами решайте - можно на рамдиск, можно на сетевой с дедупом, можно просто на zfs-раздел который никогда не снапшотится или куда хотите.
#!/bin/sh
TARGETS_DIR=/tdata/targets
if [ -z "${CARGO_TARGET_DIR}" ]; then
PROJECT="$(pwd|awk -F/ '{print $NF}')-$(pwd|sha1sum|awk '{print $1}')"
CARGO_TARGET_DIR="${TARGETS_DIR}/${PROJECT}"
export CARGO_TARGET_DIR
rm -rf target
fi
~/.cargo/bin/cargo "$@"
[ -d "${CARGO_TARGET_DIR}" ] && [ ! -d target ] && ln -sf "${CARGO_TARGET_DIR}" target
для каждого проекта, если явно не указано, создается автоматом свой таргет в /tdata/targets и ссылка для удобства в текущей папке. в результате рабочий диск и бекапы хотя бы совершенно не захламляются.
а там уже сами решайте - можно на рамдиск, можно на сетевой с дедупом, можно просто на zfs-раздел который никогда не снапшотится или куда хотите.
👍4
Брейншторм по автоматизации.
С лаптопом и температурой я наконец решил вопрос полностью. В былые времена я еще был геймером и у меня с тех времен осталась супер-подставка Cooler Master, а поскольку времена были былые и безбашенные - в ней честных килограмма 4 алюминия, в результате ноуту скоро понадобится не кулер а подогрев. Ну в целом, компиляция раста мало отличается от геймерства, тем более есть же такая знаменитая игра, с которой часто путают чаты и форумы кодеров, так вот у нас оказывается как минимум одна общая тема.
Но есть нюанс. В подставке есть три кулера, которые стандартно подключались по USB, но это неудобно, поэтому я их никогда собственно и не подключал. Но раз уплочено - надо заюзать. Есть идея эту тему расширить и когда усиленно что-то загружает машину - включать кулера беспроводным способом.
Включать вопрос простой - любая STM32 с wifi его решит. Вопрос в другом - как определять, что лаптоп стоит на столе?
Вариантов несколько:
- встроить в подставку датчик температуры. чем не нравится: будет дальше дуть если лаптоп снят, а это бессмысленно - сама подставка почти не греется
- вставить оптический датчик. чем не нравится - непонятно как будет отрабатывать ночью
- вставить rfid-reader. чем не нравится - придется наклеить метку на ноутбук, а она обязательно отвалится
Ваши за-против и свои варианты жду в комментах. Заранее благодарен за любые идеи.
С лаптопом и температурой я наконец решил вопрос полностью. В былые времена я еще был геймером и у меня с тех времен осталась супер-подставка Cooler Master, а поскольку времена были былые и безбашенные - в ней честных килограмма 4 алюминия, в результате ноуту скоро понадобится не кулер а подогрев. Ну в целом, компиляция раста мало отличается от геймерства, тем более есть же такая знаменитая игра, с которой часто путают чаты и форумы кодеров, так вот у нас оказывается как минимум одна общая тема.
Но есть нюанс. В подставке есть три кулера, которые стандартно подключались по USB, но это неудобно, поэтому я их никогда собственно и не подключал. Но раз уплочено - надо заюзать. Есть идея эту тему расширить и когда усиленно что-то загружает машину - включать кулера беспроводным способом.
Включать вопрос простой - любая STM32 с wifi его решит. Вопрос в другом - как определять, что лаптоп стоит на столе?
Вариантов несколько:
- встроить в подставку датчик температуры. чем не нравится: будет дальше дуть если лаптоп снят, а это бессмысленно - сама подставка почти не греется
- вставить оптический датчик. чем не нравится - непонятно как будет отрабатывать ночью
- вставить rfid-reader. чем не нравится - придется наклеить метку на ноутбук, а она обязательно отвалится
Ваши за-против и свои варианты жду в комментах. Заранее благодарен за любые идеи.
👍5👎1
Недавно поднимали тему. Венгерская нотация - присваивание переменным имен, включающих их тип (напр. u16Counter или strName), в данное время не приветствуется.
Роберт Мартин (автор SOLID и еще десятка книг) в частности объясняет, что нотация широко применялась и была полезна лет 30 назад в Си, когда в SDK массово оперировали raw-указателями. В наше время, когда в современных языках у каждого указателя есть явный тип, это является анахронизмом и запутывает. Кроме того, при изменении типа, приходится переименовывать и переменную, а это не всегда красиво и возможно (еще хуже - не переименовывать).
На слайде - синьер объяснет джуну о недопустимости венгерской нотации в их компании.
Роберт Мартин (автор SOLID и еще десятка книг) в частности объясняет, что нотация широко применялась и была полезна лет 30 назад в Си, когда в SDK массово оперировали raw-указателями. В наше время, когда в современных языках у каждого указателя есть явный тип, это является анахронизмом и запутывает. Кроме того, при изменении типа, приходится переименовывать и переменную, а это не всегда красиво и возможно (еще хуже - не переименовывать).
На слайде - синьер объяснет джуну о недопустимости венгерской нотации в их компании.
😁12👍5🔥1
Если usb 3 - устройство тянет не гигабайт в секунду, а мегабайт 40-50 - виноват кабель. Для высокоскоростных передач нужны кабеля соотв. стандарта, где написано белым по черному 5-10 Gbit
Надо же. Всегда думал что это разводняк, как с золотыми кабелями у аудиофилов.
Надо же. Всегда думал что это разводняк, как с золотыми кабелями у аудиофилов.
👍14
В свободное время учу Erlang и даже на нем пописываю.
Коллеги конечно говорят что пан на старости лет ебанулся, и Erlang не нужен. Конечно не нужен, вряд ли я напишу на нем когда-нибудь что-то для продакшна (хотя, кто знает), тем более когда есть Rust. Но
- такие языки учат не для программинга, а чтобы понимать, как развивались и будут развиваться технологии, точно так же как на инязе учат латынь, хотя на ней не говорят
- Erlang - функциональный язык и как правильно говорят, в нем простые вещи делаются сложно, а сложные - просто. Для работы с функциями там конечно такой инструментал, которому позавидует любой другой
- В Erlang - революционный (1986й год!) для того времени IPC. Сложно написать свой хороший IPC, не зная граблей, по которым уже ходили предки
- Удивительно, но Erlang намного быстрее питона, причем это явно "заслуга" последнего. Это как же так надо было постараться?
Коллеги конечно говорят что пан на старости лет ебанулся, и Erlang не нужен. Конечно не нужен, вряд ли я напишу на нем когда-нибудь что-то для продакшна (хотя, кто знает), тем более когда есть Rust. Но
- такие языки учат не для программинга, а чтобы понимать, как развивались и будут развиваться технологии, точно так же как на инязе учат латынь, хотя на ней не говорят
- Erlang - функциональный язык и как правильно говорят, в нем простые вещи делаются сложно, а сложные - просто. Для работы с функциями там конечно такой инструментал, которому позавидует любой другой
- В Erlang - революционный (1986й год!) для того времени IPC. Сложно написать свой хороший IPC, не зная граблей, по которым уже ходили предки
- Удивительно, но Erlang намного быстрее питона, причем это явно "заслуга" последнего. Это как же так надо было постараться?
👍17🔥2
От Thinkpad T15p я таки избавился, не выдержала душа таких страданий с термалкой. Взамен вычитал, что в штатах ставят в 3см-корпус i7 тоже, поэтому приехал ко мне оттуда P15 Gen2 с абсолютно тем же железом (только видяха квадра).
Поскольку железо одно и тоже, могу сравнить что 3см корпус и 2см - это небо и земля, начиная от размера кулеров, которые гораздо толще и тихие и заканчивая размером в принципе.
Ложка дегтя 1: в P15 установлен жЫрный радиатор и не один, а два кулера. При этом правый живёт на родной IBM-шине, а левый якобы к ней присобачен синхронно, но на практике живёт своей жизнью и постоянно гудит как паровоз, в том числе под шиндовс. Решение проблемы радикальное - отключение кулера к ебене матери. Burn-тесты показывают, что всё вполне живёт на одном, разве что два может быть бы дули гораздо эффективнее, но и так хорошо. Опять же, при размере корпуса и радиатора это не проблема.
Ложка дегтя 2: в P15, в отличие от T15P/P15s[v] есть два дополнительных слота под DRAM (всего 4) и один под M2 SSD. Всё это богатство хранится под клавой и собственным алюминиевым радиатором (на самом деле - обычным боксом), но как только вы рискнете его заполнить - клава начинает моментально греться, а охлаждать нечем - оба кулера далеко, даже если вы не будете отключать тот левый.
Ложка дегтя 3: на IBM-шину кто-то умный вынес некий battery secondary temperature sensor, который даже из холодильника показывает не меньше 75 градусов. В результате все термал-контролы немножко едут крышей (включая первую ложку дегтя, подозреваю).
И еще ложечка от Linux. В ядрах младше 5.13 не работает радио (Intel AX210NGW). На ядра старше 5.13 - не ставится NVidia-драйвер младше 465го. А в NVidia старше 465го включительно - поломано управление яркостью, в том числе для Quadro T1200, которое в комплекте. Поэтому выбор на сегодня - ядро 5.13, и ни шагу в сторону.
Вывод нехороший - Lenovo медленно, но уверенно превратили ThinkPad в жигули. Уже жалею что пожалуй надо было сэкономить и брать Gen1. Так что кто там из читателей ждал Gen3 - обождите и почитайте обзоры.
Поскольку железо одно и тоже, могу сравнить что 3см корпус и 2см - это небо и земля, начиная от размера кулеров, которые гораздо толще и тихие и заканчивая размером в принципе.
Ложка дегтя 1: в P15 установлен жЫрный радиатор и не один, а два кулера. При этом правый живёт на родной IBM-шине, а левый якобы к ней присобачен синхронно, но на практике живёт своей жизнью и постоянно гудит как паровоз, в том числе под шиндовс. Решение проблемы радикальное - отключение кулера к ебене матери. Burn-тесты показывают, что всё вполне живёт на одном, разве что два может быть бы дули гораздо эффективнее, но и так хорошо. Опять же, при размере корпуса и радиатора это не проблема.
Ложка дегтя 2: в P15, в отличие от T15P/P15s[v] есть два дополнительных слота под DRAM (всего 4) и один под M2 SSD. Всё это богатство хранится под клавой и собственным алюминиевым радиатором (на самом деле - обычным боксом), но как только вы рискнете его заполнить - клава начинает моментально греться, а охлаждать нечем - оба кулера далеко, даже если вы не будете отключать тот левый.
Ложка дегтя 3: на IBM-шину кто-то умный вынес некий battery secondary temperature sensor, который даже из холодильника показывает не меньше 75 градусов. В результате все термал-контролы немножко едут крышей (включая первую ложку дегтя, подозреваю).
И еще ложечка от Linux. В ядрах младше 5.13 не работает радио (Intel AX210NGW). На ядра старше 5.13 - не ставится NVidia-драйвер младше 465го. А в NVidia старше 465го включительно - поломано управление яркостью, в том числе для Quadro T1200, которое в комплекте. Поэтому выбор на сегодня - ядро 5.13, и ни шагу в сторону.
Вывод нехороший - Lenovo медленно, но уверенно превратили ThinkPad в жигули. Уже жалею что пожалуй надо было сэкономить и брать Gen1. Так что кто там из читателей ждал Gen3 - обождите и почитайте обзоры.
👍7👎1
А, еще вот нашел
Софт, который мы юзаем ежедневно, написан через жопу. Мы даже иногда не представляем, через какую жопу.
int Get_Battery_Info_from_Proc(const int bat_nr, Battery_Info *bat_info, int verbose) {случайно, так как в P15 пять power sources - адаптер, батарейка и три usb-c. Знаете, чье это крОсивое? Это всеми любимый и популярный acpitool.
char filename[4][65], str[100], temp[100];
// ......
assert (findex < 4);
// .....
}
Софт, который мы юзаем ежедневно, написан через жопу. Мы даже иногда не представляем, через какую жопу.
😁5💩4
Насчёт второго кулера в Thinkpad'ах. API по шине там одно и то же во всех моделях, а вот детектится второй кулер не на всех. P1 Gen4 и P15 Gen2 нет даже в самом свежем ядре.
Так что один из вариантов, чтобы не дампать ACPI и не копаться - просто поставить "жучок". Выкладываю, может кому пригодится. Но гарантий нету, может вообще брикнуть железку (маловероятно, но I2C всякие - они такие, злые и коварные).
https://gist.github.com/divi255/e8b7e6e9c8e001608c36e51f38d7d6f9
Так что один из вариантов, чтобы не дампать ACPI и не копаться - просто поставить "жучок". Выкладываю, может кому пригодится. Но гарантий нету, может вообще брикнуть железку (маловероятно, но I2C всякие - они такие, злые и коварные).
https://gist.github.com/divi255/e8b7e6e9c8e001608c36e51f38d7d6f9
Gist
Thinkpad 2nd fan patch hack for Linux Kernel 5.13. Forces 2nd fan detection and control. Use at your own risk! (confirmed to work…
Thinkpad 2nd fan patch hack for Linux Kernel 5.13. Forces 2nd fan detection and control. Use at your own risk! (confirmed to work on P15 Gen2) - thinkpad_acpi.patch
👍2
Сколько твержу всем вокруг - да, планшеты можно использовать для отображения интерфейсов, если вам так сильно хочется, но съездите в сервис, заплатите денег и снимите батарею. Иначе такой HMI обязательно через пару лет ебанет в самый непредсказуемый момент. Всё равно ставит каждый второй.
Сегодня снимали такое чудо со стены. Оно даже немножко еще горело. Хорошо что вокруг гореть было нечему, а вдруг бы да?
(картинка для примера)
Сегодня снимали такое чудо со стены. Оно даже немножко еще горело. Хорошо что вокруг гореть было нечему, а вдруг бы да?
(картинка для примера)
👍15🔥5
Всякие эти книжки "Чистый код" конечно программировать не научат, это скорее программерское НЛП, которое глава за главой тебе повторяет, как чревовещатель "не называй переменные в одну букву, если это не пара исключений, не пиши функции в 500 строчек" и т.д. В принципе, с этим справляется и clippy (в случае Rust), но clippy можно заткнуть рот, а НЛП-чревовещателя ты читаешь сам.
В связи с этим, навеяло, является ли оптимальный код чистым? Не всегда. Помнится, была у меня одна большая консольная тулза на питоне, в которой предсказуемо были блоки для argparser, аля:
и так далее, для каждой команды. Отдавая код падавану, я строго-настрого запретил оптимизации и потребовал копи-пастать парсеры дальше. Но падаван не удержался и к моменту мержа код преставлял собой идеальный, но совершенно нечитаемый цикл, где аргументы добавлялись по идеальному, но понятному только автору алгоритму из гиганского массива с кучей всяких подмассивов и флажков.
Понятное дело, что мерж не состоялся, а я достал кнут и отобрал пряник.
В связи с этим, навеяло, является ли оптимальный код чистым? Не всегда. Помнится, была у меня одна большая консольная тулза на питоне, в которой предсказуемо были блоки для argparser, аля:
parser = sp.add_parser('parser1')
parser.add_argument('a')
parser.add_argument('b')
parser.add_argument('c')
и так далее, для каждой команды. Отдавая код падавану, я строго-настрого запретил оптимизации и потребовал копи-пастать парсеры дальше. Но падаван не удержался и к моменту мержа код преставлял собой идеальный, но совершенно нечитаемый цикл, где аргументы добавлялись по идеальному, но понятному только автору алгоритму из гиганского массива с кучей всяких подмассивов и флажков.
Понятное дело, что мерж не состоялся, а я достал кнут и отобрал пряник.
👍19🔥4
Кстати насчёт киосков. Современный мир веб-интерфейсов и браузеров - адЪ эмбеда, потому что браузеры давно стали жирными, жадными и медленными. Мой новый ноутбук довольно тихо себя ведет, пока я компилирую Rust, но взрывается обоими кулерами, когда я открываю фейсбучек (для зануд: и в хроме, и в лисе).
Эмбед для гуя - это обычно какой-то arm, навроде cortex-a53 и с 512 мегабайт памяти на борту, 64-128 из которой сожрали под видео. Грузится это всё с какой-то чудо-памяти с random read 20-30 мегабайт в секунду, в общем отличный компьютер для 2002 года, где был тормознутый Netscape 7, зато относительно быстрые IE6 (кривой) и Opera (ровнее). Нет, можно конечно требовать машину получше, но скорее всего скажут что под "эти ваши телевизоры" бюджета мало, а телевизоров надо много.
Запустить на такой машине Chromium или Firefox в режиме киоска - это уйти на обед, пока они грузятся, а потом бегать на перекуры после каждого нажатия кнопки. Поэтому первое что нужно сделать - написать свой браузер под конкретную задачу, благо Webkit присоединяется в 20 строчек, из которых 10 - импорт библиотек и декларация fn main().
Дальше - интереснее. Выбор базовой платформы - безусловно чемпион в легком весе это Alpine. Но там MUSL, а собрать Webkit под MUSL и чтобы он еще и заработал - это специальная олимпиада. Потому что Webkit - это вам не библиотека, которую куда захотел, туда вкомпилял, а целый комплекс разных либ и IPC, со сложными взаимосвязями. Так что сразу советую, лучше судьбу не испытывайте, берите что-то на glibc.
"Что-то на glibc" потребует в свою очередь для вебкита целую тонну тех самых библиотек, которые ручками можно ставить очень долго и печально, поэтому всё равно рано или поздно вы придете к тому, что надо взять какой-нибудь Debian-armhf и слегка его "облегчить" больше минимального инсталла. Можно конечно взять, если проц позволяет, и Debian-aarch64, но опять же не советую, подводных камней там много, 64-битный ARM у обычного пользователя - штука довольно недавняя, так что все дистры на поверку обязательно полусырые, если только вам не гонять голую консоль.
Да, после того как вы всё же запустите этот полуголый glibc с полуголым webkit, вы внезапно обнаружите, что на 32-битном armv7 не работает нормально Webassembly и история будет иметь интересное продолжение. Тут уже вам выбирать - просить у фронт-ендеров легкую версию панели без wasm или всё же трахаться с камнями 64-битов.
Всё вышесказанное можно было бы подытожить тем, что HTML+JS в принципе не очень подходят для разработки промышленных интерфейсов на панелях и давайте разработаем что-то специальное, легкое, под конкретную задачу. Но есть нюанс - ваши фронт-ендеры уже давно всё накодили и клиент не будет платить дважды, он хочет то, что в его 1000$-айфоне и на его 3000$-декстопе иметь в том же виде и на панели за 300$, у которой себестоимость 150 и точка. Причем в 4K, но можно уговорить на FHD.
p.s. альтернативный путь - купить планшеты с андроидом по 200$, заплатить за демонтаж батарей, выслушать нытье о потере гарантии, проебаться несколько месяцев с удаленным управлением, выслушать тонны жалоб от юзеров, что планшет за 200$ с тяжелым веб-приложением нормально не работает (внезапно, да?), выбросить планшеты, пойти возиться с embed.
Эмбед для гуя - это обычно какой-то arm, навроде cortex-a53 и с 512 мегабайт памяти на борту, 64-128 из которой сожрали под видео. Грузится это всё с какой-то чудо-памяти с random read 20-30 мегабайт в секунду, в общем отличный компьютер для 2002 года, где был тормознутый Netscape 7, зато относительно быстрые IE6 (кривой) и Opera (ровнее). Нет, можно конечно требовать машину получше, но скорее всего скажут что под "эти ваши телевизоры" бюджета мало, а телевизоров надо много.
Запустить на такой машине Chromium или Firefox в режиме киоска - это уйти на обед, пока они грузятся, а потом бегать на перекуры после каждого нажатия кнопки. Поэтому первое что нужно сделать - написать свой браузер под конкретную задачу, благо Webkit присоединяется в 20 строчек, из которых 10 - импорт библиотек и декларация fn main().
Дальше - интереснее. Выбор базовой платформы - безусловно чемпион в легком весе это Alpine. Но там MUSL, а собрать Webkit под MUSL и чтобы он еще и заработал - это специальная олимпиада. Потому что Webkit - это вам не библиотека, которую куда захотел, туда вкомпилял, а целый комплекс разных либ и IPC, со сложными взаимосвязями. Так что сразу советую, лучше судьбу не испытывайте, берите что-то на glibc.
"Что-то на glibc" потребует в свою очередь для вебкита целую тонну тех самых библиотек, которые ручками можно ставить очень долго и печально, поэтому всё равно рано или поздно вы придете к тому, что надо взять какой-нибудь Debian-armhf и слегка его "облегчить" больше минимального инсталла. Можно конечно взять, если проц позволяет, и Debian-aarch64, но опять же не советую, подводных камней там много, 64-битный ARM у обычного пользователя - штука довольно недавняя, так что все дистры на поверку обязательно полусырые, если только вам не гонять голую консоль.
Да, после того как вы всё же запустите этот полуголый glibc с полуголым webkit, вы внезапно обнаружите, что на 32-битном armv7 не работает нормально Webassembly и история будет иметь интересное продолжение. Тут уже вам выбирать - просить у фронт-ендеров легкую версию панели без wasm или всё же трахаться с камнями 64-битов.
Всё вышесказанное можно было бы подытожить тем, что HTML+JS в принципе не очень подходят для разработки промышленных интерфейсов на панелях и давайте разработаем что-то специальное, легкое, под конкретную задачу. Но есть нюанс - ваши фронт-ендеры уже давно всё накодили и клиент не будет платить дважды, он хочет то, что в его 1000$-айфоне и на его 3000$-декстопе иметь в том же виде и на панели за 300$, у которой себестоимость 150 и точка. Причем в 4K, но можно уговорить на FHD.
p.s. альтернативный путь - купить планшеты с андроидом по 200$, заплатить за демонтаж батарей, выслушать нытье о потере гарантии, проебаться несколько месяцев с удаленным управлением, выслушать тонны жалоб от юзеров, что планшет за 200$ с тяжелым веб-приложением нормально не работает (внезапно, да?), выбросить планшеты, пойти возиться с embed.
🔥11👍8😁3
Один вопрос на тесте по Rust в Linkedin мне даже понравился:
Что можно кастануть без последствий?
- f32 as f64
- usize as u64
- i32 as i64
Давайте его немножко разберем.
В первом случае мы вроде бы кастим float с меньшей точностью и размером в float с большей. Но в этом и беда - во всех языках низкого уровня 32-битный флоат уже "округлен" до 32 бит, и кастинг до 64 бит может привести к непредсказуемым "хвостам" вида 1.1_f32 as f64 = 1.100000023841858 (или наоборот хлам после кучи девяток вместо нулей). Потерь при этом нету - если мы кастанем f64 обратно, получим то из чего его собирали. А вот операции сравнения и арифметика могут сильно пострадать, да и визуально неприятно. Вообще по флоатам есть целый отдельный стандарт (IEEE 754, кстати применяется и в Rust) - как их грамотно паковать и наоборот. А в разных embed-девайсах, типа тех же датчиков температуры, часто вместо float используют int, "умноженный", скажем на 100, чтобы пользователь снимал целое, а дальше уже делил или умножал во что хотел. Тоже самое кстати рекомендуют использовать и в базах данных, например для валют - в базах хвосты у флоатов это вообще отдельная специальная олимпиада.
Во втором случае мы кастим usize в u64, что по-простецки в принципе правильно - в данный момент у Rust usize может быть либо u32, либо u64. Но это в данный момент, а завтра никто не гарантриует, что usize не станет 128 или 256 бит, или наоборот, тряхнут стариной и добавят target для 16-битных систем.
Так что правильный ответ - только третий.
В целом, такой прямой кастинг - весь зло (см. clippy::cast_lossless), если только вы на 100% уверены, что вы делаете правильно и ошибки быть не может. В остальных случаях, забейте на кастинг вообще и используйте только From/TryFrom - первое вам просто не даст закастить некастуемое, а второе выбьет красивую ошибку, если внезапно ваша программа будет собрана для системы, к которой еще не приучена.
Что можно кастануть без последствий?
- f32 as f64
- usize as u64
- i32 as i64
Давайте его немножко разберем.
В первом случае мы вроде бы кастим float с меньшей точностью и размером в float с большей. Но в этом и беда - во всех языках низкого уровня 32-битный флоат уже "округлен" до 32 бит, и кастинг до 64 бит может привести к непредсказуемым "хвостам" вида 1.1_f32 as f64 = 1.100000023841858 (или наоборот хлам после кучи девяток вместо нулей). Потерь при этом нету - если мы кастанем f64 обратно, получим то из чего его собирали. А вот операции сравнения и арифметика могут сильно пострадать, да и визуально неприятно. Вообще по флоатам есть целый отдельный стандарт (IEEE 754, кстати применяется и в Rust) - как их грамотно паковать и наоборот. А в разных embed-девайсах, типа тех же датчиков температуры, часто вместо float используют int, "умноженный", скажем на 100, чтобы пользователь снимал целое, а дальше уже делил или умножал во что хотел. Тоже самое кстати рекомендуют использовать и в базах данных, например для валют - в базах хвосты у флоатов это вообще отдельная специальная олимпиада.
Во втором случае мы кастим usize в u64, что по-простецки в принципе правильно - в данный момент у Rust usize может быть либо u32, либо u64. Но это в данный момент, а завтра никто не гарантриует, что usize не станет 128 или 256 бит, или наоборот, тряхнут стариной и добавят target для 16-битных систем.
Так что правильный ответ - только третий.
В целом, такой прямой кастинг - весь зло (см. clippy::cast_lossless), если только вы на 100% уверены, что вы делаете правильно и ошибки быть не может. В остальных случаях, забейте на кастинг вообще и используйте только From/TryFrom - первое вам просто не даст закастить некастуемое, а второе выбьет красивую ошибку, если внезапно ваша программа будет собрана для системы, к которой еще не приучена.
👍15🔥1
Зарелизили ELBUS 0.2 (это тот самый наш ультра-быстрый IPC-broker), уже можно сказать релиз, проверенный временем и даже немножко уже бегающий кое-где в продакшне.
Поскольку ELBUS оказался таким удобным и удачным, что в последнее время пихаем его в свои софты везде, было принято решение немножко расширить его функционал, чтобы цеплять на брокер не только доверенных клиентов с локалхоста или соседних в кластере, а и "полудоверенных", из локальной сети.
Поэтому в 0.2 появилась, пока простенькая, ААА, которая позволяет:
- ограничить регистрацию внешних клиентов только по определенному списку имен
- разрешить клиентам использовать конкретное имя процесса только с определенных IP/сетей
- возможность урезать клиентов: p2p-сообщения только по вайтлисту, запрет pub/sub, запрет бродкастов (пока запреты полные, вайтлисты добавим по мере надобности, нам пока не надо)
- ограничения апплаются на конкретный сервер, а брокер может иметь сколько угодно серверов
- ААА у клиента можно редактировать динамически, но на сессию права всегда кешируются. поэтому добавлен новый метод Broker::force_disconnect, позволяющий насильно отключить любого клиента с шины
https://elbus.bma.ai/
Поскольку ELBUS оказался таким удобным и удачным, что в последнее время пихаем его в свои софты везде, было принято решение немножко расширить его функционал, чтобы цеплять на брокер не только доверенных клиентов с локалхоста или соседних в кластере, а и "полудоверенных", из локальной сети.
Поэтому в 0.2 появилась, пока простенькая, ААА, которая позволяет:
- ограничить регистрацию внешних клиентов только по определенному списку имен
- разрешить клиентам использовать конкретное имя процесса только с определенных IP/сетей
- возможность урезать клиентов: p2p-сообщения только по вайтлисту, запрет pub/sub, запрет бродкастов (пока запреты полные, вайтлисты добавим по мере надобности, нам пока не надо)
- ограничения апплаются на конкретный сервер, а брокер может иметь сколько угодно серверов
- ААА у клиента можно редактировать динамически, но на сессию права всегда кешируются. поэтому добавлен новый метод Broker::force_disconnect, позволяющий насильно отключить любого клиента с шины
https://elbus.bma.ai/
👍7
Как я профессионально учил английский
Первый год: сдал TOEFL
Второй год: закончил С1
Третий год: меня стал понимать Google assistant
Первый год: сдал TOEFL
Второй год: закончил С1
Третий год: меня стал понимать Google assistant
👍12😁5💩1
Pub/sub модель можно успешно применять даже для, казалось бы, нетипичных задач.
Допустим, у вас есть ACL вида
path/to/file
path/to/file
...
где элемент пути может иметь некий шаблон "any" (*) или "wildcard" (**).
В таком случае, проверку авторизации доступа к файлу можно унифицировать, превратив ACL в единое subscribe-дерево для единственного клиента (void), а доступ к конкретному файлу выдаётся, как только в дереве нашлась хоть одна "подписка".
Стоит ли использовать деревья для проверки доступа? Уже при 3-5 записях в ACL скорость проверки, по сравнению с анализом списка, возрастает в 2-3 раза. При ACL же, длиной в 100 записей, дерево эффективнее уже в 200-300 раз.
Допустим, у вас есть ACL вида
path/to/file
path/to/file
...
где элемент пути может иметь некий шаблон "any" (*) или "wildcard" (**).
В таком случае, проверку авторизации доступа к файлу можно унифицировать, превратив ACL в единое subscribe-дерево для единственного клиента (void), а доступ к конкретному файлу выдаётся, как только в дереве нашлась хоть одна "подписка".
Стоит ли использовать деревья для проверки доступа? Уже при 3-5 записях в ACL скорость проверки, по сравнению с анализом списка, возрастает в 2-3 раза. При ACL же, длиной в 100 записей, дерево эффективнее уже в 200-300 раз.
👍8
Задали вопрос - а как ты учил английский. Два раза в неделю, с преподавателем, несколько лет.
Учили мы по New Total English, он не скучный и с минимумом дебильных табличек. Но главное конечно найти препада, чтобы и знал язык, и умел учить. Мне повезло, я нашал человека, который в молодости мотался между Англией и Уэльсом, а теперь преподает на инязе. И с этого надо начинать, нет препада - нет языка. Самому конечно тоже можно выучить, но только полным погружением в среду (чешский я, например, никогда не учил, но более-менее общаюсь после 20 лет проживания, хотя часто и неграмотно).
Что могу сказать. Самая дурацкая идея - это учить слова. "Я буду запоминать по 3 новых слова в день" - это всё равно что "я буду запоминать по 3 новых функции Rust", не применяя их нигде на практике. Важна только грамматика, а новые слова можно либо понять на ходу, либо по крайней мере грамотно прочитать, что тоже немало. "Ложных друзей переводчика" (аля intelligent - "интеллигентный" и т.д.) на самом деле не так много.
Надо понимать, что лондонский водопроводчик говорит намного лучше, чем вы. Хотя словарный запас у него может быть даже меньше, а в грамматике он использует полторы прошедших времени из доступных четырех. Зато он умеет применять эти полторы на практике, а вы - нет. Поэтому первое - найдите себе хорошего преподавателя, а второе - практикуйтесь, ходите на митинги, общайтесь с людьми, читайте книги в оригинале.
Грамотный человек знает, когда вместо complicated красиво сказать sophisticated. Но давайте спустимся на землю, на практике слово "хитровыебенный" звучит чаще, чем "утонченный". Даже если вы не водопроводчик, а интеллигент в третьем поколении.
Отдельно насчёт музыки и кинофильмов, в плане для обучения - скорее нет. В английском тоже много своих "скрипка-лиса". Тут скорее наоборот - на определенном уровне вы просто начнете понимать 99% того, что говорят в кино без сабтитров. Особенно когда вам надоест просто учить язык и вы начнете учить акценты.
p.s. что самое сложное было для меня? Посмотреть "Пингвины Мадагаскара" в оригинале. Когда вы начнете понимать, что на самом деле несут Шкипер и Ковальски - вы поймете любого. Гай Ричи с его шпаной нервно курят.
Учили мы по New Total English, он не скучный и с минимумом дебильных табличек. Но главное конечно найти препада, чтобы и знал язык, и умел учить. Мне повезло, я нашал человека, который в молодости мотался между Англией и Уэльсом, а теперь преподает на инязе. И с этого надо начинать, нет препада - нет языка. Самому конечно тоже можно выучить, но только полным погружением в среду (чешский я, например, никогда не учил, но более-менее общаюсь после 20 лет проживания, хотя часто и неграмотно).
Что могу сказать. Самая дурацкая идея - это учить слова. "Я буду запоминать по 3 новых слова в день" - это всё равно что "я буду запоминать по 3 новых функции Rust", не применяя их нигде на практике. Важна только грамматика, а новые слова можно либо понять на ходу, либо по крайней мере грамотно прочитать, что тоже немало. "Ложных друзей переводчика" (аля intelligent - "интеллигентный" и т.д.) на самом деле не так много.
Надо понимать, что лондонский водопроводчик говорит намного лучше, чем вы. Хотя словарный запас у него может быть даже меньше, а в грамматике он использует полторы прошедших времени из доступных четырех. Зато он умеет применять эти полторы на практике, а вы - нет. Поэтому первое - найдите себе хорошего преподавателя, а второе - практикуйтесь, ходите на митинги, общайтесь с людьми, читайте книги в оригинале.
Грамотный человек знает, когда вместо complicated красиво сказать sophisticated. Но давайте спустимся на землю, на практике слово "хитровыебенный" звучит чаще, чем "утонченный". Даже если вы не водопроводчик, а интеллигент в третьем поколении.
Отдельно насчёт музыки и кинофильмов, в плане для обучения - скорее нет. В английском тоже много своих "скрипка-лиса". Тут скорее наоборот - на определенном уровне вы просто начнете понимать 99% того, что говорят в кино без сабтитров. Особенно когда вам надоест просто учить язык и вы начнете учить акценты.
p.s. что самое сложное было для меня? Посмотреть "Пингвины Мадагаскара" в оригинале. Когда вы начнете понимать, что на самом деле несут Шкипер и Ковальски - вы поймете любого. Гай Ричи с его шпаной нервно курят.
👍16🔥2