Очень просто. Я — тот дядька, который в результате публикации вышеупомянутой истории долго и терпеливо рассказывал другим дядькам, очень богатым и важным, а также совершенно не разбирающимся в IT вообще и IT-безопасности в частности, что детское хвастовство, где бы и в каком бы тоне оно ни было опубликовано, остаётся детским хвастовством, то есть ложью от начала до конца. Показывал. Демонстрировал. Убеждал. Очень устал от этого утомительного занятия.
Пользователи терминалов оплаты, банкоматов и прочих деньговыдающих или деньгопринимающих машин! Помните: если вы обнаружите, что железяка, которой вы привыкли пользоваться, вдруг начала брать либо увеличила существующую комиссию, а то и вовсе пропала, знайте: это реакция рынка на возросшие риски. Возросшие не с точки зрения отделов ИБ, вовсе нет. Риски возросли с точки зрения ничего не понимающих в IT дядек, которых успешно напугала очередная детская шуточка.
#7078: Powered by magic
16:45 24.08.2011, IT happens
Пишу проект на Delphi. В работе использую нестандартные компоненты из набора AlphaControls. Есть там такой симпатичный TFramebar — панель со сворачивающимися вкладками, на которых размещаются фреймы. И удобно, и красиво.
И было бы всё тихо-мирно, не понадобись мне воплотить следующую идею. Есть два фрейма, реализующих пользовательские интерфейсы для поиска и сортировки в БД. Эти фреймы помещаются на вкладки упомянутого фреймбара. Получается очень кошерная менюшка для манипуляции данными. А в приложении несколько таблиц, и каждой такую менюшку нужно прикрутить. Как это сделать? Ну конечно — кинуть саму менюшку на новый фрейм и разместить его экземпляры везде, где понадобится. Получится фрейм, на котором находится контейнер фреймов, в котором лежит два других фрейма (фрейм на фрейме и фреймом погоняет), но выглядит идея здраво. Начинаю воплощать.
Оказалось, что фреймы на фреймбарe нельзя просто взять и разместить (как, например, на привычном TPageControl — накидал, и готово). Здесь у каждой панельки прописывается событие OnFrameCreate, в котором нужно указать тип создаваемого фрейма. Только в runtime экземпляр будет создан и размещён на вкладке.
И вот тут-то подкрался капец. Привычный механизм наследования, когда потомок имеет доступ к свойствам и методам предка, у этого компонента почему-то сбойнул. То есть экземпляры моего фреймоконтейнера понятия не имели, что где-то там, в родительском модуле, у TFramebar прописаны обработчики и типы для фреймов на вкладках. При запуске я лицезрел пустые панельки с надписью: «Frame creation event has not been defined».
Когда гугление, медитация и маты не помогли, в дело вступил метод научного тыка. Я попробовал создать обработчик уже для экземпляра фрейма-контейнера. Он создался, при этом обязательный в таких случаях вызов соответствующей процедуры из родительского класса в нём не прописался, что подтвердило предположение о том, что этот потомок своих предков не помнит. Попробовал прописать вызов вручную — куда там, не знает оно о его существовании. Ладно, тупо скопировал код из родительского обработчика — при запуске словил невнятный эксепшн. Убрал обработчик — снова «has not been defined». Плюнул, создал событие обратно, поставил внутри комментарий (чтобы Delphi не удаляла пустой обработчик) и запустил. Моё долгожданное меню сортировки смотрело на меня со вкладки контейнера.
Я не поверил. Повторил все пройденные пункты — та же фигня. Создал пустой обработчик с одним только комментарием внутри для второй вкладки — менюшка поиска встала в строй. Минут пять я медитировал на это дело. Потом вздохнул — и пошёл лепить эти костыли во всех экземплярах контейнера.
Теперь в нескольких модулях красуются потрясающие по глубине и содержанию фрагменты вида:
И такая пара для каждой вкладки контейнера.
Не раз уже сталкивался, казалось бы, с мистическими глюками в работе, но причина всё же находилась. А здесь — увы… Powered by magic, в общем.
#7079: Секретарша Лентопротяжкина
16:45 24.08.2011, IT happens
— Зайди к нам, документы не печатаются.
По пути к рабочему месту сотрудника я прокручивал в голове возможные варианты: чернила кончились, бумага замялась, проблемы с дровами?
Первый раз за мою практику причиной отказа печати было физическое отсутствие принтера, который, к слову, всю жизнь стоял на столе этого сотрудника.
#7080: Затычка по-Гоблински
16:45 24.08.2011, IT happens