28 нояб. 2017 г.

Oracle Streams и AQ_TM_PROCESSES

    Параметр Oracle AQ_TM_PROCESSES в очередях сообщений контролирует мониторинг времени и обработку сообщений с задержкой и заданным сроком действия. Он может принимать значение от 0 до 10. Установка параметра AQ_TM_PROCESSES в ноль отключает Queue Monitor Coordinator, что, как написано в документации Oracle, приведет к серьезным проблемам в работе Oracle Streams. Но даже значение отличное от нуля может привести к проблемам. У моего заказчика при AQ_TM_PROCESSES = 1 трейс-файлы начали "распухать" от сообщений "Streams AQ: waiting for messages in the queue".
    В Oracle 10g был добавлен режим автонастройки Queue Monitor Coordinator. Для его включения параметр AQ_TM_PROCESSES должен быть пустым. Oracle настоятельно рекомендует, что бы параметр AQ_TM_PROCESSES оставался пустым.

Как проверить значение AQ_TM_PROCESSES?
    Запрос "select value from v$parameter where name = 'aq_tm_processes'" не позволяет проверить параметр AQ_TM_PROCESSES, т.к. даже если он пустой (т.е. включен режим автонастройки), то запрос к v$parameter всеравно вернет ноль. Поэтому для его проверки можно использовать следующий скрипт:
declare
  aq_tm_processes pls_integer;
begin
  select value
     into aq_tm_processes
  from v$parameter
  where name = 'aq_tm_processes';
  if aq_tm_processes = 0 then
    select 0
       into aq_tm_processes
    from v$parameter
    where name = 'aq_tm_processes'
       and (isDefault = 'FALSE' or isModified <> 'FALSE');
  end if;
  dbms_output.put_line('AQ_TM_PROCESSES = ' || aq_tm_processes);
exception
  when no_data_found then
    dbms_output.put_line('AQ_TM_PROCESSES is empty');
end;
Как в AQ_TM_PROCESSES установить пустое значение?
    Попытка очистить значение параметра AQ_TM_PROCESSES в Oracle Enterprise Manager Console приводит к ошибке: "Applying dynamic parameter(s) failed. ORA-02017: integer value required". Т.к. по умолчанию AQ_TM_PROCESSES является пустым, то просто сбросим параметр AQ_TM_PROCESSES в значение по умолчанию выполнив комманду:
ALTER SYSTEM RESET AQ_TM_PROCESSES SCOPE=SPFILE SID='*';
Сброс параметра AQ_TM_PROCESSES в значение по умолчанию избавил трейс-файлы моего заказчика от сообщений "Streams AQ: waiting for messages in the queue". Хотя может это совпадение...

P.S. Да прибудут с вами грамотно настроенные сервера баз данных!

19 нояб. 2015 г.

RAD Studio 10 Seattle Update 1

   Embarcadero Technologies выпустила первое обновление RAD Studio 10 Seattle. Оно исправляет несколько сотен ошибок, подробнее... В этой бочке мёда не обошлось без ложки дёгтя: это обновление только для владельцев RAD Studio 10 Seattle с лицензией "Update Subscription" (в менеджере лицензий в описании лицензии должен быть пункт "Is Subscription"). Таким образом, остальные покупатели RAD Studio 10 - в пролете, и после установки этого обновления будут вынуждены поставить старую версию.

Delphi 10 Seattle Web Install (includes Update 1)
C++Builder 10 Seattle Web Install (includes Update 1)
RAD Studio 10 Seattle Web Install (includes Update 1)

24 окт. 2015 г.

Изучайте используемый инструментарий!

   Вчера начал разбираться с чужим проектом на Delphi 7. Система весьма сложная – несколько взаимосвязанных АРМов по 20-50 форм (а может и больше, точно не считал). Усложняет все то, что она разрабатывается уже давно и пережила смену нескольких команд разработчиков. Каждая команда приносила в проект свои инновации. Например, одна из них перевела доступ к БД Oracle с BDE на ADO. При этом все старые объекты для работы с базами через BDE (TDatabase, TTable, TQuery и TStoredProc) продолжают лежать на формах рядом с их копиями для работы через ADO (TADOConnection, TADOTable, TADOQuery и TADOStoredProc). Они даже клонировали объекты TDataSource для ADODataSet'ов. Все замеченные беглым взглядом "интересные" моменты перечислять не буду, а вернусь к заголовку этой заметки. Одна из команд добавила в проект DBGridEh из EhLib 6.0 в компанию к стандартному DBGrid'у. Хороший выбор grid'а, одобряю ;-) Хочу поделится с вами их реализацией сортировки по клику на заготовке колонки. К каждому DBGridEh'у, подчеркиваю - к каждому DBGridEh'у, был написан обработчик OnSortMarkingChanged:
...
dsXYZ: TDataSource;
gridXYZ: TDBGridEh;
...
procedure TfmMain.gridXYZSortMarkingChanged(Sender: TObject);
var
  i: Integer;
  s: String;
  b: TBookmark;
begin
  Screen.Cursor := crHourGlass;
  b := dsXYZ.DataSet.GetBookmark;
  s := '';
  for i := 0 to gridXYZ.SortMarkedColumns.Count - 1 do
    begin
     s := s + gridXYZ.SortMarkedColumns[i].FieldName;
     if (gridXYZ.SortMarkedColumns[i].Title.SortMarker = smDownEh) then
        s := s + ' DESC';
     s := s + ';';
    end;
  TADODataSet(dsXYZ.DataSet).IndexFieldNames := s;
  dsXYZ.DataSet.GotoBookmark( b );
  Screen.Cursor := crDefault;
end;
   В одном из АРМ'ов только на главной форме больше 20 DBGridEh'ов лежащих на страницах TNotebook. И на каждый был написан свой обработчик! Если говорить о Delphi, или о объектно-ориентированном программировании в целом, то почему бы все эти десятки одинаковых обработчиков не заменить на один, где вместо gridXYZ использовать TDBGridEh(Sender) (или (Sender as TDBGridEh)), а вместо dsXYZ.DataSet использовать TDBGridEh(Sender).DataSet? Но самое интересное, что для сортировки в DBGridEh и такого обработчика писать не надо. EhLib для автоматической сортировки данных в DataSet'е имеет набор специальных объектов и от программиста требуется только добавить в раздел "uses" любого модуля в проекте один из модулей EhLibXXX (EhLibBDE, EhLibADO, EhLibCDS... в зависимости от подключенного к grid'у DataSet'а). Таким образом, вместо написания и копипаста десятков обработчиков OnSortMarkingChanged нужно было всего лишь подключить к проекту небольшую юниту EhLibADO.

   Еще, как зануда, отмечу, что вещи в стиле
Screen.Cursor := crHourGlass;
... 
Screen.Cursor := crDefault;
необходимо использовать совместно с конструкцией Try...Finally...End, т.к. если между этими строчками во время выполнения программы произойдет ошибка, то курсор не будет восстановлен. Т.е. нужно было написать так:
Screen.Cursor := crHourGlass;
Try
 ...
Finally
 Screen.Cursor := crDefault;
End
   А еще к восстановлению курсора в блок Finally...End было бы неплохо, для высвобождения памяти распределенной при вызове GetBookmark, добавить DataSet.FreeBookmark(b). Это же элементарно – для всех изменяемых или создаваемых ресурсов, на случай ошибки, нужно гарантировать возвращение их к исходному состоянию или высвобождению занимаемой ими памяти.

   Так, что господа, те кто считает себя программистом, дружите с Try...Finally...End и главное - ИЗУЧАЙТЕ ИСПОЛЬЗУЕМЫЙ ИНСТРУМЕНТАРИЙ!!!

8 окт. 2015 г.

Idera Inc покупает Embarcadero Technologies

   Слухи о том, что компания Idera, Inc покупает компанию Embarcadero Technologies, которые появились на форумах и в блогах в середине сентября подтвердились. Вчера инвестиционная компания Thoma Bravo, LLC опубликовала об этом событии свой пресс-релиз. А немного позже был опубликован и официальный пресс-релиз "Idera Announces Intent to Acquire Embarcadero, Expands Position in Database Management and Developer Tools Markets".
   Вот и закончился семилетний период жизни нашего любимого Delphi в компании Embarcadero Technologies. За это время было сделано 11 релизов Delphi:
  • Delphi 2009 (25 августа 2008) - полная поддержка unicode; новые элементы языков программирования (например, Generics); обновление VCL...
  • Delphi 2010 (25 августа 2009) - повышение производительности; поддержка Windows 7 API, Direct2D и мультисенсорного ввода; IDE Insight; расширение RTTI...
  • Delphi XE (30 августа 2010) – новые возможности VCL, RTL и Open Tools API; доработки в редакторе кода; обновление DataSnap...
  • Delphi XE2 (1 сентября 2011) – поддержка Windows 64, Mac OS X и iOS; кросс-платформенная библиотека FireMonkey; библиотека LiveBindings; улучшения в технологии DataSnap...
  • Delphi XE3 (3 сентября 2012) – поддержка Windows 8; улучшенная поддержка Apple Mac OS X; Firemonkey 2/FM²; удалена поддержка iOS...
  • Delphi XE4 (22 апреля 2013 ) – вернулась поддержка iOS; функционал для разработки мобильных приложений (iPhone и iPad); улучшено взаимодействие с базами данных...
  • Delphi XE5 (11 сентября 2013) - поддержка разработки ПО для устройств с архитектурой ARM, работающих под управлением Android...
  • Delphi XE6 (15 апреля 2014) - исправлены сотни ошибок; новые компоненты (Application Tethering Components, Taskbar component, компоненты для работы с датчиками (акселерометр, GPS и гироскоп)...), взаимодействие с сервисами в облаках (BaaS); возможность создания приложений для Google Glass; новые иконки в IDE...
  • Delphi XE7 (2 сентября 2014) – изменения в RTL и FireMonkey, удалены компоненты для работы с BDE...
  • Delphi XE8 (7 апреля 2015) - поддержка iOS 64; в IDE интегрирована новая система контроля версий Mercurial Version Control System; добавлены два новых независящих от платформы типа данных (FixedInt и FixedUInt)...
  • Delphi 10 Seattle (31 августа 2015) - поддержка Windows 10, iOS 8.4, Android 5.1.1, API WinRT, DirectX 12; новые компоненты...
Как видите, программисты компании Embarcadero трудились над развитием Delphi в стиле "ни дня без строчки", т.е. "ни года без релиза". Для сравнения компания Borland за 13 лет (с 1995-го по 2008-й), если не считать "мертворожденных" Kylix и Delphi 8.NET, были сделаны всего 10 резов Delphi. Хотя авторство Delphi 2009 спорно, т.к. эта версия была выпущена Embarcadero всего через несколько месяцев после покупки компании Borland. По большому счету, не важно, какая компания разрабатывает Delphi (скорбим только о Borland). Важно то, чтобы команда разработчиков Delphi дружной толпой, не снижая набранного темпа, продолжила работу над своим проектом под крышей Idera, а компания Idera уделяла больше внимания и средств на дальнейшее развитие и продвижение Delphi.

21 апр. 2014 г.

FastReport VCL 5. Улучшение интерактивности

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