понедельник, 30 ноября 2009 г.

Неформат.

Прочитал в блоге у коллеги заметку про встроенный в IDE форматтер. Человек не пожалел времени, разложил все по полочкам с примерами. Добавить в общем-то и нечего, окромя нескольких косяков этого форматтера. Ну, кто про что, а я - про баги. =)


Наличие встроенного средства форматирования в среде разработки - это как бальзам на душу. Я уже по этому поводу высказывался. Поэтому, как только появилась такая возможность, я сразу же приступил к его использованию. Горячая клавиша (ctrl+d) расположена удобно - так и подмывает её периодически нажимать. Да и функционирует новый форматтер неплохо. Но есть несколько нюансов в его работе, из-за которых код форматируется ошибочно. Обратимся к примерам:
















Как видите, с классами TTest1, TTest2 и TTest3 все в порядке. А вот TTest4 получился кривым: отступ у класса неверен и метод съехал набекрень. Найти "десять" различий не сложно. У класса TTest1 есть завершающий End, у TTest3 - его нет. И хотя такая конструкция успешно компилируется, форматтер на ней глючит. Эффект наблюдается кумулятивный: когда идут подряд несколько классов, подобных TTest3 - отступ у расположенных ниже по коду конструкций становиться гигантским. Они съезжают к правой границе экрана и пугают разработчика своим остроконечным разнобоем, напоминая выравнивание текста по правому краю.

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



































В методе класса TTest4 всё хорошо, а вот у класса TTest2 из-за опущенной точки с запятой наблюдаем смещение блока "finally end" в первом случае и finally во втором. Так что если после форматирования "что-то не так" - проверьте end-ы и точки с запятыми. Безусловно, жить данные баги не мешают и решаются легко.

Рад, если был кому-нибудь полезен =).

вторник, 24 ноября 2009 г.

Экспроприаторы

Прочитал в блоге Александра Божко о проекте DelphiFeeds.RU. Вещь безусловно нужная и полезная. Раньше в рунете был только один агрегатор-старичок DelphiPlus.org, который уже более десяти лет регулярно снабжает нас новостями, ну а "теперь мы вдвое больше сена для нашей коровки запасем!" На данный момент в списке присутствует 19 блогов. Не без интереса изучил каждый из них - всё-таки послушать коллег чертовски интересно. Видно, что каждый в чем-то поднаторел, каждого гложет несправедливость этого мира и он пытается воздействовать на это посильным ему образом. Некоторые блоги, надо признаться, вижу в первый раз, что говорит о том, что не всё так плохо в датском коровлевтсве - люди пишут, общаются, творят. Но больше других заинтересовал и удивил блог под номером 17. По ссылке переходим на сайт http://adwos.ru/blog и видим... мои собственные посты двухлетней давности, снабженные, правда, заботливо подобранными картинками и свежей датой публикации =).

Никаких копирайтов или ссылок на мой сайт, разумеется не приводится. Знаю, что в рунете такая штука встречается, но не думал, что вот так хладнокровно. Скопировал чужие мысли, поставил свою подпись и вперед! =) Ну да бог с ними. Я пишу тут просто так, для души, а деньги зарабатываю совсем другим способом. А кто-то, видимо, другим способом не умеет, вернее даже, никаким способом не умеет, кроме как клонировать дурвеи и прокачивать ботов? Или какой-то сомнительной славы захотелось создателю сего творения? Так шлепал бы новые заметки - источников вон как много, зачем постить тексты двухгодичной давности, которые уже порядочно устарели?

пятница, 23 октября 2009 г.

Компьютеру надо верить.

Скачал как-то я 64-битную версию Windows7 c Technet, чтобы проверить работоспособность своих приложений. Признаюсь: за рутиной никак не доходили руки почитать про особенности 64-х разрядных систем, поэтому в этих вопросах я плаваю основательно, и наличие огромных граблей в работе программы меня совсем не удивило. Будь я титаном, непременно бы догадался о причинах появления этого садового инструмента. А я в начале впал в ступор, потом не верил своим глазам, и лишь потом взял чашечку кофе и начал просветлятся. Но обо всем по порядку.

Есть у меня модуль, которые проверяет цифровые подписи драйверов. Обычный такой среднестатистический модуль килобайт на 50. В общем, ничего примечательного. Тестекйз этого модуля под win64 падал в разных местах с удивительными для меня эффектами. Подробное изучение происходящего привело меня к причине ошибочного поведения - функции FileExists(). Она никак не хотела видеть модули, находящиеся в системном каталоге windows\system32\drivers. Причем, если скопировать, например, из отладчика путь к модулю C:\Windows\System32\drivers\acpi.sys и выполнить его в командной строке - все работает. Из программы - фигвам. Первое, что приходит в голову, это то, что глючит рабочая лошадка - FileExists. Тут же были испробованы альтернативные способы добраться до файлов, но результат был стабилен и одинаков - такого драйвера в каталоге нет. Да и эксперименты с параметрами функции показали, что проблема только с системными каталогами. Тут я вспомнил слова одного моего товарища: "Компьютеру надо верить!" Если он говорит, что нет файла значит его там действительно нет. А то, что FAR видит этот файл - так это проблемы FAR-а. Далее я легким движением руки программно получил список содержимого каталога C:\Windows\System32\drivers\ и пришел к выводу, что передо мной на самом деле каталог C:\Windows\SysWOW64\drivers\. Там действительно файла acpi.sys нет - налицо транспарентная подмена системных папок, что в новых поколениях Windows на каждом шагу. В качестве дальнейшего источника просветления я выбрал MSDN, где нашел статейку и нужные функции. Так родился скупой, как мужская слеза, код:

function DisableRedirection(out Value: Pointer): Boolean;
const
  DIS_ALIAS = 'Wow64DisableWow64FsRedirection';
type
  TDisableRedirectionFunc = function(OldValue: Pointer): Boolean; stdcall;
var
  DisRedir: TDisableRedirectionFunc;
begin
  @DisRedir := GetProcAddress(GetModuleHandle(kernel32), DIS_ALIAS);

  if Assigned(DisRedir) then
    Result := DisRedir(@Value)
  else
    Result := False;
end;

function EnableRedirection(Value: Pointer): Boolean;
const
  REVERT_ALIAS = 'Wow64RevertWow64FsRedirection';
type
  TRevertRedirectionFunc = function(OldValue: Pointer): Boolean; stdcall;
var
  RevRedir: TRevertRedirectionFunc;
begin
  @RevRedir := GetProcAddress(GetModuleHandle(kernel32), REVERT_ALIAS);

  if Assigned(RevRedir) then
    Result := RevRedir(@Value)
  else
    Result := False;
end;

Ну и напоследок несколько комментариев:

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

- Как видно из документации, управление редиректом осуществляется только в вызывающем потоке. Этим можно воспользоваться.

- 64-х разрядного компилятора мы ждем 3-ий год. Видимо, известная поговорка опять сработала. Пока что придется довольствоваться WOW- песочницей. Про FreePascal на нынешнем этапе жизненного пути я думать боюсь.

- В каталоге system32 лежат 64-х разрядные компоненты, в SysWOW64 - 32-х разрядные. Изрядная путаница в названиях не должна смущать настоящего windows-разработчика. Путаница - это священная традиция, без которой создание программ под windows попросту невозможно.