За два месяца от идеи до первой продажи: опыт команды Genesis

22 ноября завершилась программа преакселерации конкурса «Цифровой прорыв», участие в которой приняли 53 лучших команд финалистов. В сегодняшнем посте мы расскажем о команде, которая в ближайшем будущем избавит нас от бессмысленного и беспощадного процесса сбора показаний счетчиков. Ребята из команды Genesis за два месяца прошли путь от идеи до прототипа и в этом посте мы расскажем, как им это удалось. Об этом нам рассказал капитан команды Роман Грибков.

image

1. Расскажите о своей команде. Какие в ней роли, не поменялся ли ее состав после финала?

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

Мой коллега Дима Копытов — техлид (его аккаунт на Хабре Doomer3D). Он отвечает за архитектуру создаваемого решения и закрывает большую часть задач. Дима занимается программированием с 7 лет!
Женя Мокрушин и Дима Кошелев закрывают фронт и бэк часть наших проектов. Плюс сейчас они активно занялись мобильной разработкой.

Вообще, перед тем как участвовать в «Цифровом прорыве», мы хотели сделать боевого робота, стреляющего огнем 🙂 Чисто по фану. Но потом зашли на хакатон и все завертелось. Но робота сделаем все равно. Чуть позже.

image

2. Знаем, что по ходу преакселерационной программы вы приняли решение поменять проект? Какие факторы на это повлияли?

Изначально на преакселератор мы выходили с проектом с концепцией «Uber в сфере ЖКХ». Его мы начали делать на полуфинале конкурса и продолжили развивать после, например, презентовали Губернатору Пермского края М.Г. Решетникову и получили позитивный фидбэк.
Но за 2 недели преакселератора мы поняли, что лучше делать проект, больше направленный на обычных потребителей и меньше завязанный на государство, так как проекты в формате ГЧП в части ИТ государство брать боится (их всего несколько штук было по России реализовано), а зайти с нуля в заказную разработку для госсектора команде просто нереально.

image

Поэтому мы решили сделать пивот и пойти на потребительский рынок.

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

Вот, кстати, как выглядит прототип нашего устройства

image

Но проект, который мы начинали изначально делать, мы не забросили. Сейчас как раз активно ведем переговоры с Правительством Пермского края, чтобы он все-таки был. Ищем варианты сотрудничества. Вероятно, это будет просто коммерческая разработка, в которой правительство выступит поставщиком данных и предоставит инструменты интеграции с краевыми системами. Сейчас как раз активно развивается концепция GaaS (government as a service).

Вот так работает наша система
image

Кратко о проекте

Система по передаче показаний счетчиков от жителей в ресурсоснабжающие организации (устройство, которое крепится на счетчики, и подписка на сервис передачи данных). Используя систему, можно добиться существенной экономии на жилищно-коммунальных услугах за счет передачи актуальных данных потребления электроэнергии, горячей и холодной воды.
Система работает следующим образом: на счетчик потребителя крепится устройство, которое затем через приложение соединяется с домашней WiFi-сетью. Далее данные собираются, обрабатываются и передаются в ресурсоснабжающую организацию либо через биллинговые центры, либо ГИС ЖКХ.

3. Какие цели ставили перед собой на преакселераторе? Всего ли получилось достигнуть?

Из забавного — мы шли на преакселератор с вопросом — почему он ПРЕакселератор? Ответ на вопрос мы получили 🙂

А в целом – мы хотели попробовать себя именно в продуктовой разработке. Заказная разработка — это здорово, но она не дает маневров за рамки того, что прописано в ТЗ. А ведь не всегда на стадии составления ТЗ заказчик может составить целостную картинку того, как все должно быть. А чтобы внести какие-то изменения в функционал, нужно проводить закупку по 44-ФЗ, а это очень долгая история.

Продуктовая разработка позволяет намного оперативнее реагировать на запросы потребителей.
Главный наш успех — это реально работающий и продающийся продукт. Я считаю, что мы не просто достигли всего чего хотели, но получили намного больше, чем рассчитывали.

4. Менялось ли ваше настроение по ходу программы? Были ли периоды подъема или выгорания?

Основная сложность — совмещать работу над проектом с основным местом работы. На время преакселератора мы не отказались от предыдущих договоренностей и обязательств. Мы не допускаем срыва сроков сдачи результатов заказчику, и все делаем только в свободное от основной работы время. А с учетом того, что конец года — самая горячая пора, то времени оставалось совсем немного. Из-за этого даже мы не смогли приехать в «Сенеж» всей командой.

В целом на протяжении всей программы у нас был очень боевой настрой. Мы четко осознавали зачем все это делаем и поэтому шли только вперед. Обучение в преакселераторе было крайне интенсивным, трекеры не давали нам расслабиться. Поэтому и выгореть никто не успел. Надеюсь, что этого не произойдет вплоть до вывода нашего продукта на рынок. А там и другие проекты подоспеют.

5. Как готовились к защите? Как настраивались на победу?

В лучших традициях — мы дорабатывали наш проект вплоть до самой защиты. Привезли с собой паяльники, наждачную бумагу, клеевой пистолет и производили калибровку устройства уже на месте, в Сенеже. Что касается питча — благодаря еженедельным трекерским сессиям он к моменту защиты был отточен максимально.

image

6. Расскажи о работе с менторами в преакелераторе. Как строилась удаленная работа? Какие впечатления от очного этапа преакселератора в Сенеж?

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

Менторы были очень крутые. В силу обстоятельств нам удалось достаточно плотно поработать с 4 трекерами. Сначала с нами работала Анна Качурец, потом подключилась Оксана Погодаева и в самом Сенеже – Николай Суровикин и Денис Зорькин. Таким образом, от каждого трекера мы получили очень полезный фидбек, который помог нам более глубоко проработать как финансовую модель, так и составить максимально точный портрет нашего потребителя.
Плюс очень крутая штука — активный нетворкинг. Во время одного из обедов мы собрались за столом с инвесторами, трекерами, где устроили реальный краш-тест нашего проекта. Нас разносили, как только можно 🙂 Но по итогу мы смогли сделать диверсификацию ценностного предложения по регионам. И более четко понять, что нужно Москве, а что — регионам. Здесь действительно есть очень большая разница в сознании потребителей.

Как итог — за время очной преакселерации мы сделали первые продажи нашего устройства. Мы получили предзаказы на 15 устройств Gemeter. Это говорит о том, что мы действительно все делаем не зря. Мы смогли найти боль потребителя и донести до него ценность разрабатываемого нами продукта.

7. Как в результате прошла защита? Вы остались довольны результатами?

На мой взгляд защита прошла блестяще. Выступление перед критически настроенной аудиторией, улыбки и большие пальцы вверх говорят о том, что наш проект зашел. Отдельный бальзам на душу — это когда видишь, что люди считывают QR код, опубликованный на твоем слайде, и хотят узнать более подробную информацию о проекте.

О каких-то конкретных осязаемых результатах преакселерации говорить сейчас рано. Да, к нам не пришли инвесторы с чемоданом денег, мы не слышали фразу «Shut up and take my money!». Но этого и не должно быть, когда твой проект находится на стадии концепта.
Главное, что мы вынесли с преакселератора — это то, что нельзя зацикливаться на идее в своей голове. Есть идея — надо ее проверять на своих потенциальных потребителях. Если не попал — надо ее менять и идти дальше. Ошибиться — не страшно. Страшно — пойти в неверном направлении и вовремя не развернуться. Сделать то, что никому кроме тебя не нужно.

Я вообще считаю, что только после прохождения преакселератора можно начинать делать стартап.

8. Какие планы по развитию проекта после преакселератора?

Раз у нас есть первые продажи, то отступать нам некуда. Мы будем активно работать над этим проектом. Следите за нашими успехами на сайте;) gemeter.ru

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


ссылка на оригинал статьи https://habr.com/ru/company/leadersofdigital/blog/477964/

Почему они мне не перезвонили-7, или с чем мы покидаем 2019 год

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

Кратко под катом:
— Почему ты нам не отвечаешь, нехороший человек, или автоматизация найма
— Потеря смысла в опубликованной или озвученной «зарплатной вилки» и ее фактический размах для г. Москвы
— Немного о серой зарплате
— Изменение роли HR, добавление HR фактической роли «закупщика — переговорщика». Премии, KPI и вот это все
— Почему вы хотите работать в нашей компании? Потому что вы мне предложили?
— Это новое милое слово «токсичность»
— Секта отсутствия обратной связи кандидату
— Мы за тобой следим, юзернейм, или откуда кадры узнают что ты обновил резюме, несмотря на все запреты на hh
— Инфоцыгане
— Финальный парадокс: кадров нет, но и учиться на такие позиции нет смысла
— Итого

Можно минусовать не читая, ничего нового (чего не было бы в ранее опубликованном) практически нет.

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


Почему ты нам не отвечаешь, нехороший человек, или автоматизация найма.
Из переписки:
Здравствуйте, Ivan. Предлагаем вам рассмотреть вакансию…
Здравствуйте, Ivan. Вы получили мое описание вакансии…
Здравствуйте, Ivan. К сожалению, до сих пор не получил от вас ответа по нашей вакансии а ведь наш робот так старается, ну как же так, Ivan ?

Работники нужны здесь, сейчас и дешево. Бизнесу (не всему, но определенной части) не очень интересно слушать про демографическую яму 1987-2000, отъезд сотрудников из РФ хотя бы в Минск, рост зарплат в регионах, падение уровня образования в целом — это все конечно очень интересно, но вы просто работать не умеете, надо более лучше, вот берите пример с меня — я за полгода от входа в ойти дошла до таблички «начальник отдела» .*
Повышение спроса на кадры увеличивает спрос на HR. Любых, лишь бы с пометкой «уже в ойти», что приводит к росту числа HR, не умеющих использовать и поиск, и имеющиеся инструменты, зато умея обижаться и рассказывать про токсичность. Это как пруд, в котором карасей почти нет. Вчера вокруг пруда сидело двадцать рыбаков, а сегодня сотня, причем некоторые пытаются ловить на электроудочку.
Конечно, можно было бы попробовать переманить сотрудников деньгами — но денег тоже нет (исключение: кое-какой «тех»).
* Примечание: Как регулярно сообщает широко известный в узких кругах тов. К. — табличка, особенно цифровая в виде подписи в Outlook, обходится гораздо дешевле прибавки к зарплате.

В итоге стоит обновить вакансию, с ключевыми словами в тексте (или просто написать в заголовке Devops инженер, Москва) — как на hh начинаются просмотры, а в почте — вышеописанные рассылки.
Однако рассылки малоэффективны (как и любой спам), и в действие вступает второй механизм:

Зарплатная вилка
Гораздо чаще стал натыкаться на стандартные фразы в вакансиях:
— «зарплата по результатам собеседования»
— «зарплата от 100 до 300 кк в зависимости от фактически выполняемых задач»
— «зарплата достойная»
— «зарплата на уровне и выше уровня рынка»
— «зарплата с перспективой роста в потенциальном лидере рынка»
и тому подобные.
Результаты разговоров и прохождения интервью (и не только мной, в мире много троллей) всегда приводят к одному и тому же:
— В лучшем случае озвучиваемая зарплата находится где-то посередине озвученной вилки, и это включая премии, годовые бонусы и прочие виртуальные (и крайне редко достигаемые) морковки.
— В худшем случае зарплата может быть и ниже опубликованной вилки, и формироваться из МРОт в 20-40 т.р, «конверта» и обещанной премии по результатам гадания.

Фактическая зарплатная вилка для Москвы, если брать опубликованные вакансии из крупных организаций, такова:
— Первая линия, техническая поддержка и прочая замена картриджей: 30..60 тысяч рублей «на руки». Список обязанностей крайне широк.
— Вторая линия (порой и последняя). Уметь все по чуть чуть, и заменять картриджи на время отсутствия сотрудников первой линии: 60… 130 тысяч рублей «на руки». Плюс иногда премия.
— Третья линия и выше. На этой линии начинаются сколько-то серьезные требования к квалификации. Причина планки «где-то на 2000 евро» очень проста — это примерно европейский МРОТ (зарплата финской уборщицы), и примерно на этот же уровень «на руки» выйдет только что приехавший специалист с его 4000 евро гросс.
Опубликованные вакансии для 3 линии и выше находятся на уровне 120-200к, иногда «до 250 т.р.», не дотягивая до тех самых, заветных 300к (в час). Неопубликованные вакансии могут быть с суммой и выше — в г. Москвы зафиксировано несколько случаев возвращения из США и Европы с сохранением оклада. Только в Калифорнии 60к$ в год это один уровень жизни, а в Москве те же 60к$ — другой. Бывают и неопубликованные вакансии на 300-600к.рублей, вот только для них требуют сертификаты уровня HPE ASE — Server Solutions Architect, Cisco CCIE, VCDX и аналогичных. Лучше по два.

Любая сумма в виде «на руки, белая зарплата» обходится работодателю крайне дорого:
— Социальные налоги в 30% (22% ПФР, 2.9% ФСС, 5.1% ФФОМС )
— Травматизм от 0.2 до 8.5%
— Налог на доходы физических лиц, 13%
И небольшой бонус: Для субъектов хозяйствования, применяющих УСН, ЕНВД или ПСН, в 2019 году завершается период применения пониженных страховых тарифов (наличие льгот при расчете страховых взносов зависело от направления деятельности предприятия или ИП).
И конечно, у ряда работодателей появляется порицаемое желание сэкономить, и перейти к методу, известному как:

Серая зарплата
Первый (известный мне) раз разговор про рекомендованное налоговой «обеление» зарплаты возник где-то в начале 2000х, и с тех пор не прекращался. Ошибочно думать, что в налоговой сидят люди, не знающие рынка и зарплат на нем, однако, когда с одной стороны только теоретически возможный штраф, а с другой — до 50% выплат в казну, ряд работодателей готов рискнуть.
Никакой статистики такого рода в открытом виде не ведется. Некоторые старые хрычи распространяют слухи о том, что число таких несознательных работодателей растет, но возможно это локальные всплески — в конце концов, не в каждом городе можно почти довести до банкротства областного поставщика электричества, при том что в регионе есть АЭС.

Однако, к хорошей сумме в 2-НДФЛ привыкаешь быстро, и как итог — бизнес начинает требовать изменения роли HR в процессе обсуждения с кандидатом:

Изменение роли HR, добавление HR фактической роли «закупщика — переговорщика». Премии, KPI и вот это все
о, как же все это странно. Такое ощущение что не HR-ра берут на работу, а закупщика, которому нужно «отжимать» поставщиков на нужные условия и цены)) Чесн слово))
Из linkedin

В момент интервью интересы кандидата и работодателя в ряде случаев прямо противоположны.
— Работодатель желает сэкономить как можно больше.
— Работник желает строго обратного. Можно сколько угодно говорить что «деньги не главное, нам нужны люди с сильной заинтересованностью и нематериальной мотивацией» — но пока что без денег жить грустно и печально.

В итоге, особенно если и зарплата серая, и заявленная в вакансии вилка не имеет отношения к реальности, да и KPI нарисован только ради привлечения кандидатов, HR начинает вилять как маркитантская лодка вместо прямых ответов «сколько вешать в граммах». В ход идут все средства убеждения кандидата, от обещаний повысить как только так сразу, до рассказов «вы не очень хорошо прошли техническое интервью, но мы видим в вас некий потенциал», поэтому давайте так: сейчас 2/3 от нижней планки, и в конце квартала, следующего за закрытием финансового года после окончания проекта, мы обсудим будущий рост, если проект покажет прибыль.
В последнее время неплохо себя показало обещание премий. Я уже писал про это, и на прошлой неделе столкнулся с этим лично — зарплата в NNN рублей, и премия по результатам квартала в 30% от месячного оклада по «предварительному разговору», но в самом оффере может быть прописано что угодно.
Вопрос действительно непростой — действительно, и кандидаты бывают «не очень, но стремятся», и премии бывает, случаются, но всегда есть риск, что это только разговоры, а критерии квартальной и годовой премии прописаны максимально размазанно.
Степень риска в каждом случае предстоит оценивать самому кандидату.

Почему вы хотите работать в нашей компании? Потому что вы мне предложили?
Рост числа HR с минимальным опытом приводит к забавным ситуациям.
Я, честно говоря, думал что это разовые шутки — однако нет. Чем больше число HR в целом без опыта, тем больше HR после курсов от инфоцыган (про них ниже) про войти в ойти без смс на высокой скорости, и тем больше шанса, что HR сначала будет спрашивать «ну когда же можно вас позвать», и затем в середине разговора сорвется на вопрос «почему вы хотите работать у нас». Честный ответ «подождите, кажется это вы меня звали» приводит к срыву стандартной шаблонной конструкции и вываливанию по ошибке «мы вам перезвоним», с последующей записью «фу какой токсичный кандидат».

Это новое милое слово «токсичность»
За 2019 год я услышал слово «токсичность» по отношению к чему угодно гораздо чаще, чем все годы до того. Интернеты полны статей типа «пять признаков токсичного человека» или «будь готов: через сколько Рикков надо отказаться от попыток построить любовь». А разгадка одна — безблагодатность.
Рост сочетаний «только вошедший в ойти HR плюс инфоцыгане плюс накачка про большую честь и первичный отсев» порождает рост самомнения молодого (или молодой) HR. Каждый случай вываливания из привитого на курсах цикла, каждый отказ кандидата, любой намек со стороны кандидата на то, что он готов послушать как космические корабли бороздят Большой театр приводит к реакции «все виновны кроме я». Это не у меня вакансия на серую зарплату, это не я сейчас читала с листа «мы новой крипто нано ML AI стартап и у нашего начальника большой потенциал, в чем я убедилась лично ой в чем вы можете убедиться на нашей странице в сети интернет».
Готовьтесь, за этим милым словом большое будущее.
Необходимое примечание: Софт-скиллы и взаимодействие в коллективе и с коллективом безусловно важны, однако все же надо определяться, чего вы хотите, если даже отказ «спасибо, но ваше предложение меня не заинтересовало» приводит к рассказу «фу как так можно, бяки вы все».

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

Все компании разные. В основном, так или иначе связаны со строительным рынком (производители, импортёры, торговые сети).

Кроме строительного рынка, их связывает ещё кое-что — все без исключения HR этих компаний состоят в одной секте. И она называется «секта отсутствия обратной связи кандидату». В оговоренные сроки, конечно. Ну и по их истечению тоже.

Это многое говорит об уровне компании, скажу я вам.
Linkdein

Отсутствие обратной связи или ее задержки случались и раньше. Кто-то забывал, кто-то не считал нужным, кто-то заставлял кандидата ждать, пока принималось решение по более успешным кандидатам — все это уже было.
Странно, что на этом акцентируется хоть какое-то внимание. Пообещали ответить за 1-2 дня и не ответили, ты написал запрос «уважаемый HR, есть какое-то решение или итоги» и снова не ответили? Значит, кандидат не нужен.

Мы за тобой следим, юзернейм, или откуда кадры узнают что ты обновил резюме, несмотря на все запреты на hh
На сайте hh в настройках пользователя существует настройка «не показывать обновление резюме следующим организациям»
Однако при этом в современном ПО по поиску и отслеживанию сотрудников прямо задекларирована функция:
Возможность регистрации факта обновления резюме кандидата в виде записи в личном деле.

Это не считая и простой возможности «попросить коллег открыть резюме» — достаточно часто встречаемая просьба «от HR к HR» или простого звонка в стиле Алло, Вава? Ты сейчас упадёшь!.
Поэтому просто знай, %username% — если твое руководство развлекается отслеживанием обновлений резюме на hh, то все эти запреты не имеют значения.

Инфоцыгане
Спрос на «войти в ойти любой ценой» рождает предложения, начиная от «научим поиску сотрудников», заканчивая «хотите стать девопсом за 5 простых уроков и 200 тысяч рублей? Нет ничего проще, зарплата Junior L1 XML Config Support Engineer начинается от 300кк, и даже выше! Просто приходи к нам на курсы, не прячьте ваши денежки по банкам и углам.
Пример:
Программа курса обучения DevOps:
Сетевые технологии — 20 ак.часов
Построение сетей на основе оборудования Cisco часть I — 40 ак.часов
Построение сетей на основе оборуд. Cisco часть II — 40 ак.часов
Основы инфраструктуры Microsoft Windows Server 2012 — 40 ак. часов
Установка и настройка Microsoft Windows Server 2012 — 40 ак.часов
Администрирование Microsoft Windows Server 2012 — 40 ак.часов
Разработка баз данных Microsoft SQL Server 2012 — 40 ак.часов
Администрирование баз данных Microsoft SQL Server 2012 — 40 ак.часов
Технология Windows PowerShell — 40 ак.часов
Администрирование ОС Linux New- 60 ак.часов
Введение в DevOps на базе Linux New- 50 ак.часов
Дипломное проектирование — 60 ак.часов

Что из этого имеет отношение к ELK, что к k8s, а что напоминает Cisco ICND и MS 20410 + 20411 + 20412 и все вместе MS 70-411, бонусом MS 10961 — решайте сами, как и сами отвечайте на вопрос — стоит ли хоть чего-то набор неавторизованных курсов по MS Server 2012.

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

Финальный парадокс: кадров нет, но и учиться на такие позиции нет смысла
Нам нужен кубер, но у нас оборудования нет, сетей нет, а облака на таком лимите, что кирдык
Из переписки

Кажущийся парадокс из bullshit bingo 4.0, например такой:
В Центральной и Восточной Европе выявлена катастрофическая нехватка ИТ-специалистов приводит к завышенным ожиданиям по вхождению в ойти, и последующему разочарованию.
Временами довольно болезненному.
Тем не менее, альтернатив в РФ не завезли:
— Дажен если ты очень продвинутый парень, то вакансий клоунов не много, и конкуренция там высочайшая, порой на уровне кто чей папа.
— В космонавты не берут.
— Летчики стране тоже не нужны.
— В остальных отраслях или надо сразу много уметь, или же уровень зарплаты вызывает грусть и тоску.
— Системное администрирование настолько автоматизированно, и на интервью спрашивают даже такие ужасные вещи, как роли FSMO (кому они нужны вообще!), что туда попасть невозможно (и оклады ниже, чем у программистов).
Системное администрирование „в целом“ не отжило свое, но сотрудников нужно все меньше и меньше. Облачка порешали на рыночке.
Остается одно — быстро выучить 1-2 языка программирования плюс git, linux, AWS, а дальше как-то само пойдет — сначала ранее помянутый Junior L1 XML Config Support Engineer, а там и повышение, в Москву пошлют (если очень хочется увидеть товарища Ленина).

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

Итого
Кому-то может показаться, что пост представляет собой малосвязанное нытье про плохих HR.
Что касается поста, то все так. Еще наверняка есть ошибки в грамматике и пунктуации.
Что касается плохих HR, то это, конечно, не так:
— В нехватке квалифицированных кандидатов на озвученные заказчиком деньги виноваты сами кандидаты, это они и только они не желают заниматься общественно важным делом по воспитанию и обучению следуюих поколений.
— Нормы современной вежливости и бизнес-коммуникации требуют относиться к любому звонку с предложением о работе, и не важно в какое время его сделали и что хотят рассказать, с подобающим уважением и обязательно, без исключений, необходимо такой звонок выслушивать целиком. Делать иначе должно быть стыдно.
— Кандидат всенепременно обязан понимать современные проблемы найма, и максимально способствовать HR быстро, дешево и качественно делать свою работу, в частности кандидат должен пересылать сообщения о вакансии всем в своем списке контактов, и наоборот, сообщать HR контакты знакомых, которым может быть интересна такая вакансия.
— Главное в наше непростое время — это личностный и духовный рост, способствующий развитию софт-скиллов. Деньги тут не важны.
— Если HR чего и дописал от себя в вакансию, так сделал это от чистого сердца, сердцем чуя истинные требования заказчика.
Знания древних Мнение HR неоспоримо. В конце концов, заказчик нанял именно такого HR для поиска именно таких сотрудников, и, соответственно, мнение, методы и квалификация HR устраивает заказчика в достаточной мере, вместе со сроками поиска и самим текстом вакансии.

The end.
P.S. Дописал пост и внезапно открыл для себя бездну, не могу развидеть:
Как ИИ повлияет на рынок труда, какие кадры необходимы для нового рынка, как их искать и как выращивать? На эти и другие вопросы постараются ответить участники круглого стола «ИИ для кадров или кадры для ИИ?».
Какие меры поддержки предусмотрены в Федеральном проекте «Искусственный интеллект» для развития кадров?
Должен ли ИИ иметь ценностные приоритеты? Чем руководствоваться при формировании этих приоритетов?
Круглый стол «Новая культурная HR-среда: ИИ для кадров или кадры для ИИ?»
Модератор:
Оксана Тарасенко, заместитель Министра экономического развития РФ


ссылка на оригинал статьи https://habr.com/ru/post/477652/

Программный поиск общего кода с помощью oEmbed

Всем доброго времени суток! Хочу поделиться переводом статьи «»Programmatically Discovering Sharing Code With oEmbed» автора Drew McLellan.

Введение

На многих сайтах размещены мультимедиа и контент, которыми можно поделиться в другой платформе с помощью некоторого HTML-кода для встраивания. Что произойдет, если у вас есть только URL-адрес элемента и вам нужно найти встраиваемую версию мультимедиа без участия человека? Вот тут нам и пригодится oEmbed.

Сеть полна сервисов, которые содержат разнообразный контент, такой как видео, изображения, музыка и подкасты, карты и графики, а также всевозможные развлечения. Скорее всего, когда вы добавите свой контент на сайт, он предложит вам способ внедрить этот контент в веб-страницу где-нибудь ещё.

На таких сайтах, как YouTube, есть собственный встраиваемый проигрыватель, который популярно использовать в постах блога и даже на страницах продуктов. Soundcloud имеет код для встраивания их музыкального проигрывателя на сайт вашей группы. Благотворительные сборщики денег могут загрузить маршрут своей большой гонки на сайт, подобный Strava, и захотеть поделиться им на своем сайте по сбору средств, чтобы показать их спонсорам.
Все это можно сделать, найдя опцию « Поделиться» на хостинг-сайте и скопировав некоторый код, который обычно представляет собой смесь HTML и JavaScript. Затем этот код обычно может быть вставлен на целевую страницу, и хостинг-сайт предоставит богатое представление контента для просмотра всем вашим друзьям, клиентам и контактам.
Пока все хорошо, и это достаточно хорошо подходит для встраивания контента вручную. Тем не менее, есть другой вариант использования, где результат один и тот же, но путь к нему совершенно другой.

Программный обмен

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

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

Check out this video! youtu.be/jw7bRnFbwAI

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

Второй вариант — превратить его в ссылку. Это хороший выбор, так как пользователи могут перейти по ссылке и получить доступ к контенту. Но при этом они покидают ваш сайт и могут не вернуться.

Наилучшим пользовательским опытом может быть возможность извлекать проигрыватель для этого контента и вставлять его прямо туда, а не только в URL. Это позволило бы пользователям просматривать содержимое прямо на вашем сайте, как, например, на Facebook.

Это создает проблему. Учитывая URL, как я смогу превратить это в код для встраивания HTML / JavaScript, необходимый для показа большинству пользователей на странице?

Если это такой известный сайт, как YouTube, я мог бы написать некоторый код, который использует API YouTube для извлечения видеоинформации и получения или создания кода для встраивания таким образом. Я мог бы сделать то же самое для других видео сервисов, таких как Vimeo и VIVO. Я могу написать код для распознавания URL-адресов Flickr и Instagram и использовать их API-интерфейсы для получения хороших встраиваемых версий фотографий. И то же самое для Твиттера и твитов. Но на это уйдет очень много сил и времени!

В идеале, нужен стандартизированный способ передачи URL-адреса части содержимого в блок кода для встраивания, чтобы отобразить это содержимое на странице. Если вы обратили внимание, вы поймете, что для этого подходит oEmbed.

Происхождение OEmbed

Это была именно та проблема, с которой Лия Калвер столкнулась, работая над Pownce (действительно инновационным сайтом социальных сетей, который был Betamax для VHS в Twitter). Pownce хотел встроить богатые представления контента в поток обновлений пользователя, но не хотел ограничивать поддержку только теми службами, с которыми они специально писали код для интеграции. На ужине с коллегой Майком Мэлоуном, а также с Кэлом Хендерсоном (который возглавлял инжиниринг в Flickr — одном из крупнейших поставщиков такого контента в то время) и Ричарде Кроули они вместе выработали идею открытого стандарта для получения кода для встраивания. URL. Хендерсон ушел и разработал что-то на основе обсуждения, так и родился oEmbed.

Использование OEmbed

Вот как это работает.

Он начинается с URL-адреса, который указывает на один элемент содержимого. Это может быть видео на YouTube, изображение или что-то еще. Обычно это будет предоставляться пользователем вашего сайта или приложения как часть некоторого контента, который он хочет опубликовать. Первым шагом является получение содержимого страницы по этому URL, который должен быть HTML-страницей.

Если сайт, на котором размещен контент, поддерживает oEmbed, в разделе этой страницы должен быть link элемент с oembed типом контента:

<link rel="alternate" type="application/json+oembed"   href="http://www.youtube.com/oembed?url=https%3A%2F%2Fyoutu.be%2Fjw7bRnFbwAI&format=json"   title="Inclusive Components with Heydon Pickering" />

Примечание по XML: oEmbed поддерживает ответы как в формате XML, так и в формате JSON. В этой статье я рассматриваю только JSON, потому что мы не дикари. Но если вам необходимо работать с XML, имейте в виду, что он поддерживается со спецификацией oEmbed, хотя вы можете обнаружить, что некоторые провайдеры предлагают только ответы JSON.

Этот тег ссылки в качестве rel атрибута установлен на alternate и type установлен либо либо, application/json+oembedлибо text/xml+oembed. Именно этот атрибут подсказывает нам тот факт, что указанный в URL-адресе на href самом деле является конечной точкой API oEmbed для получения сведений о содержимом.

Этот URL обычно имеет два параметра: url и format.

Общие параметры URL для начального запроса потребителя

Полная спецификация идет в гораздо более подробно здесь (и вы должны ссылаться, что если создать свою собственную реализацию), но эти два параметра, вы, вероятно, увидеть больше всего.

Итак, у нас есть URL, выбрали страницу, нашли тег ссылки oEmbed с другим URL для конечной точки API. Затем мы запрашиваем этот новый URL, и он возвращает всю информацию, которую служба должна предоставить об этом фрагменте контента.

{         "author_name": "Smashing Magazine",         "width": 480,         "title": "Smashing TV: Inclusive Components with Heydon Pickering (Nov 7th 2019)",         "provider_name": "YouTube",         "height": 270,         "html": "<iframe width=\"480\" height=\"270\" src=\"https://www.youtube.com/embed/jw7bRnFbwAI?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture\" allowfullscreen></iframe>",         "provider_url": "https://www.youtube.com/",         "thumbnail_url": "https://i.ytimg.com/vi/jw7bRnFbwAI/hqdefault.jpg",         "type": "video",         "thumbnail_height": 360,         "author_url": "https://www.youtube.com/channel/UCSDtqcJ8ZXviPrEcj1vuLiQ",         "version": "1.0",         "thumbnail_width": 480 } 

А теперь мы пообщаемся! Ответ дает нам много информации о контенте. В version обозримом будущем должно быть 1.0, что является текущей версией спецификации oEmbed. Другая возвращаемая информация во многом зависит от стоимости type.

Типы Ответов

Значение type ключа в ответе указывает, какой тип носителя вы собираетесь встраивать.

Помимо выделенного видеоконтента, наиболее распространенным типом, который вы можете увидеть в дикой природе, является rich. Даже сам Flickr, все еще отправляя photo ответ, также предоставляет html крутой встраиваемый «проигрыватель» для изображения.

В большинстве случаев встраивание контента на ваш сайт — это всего лишь случай использования кода, предоставленного в качестве html значения.

Примечание О Безопасности

Вы должны быть осторожны с одной вещью: если брать ответ HTML и программно внедрять его в страницу, которую вы размещаете, без человека, который дважды проверяет код, который вы вставляете, всегда существует вероятность того, что этот код будет вредоносным. Таким образом, вы должны принять соответствующие меры для снижения риска.

Это может включать в себя фильтрацию URL-адресов, чтобы убедиться, что схемы и домены соответствуют ожидаемым, и песочницу кода в iframe в другом домене без файлов cookie. Вы должны получить доступ к ситуации, в которой вы используете код, и убедиться, что вы не подвергаете себя чрезмерному риску.

Начнём

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

Например, НПМ упаковывание oembed обеспечивает очень простой интерфейс для создания запроса на основе URL контента и получение ответа обратно oEmbed.

Сначала установите пакет в свой проект:

npm i oembed 

А затем запросите URL. Здесь я использую URL-адрес презентации в Notist.

const oembed = require('oembed'); const url = 'https://noti.st/drewm/ZOFFfI';  oembed.fetch(url, { maxwidth: 1920 }, function(error, result) {     if (error)         console.error(error);     else         console.log("oEmbed result", result); }); 

И ответ:

{          type: 'rich',         version: '1.0',         title: 'Understanding oEmbed',           author_name: 'Drew McLellan',         author_url: 'https://noti.st/drewm',         provider_name: 'Notist',         provider_url: 'https://noti.st',         cache_age: 604800,         thumbnail_url: 'https://on.notist.cloud/slides/deck4179/large-0.png',         thumbnail_width: 1600,         thumbnail_height: 900,         html:            '<p data-notist="drewm/ZOFFfI">View <a href="https://noti.st/drewm/ZOFFfI">Understanding oEmbed</a> on Notist.</p><script async src="https://on.notist.cloud/embed/002.js"></script>',         width: 960,         height: 540  } 

Если вы хотите сделать то же самое в PHP, удобный пакет с именем embed / embed доступен для установки через Composer.

composer require embed/embed 

И тогда в вашем проекте PHP:

use Embed\Embed;  $info = Embed::create('https://noti.st/drewm/ZOFFfI');  $info->title; // "Understanding oEmbed" $info->authorName; // "Drew McLellan $info->code; // "<p data-notist="drewm/ZOFFfI"> ... </script>" 

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

Вывод

oEmbed — это очень элегантное решение очень специфической проблемы. Вам наверное кажется, что от этого выиграют лишь несколько инженеров, работающих в больших социальных сетях, но на самом деле издательские системы, в которых пользователь может ввести URL, на удивление распространены. Найдите мне одного внутреннего инженера, которому в какой-то момент не нужно было создавать какую-то CMS. Мы можем не думать об этом в тех же терминах, но если вы принимаете ввод пользователя, вы должны подумать о том, что делать, если этот ввод содержит URL-адреса.

Теперь, когда вы знаете о oEmbed (извините), но у вас нет оправдания не уделять серьезного внимания тому, как вы будете обрабатывать URL-адреса в ваших будущих проектах.

Дополнительная информация


ссылка на оригинал статьи https://habr.com/ru/post/477904/

Внедрение в архитектуру советских программируемых калькуляторов «Электроника МК-52»

В этой статье я хочу рассказать об архитектуре советских программируемых микрокалькуляторов на примере калькулятора «Электроника МК-52» и как можно внедриться в его архитектуру.

Советские калькуляторы семейства «Электроника Б3-34» («Электроника МК-56», «Электроника МК-61» и «Электроника МК-52») были особенно популярны в СССР. Причиной этому была не только доступная цена в 65 рублей за МК-54, 85 рублей за МК-61 или 115 рублей за МК-52, но и развитой язык программирования. Это семейство калькуляторов стало де-факто стандартным для многочисленных пользователей. Огромное количество книг было посвящено программированию на этих машинках и публикацией готовых алгоритмов. Электроника МК-52 даже летала в космос на корабле Союз ТМ-7, где предполагалось его использование в качестве резервного на случай неисправности спускаемого навигационного оборудования. Даже в военно-морском флоте СССР калькулятор «Электроника МК-52» с блоком расширения памяти БРП «Астро» какое-то время был стандартным средством для навигационных расчетов.



Микрокалькулятор МК-52 относится ко второму поколению советских программируемых микрокалькуляторов.

Первым поколением было семейство Б3-21 (включая МК-46, МК-64 и МС 1103). Базовая модель Б3-21 разработана в 1975-м и массово производилась с 1977 года. У нее был рабочий стек на два числа (Б3-21, как и семейство Б3-34 — калькуляторы с RPN — обратной польской (или бесскобочной) записью — где сначала в стек вводятся числа, а потом нажимается кнопка операции).

В дополнение к рабочему стеку имелся дополнительный кольцевой стек на 6 чисел. В этот стек можно записать по кругу число, а потом извлекать. И еще семь регистров памяти с номерами 2-8 (в МК-46, МК-64 и МС 1103 — восемь) — обычные регистры памяти для хранения чисел. Количество шагов программы у Б3-21 — 60. В моделях МК-46, МК-64 и МС 1103 — 66. Последние модели — настольные калькуляторы с блоками для контроля параметров от внешних устройств. В МК-46 имелась только возможность получать цифровые коды, а в МК-64 и МС 1103 устанавливалась кассета с аналогово-цифровым преобразователем, и дополнительная микросхема К145ИК1801, которая организовывала взаимодействие. За счет установки этой микросхемы появлялся дополнительный регистр памяти с номером 9 и еще шесть шагов программы. Управление считыванием происходило через регистр номер 9 путем ввода кода команды. Аналогично, кстати, в МК-61 и МК-52 ставилась микросхема К745ИК1306, которая кроме дополнительных функций добавляла еще один регистр и еще семь шагов программы, но об этом дальше.

Где-то в 1980-м году появляется второе поколение программируемых микрокалькуляторов в лице «Электроники Б3-34». Первые экземпляры стоили 120 рублей, но завод довольно быстро снизил цену до 85 рублей и так и продавал модель где-то до 1985 года. Вообще ценообразование калькуляторов — предмет разговоров для отдельной статьи: где-то цены снижались по мере выпуска, где-то повышались. Если интересно, то можно посмотреть на моём сайте изменение цен по годам — я стараюсь собирать такую информацию по мере возможности. Калькулятор Б3-34 сменили аналогичные по функциям, но более компактный МК-54, настольный МК-56. Через несколько лет появилась микросхема К745ИК1306 с дополнительными функциями, и выпустили новые модели МК-61 в корпусе, аналогичному МК-54, и горизонтальный МК-52 с внутренней EEPROM К1601РР1 на 512 шагов (уникальная вещь, других в мире калькуляторов с EEPROM я не встречал: у них либо низкопотреблящее CMOS ОЗУ, либо более современные Flash) и двумя разъемами для подключения устройств: первый использовался для подключения внешних модулей памяти «Блоков расширения памяти БРП», а второй был технологическим и туда ничего не подключалось (завод объяснял как технологический разъем для тестирования во время производства).

Вид сзади:

По сравнению с микрокалькуляторами первого поколения, усовершенствование было существенным. Количество регистров для хранения чисел увеличилось с 8/9 до 14/15. Операционный стек с двух регистров увеличился еще на два регистра — X, Y, Z, T. Появился регистр последнего значения регистра X перед выполнением последней арифметической операции — BX (операционные регистры X, Y, Z, T с регистром Last X наши подсмотрели, скорее всего, у калькуляторов Hewlett Packard с аналогичными регистрами, впрочем, на этом тождественность с HP и заканчивается). Область программы с 60/66 шагов увеличилась с 98 шагов (у Б3-34, МК-54, МК-56, МС 1104) до 105 шагов (у МК-61 и МК-52).
В программе можно использовать автоматические циклы по регистрам L0-L3, тогда идет уменьшение соответствующего регистра на 1, сравнение с нулем и ветвление по адресу.
Очень сильно улучшило калькуляторы второго поколения внедрение косвенной адресации. Любой регистр памяти может использоваться в качестве индексного как для сохранения/извлечения чисел, так и косвенных переходов на программы и подпрограммы, в том числе с условием. При этом значение регистра косвенного перехода будет автоматически уменьшено (регистры 0-3), увеличено (регистры 4-6) или оставлено без изменений.
Все эти автоматические действия с регистрами очень экономят программную область и позволяют упростить программирование.

Говорить о работе с МК-52 можно долго. Я только вкратце рассказал о возможностях этих машинок для тех, кто не работал с ними.

Разговор об архитектуре я бы хотел начать с истории. Семейство калькуляторов Б3-21 и Б3-34 — разработка Киевского НИИ Микроприборов (НИИМП). Первые калькуляторы под названием «Электроника 4-71» у них появились в 1971 году. Двум предприятиям было поставлено задание — сделать к 24-му съезду КПСС в 1971 году калькуляторы на больших интегральных схемах — киевскому НИИМП и ленинградской «Светлане». В итоге у нас примерно в одно и то же время появились две модели калькуляторов — упомянутая «Электроника 4-71» и «Электроника 24-71» (улавливаете название моделей?). Модель 4-71 была сделана на микропрограммном управлении, как первые калькуляторы семейства «Искра», с логикой на автоматах Мура в сотрудничестве с ленинградским ГСКТБ. То есть при нажатии кнопки происходит защелкивание нужных триггеров (в зависимости от назначения кнопки), которые формируют прохождение соответствующих микрокоманд. Автоматы — это конечно хорошо, но на них далеко не уедешь в плане совершенствования. Даже калькуляторы Искра-114 от ГСКТБ в 1974 году уже имели ПЗУ К5ЯП011001 (предположительно, первые в СССР микросхемы масочного ПЗУ) с «прошивкой».
И вот, в 1973 году у НИИМП появляется микроконтроллерное ядро собственной разработки. Сохраните себе тот сайт по ссылке, пока он живой — там очень много интересного рассказано о НИИМП. Первый микрокалькулятор «Электроника Б3-09» на микросхеме К145ИК2А вышел «первым блином» и не прижился, зато его модификации «Электроника Б3-09М«, Б3-14М и Б3-14 пошли «на ура», выпускались сотнями тысяч штук в год и решили проблему калькуляторного дефицита. Калькуляторов нашего производства в те годы не хватало, и их завозили из-за рубежа, как с соцстран, так и с капстран. Помните фильм «Служебный роман» 1977-го года? Можно посмотреть, начиная с 9:15, какие калькуляторы стоят на столах — в основном, транзисторные ГДРовские «Soemron 220» и болгарские «Элка 50» первой модификации.

Более крупные фотографии можно видеть на сайте «Радиокартинки»: К145ИК2, К145ИК501, К145ИК502П.

Это кристаллы микросхем К145ИК2, ИК501 и ИК502. Как можно заметить, чипы простого калькулятора с четырьмя арифметическими операциями К145ИК2 практически совпадают с чипами программируемого калькулятора «Б3-21» (К145ИК501, 502 и 503). Последние отличаются только «прошивкой». Номер прошивки показан на отдельном слое после названия.

А это уже более совершенный кристалл микросхемы К145ИК1302, который стоит в программируемых калькуляторах семейства «Электроника Б3-34», в том числе и «Электроника МК-52», о котором эта статья.

В центре чипа видны три области (помещены зеленым). Это память микрокоманд, память синхропрограмм и память программ. Желтым помечены кольцевые сдвиговые регистры.
Процессор калькулятора работает на частоте 75-100 кГц. В процессоре есть однобитное АЛУ (арифметическо-логическое устройство) с несколькими источниками и приемниками.

За четыре микротакта процессор выполняет одну микрокоманду (над одной тетрадой). Каждая микрокоманда говорит — какой набор источников взять для сумматора и куда положить результат.
Всего в микросхеме 68 микрокоманд длиной 27 бит каждая, 128 различных синхропрограмм и 256 ячеек для команд.

Микропроцессор калькулятора (точнее было бы сказать микроконтроллер, потому что внутри него находится и ПЗУ, и ОЗУ, и порты ввода-вывода) работает по последовательному принципу. Все регистры представляют собой регистры сдвига.

Внутри процессора всё закольцовано и напоминает парк аттракционов с каруселями, колесом обозрения и идеальным автобусом с посетителями, у которого одна дверь работает на вход, другая на выход, и посетители постепенно перемещаются от начала в конец.
Работник парка (микрокоманда), сверяясь с тетрадочкой (полем микрокоманды), на каждом микротакте извлекает (или нет) из подошедшей ячейки карусели, колеса обозрения или очередного пассажира автобуса (то есть очередного регистра) бит, направляет их на аттракцион «сумматор», где с ними происходят какие-то действия и результат отправляет обратно, так же в зависимости от полей микрокоманды. Этот распорядок действует на 4 бита, после чего номер такта увеличивается.
Поскольку регистры кольцевые, разработчикам было нужно правильно задать их размер. В итоге базовым числом для калькуляторов семейства К145ИК13 стало число 42.
Эту длину (42 тетрады) имеют последовательные регистры — регистры М, R и ST. Чтобы не ждать, пока нужные числа продвинутся по всему кольцу, дополнительно есть несколько 4-х битных и однобитных регистров вроде регистра переноса, доступных в каждом такте. Одно число с 8-разрядной мантиссой и 2-х разрядным порядком занимает 14 тетрад (одна треть от 42). В кольцевой регистр влезает ровно три числа, что позволяет, например, реализовать регистр памяти и хранение двух чисел при вычислении со скобками, как это реализовано в калькуляторе «Электроника Б3-32» на К145ИК1301.

С числом 42 также жестко работает так называемая «память синхропрограмм», в которых находятся адреса микрокоманд, которые надо выполнять.
Синхропрограммой она называется оттого, что жестко засинхронизирована с размером кольцевого регистра и номером такта 0-41 — одного кольцевого цикла.
В каждой синхропрограмме содержится девять номеров микрокоманд, которые нужно выполнить.
Синхрокоманды устроены довольно интересно. Разработчики проанализировали алгоритмы и посчитали, что с учетом переносов одна типовая операция с АЛУ над тетрадой требует три такта, а производимые действия довольно однотипны. И они сделали так, что микрокоманды в зависимости от номера такта (0-41) аппаратно всегда выполняются в такой последовательности:
0, 1, 2, 3, 4, 5, 3, 4, 5, 3, 4, 5, 3, 4, 5, 3, 4, 5, 3, 4, 5, 3, 4, 5, 6, 7, 8, 0, 1, 2, 3, 4, 5, 6, 7, 8, 0, 1, 2, 3, 4, 5

Желтым цветом я отметил одинаковые участки (микрокоманды 3, 4, 5), которые выполняются семь раз подряд. Этого хватает, чтобы обработать одно восьмиразрядное число. По сути это готовые микроалгоритмы. С одной стороны такие встроенные циклы сокращают емкость необходимого для программы ПЗУ, но с другой стороны представьте, что такая последовательность выполняется всегда и на каждой строке программы.
Поскольку одна тетрада обрабатывается за три такта, данные за это время успевают уехать по кольцу. Из-за этой особенности числа в кольцевых регистрах хранятся не в последовательных ячейках, а в каждой третьей, чтобы они как раз подоспели к окончанию циклов 3, 4, 5.
Снизу на рисунке показана область памяти программ. В памяти программ в каждом ее поле содержится информация о трех синхропрограммах, которые надо выполнить за один кольцевой цикл. Там есть еще нюанс, заключаемый в том, что третья синхропрограмма обычно используется для всяких ветвлений. В регистре R ячейки 36 и 39 закреплены за адресом текущей выполняемой программы, они как раз появляются на соответствующих тактах, когда выполнились первые две синхропрограммы, и третья синхропрограмма занимается обработкой этого адреса.
Конечно, внутри микропроцессор работает еще более сложно. Только описание его со всеми нюансами занимает не один десяток страниц книги Трохименко Я.К. «Программируемые микрокалькуляторы. Устройство и пользование» (книга гуглится).

Вот эта архитектура с тремя уровнями обработки — памятью программ с адресами синхропрограмм, памятью синхропрограмм с номерами микрокоманд и памятью микрокоманд с набором источников и приемников является базовой для целого семейства микросхем К145ИК2, К145ИК13xx, К145ИК18xx и К145ИК19xx, только у них разный размер регистров, по-другому сделана адресация и ветвления и сделаны другие доработки и изменения.

А самое интересное, что сделали разработчики еще в 1973-м году — вывели мозги процессора наружу для возможности расширения. Я имею ввиду кольцевые регистры. В первом массовом калькуляторе Б3-09М емкости регистра хватало, и расширение не требовалось. Но что делать, если возможностей аттракциона не хватает? Можно увеличить его размер или поставить рядом еще один. Чтобы не увеличивать размер ПЗУ, а следовательно размер кристалла, уменьшать выход годных кристаллов в процессе производства и прочие сложности, разработчики взяли несколько одинаковых процессоров и сделали общий кольцевой регистр.

Здесь на фотографии слева часть кристалла К145ИК2, а справа К145ИК5. Можно обратить внимание на левый верхний угол. Там уже в процессе производства стоит небольшая перемычка, замыкающая две контактные площадки (кольцевой регистр). А в К145ИК5 этой перемычки нет, и кольцевой регистр не замыкается.
В 1975-м году появились первые образцы программируемого калькулятора «Электроника Б3-21«. Там можно видеть аж три процессора типа К145ИК5 — К145ИК501, К145ИК502 и К145ИК503. Они отличаются только прошивкой.
Первый процессор К145ИК502 занимается вводом с клавиатуры и выводом на индикатор, обработкой действий в автоматическом режиме и режиме ввода и выполнения программы. К145ИК501 занимается арифметическими операциями, а К145ИК503 — тригонометрическими. А поскольку требовалась еще ёмкость для хранения программы пользователя и регистров памяти, дополнительно в разрыв того же регистра поставили микросхему К145ИР1, представляющий собой один большой регистр сдвига. В итоге появилось три аттракциона с тремя последовательно соединенными автобусами и одной электричкой. И все данные постоянно перемещаются по общему кольцу со скоростью тактового генератора.

Благодаря Феликсу Лазареву, который смог считать прошивки с этих микроконтроллеров и разобраться в архитектуре, у нас появился эмулятор калькуляторов типа МК-61 и Б3-34, где можно более детально изучить его работу и поиграться с включением и отключением микросхем от общего кольца.

В первом микрокалькуляторе второго поколения «Электроника Б3-34» использовались микросхемы К145ИК1302 (ввод/вывод, режимы работы), К145ИК1303 (математические функции) и два регистра К145ИР2 по 1008 бит каждый.

Суммарно два регистра M и два регистра по 1008 бит образуют кольцо размером в 42*4 + 42*4 + 1008 + 1008 = 2352 бита.

Всё поле данных разработчики разбили на три одинаковые области по 784 бита (196 тетрад или 98 байт). В первой области хранится программа пользователя (98 шагов), во второй области — регистры данных (14 регистров с номерами 0-9, a, b, c, d по 14 тетрад каждый), а третья область — служебная.

Через несколько лет после появления Б3-34 появились две новые модели — МК-61 и МК-52. У них добавился еще один чип К145ИК1306, где вычисляются операции с градусами и логические операции. Кольцо стало выглядеть так:

Обратите внимание, что в К145ИК1306 есть такой же регистр М, как и в К145ИК1302 и К145ИК1303. Появление этого чипа добавило в кольцо один регистр памяти (14 тетрад), еще семь шагов программы (14 тетрад) и на 14 тетрад увеличилась служебная область.
В МК-52 есть еще микросхема К745ИК1801, которая осуществляет передачу данных из микросхемы EEPROM или сменного блока расширения памяти. Но в нем кольцо регистра не используется.

Разбиение всего кольца данных в калькуляторах типа МК-61 и МК-52 показано на рисунке ниже:

Как я говорил, всё кольцо разбивается на три области: М1, М2 и М3.
В области М1 находятся регистры памяти 0-9, a, b, c, d, e. В них интересно то, что для хранения чисел надо 12 тетрад (1 — знак мантиссы, 8 — мантисса, 3 — порядок), а на один регистр выделяется 14 тетрад (чтобы делилось на 42 в процессоре). В итоге две тетрады на каждый регистр не используются.
В области М3 располагается память программ. Там всё просто — 98 шагов для Б3-34 и 105 шагов (на 14 тетрад больше) для МК-61 и МК-52.
Область М2 самая интересная. В нем кроме регистров X, Y, Z, T, BX, располагается область Ms, канал связи КС и Метка.

Показанные области не идут друг за другом. Помните, я говорил, что в синхропрограмме есть несколько повторяющихся операций, которые отнимают три такта и приводят к тому, что числа в регистрах хранятся на каждой третьей ячейке? В данных кольца это и реализовано. Сначала передается первая тетрада области М1, затем первая тетрада области М2 и затем первая тетрада области М3. Потом идут вторые тетрады и так далее. И пока за три такта отрабатываются микрокоманды 3, 4, 5 в синхропрограмме, ненужные области пропускаются.

Когда я разбирался с распределением данных в общем кольце, меня очень удрудича область, обозначенная как Ms. Она довольно большая, занимает одну шестую часть области данных кольца. И эта область не используется в калькуляторе. При разработке архитектуры разработчики предусматривали возможность сделать «область программ-данных». Это — такая область, в которую можно записывать или программу, или регистры с данными. Причем довольно большая область — 56 программных шагов. В калькуляторах предполагались включить специальные функции в комбинации с кнопкой [К] для обмена (над кнопками 1 и 2, сейчас там пустое место). Но, повторюсь, в серийных моделях эта область пропала, а так у нас могло бы быть больше регистров памяти или программа длиннее на 56 шагов. Об этой области вскользь упоминалось в журнале «Техника-молодежи», № 7 за 1986 год. ic.pics.livejournal.com/avva/111931/119690/119690_original.png

Самый важный элемент синхронизации в данных кольца — так называемая «Метка». Это последовательность из девяти тетрад, состоящих из единиц. При появлении кода «Метка» внутренний счетчик у процессоров сбрасывается, и начинается отсчет данных кольца относительно кода Метка. В самом начале после включения машинки головной процессор К145ИК1302 инициализирует кольцо и формирует Метку. Команды и содержимое регистров подобраны так, что код Метка не может встретиться ни в данных, ни в программе.
Продвинутые пользователи калькуляторов семейства Б3-34 наслышаны о «пустышке» — недокументированной операции, когда на индикаторе отображается только десятичная точка. Это — код, состоящий только из единиц. Когда этот код появляется, внутренний счетчик сбивается, и калькулятор начинает чудить — появляется два кода Метка и вся синхронизация сбивается — калькулятор принимает одну область памяти за другую.
Внутренняя адресация относительна относительно кода Метка. При появлении чип К745ИК1306 с дополнительным регистром М, количество ячеек увеличилось, и они условно добавились в конец, потому что в архитектуре вся область данных в кольце непрерывна. В этой архитектуре можно добавить еще один процессор типа К145ИК13, тогда станет больше еще на один регистр памяти, и добавится еще 7 шагов программы (максимально — 112).
Скорее всего аналогичным образом работает внутреннее представление данных и в непрограммируемом калькуляторе «Электроника МК-44«, сделанном на том же микропроцессоре К145ИК1305. Это был один из самых массовых настольных калькуляторов в нашей стране. В нем есть три регистра памяти. Я подумал, а что будет, если разорвать выведенное наружу кольцо регистра М и добавить туда памяти? Эксперимент удался. Процессор «подхватил» появившуюся память, и в калькуляторе стало десять регистров памяти.

А как процессоры взаимодействуют между собой? Они «общаются» специальному полю, называемому «канал связи» (КС). Как в калькуляторах семейства «Б3-21», так и в калькуляторах семейства «Б3-34» есть один главный процессор. В нашем случае это К145ИК502 для Б3-21 и К145ИК1302 для Б3-34. Они инициализируют кольцо при включении, формируют код «метка» и взаимодействуют с оператором, организуя ввод с клавиатуры и вывод на индикатор. Другие процессоры находятся в режиме ожидания и ждут команд.
«Канал связи» — это две тетрады, в которые главный процессор может поместить число — байт с кодом операции.
Если при работе по программе или в ручном режиме головной процессор не может обработать операцию с каким-то кодом своими силами, то он кладет код операции в регистр КС кольца и начинает ждать.
Ведомые процессоры все время следят за регистром КС в кольце данных. Как только появляется код операции, который может обработать ведомый процессор, он начинает его обрабатывать, например, выполнять функцию сложения, вычисление синуса и т. д. Ведомый процессор самостоятельно извлекает из кольца нужные регистры, когда они приходят к нему по кольцу, производит с ними операции, и результат помещает обратно. После выполнения процессором своих действий, он очищает регистр канала связи, затерев младшую тетраду числом «F». То есть если в канале связи появилось число 10 (код сложения), то по окончанию счета в регистре КС будет записано число 1F.
Одновременно с выставлением кода операции в канал связи в головном чипе включается специальный счетчик ожидания по типу сторожевого таймера. Если ни один ведомый процессор не сможет обработать команду по каналу связи, то через определенное время головной процессор сам очистит канал связи и выдаст на индикаторе сообщение об ошибке «ЕГГОГ».
Этим таймаутом пользуются ведомые чипы, если в процессе вычисления произошла ошибка с числом. Например, пользователь попытался извлечь корень из отрицательного числа. В этом случае ведомый чип ничего не выставляет в канал связи, а головной процессор через несколько секунд сам выводит сообщение об ошибке. Оттого в калькуляторах вывод надписи «ЕГГОГ» при подобного рода ошибках занимал так много времени.
Главный процессор может не знать, какие есть в кольце другие процессоры. Он всего лишь выставляет код в канал связи, а его обрабатывают другие процессоры. Можно, например, заменить микросхему К745ИК1306 на другую или сделать свою разработку на основе микроконтроллера, как сделали еще в советские времена в калькуляторе «Электроника МС-1104«.

Кроме последовательной шины данных в калькуляторах типа «Электроника МК-52» есть интерфейс с EEPROM и внешними модулями расширения памяти. Как я писал выше, в МК-52 есть микросхема электрически стираемой памяти К1601РР1, в которую можно записать до 512 шагов программы. Вместо программной памяти можно сохранить числовые регистры памяти. Что записывать — программную памяти или регистры, определяется переключателем «Д-П» на передней панели. Одни и те же области в EEPROM могут использоваться как для хранения программы, так и для хранения регистров. Можно записать в EEPROM регистры, а записанные данные извлечь в программную область, и наоборот.

Вид калькулятора со стороны микросхем:

Микросхемы крупно:

Кроме внутренней EEPROM выпускались также сменные модули памяти «БРП» (блоки расширения памяти). Они представляют собой микросхему ПЗУ, где записаны программы.
Всего известны модули:
— БРП «Астро», он же БРП-2 — навигационные программы. Модуль использовался на кораблях, о чем я писал в начале статьи.
— БРП-3 содержал математические программа
— БРП-4 — математические программы и программы бытового назначения, в том числе игры.
ПЗУ были довольно большого объема, и в один БРП на самом деле влезали программы от двух модулей. То есть обладатели модуля БРП-3 могли открыть корпус, перепаять перемычку и получить модуль БРП-2 «Астро».
Когда я считывал дампы, то в модуле БРП-4 обнаружил дамп от модуля неизвестного назначения. Пока нет информации, как использовать эти дампы.

Микросхема связи с EEPROM или БРП К745ИК1801 довольно самостоятельная. Она так же сидит на калькуляторном кольце, но не отслеживает команды. Она только запоминает содержимое регистра X как адрес и длину обращения к ПЗУ или EEPROM по кнопке [А↑], и по кнопке [↑↓] запускает стирание, считывание или запись из, или в область программы или данных.
Применительно к ПЗУ БРП на шину всегда выставляется адрес в параллельном коде, и БРП всегда выдает содержимое ячейки.
Модуль БРП вставляется в соответствующий разъем сзади калькулятора МК-52.

Наверняка каждый пользователь МК-52, купив калькулятор, видел сзади корпуса два разъема — большой для БРП и маленький, непонятно для чего. В инструкции и в журналах разработчики поясняли, что этот разъем используется только в технологических целях на этапе производства.
Может быть выпускались какие-нибудь несерийные модификации калькулятора МК-52, но я о них не слышал. Всё время хотелось разработать какое-нибудь устройство, которое могло сидеть на том разъеме и использовать его в работе.

Если обратиться к принципиальной схеме калькулятора, то можно видеть, что на разъем выведены кроме напряжений питания и тактовых сигналов, сигналы с кольца, снятые со входа и выхода микросхемы К745ИК1801. Чтобы внедриться и что-то записывать в кольцо необходимо было его разорвать. Конечно, что-то менять в схеме МК-52 — самый последний вариант. Но оказалось, что выходной сигнал кольца микросхемы К745ИК1801 слабый. Скорее всего он незначительно подтянут на одно из напряжений питания, и его можно довольно свободно перегружать своим сигналом. Так я и сделал. Микроконтроллер мониторит кольцо МК-52, анализирует его, и может считывать и записывать данные.

В итоге получилось устройство — модуль «FRS-BRP». Вот принципиальная схема: habrastorage.org/webt/iz/d8/dm/izd8dmuq-h3l18av6dkhgazjg24.png

Ядро модуля — микроконтроллер STM32F205. Он на прерываниях от внутреннего генератора частоты калькулятора считывает бит за битом данные, передаваемые по кольцу. Одновременно следит за параллельной шиной для эмуляции блока расширения памяти. Большое количество компараторов необходимо для правильного детектирования логических уровней. Дело в том, что в калькуляторе используется отрицательное напряжение от 0 до -15 вольт. Это напряжение вырабатывается от источника питания в 5 вольт. Плате так же необходимо было использовать эти напряжения, но только не до -15 вольт, а до -5 и до -3.3. В итоге то напряжение, которое в калькуляторе 0 вольт, в плате FRS-SRP стало +5 вольтами, а то, которое -5 вольт стало нулем. На компараторах всё можно хорошо отфильтровать, их много, но они сейчас очень дешево стоят. В основном, компараторы задействованы для декодирования сигналов параллельной шины эмулятора БРП. Конечно, сам БРП можно эмулировать через засылку данных сразу в кольцо. Но для аутентичности, чтобы пользователь нажимал «те самые» кнопки, которые описаны в инструкции к БРП, решил сделать полноценный эмулятор.

Сейчас мало кто будет использовать калькулятор МК-52 по прямому назначению. Есть более эффективные средства вычислений. Но для энтузиастов, для тех, кто хочет разобраться с его внутренним устройством, кто хочет использовать наработанные программы или тех, кто хочет поиграть в те игры, которые сводили с ума пользователей середины 1980-х годов, этот модуль может пригодиться.
Что умеет этот модуль:
1. Выводит на OLED экранчик содержимого на выбор двух регистров оперативной памяти калькулятора (0-9, A, B, C, D, E) одновременно. В режиме счета по программе, когда основной экран калькулятора моргает, можно нажимая кнопки на модуле просматривать регистры.
2. Эмулирует (заменяет) модули БРП-АСТРО, БРП-3, БРП-4, БРП-5 в полном соответствии с их инструкцией по эксплуатации (название БРП-5 дано условно, поскольку для найденных данных не был найден соответствующий модуль).
3. Позволяет сохранить блок программы (105 шагов) во внутреннюю память модуля с номерами ячеек от 1 до 130.
4. Позволяет извлекать и записывать в калькулятор один из 130 записанных блоков программы (105 шагов).
5. Аналогично с пп. 3, 4 сохраняет и извлекает блоки данных (0-9, A, B, C, D, E) до 130 ячеек.
6. Сохраняет и извлекает полную информацию, находящемся в кольце данных (программа, данные и служебная информация) до 50 ячеек.
7. Имеет библиотеку популярных программ («ЛУНОЛЕТ-1», «ЛУНОЛЕТ-2», «ЛУНОЛЕТ-3», «ОС-1», «ОС-2», «АТМОСФЕРА»).
8. Позволяет по желанию заблокировать математический процессор К745ИК1303 и эмулировать за него математические функции, которые тот вычисляет, для увеличения быстродействия и точности вычислений. Оказалось, что микросхему К745ИК1303 можно ввести в ступор недокументированной командой, он «уходит в себя», не реагирует на команды в канале связи, и модуль за него обрабатывает математические команды.
9. Дополняет функционирование калькулятора путем обработки неиспользуемых в калькуляторе функций с кодами 0x28 (K *) и 0x29 (К /).

Как я выше писал, по каналу связи передается код операции. Сейчас почти все коды заняты, и с пульта можно ввести только три незадействованные команды — коды 27, 28 и 29. В принципе, их вполне хватает для каких-нибудь задач. Хотя я не знаю, какие команды можно реализовать по причине, что калькулятор по прямому назначению уже не торт, но сам факт обработки увлекает.

Ну, и конечно — общение с компьютером по USB. В модуле реализованы простые команды диалога, можно считать и записывать содержимое данных, программы, служебных областей или кольца целиком. Его можно сохранить на диск, извлечь, проанализировать, изменить и записать в калькулятор. Вот скриншот: habrastorage.org/webt/mh/2v/dr/mh2vdrtvnwjlxx1oxcdff0k4yu4.jpeg

Можно например, в канал связи положить какое-нибудь число и посмотреть, как оно будет обрабатываться другими чипами. Или узнать, что произойдет, если какую-нибудь служебную ячейку записать по-другому. Или проверить, возможно ли вывести калькулятор из состояния «тьма», если в регистре X через модуль исправить порядок, скажем с 500 на 0, не выведет ли он его из ступора?

К сожалению, наружу калькулятора выходит только кольцо с данными. А другие состояния вроде программного счетчика, признака — считает ли калькулятор по программе или выводит на индикатор, и прочее, — эта информация сидит во внутреннем регистре R.
Но разработчики вывели наружу и его. Если посмотреть на схему того же МК-52, то можно видеть, что там есть «некая перемычка» — она и есть выход и вход регистра «R». То есть при желании можно подключиться к этой шине и более внимательно изучить его внутренности.

Такие выведенные регистры есть, наверно, во всех микросхемах семейства К145ИК5, К145ИК13, К145ИК18 и даже К145ИК19. Знаменитая микросхема часов «К145ИК1901» так же имеет выведенные наружу регистры M и R. Можете убедиться, взглянув на принципиальную схему.

Я даже в порядке эксперимента подключился к регистрам в часах на К145ИК1901 и снял, где у него находятся данные.

В заключение статьи скажу, что упомянутое семейство микроконтролеров было очень популярным в CCСР, на его базе было выпущено большое количество калькуляторов — модели:
— К145ИК2 — Б3-09, Б3-09М, Б3-14, Б3-14М;
— К145ИК5xx — Б3-05М, Б3-21, МК-46, МК-64, МС-1103, МК-59, Elwro 330;
— К145ИК13xx — Б3-32, МК-44, Б3-34, МК-54, МК-56, МК-52, МК-61, МС-1104.
На микросхемах серии К145ИК18xx и К145ИК19xx — бытовые приборы, из известных — таймеры для микроволновок, часы, реле времени для фотографии, контроллеры лентопротяжек в магнитофонах и прочее.

Вот и всё, что я хотел сказать. Надеюсь, было интересно. Спасибо за внимание.


ссылка на оригинал статьи https://habr.com/ru/post/467501/

Падение в кроличью нору. История об одной ошибке перезагрузки varnish — часть 1

ghostinushanka, молотив по кнопкам в течение предыдущих 20 минут, как если бы от этого зависела его жизнь, поворачивается ко мне с полу-диким выражением в глазах и хитрой ухмылкой — «Чувак, я кажется понял.»

«Посмотри вот сюда,» — говорит, показывая на один из символов на экране — «Спорим на мою красную шляпу, что если мы добавим вот сюда то, что я тебе только что послал» — показывая на другой участок кода — «ошибка уже не будет выводиться.»
Немного озадаченный и уставший, я изменяю sed выражение, над которым мы какое-то время уже работали, сохраняю файл и запускаю systemctl varnish reload. Сообщение об ошибке исчезло…

«Мейлы, которыми я обменивался с кандидатом,» продолжил мой коллега, в то время как его ухмылка перерастает в неподдельную улыбку полную радости, «До меня вдруг дошло что это точно такая же проблема!»

С чего оно всё начиналось

Статья предполагает понимание принципов работы bash, awk, sed и systemd. Знание varnish приветствуется, но не является обязательным.
Временные метки в сниппетах изменены.
Написано вместе с ghostinushanka.
Этот текст является переводом оригинала, опубликованного на английском языке две недели назад; перевод boikoden.

Солнце просвечивает сквозь панорамные окна очередным тёплым осенним утром, чашка свежеприготовленного насыщенного кофеином напитка покоится в стороне от клавиатуры, в наушниках звучит любимая симфония звуков, перекрывающая шелест механических клавиатур, и первой записью в списке тикетов бэклога на канбан доске игриво светится судьбоносный заголовок “Investigate varnishreload sh: echo: I/O error in staging” (Расследуйте “varnishreload sh: echo: I/O error” в стейдже). Когда речь заходит о varnish-е, ошибкам нет и не может быть места, даже если они не выливаются в какие-либо проблемы как в этом случае.

Для тех, кто не знаком с varnishreload, это простой шелл скрипт, используемый для перезагрузки конфигурации varnish-а — также называемой VCL.

Как подсказывает название тикета, ошибка возникла на одном из серверов на стейдже, а так как я был уверен, что маршрутизация varnish-а на стейдже работает исправно, я предположил, что это будет мелкой ошибкой. Так, просто сообщение попавшее в уже закрытый выходной поток. Беру тикет себе, в полной уверенности, что я его отмечу готовым менее чем через 30 минут, похлопаю сам себя по плечу за очистку борды от очередного хлама и вернусь к более важным делам.

Врезаясь в стену на скорости 200 км/ч

Открыв файл varnishreload, на одном из серверов под управлением Debian Stretch, я увидел шелл скрипт длиной менее 200 строк.
Пробежавшись по скрипту, я не заметил ничего такого, что могло бы вылиться в проблемы при многократном его запуске прямо из терминала.
В конце концов, это стейдж, даже если оно и сломается, никто не будет жаловаться, ну… не слишком много. Запускаю скрипт и смотрю что будет выписываться на терминал, вот только ошибок уже и не видно.
Еще пару запусков, чтобы убедиться, что я не могу воспроизвести ошибку без каких-либо дополнительных усилий, и я начинаю придумывать как этот скрипт изменить и заставить его таки выдавать ошибку.
Может скрипту перекрыть STDOUT (с помощью > &-)? Или STDERR? Ни то ни другое в итоге не сработало.

Очевидно, systemd каким-то образом изменяет среду запуска, но как, и, почему?
Врубаю vim и редактирую varnishreload, добавляя set -x прямо под шебанг, надеясь, что дебаг вывод скрипта прольёт чуточку света.

Файл поправлен, так что я перезагружаю varnish и вижу что изменение начисто всё сломало… Выхлоп — полный бардак, в котором тонны Си-подобного кода. Даже прокрутки в терминале недостаточно, чтобы найти где оно начинается. Я в полном замешательстве. Может ли режим отладки повлиять на работу программ запускаемых в скрипте? Нет, бред. Баг в шелле? Несколько возможных сценариев несутся в моей голове как тараканы в разные стороны. Чашка кофеино-полного напитка мгновенно опустошается, быстрое путешествие на кухню для пополнения запаса и… поехали. Я открываю скрипт и присматриваюсь к шебангу: #!/bin/sh.

/bin/sh — это ведь просто симлинк на bash, так что скрипт интерпретируется в POSIX-совместимом режиме, верно? Не тут-то было! Оболочка по умолчанию в Debian — это dash, и это именно то, на что ссылается /bin/sh.

# ls -l /bin/sh lrwxrwxrwx 1 root root 4 Jan 24  2017 /bin/sh -> dash

Пробы ради, я изменил шебанг на #!/bin/bash, удалил set -x и попробовал ещё раз. Наконец-то, при последующей перезагрузке varnish-а, в выводе появилась сносная ошибка:

Jan 01 12:00:00 hostname varnishreload[32604]: /usr/sbin/varnishreload: line 124: echo: write error: Broken pipe Jan 01 12:00:00 hostname varnishreload[32604]: VCL 'reload_20190101_120000_32604' compiled

Строка 124, вот оно!

114 find_vcl_file() { 115         VCL_SHOW=$(varnishadm vcl.show -v "$VCL_NAME" 2>&1) || : 116         VCL_FILE=$( 117                 echo "$VCL_SHOW" | 118                 awk '$1 == "//" && $2 == "VCL.SHOW" {print; exit}' | { 119                         # all this ceremony to handle blanks in FILE 120                         read -r DELIM VCL_SHOW INDEX SIZE FILE 121                         echo "$FILE" 122                 } 123         ) || : 124 125         if [ -z "$VCL_FILE" ] 126         then 127                 echo "$VCL_SHOW" >&2 128                 fail "failed to get the VCL file name" 129         fi 130 131         echo "$VCL_FILE" 132 }

Но как оказалось, строка 124 довольно пуста и интереса не представляет. Я мог лишь только предположить, что ошибка возникла как часть многострочника, начинающегося на 116-й строке.
Что в итоге записывается в переменную VCL_FILE в результате выполнения вышеупомянутого саб-шелла?
В начале, он отправляет содержимое переменной VLC_SHOW, созданной на строке 115, следующей команде через пайпу. А там-то что тогда происходит?
Во-первых, там используется varnishadm, который является частью установочного пакета varnish, для настройки varnish-а без перезапуска.
Подкоманда vcl.show -v используется для вывода всей конфигурации VCL, указанной в ${VCL_NAME}, в STDOUT.
Чтобы отобразить текущую активную конфигурацию VCL, а также несколько предыдущих версий конфигураций маршрутизации varnish-а, которые все еще находятся в памяти, можно использовать команду varnishadm vcl.list, вывод которой будет аналогичен приведенному ниже:

discarded   cold/busy       1 reload_20190101_120000_11903 discarded   cold/busy       2 reload_20190101_120000_12068 discarded   cold/busy       16 reload_20190101_120000_12259 discarded   cold/busy       16 reload_20190101_120000_12299 discarded   cold/busy       28 reload_20190101_120000_12357 active      auto/warm       32 reload_20190101_120000_12397 available   auto/warm       0 reload_20190101_120000_12587

Значение переменной ${VCL_NAME} устанавливается в другой части скрипта varnishreload на имя активного в данный момент VCL, если таковой имеется. В данном случае это будет “reload_20190101_120000_12397”.

Отлично, переменная ${VCL_SHOW} содержит полную конфигурацию для varnish, пока ясно. Теперь я, наконец, понял, почему вывод dash с set -x оказался таким битым — он включал в себя содержимое получившейся конфигурации.

Важно понимать, что полная конфигурация VCL часто может быть слеплена из нескольких файлов. Комментарии в Си стиле используются для определения того, где одни файлы конфигурации были включены в другие, и это именно то, о чем, собственно, вся приведённая ниже строка фрагмента кода.
Синтаксис комментариев, описывающих включенные файлы, имеет следующий формат:

// VCL.SHOW <NUM> <NUM> <FILENAME>

Цифры в данном контексте не важны, нас интересует имя файла.

Что же в итоге творится в болоте команд, начинающимся на строке 116?
Давайте разберемся.
Команда состоит из четырех частей:

  1. Простое echo, которое выводит значение переменной ${VCL_SHOW}
    echo "$VCL_SHOW"
  2. awk, который ищет строку (запись), где первым полем, после разбиения текста, будет “//”, а вторым — «VCL.SHOW».
    Awk выпишет первую строку, соответствующую этим шаблонам, а затем немедленно прекратит обработку.
    awk '$1 == "//" && $2 == "VCL.SHOW" {print; exit}'
  3. Блок кода, который сохраняет в пять переменных значения полей, разделенных пробелами. Пятая переменная FILE получает остаток строки. Наконец, последний echo выписывает содержимое переменной ${FILE}.
    { read -r DELIM VCL_SHOW INDEX SIZE FILE; echo "$FILE" }
  4. Поскольку все шаги с 1 по 3 заключены в саб-шелл, вывод значения $FILE будет записан в переменную VCL_FILE.

Как следует из комментария на 119-й строке, это служит единственной цели: надежно обрабатывать случаи, когда VCL будет ссылаться на файлы с символами пробела в названии.

Я закомментировал исходную логику обработки для ${VCL_FILE} и попытался изменить последовательность команд, но это ни к чему не привело. У меня всё работало чисто, а в случае запуска сервиса выдавало ошибку.

Похоже, что ошибка просто не воспроизводима при запуске скрипта вручную, при этом предполагаемые 30 минут закончились уже раз шесть и, в довесок, появилась более приоритетная задача, отодвинувшая остальные дела в сторону. Оставшаяся часть недели была забита самыми разными задачами и была лишь немного разбавлена докладом о sed и собеседованием с кандидатом. Проблема с ошибкой в varnishreload была безвозвратно утеряна в песках времени.

Ваше так называемое sed-фу… на самом деле… дрянь

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

Поскольку в прошлый раз простое изменение кода не помогло, я просто решил его переписать начиная со 116-й строки. В любом случае существующий код был дурковатым. И в нём нет абсолютно никакой необходимости использовать read.

Глядя на ошибку еще раз:
sh: echo: broken pipe — в этой команде echo находится в двух местах, но я подозреваю, что первая — более вероятный виновник (ну или хотя-бы соучастник). Awk также не внушает доверия. И в случае, если действительно это awk | {read; echo} конструкция приводит ко всем этим проблемам, почему бы её не заменить? Эта однострочная команда не использует все возможности awk, да ещё и этот лишний read в довесок.

Поскольку на прошлой неделе был доклад о sed, я хотел попробовать свои недавно приобретенные навыки и упростить echo | awk | { read; echo} в более понятный echo | sed. Хотя это определенно не лучший подход к выявлению ошибки, я подумал, что по крайней мере попробую свое sed-fu и, возможно, узнаю что-то новое о проблеме. По ходу дела я попросил своего коллегу, автора доклада о sed, помочь мне придумать более эффективный sed скрипт.

Я скинул содержимое varnishadm vcl.show -v "$VCL_NAME" в файл, так я мог сосредоточиться на написании sed скрипта без каких-либо хлопот, связанных с перезагрузками сервиса.

Краткое описание того, как именно sed обрабатывает входные данные, можно найти в его GNU руководстве. В исходниках sed символ \n явно указан в качестве разделителя строк.

В несколько проходов и с рекомендациями моего коллеги мы написали sed скрипт, который давал тот же результат, что и вся исходная строка 116.

Ниже приведён образец файла со входными данными:

> cat vcl-example.vcl Text // VCL.SHOW 0 1578 file with 3 spaces.vcl More text // VCL.SHOW 0 1578 file.vcl Even more text // VCL.SHOW 0 1578 file with TWOspaces.vcl Final text

Это может быть не очевидным из приведенного выше описания, но нас интересует только первый комментарий // VCL.SHOW, причём во входных данных их может быть несколько. Именно поэтому оригинальный awk заканчивает свою работу после первого совпадения.

# шаг первый, вывести только строки с комментариями # используя возможности sed, определяется символ-разделитель с помощью конструкции '\#' вместо обычно используемого '/', за счёт этого не придётся экранировать косые в искомом комментарии # определяется регулярное выражение “// VCL.SHOW”, для поиска строк с определенным шаблоном # флаг -n позаботится о том, чтобы sed не выводил все входные данные, как он это делает по умолчанию (см. ссылку выше) # -E позволяет использовать расширенные регулярные выражения > cat vcl-processor-1.sed \#// VCL.SHOW#p > sed -En -f vcl-processor-1.sed vcl-example.vcl // VCL.SHOW 0 1578 file with 3 spaces.vcl // VCL.SHOW 0 1578 file.vcl // VCL.SHOW 0 1578 file with TWOspaces.vcl  # шаг второй, вывести только имя файла # используя команду “substitute”, с группами внутри регулярных выражений, отображается только нужная группa # и это делается только для совпадений, ранее описанного поиска > cat vcl-processor-2.sed \#// VCL.SHOW# {     s#.* [0-9]+ [0-9]+ (.*)$#\1#     p } > sed -En -f vcl-processor-2.sed vcl-example.vcl file with 3 spaces.vcl file.vcl file with TWOspaces.vcl  # шаг третий, получить только первый из результатов # как и в случае с awk, добавляется немедленное завершения после печати первого найденного совпадения > cat vcl-processor-3.sed \#// VCL.SHOW# {     s#.* [0-9]+ [0-9]+ (.*)$#\1#     p     q } > sed -En -f vcl-processor-3.sed vcl-example.vcl file with 3 spaces.vcl  # шаг четвертый, схлопнуть всё в однострочник, используя двоеточия для разделения команд > sed -En -e '\#// VCL.SHOW#{s#.* [0-9]+ [0-9]+ (.*)$#\1#p;q;}' vcl-example.vcl file with 3 spaces.vcl

Итак, содержимое скрипта varnishreload будет выглядеть примерно так:

VCL_FILE="$(echo "$VCL_SHOW" | sed -En '\#// VCL.SHOW#{s#.*[0-9]+ [0-9]+ (.*)$#\1#p;q;};')"

Вышеприведенная логика может быть кратко выражена следующим образом:
Если строка соответствует регулярному выражению // VCL.SHOW, тогда жадно сожри текст, включающий оба числа в этой строке, и сохрани всё, что останется после этой операции. Выдай сохранённое значение и закончи программу.

Просто, не правда ли?

Мы были довольны sed скриптом и тем фактом, что он заменяет собой весь оригинальный код. Все мои тесты дали желаемые результаты, поэтому я изменил “varnishreload” на сервере и снова запустил systemctl reload varnish. Поганая ошибка echo: write error: Broken pipe вновь смеялась нам в лицо. Подмигивающий курсор ожидал ввода новой команды в темной пустоте терминала…


ссылка на оригинал статьи https://habr.com/ru/post/477968/