Мне нравится, как торгует Beckhoff. Например TF6701 - солидно, надёжно, чувствуется чугун под маркировкой, минимум тонна.
А вообще это просто MQTT плагин под Twincat. Но учитывая, кто клиенты, им тоже нравится.
Оборот компании кстати вырос за последние 5 лет с 700 миллионов до 1,5 миллиарда. Учитесь торговать!
А вообще это просто MQTT плагин под Twincat. Но учитывая, кто клиенты, им тоже нравится.
Оборот компании кстати вырос за последние 5 лет с 700 миллионов до 1,5 миллиарда. Учитесь торговать!
👍5😁1
Segment@tion fault
Интересно, только меня Google Play постоянно бесит? У нас только специфические B2B-аппки, причем они апдейтятся раз в 100 лет. По этой причине у нас нет специального человека, который этим занимается и знает все веяния моды. Ладно там гугл периодически требует…
Перевели все апки на свой F-Droid, теперь со злорадной улыбкой наблюдаю, как Google Play все больше исходит на говно, требуя заполнить очередные формы, ставит дедлайны, потом сам их отменяет, просит, требует, угрожает.
ГП ПНХ
ГП ПНХ
👍25😁7
Если вы верите, что у вас есть душа, то придется поверить, что бог - типичный промышленный инженер.
Человек задумывался как автономная система с биокомпьютером внутри. Но перед релизом выяснили, что без оператора он не работает.
Человек задумывался как автономная система с биокомпьютером внутри. Но перед релизом выяснили, что без оператора он не работает.
😁30👍5
Немного истории современного IoT.
Протокол MQTT - уже старичок, ему в этом году стукнуло 25 лет. Разработал его в 1999 британский инженер Энди Стенфорд-Кларк, для проекта IBM по распределенной SCADA-платформе, которая управляла нефтепроводами.
Никто уже не помнит, чьи это были нефтепроводы и что это была за SCADA, так бы забыли и протокол. Знаменитым он стал случайно - когда в конце нулевых автор подключил свою самодельную систему умного дома к Twitter и привлек этим внимание прессы.
Сейчас MQTT - де-факто стандарт pub/sub коммуникаций, особенно в распределенной автоматизации. Тоесть у вас конечно может быть и свой pubsub, но MQTT поддерживать вы обязаны.
Энди же продолжает карьеру в IBM, последние 7 лет занимая позицию CTO в британском филиале корпорации.
Протокол MQTT - уже старичок, ему в этом году стукнуло 25 лет. Разработал его в 1999 британский инженер Энди Стенфорд-Кларк, для проекта IBM по распределенной SCADA-платформе, которая управляла нефтепроводами.
Никто уже не помнит, чьи это были нефтепроводы и что это была за SCADA, так бы забыли и протокол. Знаменитым он стал случайно - когда в конце нулевых автор подключил свою самодельную систему умного дома к Twitter и привлек этим внимание прессы.
Сейчас MQTT - де-факто стандарт pub/sub коммуникаций, особенно в распределенной автоматизации. Тоесть у вас конечно может быть и свой pubsub, но MQTT поддерживать вы обязаны.
Энди же продолжает карьеру в IBM, последние 7 лет занимая позицию CTO в британском филиале корпорации.
🔥21👍8
Мне не очень нравится, что в 2024 году в Linux до сих пор огромная часть секьюрити делается через POSIX user db.
Это хорошо работало для толстых серверов, тем более если там не просто процессы под юзерами, а реальные юзеры заходили. А теперь ту же схему пытаются натягивать, как сову на глобус, на десктопные машины, дешевые дроплеты и тонкие контейнеры. Тем более, в Linux уже 17(!) лет как есть cgroups.
Посмотрите на ядро NT. Там по факту всего 3 уровня - 1) юзер 2) админ, если юзер дебил и 3) system, если дебил админ. Ну в шиндовс решили что админ - дебил по-умолчанию, это уже конкретный случай имплементации. Есть четкая система иерархии и никто не задумывал юзеров, под которыми работают системные сервисы. Потом, вместо того чтоб завести сендбоксы, тоже начали натягивать сову, но это уже следствие.
Хороший пример правильной реализации - Android. Плохой - всё остальное. Хотя я совершенно андроида не фанат. Это просто факт.
Это хорошо работало для толстых серверов, тем более если там не просто процессы под юзерами, а реальные юзеры заходили. А теперь ту же схему пытаются натягивать, как сову на глобус, на десктопные машины, дешевые дроплеты и тонкие контейнеры. Тем более, в Linux уже 17(!) лет как есть cgroups.
Посмотрите на ядро NT. Там по факту всего 3 уровня - 1) юзер 2) админ, если юзер дебил и 3) system, если дебил админ. Ну в шиндовс решили что админ - дебил по-умолчанию, это уже конкретный случай имплементации. Есть четкая система иерархии и никто не задумывал юзеров, под которыми работают системные сервисы. Потом, вместо того чтоб завести сендбоксы, тоже начали натягивать сову, но это уже следствие.
Хороший пример правильной реализации - Android. Плохой - всё остальное. Хотя я совершенно андроида не фанат. Это просто факт.
👍13👎5😁2
https://github.com/TimonPost/cargo-dependency-inheritor - неплохая простая тулза для наведения порядка с зависимостями в воркспейсах.
Workspace dependencies появились в Rust больше года назад, но в старых воркспейсах зависимости из крейтов в общие волшебным образом конечно не переехали. Я месяцами смотрел на один свой воркспейс с 34 мемберами и думал наконец навести там порядок, а тулза справилась за пару секунд.
В общем, рекомендую. Можно также гонять уже по "новым" воркспейсам - тоже найдет, где навставляли одинаковых крейтов и перенесет в общий Cargo.toml.
p.s. не всегда умеет работать с зависимостями по path. если падает - закомментировать, прогнать, раскомментировать.
Workspace dependencies появились в Rust больше года назад, но в старых воркспейсах зависимости из крейтов в общие волшебным образом конечно не переехали. Я месяцами смотрел на один свой воркспейс с 34 мемберами и думал наконец навести там порядок, а тулза справилась за пару секунд.
В общем, рекомендую. Можно также гонять уже по "новым" воркспейсам - тоже найдет, где навставляли одинаковых крейтов и перенесет в общий Cargo.toml.
p.s. не всегда умеет работать с зависимостями по path. если падает - закомментировать, прогнать, раскомментировать.
🔥8👍3😁1💩1
Сегодня буду ругать каналы, и не только в Rust.
Каналы - они хорошо, когда вы пишете какое-нибудь приложение, которое что-то куда-то складывает. Запустил канальчик, с одной стороны вебсокет принимает, с другой в базу пишется. Забился канал - вебсокет подождет: "эй, на той стороне - обождите! в очередь, сукины дети"
Каналы - они плохо, когда их начинают совать в системы реального времени. Почему? Потому что в системе реального времени нам наплевать, в каком состоянии она была секунду назад, нам важно знать что происходит сейчас. Какая нам разница, сколько показывал датчик температуры, если мы его не складываем в базу? Никакой. Нам надо прямо сейчас - или у нас потепление, или похолодание, и принять меры.
Поэтому в системах реального времени все задачи решаются через shared context. Один воркер значит кидает в регистр значение датчика, а другой берет. Значение всегда свежее, никаких очередей, а что там раньше было - да кому какое дело.
Но это не значит, что в системах реального времени не бывает задач, для которых нужны каналы. А вдруг мы, допустим, пишем лог? Уже желательно канал. А вдруг у нас классический пример робота - vending machine. Нам совершенно наплевать, какие кнопки по выбору товара нажимал юзер, нам нужна последняя. При этом нам (а особенно юзеру) не наплевать, сколько и каких он закинул монет в приемник.
Такую задачу уже либо классически решаем через shared context, только упражняемся с математикой и задрачиваем jitter, чтоб не пропустить монетку. Либо скрещиваем ежа с ужом, там канал - тут контекст, а потом пытаемся во всем этом разобраться.
Хотя всё можно было бы решать через каналы. Можно, но нельзя. Потому что какой-то надмозг когда-то придумал что в каналах сендеры - существа совершенно бесправные и должны, сукины дети, стоять в очереди. Или отвалить. Еще хорошо если им дадут посмотреть большая ли она, а может и не дадут.
std::sync::mpsc я даже не рассматриваю, там не каналы а порнография для детей старшего дошкольного и младшего школьного возраста. Возьмем crossbeam. Или async_channel. Или любой другой популярный, уважаемый крейт.
Ни в одном нет для отправителя force send. Нет возможности очистить канал, если получатель затупил. Нет возможности пушнуть в полный канал, чтобы последнее значение оттуда вывалилось.
Чтобы сделать такую элементарную операцию, нам нужно идти через жопу - иметь под рукой клон receiver'а и вычистить его самостоятельно. Других вариантов у нас не имеется.
Каналы - они хорошо, когда вы пишете какое-нибудь приложение, которое что-то куда-то складывает. Запустил канальчик, с одной стороны вебсокет принимает, с другой в базу пишется. Забился канал - вебсокет подождет: "эй, на той стороне - обождите! в очередь, сукины дети"
Каналы - они плохо, когда их начинают совать в системы реального времени. Почему? Потому что в системе реального времени нам наплевать, в каком состоянии она была секунду назад, нам важно знать что происходит сейчас. Какая нам разница, сколько показывал датчик температуры, если мы его не складываем в базу? Никакой. Нам надо прямо сейчас - или у нас потепление, или похолодание, и принять меры.
Поэтому в системах реального времени все задачи решаются через shared context. Один воркер значит кидает в регистр значение датчика, а другой берет. Значение всегда свежее, никаких очередей, а что там раньше было - да кому какое дело.
Но это не значит, что в системах реального времени не бывает задач, для которых нужны каналы. А вдруг мы, допустим, пишем лог? Уже желательно канал. А вдруг у нас классический пример робота - vending machine. Нам совершенно наплевать, какие кнопки по выбору товара нажимал юзер, нам нужна последняя. При этом нам (а особенно юзеру) не наплевать, сколько и каких он закинул монет в приемник.
Такую задачу уже либо классически решаем через shared context, только упражняемся с математикой и задрачиваем jitter, чтоб не пропустить монетку. Либо скрещиваем ежа с ужом, там канал - тут контекст, а потом пытаемся во всем этом разобраться.
Хотя всё можно было бы решать через каналы. Можно, но нельзя. Потому что какой-то надмозг когда-то придумал что в каналах сендеры - существа совершенно бесправные и должны, сукины дети, стоять в очереди. Или отвалить. Еще хорошо если им дадут посмотреть большая ли она, а может и не дадут.
std::sync::mpsc я даже не рассматриваю, там не каналы а порнография для детей старшего дошкольного и младшего школьного возраста. Возьмем crossbeam. Или async_channel. Или любой другой популярный, уважаемый крейт.
Ни в одном нет для отправителя force send. Нет возможности очистить канал, если получатель затупил. Нет возможности пушнуть в полный канал, чтобы последнее значение оттуда вывалилось.
Чтобы сделать такую элементарную операцию, нам нужно идти через жопу - иметь под рукой клон receiver'а и вычистить его самостоятельно. Других вариантов у нас не имеется.
👍18🔥6👎2
https://www.bohemia-automation.com/events/cyberscotlandweek-2024/
Напоминаю, уже в понедельник буду вещать. Презентации намалеваны, накрашены. Но сексизмы, расизмы, эйджизмы и прочие -измы из текста выкинуты цензорами, извините.
Как и картинки из Heavy IE.
Напоминаю, уже в понедельник буду вещать. Презентации намалеваны, накрашены. Но сексизмы, расизмы, эйджизмы и прочие -измы из текста выкинуты цензорами, извините.
Как и картинки из Heavy IE.
Bohemia-Automation
Bohemia Automation @ CyberScotland Week 2024
Security in modern IoT in critical industrial sectors
👍13
На плате читаются SATA M2 но не читаются NVMe.
Как думаете, кто виноват? Я бы сам не поверил, но виноват блок питания.
Как думаете, кто виноват? Я бы сам не поверил, но виноват блок питания.
👍10😁10🔥2💩2
Помнится рассказывал, как я купил по случаю Toughbook CF-19.
У меня MK7, который выпускался с довольно неплохим железом на борту (USB3, отличная поддержка SATA SSD, в машине уже стоял 2TB). При этом имеется VGA, аппаратный serial, rj12 под модем и даже Firewire 400.
Заглушки в основном - добротная резина (заменяемая), часть (батарея, SSD и основная крышка) - железные. Я бы даже сказал чугунные - иногда по заглушке нужно приложить молотком, чтобы открыть, если давно не смазывалась.
Мне достался армейский экземпляр. Из особенностей - отсутствует веб-камера и встроенный микрофон (при этом есть разъемы как под отдельный микрофон, так и под 3.5mm гарнитуру со встроенным). Учитывая, сколько спайвари сейчас сыпят прямо из коробки, скоро чувствую перейду на такой и в повседневной жизни.
Еще из особенностей - Panasonic комплектует практически все toughbooks режимом concealed mode, который можно активировать в BIOS. Если опция включена, по Fn+F8 вырубается wifi+bluetooth, звук, а монитор переходит на пониженную яркость или выключается вообще. Всё сделано добротно и аппаратно и никакими софтварными хитростями устройствам из режима не выйти, причем после reboot/shutdown машина помнит, в каком режиме вы находились. Что именно и как выключать - настраивается там же в BIOS.
Из особенностей работы под Linux:
- Иногда (редко) ALSA психует, что система загружалась в "скрытном" режиме и отказывается играть звук после выхода. Решается походом в sleep и обратно.
- Тачскрин работает прекрасно. что компенсирует отвратительный тачпад панасоников.
- На боку находятся 6 дополнительных кнопок, которые используют в планшетном режиме. Под Linux они из коробки не работают - это отдельная мини-клава, которая висит на i2c. Можно поставить дополнительный софт от умельцев.
У меня MK7, который выпускался с довольно неплохим железом на борту (USB3, отличная поддержка SATA SSD, в машине уже стоял 2TB). При этом имеется VGA, аппаратный serial, rj12 под модем и даже Firewire 400.
Заглушки в основном - добротная резина (заменяемая), часть (батарея, SSD и основная крышка) - железные. Я бы даже сказал чугунные - иногда по заглушке нужно приложить молотком, чтобы открыть, если давно не смазывалась.
Мне достался армейский экземпляр. Из особенностей - отсутствует веб-камера и встроенный микрофон (при этом есть разъемы как под отдельный микрофон, так и под 3.5mm гарнитуру со встроенным). Учитывая, сколько спайвари сейчас сыпят прямо из коробки, скоро чувствую перейду на такой и в повседневной жизни.
Еще из особенностей - Panasonic комплектует практически все toughbooks режимом concealed mode, который можно активировать в BIOS. Если опция включена, по Fn+F8 вырубается wifi+bluetooth, звук, а монитор переходит на пониженную яркость или выключается вообще. Всё сделано добротно и аппаратно и никакими софтварными хитростями устройствам из режима не выйти, причем после reboot/shutdown машина помнит, в каком режиме вы находились. Что именно и как выключать - настраивается там же в BIOS.
Из особенностей работы под Linux:
- Иногда (редко) ALSA психует, что система загружалась в "скрытном" режиме и отказывается играть звук после выхода. Решается походом в sleep и обратно.
- Тачскрин работает прекрасно. что компенсирует отвратительный тачпад панасоников.
- На боку находятся 6 дополнительных кнопок, которые используют в планшетном режиме. Под Linux они из коробки не работают - это отдельная мини-клава, которая висит на i2c. Можно поставить дополнительный софт от умельцев.
👍16🔥10
Сегодня на CSW обсуждали пароли, вспомнил две истории
История первая, короткая
Клиент хотел, чтобы при смене пароля он отличался от старого минимум на 3 символа. Очень удивился, что наш бэк не знает пароль юзера. Но к специалистам не пошел, оставили так.
История вторая, подлиннее
Другой клиент очень хотел голосовой пароль для авторизации в форме "вторая и пятая буква/цифра вашего пароля". Причем номер буквы-цифры должен был генериться рандомно.
Клиенту объяснили, что мы задолбаемся строить хеши для каждой пары букв и предложили построить 4-5 вариантов, типа "первая и третья, вторая и пятая". Клиент сказал, что мы лохи и он обратится к специалистам. И таки обратился.
Через год база паролей была чудесным образом слита. А когда я получил доступ, чтобы посмотреть что случилось, рядом с нашим солёным-хешеным password в базе красовалось новое поле "password_plaintext".
Специалисты поработали отлично. Как всегда.
История первая, короткая
Клиент хотел, чтобы при смене пароля он отличался от старого минимум на 3 символа. Очень удивился, что наш бэк не знает пароль юзера. Но к специалистам не пошел, оставили так.
История вторая, подлиннее
Другой клиент очень хотел голосовой пароль для авторизации в форме "вторая и пятая буква/цифра вашего пароля". Причем номер буквы-цифры должен был генериться рандомно.
Клиенту объяснили, что мы задолбаемся строить хеши для каждой пары букв и предложили построить 4-5 вариантов, типа "первая и третья, вторая и пятая". Клиент сказал, что мы лохи и он обратится к специалистам. И таки обратился.
Через год база паролей была чудесным образом слита. А когда я получил доступ, чтобы посмотреть что случилось, рядом с нашим солёным-хешеным password в базе красовалось новое поле "password_plaintext".
Специалисты поработали отлично. Как всегда.
😁72🔥8👍5
Задолбался я искать на свой Toughbook настройки тачскрина, которые бы эмулировали правый клик по лонг-тачу (там что-то не wacom-совместимое), поэтому накидал по-быстрому своё.
https://github.com/divi255/x-right-touch
Должно работать на любых тачскринах вообще. Под Wayland не уверен, но это вопрос к автору крейта rdev, когда он там допилит свою абстракцию
Логика тупая, как я в 3 часа ночи:
- на низком уровне иксы видят нажатие по экрану как mouse click, но если это незнакомый тачскрин, то без определенной кнопки в принципе
- в X11::listen ивент трансформируется уже в LeftButton, что запускает хендлер гестуры, который через указанное время сэмулирует клик RightButton
- второй тред слушает тачпады и мыши через libinput и если LeftButton нажата физически, гестура абортируется
- также гестура абортируется, если курсор слишком далеко ездил от начальной точки (значит у юзера dragging)
p.s. интересный опыт, под голые иксы еще на расте не писал
https://github.com/divi255/x-right-touch
Должно работать на любых тачскринах вообще. Под Wayland не уверен, но это вопрос к автору крейта rdev, когда он там допилит свою абстракцию
Логика тупая, как я в 3 часа ночи:
- на низком уровне иксы видят нажатие по экрану как mouse click, но если это незнакомый тачскрин, то без определенной кнопки в принципе
- в X11::listen ивент трансформируется уже в LeftButton, что запускает хендлер гестуры, который через указанное время сэмулирует клик RightButton
- второй тред слушает тачпады и мыши через libinput и если LeftButton нажата физически, гестура абортируется
- также гестура абортируется, если курсор слишком далеко ездил от начальной точки (значит у юзера dragging)
p.s. интересный опыт, под голые иксы еще на расте не писал
👍16🔥3
GPT действительно изменился. Если раньше он писал код, то теперь даёт пару примеров и требует чтобы ты все сам сделал по аналогии. Классика
- Вася, возвращайся, нам программист нужен
- Вы же GPT купили
- GPT уже ПМ, а нам программист нужен
- Вася, возвращайся, нам программист нужен
- Вы же GPT купили
- GPT уже ПМ, а нам программист нужен
😁65👍3
Записи моих вебинаров с последнего CyberScotland Week
https://www.youtube.com/playlist?list=PLC4R6pMal63rY8eMgJ8Q8bZ0kj4DKyEQV
https://www.youtube.com/playlist?list=PLC4R6pMal63rY8eMgJ8Q8bZ0kj4DKyEQV
👍13🔥5
Чем больше работаю, тем меньше понимаю Computer Science, хотя имею по ней даже диплом.
В реалтайм-системах есть такая "известная проблема", как priority inversion. На вики довольно длинная статья (господа ученые любят много болтать по пустому поводу), поэтому расскажу на пальцах:
- есть два треда, один бегает с priority HIGH, другой с LOW
- LOW забрал Mutex и что-то там под ним пилит
- HIGH добежал до Mutex и вынужден ждать LOW
Я за свою карьеру пожалуй не встречал варианта, чтобы нельзя было быстро вытащить данные из-под Mutex и это бы привело к каким-то серьезным последствиям. Даже если у вас толстый объект, клонирование Arc даже на современном ембеде занимает порядка 5-10 наносекунд (специально когда-то мерял). А архитектуру всегда можно подпилить так, чтобы исключить любые коллизии по этому поводу.
Но у ученых проблема существует, и они с ней воюют уже десятки лет. Самая известная беда-печаль была в конце 90х, когда у американцев марсоход из-за мютекса пошел в ребут и сутки простоял.
Я помню ту историю. Разработчики очень гордятся, что марсоход не потерял ни байта данных, потому что они все сразу флушались на диски. А вот догадаться флушать куда-то текущую очередь команд почему-то никто не додумался - ну ладно там, окно с Землей раз в пару дней, прилетит новая, какие проблемы. Тогда нечего и ныть. Вообще в любой промышленной системе better crash+reboot than freeze - это правильно, это они молодцы. Только остальное подкачало.
Тем не менее, наука не стоит на месте и сейчас применяются два варианта, чтобы победить "ужасную проблему": priority ceiling и priority inheritance. Чтобы не описывать долго оба, скажу что они примерно одинаковы по результату - тот блок кода, который лазит под Mutex, получает high priority, либо сразу (в ceiling), либо когда HIGH-тред дополз и встал (в inheritance).
Просто вытащить данные из-под Mutex никто, видимо, даже не собирается. Clone - не наши методы, наши методы зато - костыли, говно и палки.
В реалтайм-системах есть такая "известная проблема", как priority inversion. На вики довольно длинная статья (господа ученые любят много болтать по пустому поводу), поэтому расскажу на пальцах:
- есть два треда, один бегает с priority HIGH, другой с LOW
- LOW забрал Mutex и что-то там под ним пилит
- HIGH добежал до Mutex и вынужден ждать LOW
Я за свою карьеру пожалуй не встречал варианта, чтобы нельзя было быстро вытащить данные из-под Mutex и это бы привело к каким-то серьезным последствиям. Даже если у вас толстый объект, клонирование Arc даже на современном ембеде занимает порядка 5-10 наносекунд (специально когда-то мерял). А архитектуру всегда можно подпилить так, чтобы исключить любые коллизии по этому поводу.
Но у ученых проблема существует, и они с ней воюют уже десятки лет. Самая известная беда-печаль была в конце 90х, когда у американцев марсоход из-за мютекса пошел в ребут и сутки простоял.
Я помню ту историю. Разработчики очень гордятся, что марсоход не потерял ни байта данных, потому что они все сразу флушались на диски. А вот догадаться флушать куда-то текущую очередь команд почему-то никто не додумался - ну ладно там, окно с Землей раз в пару дней, прилетит новая, какие проблемы. Тогда нечего и ныть. Вообще в любой промышленной системе better crash+reboot than freeze - это правильно, это они молодцы. Только остальное подкачало.
Тем не менее, наука не стоит на месте и сейчас применяются два варианта, чтобы победить "ужасную проблему": priority ceiling и priority inheritance. Чтобы не описывать долго оба, скажу что они примерно одинаковы по результату - тот блок кода, который лазит под Mutex, получает high priority, либо сразу (в ceiling), либо когда HIGH-тред дополз и встал (в inheritance).
Просто вытащить данные из-под Mutex никто, видимо, даже не собирается. Clone - не наши методы, наши методы зато - костыли, говно и палки.
🔥17👍6💩2
Ни один студент не смог мне объяснить, зачем ему знать теорему Пифагора. Если он конечно не слесарь и не пилит треугольные держаки на полки.
Это примерно уровень преподавания всего, в первую очередь основ математики. А потом люди лезут в лотереи, МММ, берут микро-займы, не понимают как работает НДС и почему, если ты потерял 20%, а потом отыграл 20% назад - то ты в минусах.
Зато знают сумму квадратов катетов.
p.s. Преподавание на абстрактных вещах - лучший способ привить ненависть к предмету до конца жизни.
Это примерно уровень преподавания всего, в первую очередь основ математики. А потом люди лезут в лотереи, МММ, берут микро-займы, не понимают как работает НДС и почему, если ты потерял 20%, а потом отыграл 20% назад - то ты в минусах.
Зато знают сумму квадратов катетов.
p.s. Преподавание на абстрактных вещах - лучший способ привить ненависть к предмету до конца жизни.
👍44👎10😁6🔥5
Это я только на презах хвалю комьюнити, а так совсем наоборот. Например, на гитхабе стало больше дебилов. Намного больше, чем было раньше.
Раньше дебильный PR было видно сразу - он был дебильно оформлен с самого начала. Теперь дебилы научились открывать PR'ы, которые выглядят вполне прилично, но обязательно что-то ломают.
Поэтому обкладывайтесь тестами еще больше. Времена лихие.
Раньше дебильный PR было видно сразу - он был дебильно оформлен с самого начала. Теперь дебилы научились открывать PR'ы, которые выглядят вполне прилично, но обязательно что-то ломают.
Поэтому обкладывайтесь тестами еще больше. Времена лихие.
😁26👍12🔥2
https://github.com/casey/just - хорошая замена make, RIIR, кому не хватает cargo. Синтаксис в целом совместим, кроме переменных, а так дает много дополнительного.
Пользуюсь уже пару месяцев, рекомендую.
Пользуюсь уже пару месяцев, рекомендую.
👍12🔥4