24 сентября 2008 г.

Технический семинар Embarcadero

Вернулся с семинара Embarcadero Новое поколение средств разработки.

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

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

Собственно, основной целью семинара было всё же знакомство российских Delphi разработчиков с линейкой продуктов Embarcadero/DatabaseGear (совсем грубо говоря: реклама - покупайте наших слонов). Ну и конечно, помимо этого, нужно было и рассказать о новых Delphi/Builder-е и показать, что "мы ещё живы и движемся вперёд". Как ни странно, но лучше всего выступал представитель от компании SoftBcom (а не Embarcadero) - рассказывал очень живо и интересно. Увы, но базы данных это не моя область интересов. Не знаю, насколько это была удачная идея: на вопрос о том, кто слышал о продуктах Embarcadero до объединения, подняли руки два человека. Довольно предсказуемый результат :)  У большинства только что на лбу не было отпечатано: "Delphi, Delphi, DELPHI!".

Лично я (и большая часть народа, как я понял) пришли послушать про Delphi (ок, часть из которых - чтобы определить мертва ли Delphi или нет, и стоит ли новая версия апгрейда). Тут вообще завал. И нового ничего сказано не было (по крайней мере для тех, кто следит за новостями/читает блоги) и рассказывал Алексей, признаться, ужасно. Такое ощущение, что человек всю жизнь на 7-ке сидел, а про генерики за два дня до семинара услышал :)  Так путано говорил, что, если бы я не знал, о чём идёт речь - точно ничего бы не понял. А каково тем, кто пришли как раз послушать про нововведения? Ок, я допускаю, что за такое короткое время рассказать о вкусностях невозможно, но всё же можно было и лучше подготовиться - как-никак, считай, самая значимая версия Delphi со времён третьей. Визуально тоже мало всего показано было - признаться, в видиках Ника намного интереснее. Уж не знаю, какого рода мнение вынесли с этого семинара всякого рода менеджеры. В любом случае я рекомендую почитать Here Comes Tiburon

В итоге, по времени мы не успели - пришлось обрезать выступления. А жаль. Судя по списку TODO, о нововведениях в Delphi должен был ещё рассказывать западный коллега (Mark Barringer, если не напутал). Может быть, в итоге ощущения от семинара были бы другими.

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

Впрочем, для тех, кто не слишком следит за развитием событий или имеет проблемы с чтением англоязычных блогов, на семинаре может и было сказано немало полезного. Было это видно и по задаваемым вопросам (что люди не читали новости/блоги). 

Кстати, о вопросах. Были и "классические вопросы": Win64, Linux, CF - с этими всё понятно. Были и интересные, уместные на семинаре, вопросы. Но были и глубоко частные вопросы. Например, вопросы о конкретных баг-фиксах, о наличии юникодных компонент и т.п. (даже вроде о решении конкретных проблем). Я не понимаю, что люди хотят услышать в ответ на такие вопросы? Они же не полагают всерьёз, что перед ними человек-энциклопедия, который держит в голове все эти мелочи?

Интересуют баг-фиксы? См. Delphi 2009 Quality Central Reported Bug Fixes и/или C++Builder 2009 Quality Central Reported Bug Fixes. Полный список закрытых в версии 2009 отчётов на Quality Central.

Компоненты? JEDI (JCL, JVCL и API - точно), TMS, DevExpress и другие крупные разработчики уже выпустили версию (или хотя бы бета-версию) с поддержкой Tiburon или же таковая уже находится в разработке. Вы и сами можете спросить у разработчика(ов) используемых вами компонент о планах на Tiburon. Или посмотреть список Delphi 2009 Compatible Third Party Tools & Components.

Вопросы по тому, что есть, а что нет в среде? Ну, ребята, посмотрите уж триал-то. Кстати. Вот халявные диски с триалами продуктов DatabaseGear давали, а вот от CodeGear - нет. А жаль. На мой взгляд, значительный промах. Хоть лично я давно уже скачал ISO-шку, но многие не отказались бы от триала на диске. Всё же не у всех есть возможность использовать интернет.

По поводу собственно нововведений Delphi и стоит ли переходить на новую версию, я хотел бы поговорить отдельно в ближайшем будущем.

P.S. Кстати, чуть не забыл. В самом начале Ludovic Neveu весьма интересно рассказывал о компании Embarcadero вообще и её планах развития. Мне понравилось. Хотя человек с пессимистичным взглядом на вещи мог бы сказать, что выступление сводилось к: "we want you to trust us" :)  Но я к таким себя не отношу ;)

P.P.S. Кстати, часть показанного на семинаре можно посмотреть в этом PDF

23 сентября 2008 г.

Вышел Tiburon/Delphi 2009

Ок, большинство уже об этом слышали и даже успели пощупать.

Берётся это дело здесь: Delphi and C++Builder ISO file. Триальный серийник можно получить там же.

Достаточно хорошее описание новых хрюшек можно найти здесь: Here Comes Tiburon (в трёх частях, в начале поста ссылки на две другие части). Также очень детальное описание нововведений на английском можно почитать в Delphi 2009 Online Resources (это просто набор ссылок по категориям).

Поставил я и себе это дело посмотреть. Увы, но при триальной установке не устанавливаются исходные коды RTL/VCL, поэтому смотреть практически и нечего. В основном изменения среды, которые я не буду описывать - и так их везде полно. Скорость загрузки, неудобные опции и т.п. - короче, что обещали, то и сделали. Говорят, хэлп улучшился на порядок. Что ж, возможно. Субъективно: скорость работы стала выше. А наполнение всё ещё хромает. Ок, я допускаю, то туда действительно много сил вбухали (всё же многие говорят, что стало намного лучше), но вот, например, описания нововведений бывает отсутствуют. Первое, что я посмотрел:

Pascal
function GetBaseException: Exception; virtual;
C++
virtual __fastcall Exception GetBaseException();
Description
This is GetBaseException, a member of class Exception.


Очень "полезно" :)

Аналогично и с unicode-м:

The generic character type is Char, which is equivalent to AnsiChar on Win32, and to Char on the .NET platform. Because the implementation of Char is subject to change, it's a good idea to use the standard function SizeOf rather than a hard-coded constant when writing programs that may need to handle characters of different sizes.

Собственно, полез я это смотреть, т.к. уже давно пытаюсь протолкнуть в EurekaLog поддержку chained-исключений.

Также хотел ещё и баг-репорты свои проверить. Увы, конечно, но без сырцов ничего толком и не посмотришь. 

17 сентября 2008 г.

Задачка №2

Что не так в этом коде?

История вопроса:

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

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

Код:

var
  Converter: String; // полное имя exe-файла конвертора. Настройка, глобальная переменная.

// .... какой-то код

// Экспортируемая из плагина функция
function OnPreviewPostProcess(const AFileName: WideString; const AModel: Pointer; AReserved: Pointer): WideString; stdcall; 
var 
  SI: TStartupInfo; 
  PI: TProcessInformation; 
  SrcFile: String; 
  // .... другие переменные 
begin 
  Result := AFileName; 
  try

    // .... Конвертация в промежуточный формат. Временный файл сохранён в SrcFile.

    if not FileExists(SrcFile) then
      raise Exception.Create('Файл предпросмотра "' + SrcFile + '" не найден');  
    if (Converter <> '') and FileExists(Converter) then 
    begin 
      FillChar(SI, SizeOf(SI), 0); 
      SI.cb := SizeOf(SI); 
      SI.dwFlags := STARTF_FORCEOFFFEEDBACK; 
      FillChar(PI, SizeOf(PI), 0); 
      if not CreateProcess(PChar(Converter), PChar('"' + Converter + '" "' + SrcFile + '" "' + Result + '" /storefile'), nil, nil, False, 0, nil, nil, SI, PI) then 
        RaiseLastOSError; 

      // .... Обработка завершения процесса 

    end;
    if not FileExists(Result) then 
      Result := ''; 
  except 
    // .... Обработка исключения
  end; 
end;

Данный код является нерабочим. Ваша задача - объяснить почему, какие косяки в нём есть. Может это и простая задача, когда проблемный кусок кода выделен и перед глазами, но я потратил 15 минут времени на поиск причины, причём в совершенно ошалелом состоянии (поясню почему, когда буду писать ответ на задачу).

Ответ на задачку будет выложен где-то через месяц.

Ответ.

7 сентября 2008 г.

Исключения в чужом потоке в EurekaLog

В связи с моей будущей статьёй, я познакомился с EurekaLog несколько ближе, чем мне нужно для повседневной работы. В частности, у EurekaLog есть возможность включить обнаружение зависаний приложения. Делается это классическим образом: через дополнительный поток и polling (опрос) главного потока с SendMessageTimeout.

Интересна, однако, реакция на обнаружение зависания. Вместо какого-нибудь показа сообщения об ошибке, в EurekaLog я заметил интересную вещь: при подвисании приложения, в главном потоке будет возбуждено EFrozenException. При этом используется примерно тот же код, что и в моём неудачном эксперименте для TasksEx.

Видимо подразумевается, что EFrozenException фатально и требуется перезапуск приложения.

Вот и пример удачного использования подобного кода.

Мохнатое чудовище

Ездил в отпуск в Тверь, почесал кота.
Posted by Picasa