bash.im ithappens.me zadolba.li

Программы

12759

Не пытайтесь покинуть скайп

26 октября 2014, 08:12

Люблю скайп.

Обновления, после которых глюков становится больше, неслабые машины начинают подтормаживать, а слабые становятся на колени. Если не обновился — связи не будет: «Невозможно подключиться», и точка.

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

Идущие по несколько дней сообщения и неубиваемые уведомления о пропущенных полгода назад звонках.

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

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

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

Я, кажется, уже говорил, что люблю скайп?

12754

У десяти серверов продукт без глазу

24 октября 2014, 07:24

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

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

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

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

В общем, заканчиваю с затянувшимся вступлением и перехожу непосредственно к описанию этого чудо-комплекса.

Комплекс состоял приблизительно из десятка серверов, каждый из которых был заточен под решение конкретной задачи: один сервер БД, один сервер управления поисковыми роботами, один сервер, собственно, этих роботов, один сервер обработки, один сервер распознавания текста, один сервер веб-интерфейса и ещё разные серверы. Все машины на момент установки уже устарели на два-три года, не отличались большой мощностью, имели оперативную память от 8 до 12 ГБ, что выглядело немного странно, учитывая наличие двух процессоров Xeon в каждом. При грамотном использовании ресурсов весь этот комплекс, в принципе, обладал бы очень неплохой вычислительной мощностью. Однако логика разработчиков, видимо, была проста: одна задача — один сервер, и неважно, что часть задач выполняется последовательно, и большую часть времени половина серверов простаивает, а вторая половина трудится на 5–10% мощности. Сервер распознавания текста вообще не использовался: Файнридер был на каждой клиентской машине.

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

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

Данные для отображения в веб-интерфейсе диспетчера хранятся в отдельных таблицах БД. При любом действии в интерфейсе вызывается каскад T-SQL-запросов, который вносит изменения в основную базу, пересчитывает таблицы для отображения и потом запрашивает данные. В процессе работы размер таблиц растёт, время выполнения запросов увеличивается, и оператор, слишком быстро нажав пару кнопок, легко и непринуждённо может вызвать блокировку БД, приводящую к падению диспетчера и веб-интерфейса.

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

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

Ах да, забыл сказать: на сервере диспетчера установлена 32-битная Windows XP. Это при двухпроцессорной-то архитектуре и 12 гигах памяти.

Допустим, что данные собраны успешно и легли в соответствующие таблицы MS SQL, далее их надо передать в подсистему обработки. Что тут сложного, спросите вы? А сложно то, что подсистема обработки — это крайне устаревшая проприетарная система с поисковым движком в ядре, работающая на PostgreSQL. То есть данные нужно экспортировать из одной базы в другую. Как же это рациональнее всего сделать? Конечно, сделать передачу по расписанию, которая, дабы днём не снижать производительность сервера обработки, будет каждый день в 00:00 перекидывать накопленный массив данных. Что мы получаем в итоге? Система обработки пыхтит ночь напролёт, индексируя и анализируя полученный одномоментно массив данных, пользователи получают результаты с задержкой в один день, зато сервер обработки днём совершенно разгружен и готов к выполнению работы. Вот только какой?

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

Опять же, допустим, что всё получилось и работает нормально. Пользователь зашёл на веб-интерфейс программы обработки, отобрал нужные ему документы и хочет их себе сохранить для дальнейшей работы. Не тут-то было! Экспорт осуществляется в формате либо XML, либо XLS, при этом в экспорте не учитывается информация о рубриках, тексты лишаются намёков на форматирование, получить документ в оригинальном виде просто невозможно, хотя в базе он есть…

В общем, весь этот комплекс можно было довести до ума, обвешав по самое не балуй костылями, игнорировать большинство косячных встроенных функций, забирать данные из баз напрямую сторонними средствами, но весь этот зоопарк потребовал бы колоссальных усилий на поддержание в работоспособном виде и изменение каких-либо параметров. И что мы имеем в итоге? Дорогущая система стоимостью в несколько миллионов, развёрнутая на морально устаревшем в момент приобретения железе, разнородное ПО, скреплённое ржавыми гвоздями и неспособное работать в комплексе более пары дней, один уволившийся программист, психанувший после долгих попыток заставить всё это работать, — и ни одного дня использования этой системы по назначению вплоть до дня официального окончания поддержки, когда выжившие специалисты со скупыми мужскими слезами радости наконец удалили весь этот кошмар и развернули на серверах аналогичное самописное ПО с использованием опенсорса, возможно, тоже в чём-то глючное и несовершенное, но так хорошо справлявшееся с поставленными задачами, ютясь на обычных рабочих станциях, используемых вместо серверов!

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

12745

С точностью до ослика

22 октября 2014, 07:00

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

Попробую объяснить. Дело всё в том, что производители и поставщики софта заинтересованы в поддержке работы своих продуктов в длительной перспективе. Сделали, протестировали, поставили продукт, посадили техподдержку на телефон и раздали ей инструкции.

Если система предполагает, что её пользователи преимущественно используют Виндоус, то в Виндоусе обязательно есть Интернет-эксплорер, а значит, можно написать инструкцию с точностью до пунктов его меню. Когда в техподдержку позвонит жаждущий: «У меня ничего не работает!», оператор колл-центра прочитает в ответ: «Нажмите третью кнопку сверху и во втором пункте проставьте правую галочку», после чего проблема в 90% случаев будет решена. Поэтому при поставке продукта будет оговорено, что он работает например, с IE 9.0 — значит, именно по нему есть инструкция у операторов.

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

Но бывает и иначе: если используется какая-то возможность HTML5 — вероятность того, что её поддерживает Хром, куда как выше, чем вероятность работы в IE. Впрочем, другие браузеры тоже, скорее всего, будут работать, просто в них не тестировали.

И наоборот, какой-нибудь ActiveX-компонент работает только в IE, только под Виндоусом, да ещё может зависеть от конкретной версии ОС. В этом IE уникален и незаменим.

Впрочем, некоторые поступают иначе: если программа или система отказывается работать, кроме как в IE — можно заменить саму программу, а то и её владельца, например, банк. В самом деле, как можно доверять банку, если его IT-департамент до сих пор не слышал о существовании других ОС и браузеров?

12742

Меньше мягкого

21 октября 2014, 07:00

Как раз отношусь к тем людям, которые совершают множество лишних действий, а именно пользуются Интернет-эксплорером и Проводником. Как бы дико это ни звучало для поборников Тотал-коммандера, это софт несколько платный. А компания у нас бедная. Достаточно небедная, чтобы работать на лицензионном софте, но достаточно бедная, чтобы не покупать то, без чего можно обойтись. В своё время во исполнение начальственной воли бойцы мои прошли по всем компьютерам пользовательским и снесли все Тотал-коммандеры, Винрары, Эйсидиси, не говоря уже о продуктах крупных разработчиков. Желающим было предложено написать служебную записку на моё имя с обоснованием необходимости приобретения. Про Тотал-коммандер ни одной не было. Распознавалки и рисовалки были популярнее. А скольким людям нужны для работы социальные сети… Не видел бы — не поверил.

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

Продолжая тему файловых менеджеров: командная строка ещё удобнее. copy *.* или cp *.* в зависимости от религии. И не надо мышкой по монитору между папками шариться.

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

И да, я храню ежедневник за 2008 год. Работу я не менял, и полезной информации в нём — море. Задача наёмного сотрудника, как я её вижу — решать задачи, а не плодить новые. Если в ежедневнике огромное количество контактов, аккаунтов, задач и прочей информации, то почему бы и нет. Не в телефон же всё это вносить, если понадобится один контакт из сотни? Пусть лежит — еды не просит, полезен.

Эх, сколько в IT лишних действий — одна политика паролей чего стоит! А ежедневное копирование на внешний носитель или шифрование данных…

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

12737

Проводник в мир лишних действий

19 октября 2014, 07:12

Мне очень тягостно смотреть, как программисты (мои знакомые, но допускаю, что бывают и другие) копируют файл. Открывают Проводник, щёлкнув на «Мой компьютер» на рабочем столе. Ищут нужный файл, не нажимая на плюсики, а щёлкая по папкам. Находят его, копируют через правую кнопку мыши (и часто забывают это сделать!). Открывают ещё один Проводник, щёлкая по «Моему компьютеру» и игнорируя мой совет нажать Win+Е. Там переходят на диск D:, ищут папку, куда надо вставить файл. Вставляют его. Если оказывается, что забыли скопировать, то запускают ещё один Проводник, помня, что уже висит где-то открытый на нужном месте, но наплевав на это и решив, что проще заново всё сделать, чем искать среди множества открытых окон… Ну, и так далее. Обращали внимание, сколько открытых Проводников у таких людей? А в Тотале (PowerDesk, Directory) всё делается двумя кликами мышки и нажатием одной клавиши F5. Но им это не надо. Ну, на здоровье! Я просто ухожу куда-нибудь минут на десять, чтобы не видеть этого всего. Но если у меня не будет Тотал-коммандеров, то я не захочу пользоваться компьютером. Столько манипуляций для того, чтобы всего-то навсего скопировать файл, я не выдержу.

Таких, как я, пока много. Для нас и пишут и Тоталы, и всё прочее. Чтобы работать и пользоваться компьютером было быстрее, удобнее, эффективнее. А для тех, кому не надо быстро и удобно — для них есть Аутлук, Проводник, Интернет-эксплорер, ежедневник за 2008 год в дерматиновой обложке, в конце концов…

12731

Пока ключи не стали тыквой

17 октября 2014, 07:12

Работаю в маленьком филиале большой компании. Раз в квартал приходится пользоваться всем известной системой отправки бухгалтерской отчётности через интернет. Главбух попросила «проверить систему» в 17:50, и на бухгалтерском компьютере за десять минут до окончания рабочего дня так ничего сделать и не удалось. Комп полудохлый, тормозит безбожно, но на нём «всё настроено» — куча сертификатов и ключей от разных важных организаций. А бухгалтеры с него в основном работают в терминале на ферме.

Итак, события следующего дня.

8:50. Запускаю подключение к системе отчётности.

8:56. Получаю сообщение об истечении срока действия сертификата через 2 часа 8 минут. Отчёт необходимо отправить строго сегодня.

9:00. Наконец добираюсь до входа в систему и обнаруживаю, что обновления требует и криптопрограмма для этой системы.

9:00 — 9:25. Обновляю криптопрограмму. Обнаруживается, что новая версия требует 20-значный ключ, а наш на 10 символов.

9:30 — 9:40. Слушаю мнение главбуха и отпаиваюсь чаем.

9:45 — 10:05. Путешествую по техподдержкам головной компании и оператора системы. Нужный человек найден, ключ запрошен.

10:10 — 10:25. Жду ключ.

10:30 — 10:50. Ввожу ключ, завершаю установку криптопрограммы, вхожу в систему под уведомление о скором истечении сертификата.

10:55. Главбух присылает Word-форму на запрос сертификата. Ждать два дня!

11:00. Обнаруживаю возможность запроса нового сертификата с помощью старого. Генерирую новый, подписываю старым за семь минут до его истечения.

11:10. Старый сертификат сдох, новый готов. Отпаиваюсь чаем, зову бухгалтера для заполнения формы.

Мораль:

  • планируй обновления сертификатов и ключей за несколько дней до их истечения, используй напоминалки (даже если на год вперёд);

  • не надейся на уведомления от вышестоящих уполномоченных товарищей;

  • доверяй пятой точке своего главбуха, ибо работа у него такая;

  • не сдавайся и борись до последнего.

12711

Хочешь, я расскажу тебе сказку?

11 октября 2014, 07:24

Интересный DVD-плеер прикатил к нам из Поднебесной. Любой видеофайл на носителе можно пометить как защищённый от просмотра детьми. После этого, пока не введёшь пароль, видео будет проигрываться без изображения — с одним звуком. Глухих детей рожать прикажете?

12710

Остальное — слова и бумаги

11 октября 2014, 07:12

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

Так сложилось, что обычно я веду IT-проекты со стороны заказчика. Самые разные, от корпоративных информационных систем до охранных сигнализаций, при этом группа компаний работает в разных странах и регионах. Самые разные задачи бывают. Экономят у нас в конторе на людях, что поделаешь. Да везде так же.

И вот что я вам скажу, господа подрядчики, интеграторы, франчайзеры 1С и иже с ними: не там вы брёвна ищете.

Когда идёт обсуждение и составление ТЗ, то это мы сделаем, это мы вообще сделаем, а об этом можно и не писать, само собой разумеется.

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

На этапе оплаты — акты уже подписаны, где наши деньги? То, что мы обещали, да, доделаем. Может быть. Не в этом году. Если заплатят ещё. Не работает? А куда вы смотрели, когда принимали? Всё работало? Так никто и не говорил, что оно через неделю работать будет. Платите за поддержку.

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

Потому что, господа, вы всегда упускаете несколько нюансов.

Во-первых, заказчику нужен продукт. Это вам нужно денег, нужно платить зарплату, нужен оборот, нужно найти людей, нужно занять людей, у вас есть другие проекты и другие объекты. А заказчику нужен результат. Если вы вместо результата даёте что-то ещё, а я слышу вышеназванные отмазки, я могу просто перестать вам платить. Добро пожаловать в суд! Разница в том, что у вас опытного юриста нет, а у меня есть. А также в том, что при заключении следующего договора с любым солидным заказчиком вас будет проверять его СБ. И если с предыдущим заказчиком вы судились, то не мне вам объяснять… А ещё в том, что пока идёт суд, у нас идёт бизнес, а у вас деньги выведены из оборота. В общем, со всех сторон получается, что вам надо работать, а не права качать. В большинстве случаев заказчик не зверь, просто подрядчик почему-то считает, что 80% от стоимости проекта — это его чистая прибыль, а требования заказчика взяты с потолка. А по факту 10% прибыли от суммы заказа для компании подрядчика — это уже неплохо. Остальное — материалы, зарплата исполнителей, налоги… Не знаю, как у вас, а в компании, где работаю я, распилы остались в далёком прошлом. И когда я считаю, сколько мы готовы заплатить за проект, то учитываю затраты подрядчика. И если я вижу, что работы на сто тысяч, а выкатывают миллион, то лесом, господа, лесом. Половину мне — тем более лесом. У нас тоже не дураки сидят.

И если я говорю, какой отчёт для CRM мне нужен или какой должен использоваться провод, то так и должно быть. Нужно именно то, что написано в ТЗ. Если доводчик должен закрывать дверь, то «заказали не тот доводчик, на сайте производителя неправильно указаны характеристики» — это детская отмазка. Да, денег не будет, пока не переделаете. Мне всё равно, что в подписанной смете этот доводчик. Если я буду проверять каждую позицию сметы на соответствие ТЗ, проект на соответствие всем отраслевым стандартам, условия продажи каждой лицензии на соответствие законодательству, то зачем мне нужны вы? Да, приходится проверять — но не каждый же доводчик! Мир крутится не вокруг вас, и у заказчика нет цели заплатить вам денег. В последнем примере у меня нет цели купить доводчик — у меня есть цель получить систему контроля и управления доступом в рабочем виде. И закрывающий платёж будет тогда, когда она будет работать, не раньше.

Все проблемы решаются. Главное — понимать, кому и что друг от друга нужно. Вам — деньги, нам — результат. А всё остальное — всего лишь слова и бумаги.

Ещё со сроками всегда весело. Если подрядчик срывает сроки на полгода, то он за это хочет ещё денег, потому что работы оказалось больше, чем планировалось. Когда после этого заказчик задерживает оплату на месяц, подрядчик воет, грозит судом, активирует закладки…

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

12707

Демонстрация намерений

10 октября 2014, 07:12

Автор заметки «Утром стулья, вечером хрен» как-то забыл о том, что пока деньги за автомобиль не выплачены, он принадлежит продавцу. Последний, как текущий владелец, может делать с ним что угодно, хоть медвежью мочу вместо масла залить.

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

Выгодней, чем ставить закладки? О да! Так почему закладки всё ещё ставят? Потому что, как в анекдоте про АвтоВАЗ, место проклятое. Механизмы, которые должны защищать, не работают.

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

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

После завершения проекта пришло осознание, что платить никто не собирается. Акты не подписаны, ответственные лица не отвечают, только намёки из категории «будете возмущаться — неустойку потребуем».

Проходит месяц. На сайте активируется демо-режим, а так как код мы обфусцировали, неспециалист его не выключит. Все, кто заходит почитать про успехи горадминистрации в плане заботы о пенсионерах, видит поперёк страницы красный баннер: «Это демонстрационная версия продукта, создаваемого фирмой %Имя% для горадминистрации по договору %реквизиты%».

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