А как это называется?

А скажите, как называется то чувство, когда ты сначала хуесосишь чувака в твиторе за тупость, а потом видишь его юзерпик в корпоративном чате? И чтобы два раза не вставать — может ли преподаватель курса по алгоритмам и структурам данных иметь наивные эльфийские представления о том, какие именно данные может сохранять гугл, и что хранилка на несколько сот терабайт может поместиться даже в икеевском журнальном столике?

Электронный документооборот

Пока тут Исавнин с Артамоновым кидают друг в друга какахами на хабре из-за дистанционного электронного голосования — реальные электронные сервисы «от государства» выглядят примерно так:

Прекрасно все, особенно ссылка через левый совершенно «сокращатель ссылок» на гуглодиск.

UPD А за «так же» надо вообще убивать.

Имею вопрос

А как играть в бинго 3*4?

Ну и чтоб два раза не вставать — обратите внимание, что непьющий, молодой и неженатый препод — не абьюзер, без этого бинго не складывается. Видимо, предполагается, что можно его захомутать и окольцевать. Заодно напомню, что «молодой преподаватель» по документам минобра — это до 35 лет; но если он доктор наук — то молодым считается до 40.

Что-то #MeToo в этом году никакое

Хотя вот истории про Хохла, могущественного начальника котлопункта просто волшебно хороши. Например:

https://m.vk.com/wall-195334579_801 — вдали от мужа нахуяриться коньяком с тем самым Хохлом, невероятным половым гигантом? Умею, люблю, практикую! Спустя 13 лет мадам стала испытывать по этому поводу некое странное чувство, когда все воспитание говорит тебе, что ты хорошая девочка, а обстоятельства указывают на то, что ты — конченная блядь; в психологии это вроде бы называется фрустрацией и когнитивным диссонансом. Выход? Разумеется, объявить Хохла ужасным абьюзером!

Продолжения (а в MeToo продолжения просто обязательны, без них никак нельзя) менее насыщены сюжетно, но прекрасны своими определениями:

https://m.vk.com/wall-195334579_803 — «Тут очень важно не забывать фигуру и вес слова этого человека на ББС: он там высоко на Олимпе среди прочих богов этого замкнутого места и действительно мановением пальца может сделать жизнь любого нижестоящего человека адом»

https://m.vk.com/wall-195334579_807 — «Хохол — очень харизматичный и могущественный человек, который заведовал всей едой, принимал заказы на доставку с большой земли (продрейс), и который, если ты ведёшь себя хорошо, может привезти тебе сигареты.»

Видать, совсем плохо жилось на биостанции, раз заведующий котлопунктом был «высоко на Олимпе» и ему отдавались за еду и сигареты.

PS Интересно, пропустит ли фейсбук ссылку на пост, где много раз встречается слово «хохол»?

1000 верст, осень 2021

Узнал инсайдерскую информацию про маршрут осенних «1000 верст» в этом году. Информация заключалась в следующем — поедем в город Кашин, один из судейских пунктов будет находиться у проходной ликероводочного завода, а фирменный магазин «Вереска» находится в центре города. Ушел готовиться и смотреть видеоролик с дегустацией кашинских настоек, дичайше котирующихся среди автоспортсменов:

PS Ночевка, совмещенная с традиционным для 1000 верст феерическим бухичем, будет в Рыбинске.

Волшебные константы, часть 2

Мне так понравилось разнообразие мнений по поводу написанного leetspeak-ом слова Bootload (там, где я спер этот скриншот, срач был под полторы сотни комментов), что предлагаю обсудить вот этот кусок кода, 13 лет в практически неизменном виде существующий в довольно популярном опенсорсном проекте:

Хотя… Пожалуй, обсуждать, по какой причине господин Mathieu Lacage старательно расписал enum для разных значений SUBTYPE_CTL_*** и не стал так делать для SUBTYPE_MGT_*** и SUBTYPE_DATA_*** будет довольно скучно (ответ: потому что мудак), а было бы забавней обсудить, как и почему для того, чтобы два байта отослать — я не вру — вот эти два байта октета:

— надо городить аж вот такую фигню:

uint8_t m_ctrlType;     ///< control type
uint8_t m_ctrlSubtype;  ///< control subtype
uint8_t m_ctrlToDs;     ///< control to DS
uint8_t m_ctrlFromDs;   ///< control from DS
uint8_t m_ctrlMoreFrag; ///< control more fragments
uint8_t m_ctrlRetry;    ///< control retry
uint8_t m_ctrlMoreData; ///< control more data
uint8_t m_ctrlWep;      ///< control WEP
uint8_t m_ctrlOrder;    ///< control order

Вообще, я видел три подхода к проблеме заполнения всякого рода "предопределенных" байтовых и битовых структур на C и C++. Подход первый, расточительный, продемонстрирован только что - заводим по полю избыточного, но удобного размера на каждый элемент структуры, а затем пишем две функции Serialize и Deserialize, в которых занимаемся странным байтоебством примерно в таком духе (да, волшебных констант тут налепили много):

uint16_t val = 0;
val |= (m_ctrlType << 2) & (0x3 << 2);
val |= (m_ctrlSubtype << 4) & (0xf << 4);
val |= (m_ctrlToDs << 8) & (0x1 << 8);
val |= (m_ctrlFromDs << 9) & (0x1 << 9);
val |= (m_ctrlMoreFrag << 10) & (0x1 << 10);
val |= (m_ctrlRetry << 11) & (0x1 << 11);
val |= (m_ctrlMoreData << 13) & (0x1 << 13);
val |= (m_ctrlWep << 14) & (0x1 << 14);
val |= (m_ctrlOrder << 15) & (0x1 << 15);
return val;

Вариант второй - экономично-эмбеддерский, выглядит примерно так:

uint16_t frameControl = 0;
frameControl |= (CTL_TYPE_DATA << FRAME_CONTROL_CONTROL_TYPE_OFFSET) & FRAME_CONTROL_CONTROL_TYPE_MASK;
frameControl |= (CTL_SUBTYPE_DATA_QOS << FRAME_CONTROL_CONTROL_SUBTYPE_OFFSET) & FRAME_CONTROL_CONTROL_SUBTYPE_MASK;

ctrlSubtype = (frameControl & FRAME_CONTROL_CONTROL_SUBTYPE_MASK) >> FRAME_CONTROL_CONTROL_SUBTYPE_OFFSET;
/* and so on */

Отличие от предыдущего - мы работаем напрямую с этими двумя байтиками, и это довольно экономично, нам не надо работать с "тяжеловесным" по эмбеддерским меркам объектом с десятком-другим полей, а то и целой ссылкой на vtable (если обратите внимание - функции Serialize и Deserialize виртуальные). Можно обернуть это все в несколько более удобные макросы или inline-функции.

Но неужели для такой стандартной задачи человечество не придумало ничего лучше? Подобного рода херней люди занимаются вот уже несколько десятков лет, и в полувековой давности языке C есть прекрасная штука - битовые поля. В книжке 1984 года The Unix Programming Environment они описывались, как рекомендованный и правильный способ вот этого битоебства. По удобству это напоминает первый способ, с членами структуры, а по экономичности полностью аналогично второму:

struct {
    unsigned int protocolVersion : 2;
    unsigned int type : 2;
    unsigned int subtype : 4;
    unsigned int toDS : 1;
    unsigned int fromDS : 1;
    unsigned int moreFragments : 1;
    unsigned int retry : 1;
    unsigned int powerManagement : 1;
    unsigned int moreData : 1;
    unsigned int protectedFrame : 1;
    unsigned int order : 1;
} frameControl;

frameControl.type = CTL_TYPE_DATA;
frameControl.subtype = CTL_SUBTYPE_DATA_QOS;

ctrlSubtype = frameControl.subtype;
/* and so on */

Но... если на уровне "байтиков" структуры в C и C++ еще как-то предсказуемы (а проблемы с выравниванием обычно решаются с помощью #pragma pack(1)), то вот битовые поля оказываются настолько непредсказуемы, что в книжке Кернигана и Ритчи приведено осторожное предупреждение, а в любом современном учебнике настоятельно рекомендуется ими никогда не пользоваться!

Что-то мне подсказывает, что вовсе не этого хотели Керниган с Ритчи. А что вы порекомендуете?

Давайте поговорим про зарплаты программистов

Прикидывал на пальцах бизнес-модель одного прожектика, много ругался. В процессе пришел к выводу, что «интернет вещей» — это когда у вас офис в симпатичном пригороде Лорьяна с видом на бетонный бункер для немецких подлодок, а если денег хватает только на романтический вид на ТТК — то все то же самое называется «промавтоматика».

Помимо того родился вопрос (точнее, серия вопросов) — вот представьте, что вам надо разделить ФОТ (уже забыли про все налоги «с работодателя», они более-менее учтены) между двумя инженерами — скажем, инженером-конструктором и инженером-электроником и одним программистом. ФОТ у вас, для ровного счета, 480 тысяч рублей в месяц. Все трое сотрудников работают — по времени — примерно одинаково, у всех схожая квалификация и опыт работы.

Вопрос первый: правильно ли будет поделить сумму поровну, 160/160/160?

Вопрос второй: программисты из твитора рассказывают, что получать меньше одной козули (единица измерения зарплат программистов, 300 тысяч рублей в месяц) стыдно, и приводят в пример одного фронтендера. Не будет ли более правильным платить программисту 320, а тем двум неудачникам — по 80?

Вопрос третий: вы решили строить свой стартап в Европе, пересчитали бизнес-модель и распоряжаетесь ФОТом в 9600 евро. Команда та же, но местные, два инженера и программист. Правильно ли будет платить им 3200/3200/3200?

Вопрос четвертый: европейский программист приходит к вам и говорит, что не согласен работать за 3200, а хочет 6400, потому как в Силиконовой долине за ту же работу платят столько. Чемодан-вокзал-Лос Анджелес или 6400/1600/1600?

Вопрос пятый: расставшись с жадным европейским программистом, вы решили вернуть программирование в Россию. Сколько платить местному программисту: 160, 320 или 256 (примерно 3200 евро) тысяч рублей?

Не ходите в околотелеком

Вот уже третий день в твиттере срутся по поводу треда про тестовые задания в Nokia:

https://twitter.com/st_1ena/status/1419689924505260032

Особенно многих удивила озвученная там зарплата (в 2018 году) — предлагали 120 тысяч рублей в месяц. Народ поделился примерно на два лагеря — первые считают, что задания простые, решит любой студент, и с чего бы это студенту платить больше? Вторые — в основном это успешные фронтендеры, у которых единицей измерения зарплаты служит «1 козуля» (вроде бы 300 тысяч рублей в месяц) считают задачи адски сложными, критерии оценки дикими, ну а озвученную зарплату нищенской. Срутся уже три дня, смотреть на это весело.

Сегодня за обедом начал писать «ответ» — тредик о том, что вас ждет после такого собеседования, какие задачки придется решать после его прохождения, и почему все написанное в том треде — реально важно и нужно?

Спойлер — основано на личном опыте ощупывания большого телекомовского слона, к Нокии отношения не имеет, YMMV.

Для начала вспомним модель OSI, которая, как всем известно, не существует. Когда ее упрощают до четырехслойной — то руководствуются простой логикой, все, что ниже IP (то бишь сетевого уровня) — это херня какая-то, проводочки, не заслуживающие внимания. На самом деле там адов зоопарк, от «понятных» и привычных проводного Ethernet и живущего в вашем роутере WiFi до всякой редкой хтони типа 6LoWPAN. Это, кстати, два разных уровня — упрощенно их можно обозвать MAC (medium access control) и PHY (physical); стандарт Ethernet описывает, грубо, один вариант MAC поверх нескольких PHY, WiFi — несколько связок MAC+PHY, 6LoWPAN — один LLC и MAC поверх полутора десятков PHY из IEEE 802.15.4 и даже Bluetooth. PHY — это отдельная песня, а мы сейчас посмотрим на уровень MAC. Издеваться над людьми я не хочу, так что в качестве учебного протокола уровня MAC в современной беспроводной сети возьмем LoRaWAN.

Ну я думаю, вы все ознакомились со стандартом LoRaWAN? Он небольшой, всего-то сотня страничек — так что давайте продолжим. Стандарт — это хорошо, это надежно, можно (теоретически) набрать толпу программистов и начать делать оборудование под этот стандарт. Потом, правда, возникнут вопросы — например, очевидный: LoRa (физический уровень) поддерживает несколько скоростей передачи данных. В LoRaWAN есть механизм ADR, Automatic data rate, с помощью которого сетевой сервер может назначить конечному устройству какую-то скорость.

Вопрос попроще: а как бы нам эту скорость определить правильно? Побольше? Проиграем в дальности (а LoRa — это Long Range, что намекает). Поменьше? Начнутся коллизии при передаче, проиграем в емкости сети (это сколько устройств можно повесить на одну «точку доступа»). Стандарт этот вопрос почти никак не комментирует, предлагая всегда использовать наибольшую скорость из возможных (определяя ее по SNR, например). Но у модуляции LoRa есть очень интересное свойство — передача данных с использованием разных data rate ортогональна. Это значит, что если одно устройство передает данные, допустим, с DR5, а другое — с DR4 — то шлюз примет данные от обоих! И возникает вопрос посложнее — а как назначать data rate устройствам, чтобы максимально использовать вот этот бесплатный бонус?

Уже звучат вопросы — так какие же задачи придется решать после того зверского собеседования в Нокию? Нет, не такие. Вопрос на самом деле уже решен — немного в другой постановке, но идея довольно понятна (если вы осилите 20 страниц настоящего «матана«). Ноучная ноука в виде Евгения Хорова из ИППИ РАН с соавторами понаписала формул, порисовала графиков — и с точки зрения науки, все хорошо, план по публикациям выполнен, можно спать спокойно.

На самом деле между такого рода «академической» наукой и программистами у любого более-менее крупного вендора есть еще прослойка в виде толпы математиков-алгоритмистов (я тут осознанно упрощаю реальное взаимодействие между всеми заинтересованными сторонами — это не так важно), которые должны выцеплять вот такие хорошие идеи, независимо их проверять и дальше передавать программистам. Разумеется, не все так безоблачно — 95% публикаций будет полным говном, неприменимым в реальной жизни — но в принципе, на то эти математики и нужны, чтобы склепать из оставшихся 5% что-то теоретически удобоваримое. «Удобоваримое» — это еще оптимистично, математики на выходе генерят обычно псевдо- или говнокод на ебучих языках типа питона или матлаба; могут выдать полный пиздец на том, что им кажется C++, или просто на отъебись хуйнуть блок-схему:

Не правда ли, все просто и понятно? Попизжено, кстати, вот отсюда: https://arxiv.org/pdf/2010.08860.pdf, это тоже творчество Хорова сотоварищи, но довольно близко к тому, что попадет в руки программистам.

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

Мне так жалко программиста стало, что пойду за пивком схожу.

Пока я за пивком еще не пошел — пизданул тут на днях, что сетевой сервер LoRaWAN можно утоптать ногами в жирный микроконтроллер (хотя таких прецедентов я не знаю) — и мне похуй, спизданул и спизданул, а для руководителя вашего проекта это стало руководством к действию!

Я вернулся, принял пивка, продолжим.

Что проверяют те нокиевские задания и что мы увидим в нашем проекте охуительного сетевого сервера LoRaWAN по цене простого тупого шлюза? Да собственно все то же самое — манипуляции с битиками? Открываем стандарт и смотрим на любой заголовок MAC-уровня. Манипуляции с самописной реализацией половины коллекций из stdlib? Этого в эмбеде полно, кушайте, не обляпайтесь. Если хотите рассказать, как вам в жизни помогает знание std::list — посмотрите на любое scatter-gather DMA и представьте, что это очередь пакетов, которые будут запихиваться в радиомодем «по готовности». Нет, вы не обернете её в привычный список — а манипулировать очередью надо! Что еще? Задачи с неясной изначально постановкой, про которые надо либо спросить, либо додумать? И этого тут предостаточно, посмотрите хотя бы на это произведение математического мозга:

Ученый (в говне моченый) написал «Sort groups by $PLR_g^{QoS}$» (да, именно так и написал) — а ты теперь сам думай, в какую структуру обернуть эти «группы» и как после этого их эффективно отсортировать. Ах да, учоные на словах еще сообщили, что лучше всего этот алгоритм выполнять «как можно чаще» :)

Математиков этот вопрос не волнует — они готовы даже показать симуляционную модель, где сортируют std::list<std::map<std::string, std::list<SomeShit>>> — в типичном случае эта штука займет всю доступную память в вашем устройстве.

И это, считайте, вам еще повезло — потому что ваш коллега вынужден реализовывать сок мозга другого математика, который молодец, читал Кормена и даже может там ткнуть пальцем в алгоритм Хопкрофта-Карпа (поиск паросочетания в двудольном графе). Вы даже можете найти эту штуку в википедии, но она вам не поможет — это еще более ебаный псевдокод, чем напечатан у Кормена. Что вы там говорили по поводу «адаптации алгоритмов, которые сто раз уже реализованы»?

Ну и да, не забываем, что все эти красивости происходят на микроконтроллере, пусть и жирном, с целым МЕГАБАЙТОМ оперативной памяти — а вам надо будет еще упихнуть туда целый TCP/IP стек, возможно, даже готовый — что-то вроде lwIP, но даже от этого не легче. Остается утешать себя тем, что вам досталась простая и понятная вещь — потому что старый стандарт того же WiFi, 802.11-2012 — это 2800 страниц, вот такая упаковка бумаги и еще полпачки:

Я кончил и закурил.

Chateau Tamagne Красностоп 2020

В ближайшем «Перекрестке» найдена альтернатива Mateus в жанре «розавинькое винишко на каждый день» — собственно, сабж. Крайне конкурентоспособно по цене (330 р. vs 450 р. по акции), заодно еще и полноценно игристое. Для девочек очень ОК.

https://kuban-vino.ru/catalog/3456/

Надо бы небольшой срач устроить

А то меня программисты читают, в том числе эмбеддеры :)

Вопрос: можно ли так писать, или надо обязательно написать еще и

#define VERY_MAGIC_BOOTLOADER_CONSTANT 0xB00710AD,

и почему?

08-remove-kebab.patch

10-14 строчки прямо отличные:

https://salsa.debian.org/debian/wxhexeditor/-/blob/master/debian/patches/08-remove-debug.patch#L10

А можно ли патч переименовать из remove debug в remove kebab?

Бесит, блядь

Вот эти товарищи:

https://pizzasushiwok.ru/pizza/pitstsa-dary-morya/

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

Прошло семь лет

11 июня 2014 года:

Директор ФРИИ Кирилл Варламов, пока объяснял, чего удалось достичь за год, расходуя деньги фонда, рассказывал президенту про трехуровневый акселератор, точки кристаллизации, коворкинг… До какого-то момента господин Путин честно слушал. Но потом Кирилл Варламов сказал:

— Развивается интернет вещей, когда к интернету будут подключены не просто мобильные устройства, а вся бытовая техника: может быть, кресло будет подключено через семь лет к интернету. И вся эта информация, она…

— Зачем? — не выдержал господин Путин.

Зачем, он имел в виду, подключать кресло к интернету.

— Может быть, как часто нужно садиться…— смешался господин Варламов.

То есть интернет может рассчитать для человека оптимальное количество посадок в кресло. Что-то здесь предвещало начало бурного стартапа.

Но тут же у него возникла новая идея:

— Например, мерить вес человека изо дня в день.

Президент ничего не ответил.

Но мозговая атака была уже в разгаре и не зависела от его воли.

— Можно ответить про кресло?! — воскликнул генеральный директор Mail.ru Group Дмитрий Гришин.— Кресло, если мерить, сидит человек или не сидит, может экономить еще электроэнергию — в офисах, в больших и крупных компаниях, потому что очень часто бывает, что кондиционирование работает зря — когда людей нет. То есть на самом деле это имеет право на жизнь.

— Ужасно,— вздохнул господин Путин.

В этом комментарии не было осуждения. Но было сожаление.

https://www.kommersant.ru/doc/2490931

Прошло ровно семь лет, а подключенных к интернету кресел не видно, несмотря на все трехуровневые акселераторы с точками кристаллизации. Ужасно — без осуждения, но с сожалением :)

Отправил тут хуйню Доставистой

Я и раньше не испытывал иллюзий относительно этой конторы с юрадресом в Сколково — но в этот раз они переплюнули сами себя!

Итак, если доставка стоит 748 рублей — то вам придет чек от ООО «Портал» на 134 рубля, в интерфейсе «Достависты» можно будет увидеть ссылку на чек от некоего самозанятого на 364, и еще неведомая ебаная хуйня — это 250 рублей «страхования отправления», которые вообще хз кому уходят.

Мне вот прямо интересно — а налоговая по адресам в Сколково принципиально не ходит? Тут сходу видно кучу нарушений, причем обычную бы фирмочку за них выебли бы по полной.

Читал и ржал

https://www.cnews.ru/news/top/2021-04-20_nazvany_samye_neobychnye

Прямо даже не знаю, что смешнее — «редкий и необычный» программист микроконтроллеров или «московская компания» Ventra.