Profile

coolwolf0: (Default)
coolwolf0

July 2025

S M T W T F S
  123 45
6789101112
13141516171819
20212223242526
2728293031  

Custom Text

Для тех, кто не в курсе: так программисты называют витиеватые способы, которыми программа может сделать себе больно.

Итак, был у меня замечательный код, просто конфетка: после выбора фильтра в верхнем меню он проходил по всем имеющимся объектам и помечал не прошедшие фильтрацию ноликом, а прошедшие - единичкой. После этого на сцену выходил его высочество AngularJS который показывал или прятал объект, в зависимости от того самого статуса.
Но начальство резонно заметило, что прятать от пользователя объекты, пусть даже отфильтрованные, некрасиво. А красиво было бы объект показать, но в стиле "disabled" - сереньким, с выключенными действиями по клику мышки. Сказано - сделано: пошаманил с CSS, переставил вместо ng-hide вычисляемый класс ng-class зависимый от всё того же битового поля 0/1.
И оно тоже прекрасно заработало, и увидел я что это хорошо, и сказал "да быть интеграции". Дело в том, что помимо этих визуальных чудес, я накрутил сложнючий код на PHP, который читал инфу из JSON-файла, объединял эту инфу с реальными объектами из базы данных, остатки разбивал на два подмножества (привет вычислительная математика)...
Поэтому, чтобы немного облегчить мне жизнь, вопросами фронт-энда занялся совсем другой человек. Он просто заметил, что в моём жаба-скрипте есть что-то связанное с условием показывать/спрятать, и логично рассудив, что именно этого ему почему-то не хватает, понаставил в собственном цикле единички во все объекты.
И вот, собрана бета-версия, начинаю тестировать и получаю полный игнор: что бы я ни фильтровал, ни черта не меняется. Начинаю дебажить жаба-скрипт - в нужные места программа заходит, нолики честно прописывает. Натравливаю на данные JSON.stringify и печатаю результат на консоль - та же картина, все нолики на месте. Но проклятый Angular продолжает игнорировать мои нолики! Уж не знаю, каким чудом я догадался заглянуть на несколько строчек ниже своего дампа: kurwa, вся моя фильтрация аккуратно идёт под нож. И ведь не упрекнёшь человека в том, что он мне данные попортил - надо было самому не лениться и переменную переименовать во что-то более self-explanatory.
Строчка взята в сегодняшнем логе одного из пользователей:

{{{
[ERROR]File Mohammad does not exist
}}}

Спрашивается, не нарушает ли это сообщение первый столп ислама, шаhаду "лоильаллаhy ильаллаh ..."?
КДПВ... )
Для нового проекта в области DevOps учу кучу незнакомых вещей: все эти IPMI, DCMI, SNMP и прочая, и прочая.
В одной из под-задачек понадобилось проверить, а открыт ли https-порт (прежде чем ломиться туда с криками "сова, открывай, медведь пришёл!"). Насколько мне было известно, для тупых проверок нужен 'nc хост порт', вот только в автоматическом режиме это не работает. Попробовал стандартный флаг "-z" - в нашей версии "nc" его тупо нет (sic!).

Ну чо, скачал сорцы nmap, сконфигурировал, собрал и установил - voila, система заговорила на нужном языке! Совсем как в старые добрые времена ./configure; make; make install

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

I like my job |-)

КДПВ... )
Кто-то учится ракеты на Марс отправлять, а ВПС к 50 с лишком годам научился Апач ставить, да чтоб со всеми нужными плагинами и клиентами. Задача была поставлена максимально приближенная к боевой - восстать из руин (что с давних пор официяльно называется би-си-пи, то есть "что будем делать, если всё пропало"). Мне предоставили голый-босый убунто-сервер дабы на нём восстановить фунциклирование нашей системы. Начал я с простого - воткнул все сорсы под /var/www/html. Поскольку веб-морда основана на вышеупомянутом Апаче, он был поставлен при помощи элементарного yum install httpd. Естественно, этого мало - нужна скотинка под названием пе-ха-пе: yum install php -y. Ну а дальше начался полный хаос: плагины сыпались отовсюду, это был и XML, и LDAP, и Оракл с Редисом. Естественно, Ораклу недостаточно было просто встать как приложение к пе-ха-пе, ему клиента подавай. Пришлось немного пожульничать и скопировать клиентские библиотеки. Но это не сильно помогло - динамические библиотеки Апач так и не увидел (а очень хотел - так в один голос советовали умные люди из разных нагугленных форумов). Пропустив мат-перемат пострадавших, нашёл в тех постингах зацепку - файл конфигурации должен определять переменные ORACLE_HOME и LD_LIBRARY_PATH (наши старые знакомые по аналогичным затыкам в Пайтоне). Каким-то чудом я прекратил безрезультатные поиски в /etc/httpd/conf* и подсмотрел /etc/sysconfig/httpd на "донорском" хосте - там-то всё и было прописано простым и понятным присвоением, как в шелле. После этого привычное телодвижение по рестарту service httpd restart и вуаля - приложение забежало как полагается.
Увы, моя работа изо дня в день связана с офисным мусором, который поддерживается рабочим лептопом. Помимо того, что там аутлук, мессенджеры, звонилка, и т.п. самое главное приложение для работы - это VNC Viewer, через который я и попадаю в свою вселенную линуксов. За 5 лет работы я могу по пальцам одной руки сосчитать количество перезагрузок линуксового десктопа, да и то по внешним причинам (ну не складывается иногда что-то в сети или у хайпервайзорного железа). А лептоп постоянно живёт своей жизнью - накатывает обновления, активно что-то архивирует-дезархивирует, требует немедленной перезагрузки или просто отказывается работать, намекая, что без ребута дальнейшее сотрудничество проблематично. Естественно, открытые окна при этом пропадают, архивация тормозит все процессы, а перезагрузка занимает по 15 минут драгоценного рабочего времени.

А недавно винда вообще впала в детство. Давно уже я не видел ситуации, когда менюшка правого клика какого-нибудь приложения оставляла бы за собой на десктопе неудаляемую "висящую" строчку текста. И вот опять это вернулось. Сначала я наивно попытался позакрывать все окна - не помогло. Перезагрузился, немного поработал, правый клик и опять такая же фигня. Причем поверх VNC! Работать невозможно. Попробовал перезапустить Explorer - убил в списке процессов и запустил заново. Результат тот же. Но тут мне пришла в голову шальная мысль - а если просто вырубить тот десктоп? Включил-выключил монитор, лептоп недовольно перещелкнул видео туда-сюда и ... мерзкая строчка пропала! Ура, на хитрую жопу нашелся хитрый болт с левой резьбой. Майкрософт может продолжать своё мерзкое дело, он нам не страшен.
У меня дома завелась специальная мышь для работы. Столько времени держался, говорил себе "всё временно, можно потерпеть", и вот решился.
Кстати, можно было и с работы привезти, но это как-то совсем уже. Опять-таки, у нас даже онлайн-опрос проводили, не хотим ли мы после отмены ограничений работать из дома.
Не скажу, что это идеальное место - всё-таки есть мелочи, которые имеются только в офисе, но лично я за то, чтобы хотя бы раз в неделю нам разрешили работать из дома на официальном уровне. По крайней мере многие месяцы доказали, что без толкотни в столовке и походов на совещания можно обойтись (я уже не говорю про езду туды-сюды, пусть даже без пробок)
Как я уже упоминал, на моём рабочем компе после очередного обновления винды перестали работать все "самодельные" ассоциации приложений по расширению файла. Вот такой лес, без деревьев. Офисные - пожальте, а всякие VNC, Пайтон, и медиафайлы - пошли на мороз. Хорошо хоть картинки через Пикасу открываются.

Погоревал я, и ... накатал скриптик. Ясное дело, работает он только из командной строки FAR, зато как работает! Просто загляденье. Итак, чтобы открыть автоматически ассоциированную программу надо в командной строке добавить имя бат-файла (для скорости названного AA.BAT) и закинуть ему через Ctrl+Enter файл в качестве аргумента. Всё, батничек вызывает через виндовую команду START интерпретатор Пайтона (специальную не-консольную версию) и он спокойненько открывает файл при помощи расписанного в собственной конфигурации приложения, будь то GIMP, MediaMonkey, SumatraPDF или VLC. Пара часов сидения за компом, и проблема решена, причём теперь я сам решаю, какое действие будет по умолчанию (опционально можно добавлять альтернативные действия, например "редактировать" или "распечатать").

Прикольно, но мне удалось даже решить проблему выдачи сообщений об ошибке. Я не стал чикаться с Tk под Пайтоном (технически это не сложно, но бессмысленно городить приложение ради окошка с сообщением об ошибке). Просто использовал универсальный "швейцарский нож виндовой автоматизации" - nircmd. Простой израильский парень Нир Сойфер объединил все самые часто используемые действия в сценариях работы с виндой в один экзешник. Просто прочитайте прилагаемый к нему хелп-файл и вы сходу начнёте выделывать всякие крутые штучки, не вдаваясь в хитрости программирования. У меня, например, на большом домашнем компьютере при помощи этой приблуды сделана иконка "перейти в спящий режим". Короче, будьте проще, и проблемы сами не захотят к вам приставать.

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

Ну и чтобы вы не скучали, расскажу ещё одну байку, но для баланса - из мира Линуксов. ВПС получил как-то задачу: научить систему распаковывать архивы на экзотической платформе (Винда ARM64). Решение было простым - использовать пайтоновскую библиотеку, которая распаковывает хоть чёрта лысого, независимо от операционки и типа процессора. И вот, через месяц, у линуксовых групп начались проблемы: тот самый скрипт падает на распаковке архива. Что за ёперный балет, подумал я, - у всех работает, а у них - падает. Начал копать, посмотрел сообщение об ошибке и о...бомлел: архив содержал некорректные симлинки! Открываю его через less - действительно сплошные линки на самого себя, кому же такое понравится? Впрочем, штатный tar раскрывал такой архив без проблем. Пришлось искать виноватых и наказывать непричастных. Оказалось, что при создании архива tar получил очень противоречивые аргументы - одна и та же папочка упоминалась дважды. Что же сделал этот *** умник? Создал внутри архива линки на самих себя!!! Реально, попробуйте запаковать через tar директорию и тут же вместе с ней - её поддиректорию. Получите того самого монстра. И пусть на распаковке падал только старый Пайтон2, всё равно, история не из приятных.
Увы, по долгу службы приходится иногда программировать на языке, который если не мой ровесник, то почти (он - 1974 года рождения). И то, что его всячески облагородили в некоей Корпорации Добра, не делает SQL языком программирования. Это какой-то монстр, годный только для Job security на старости лет.

Приведу сегодняшний пример. На Оракловском SQL написана функция, которая должна вернуть простой битовый ответ да/нет на вопрос о членстве пользователя в некой группе. Данные собираются из двух таблиц и результат суммируется через COUNT(*). Всё было бы кошерно, если бы не одно "но": у некоторых пользователей функция упорно возвращает нолик, хотя запустив саму query получаем туеву хучу результатов (многие тыщи). Начали копать, ковырять и мучать эту функцию. Запустили дебаггер (слава яйцам, Корпорация Добра приделала к функциям такую возможность). И что же всплыло? После выполнения запроса функция вылетает по EXCEPTION! Ну какое может быть событие, вызывающее падение тупого запроса (который спокойно работает вне функции)? Копаем дальше - результат запроса попадает в целочисленную переменную... И тут Штирлица осенило: переменная была описана как NUMBER(5), поэтому результат туда иногда не помещался! Проверили - действительно страдающие от дискриминации пользователи получали 6-значное значение. Исправили на NUMBER(10) - нехай тот хомяк подавится - и всё заработало. Да, криворукость автора функции тут тоже присутствует, но бросать EXCEPTION без объяснения причин - свинство.

PS Коллега теперь считает меня колдуном - найти такой баг буквально анализируя сорсы...
Я тут уже почти третью неделю кряду пытаюсь разгадать секрет, почему зависает удалённый клиент при ЛЮБОМ подключении к некоему множеству линуксовых хостов.
Перепробованы аж два вида соединений - по RPyC и SSH. В обоих случаях, если контролируемый удалённо процесс бежит меньше часа, то клиентская сторона получает отчётливый сигнал о завершении. А вот стоит перейти границу часового ожидания, и всё - процесс на стороне сервера успешно отрабатывает, а клиент этого не видит и ждёт у сокета погоды (пока не помирает через собственный тайм-аут).

Дебагировать такую пакость при помощи дебаггера - штука опасная в том плане, что наблюдатель привносит в наблюдаемую систему очевидное крушение сценария: вместо обслуживания сокета, сервис будет ужасно долго чикаться с интерактивным дебаггером. Поэтому ВПС пошёл другим путём - подключил в "подозрительный" код трейсер pysnooper.
 (благо у RPyC серверная часть тоже на Пайтоне написана). Получилось прикольно (жалко, что не помогло - лажа оказалась на уровне сокета, а там никакой трейсер уже нифигашечки не видит). Тем не менее, если будете такие вещи дебагировать - попробуйте. Это реально удобная штука, хотя бы для вынесения вердикта "тут всё в порядке - проблемы где-то глубже", ибо исполняемый код можно натурально просмотреть глазами.

Кстати, просто анализируя код, мой коллега нашёл баг в RPyC версии 4.1.4 - если у кого тормозит при передаче данных, откатитесь на пару версий назад.
Дыбр из рабочих будней (мы все продолжаем трудиться из дома). Пользователь жалится с утра, что наполучал тонны тревожных писем от watchdog-а, который не смог поднять сервис на одном из его хостов. Первое, что сделали в качестве реакции - зашли на ту машину, и ... увидели сервис радостно дрыгающий ножками и вопрошающий "чего изволите-с?". На всякий случай сервис перезапустили и он бодро побежал дальше. После этого (точно как в юмореске раннего Задонова) пользователь опять шлёт слёзный мейл - на меня сыплются сообщения про упавший сервис! На этот раз за дело взялся ВПС. Первым делом попросил переслать в виде аттачмента образец получаемого мейла (вдруг какой оптический обман здрения?). Проверил заголовок SMTP - действительно прислано с "проблемного" хоста. На всякий случай подергал за сервис еще раз - перезапустил и убедился в его работоспособности. Всё зашибись, но мейлы-то идут! Подключил коллегу (по телефону), стали смотреть вместе. Зашли в лог watchdog-а - действительно ошибки обнаруживаются с завидной периодичностью. Поубивали на всякий случай процессы watchdog-а (которых оказалось два, но мы не обратили внимания). Через какое-то время процессы поднялись по crontab и ошибки понеслись дальше. Повертели файлы конфигурации - ничего криминального, всё как доктор прописал. И тут Соколиный Глаз (в лице моего коллеги) заметил, что второй watchdog бежит не с правами root-а! Это был совсем "левый" процесс, цель которого ограничивалась удалением старых директорий на общем сетевом диске!!! И (естественно) ему нехватало прав не то чтобы запустить сервис, а даже на проверку его состояния.

Вы спросите, а где же мораль и кто виноват? Мораль в том, что crontab этого процесса мы тупо не видели (ибо cron работает строго для каждого пользователя индивидуально). И только посмотрев на то, под каким пользователем бежит злосчастный процесс, можно было догадаться, что он занимается ерундой и шлёт никому не нужные репорты.

Сказка - ложь, да в ней намёк, не забывайте про права процессов, и про crontab других аккаунтов.
Как вариант - использовать из-под cron-а sudo и не лохматить бабушку.

В следующей серии - как дебагировать упавшие сокеты RPyC без дебаггера.