Telegram Web Link
Случилось - волевым движением руки перевёл большинство всякого нашего корпоративного хлама с K8S обратно на bare metal (ну точнее на bare os).

Это была какая-то бездумная мода, когда для пары скриптов на питоне создавали образ и пихали в кубик. Кубик конечно штука хорошая, но когда у вас приложение заточено конкретно под кубик и использует все его возможности, а не когда его запихнули туда насильно и заставили использовать недостатки.

В общем, опять здравствуй ansible. Давно не виделись.
👍21
Опять буду ругать Lenovo и все современные ноутбуки. Мы их еще не простили за выпиливание полноценной механической клавы в Thinkpad, а они нам приготовили очередную тонну гадостей.

Система охлаждения. Фирмварь я уже обсирал, но дело не только в фирмвари. Почему я вообще занялся фирмварью? Потому что кулер постоянно фигурно свистел на первой скорости. Можно ли это починить? Можно! Кусок (синей) изоленты размером примерно 2х2 сантиметра на нижнюю решетку воздухозаборника и ничего не свистит. А при общем огромном размере решетки даже не греется.

У меня вопрос - кто-то тестировал решетки на резонансы и свисты, прежде чем поколение уехало в продакшн?

И опять система охлаждения. Прошлые поколения ноутбуков были толщиной в 28-30мм, а то и все 35. У меня до сих пор на столе лежит P17 2017 года выпуска, который холодный как рыба об лед. Но нет, давайте будем уменьшать еще! Я думал Т-серия греется потому что у нее толщина 22мм, но позвольте, Р-серия, которая позиционируется как еще более продакшн - 17 миллиметров! Законы маркетинга окончательно победили законы физики.

Кроме нескольких топовых моделей с Core i9. Там какой-то инженер старой закалки всё-таки пропихнул корпус на 30мм. Может быть даже тайно поменял чертежи перед выпуском, за что уже уволен. Спасибо тебе, добрый человек. Жаль правда на i9 моя жаба еще не заработала.
👍11🔥4👎1
Кто там еще с cargo воевал кстати? У меня cargo запускается так

#!/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. чем не нравится - придется наклеить метку на ноутбук, а она обязательно отвалится

Ваши за-против и свои варианты жду в комментах. Заранее благодарен за любые идеи.
👍5👎1
Недавно поднимали тему. Венгерская нотация - присваивание переменным имен, включающих их тип (напр. u16Counter или strName), в данное время не приветствуется.

Роберт Мартин (автор SOLID и еще десятка книг) в частности объясняет, что нотация широко применялась и была полезна лет 30 назад в Си, когда в SDK массово оперировали raw-указателями. В наше время, когда в современных языках у каждого указателя есть явный тип, это является анахронизмом и запутывает. Кроме того, при изменении типа, приходится переименовывать и переменную, а это не всегда красиво и возможно (еще хуже - не переименовывать).

На слайде - синьер объяснет джуну о недопустимости венгерской нотации в их компании.
😁12👍5🔥1
Если usb 3 - устройство тянет не гигабайт в секунду, а мегабайт 40-50 - виноват кабель. Для высокоскоростных передач нужны кабеля соотв. стандарта, где написано белым по черному 5-10 Gbit

Надо же. Всегда думал что это разводняк, как с золотыми кабелями у аудиофилов.
👍14
В свободное время учу 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 - обождите и почитайте обзоры.
👍7👎1
А, еще вот нашел

int Get_Battery_Info_from_Proc(const int bat_nr, Battery_Info *bat_info, int verbose) {
char filename[4][65], str[100], temp[100];
// ......
assert (findex < 4);
// .....
}

случайно, так как в P15 пять power sources - адаптер, батарейка и три usb-c. Знаете, чье это крОсивое? Это всеми любимый и популярный acpitool.

Софт, который мы юзаем ежедневно, написан через жопу. Мы даже иногда не представляем, через какую жопу.
😁5💩4
Насчёт второго кулера в Thinkpad'ах. API по шине там одно и то же во всех моделях, а вот детектится второй кулер не на всех. P1 Gen4 и P15 Gen2 нет даже в самом свежем ядре.

Так что один из вариантов, чтобы не дампать ACPI и не копаться - просто поставить "жучок". Выкладываю, может кому пригодится. Но гарантий нету, может вообще брикнуть железку (маловероятно, но I2C всякие - они такие, злые и коварные).

https://gist.github.com/divi255/e8b7e6e9c8e001608c36e51f38d7d6f9
👍2
Сколько твержу всем вокруг - да, планшеты можно использовать для отображения интерфейсов, если вам так сильно хочется, но съездите в сервис, заплатите денег и снимите батарею. Иначе такой HMI обязательно через пару лет ебанет в самый непредсказуемый момент. Всё равно ставит каждый второй.

Сегодня снимали такое чудо со стены. Оно даже немножко еще горело. Хорошо что вокруг гореть было нечему, а вдруг бы да?

(картинка для примера)
👍15🔥5
1971й год. Мини-камера на шлеме.
👍11🔥3
Всякие эти книжки "Чистый код" конечно программировать не научат, это скорее программерское НЛП, которое глава за главой тебе повторяет, как чревовещатель "не называй переменные в одну букву, если это не пара исключений, не пиши функции в 500 строчек" и т.д. В принципе, с этим справляется и clippy (в случае Rust), но clippy можно заткнуть рот, а НЛП-чревовещателя ты читаешь сам.

В связи с этим, навеяло, является ли оптимальный код чистым? Не всегда. Помнится, была у меня одна большая консольная тулза на питоне, в которой предсказуемо были блоки для argparser, аля:

parser = sp.add_parser('parser1')
parser.add_argument('a')
parser.add_argument('b')
parser.add_argument('c')


и так далее, для каждой команды. Отдавая код падавану, я строго-настрого запретил оптимизации и потребовал копи-пастать парсеры дальше. Но падаван не удержался и к моменту мержа код преставлял собой идеальный, но совершенно нечитаемый цикл, где аргументы добавлялись по идеальному, но понятному только автору алгоритму из гиганского массива с кучей всяких подмассивов и флажков.

Понятное дело, что мерж не состоялся, а я достал кнут и отобрал пряник.
👍19🔥4
Починил LinkedIn наконец тест. Из 15 вопросов даже ни один дебильный не попался
👍8
Кстати насчёт киосков. Современный мир веб-интерфейсов и браузеров - адЪ эмбеда, потому что браузеры давно стали жирными, жадными и медленными. Мой новый ноутбук довольно тихо себя ведет, пока я компилирую 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.
🔥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 - первое вам просто не даст закастить некастуемое, а второе выбьет красивую ошибку, если внезапно ваша программа будет собрана для системы, к которой еще не приучена.
👍15🔥1
Зарелизили ELBUS 0.2 (это тот самый наш ультра-быстрый IPC-broker), уже можно сказать релиз, проверенный временем и даже немножко уже бегающий кое-где в продакшне.

Поскольку ELBUS оказался таким удобным и удачным, что в последнее время пихаем его в свои софты везде, было принято решение немножко расширить его функционал, чтобы цеплять на брокер не только доверенных клиентов с локалхоста или соседних в кластере, а и "полудоверенных", из локальной сети.

Поэтому в 0.2 появилась, пока простенькая, ААА, которая позволяет:

- ограничить регистрацию внешних клиентов только по определенному списку имен
- разрешить клиентам использовать конкретное имя процесса только с определенных IP/сетей
- возможность урезать клиентов: p2p-сообщения только по вайтлисту, запрет pub/sub, запрет бродкастов (пока запреты полные, вайтлисты добавим по мере надобности, нам пока не надо)
- ограничения апплаются на конкретный сервер, а брокер может иметь сколько угодно серверов
- ААА у клиента можно редактировать динамически, но на сессию права всегда кешируются. поэтому добавлен новый метод Broker::force_disconnect, позволяющий насильно отключить любого клиента с шины

https://elbus.bma.ai/
👍7
Как я профессионально учил английский

Первый год: сдал 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 раз.
👍8
Задали вопрос - а как ты учил английский. Два раза в неделю, с преподавателем, несколько лет.

Учили мы по New Total English, он не скучный и с минимумом дебильных табличек. Но главное конечно найти препада, чтобы и знал язык, и умел учить. Мне повезло, я нашал человека, который в молодости мотался между Англией и Уэльсом, а теперь преподает на инязе. И с этого надо начинать, нет препада - нет языка. Самому конечно тоже можно выучить, но только полным погружением в среду (чешский я, например, никогда не учил, но более-менее общаюсь после 20 лет проживания, хотя часто и неграмотно).

Что могу сказать. Самая дурацкая идея - это учить слова. "Я буду запоминать по 3 новых слова в день" - это всё равно что "я буду запоминать по 3 новых функции Rust", не применяя их нигде на практике. Важна только грамматика, а новые слова можно либо понять на ходу, либо по крайней мере грамотно прочитать, что тоже немало. "Ложных друзей переводчика" (аля intelligent - "интеллигентный" и т.д.) на самом деле не так много.

Надо понимать, что лондонский водопроводчик говорит намного лучше, чем вы. Хотя словарный запас у него может быть даже меньше, а в грамматике он использует полторы прошедших времени из доступных четырех. Зато он умеет применять эти полторы на практике, а вы - нет. Поэтому первое - найдите себе хорошего преподавателя, а второе - практикуйтесь, ходите на митинги, общайтесь с людьми, читайте книги в оригинале.

Грамотный человек знает, когда вместо complicated красиво сказать sophisticated. Но давайте спустимся на землю, на практике слово "хитровыебенный" звучит чаще, чем "утонченный". Даже если вы не водопроводчик, а интеллигент в третьем поколении.

Отдельно насчёт музыки и кинофильмов, в плане для обучения - скорее нет. В английском тоже много своих "скрипка-лиса". Тут скорее наоборот - на определенном уровне вы просто начнете понимать 99% того, что говорят в кино без сабтитров. Особенно когда вам надоест просто учить язык и вы начнете учить акценты.

p.s. что самое сложное было для меня? Посмотреть "Пингвины Мадагаскара" в оригинале. Когда вы начнете понимать, что на самом деле несут Шкипер и Ковальски - вы поймете любого. Гай Ричи с его шпаной нервно курят.
👍16🔥2
2025/10/01 13:29:18
Back to Top
HTML Embed Code: