Страницы

вторник, 28 апреля 2009 г.

Чем же так хорош MSI?

Раз грозился вчера написать, в чём MSI лучше чем Nsis и Inno Setup, то надо выполнять угрозу. =) Скажу сразу, последний раз я смотрел Nsis и Inno Setup года два тому назад, но на первый взгляд, ничего глобально в них не изменилось. Эта тема отлично подходит для холиваров, особенно если опустить конкретные требования к инсталлятору. Посему хочу напомнить: для разных задач - разные инструменты.

Плюсы Windows Installer

  1. Во-первых, Windows Installer - единственный из известных мне установщиков, который сам проверяет, не используются ли сейчас какие-нибудь из инсталлируемых файлов, и выводит список программ, которые необходимо закрыть для продолжения инсталляции. Насколько я помню, в InnoSetup и Nsis в этом случае предлагают создавать в приложении какой-нибудь глобальный объект(например, мьютекс) и проверять его из инсталляции(уж не помню какие для этого привилегии нужны, но какие-то точно нужны).
  2. MSI-инсталляция может существенно упростить жизнь системного администратора. Особенно в крупной организации. Особенно если системный администратор не понаслышке знает что такое Group Policy[1]. Многие заказчики, требуют поставки инсталляций именно в MSI. К слову, через Group Policy можно распространять не только MSI, но удобств будет меньше.[2]
  3. MSI для винды - это стандарт де-факто.
  4. Для получения Certified for Windows Vista нужна инсталляция в MSI.(для меня и моей работы сейчас не особо актуально, но почему бы не сделать задел на будущее)

воскресенье, 26 апреля 2009 г.

Итоги недели: возня с Wix-ом.

Продукты для бух. учёта нашей фирмы – чертвоски конфигурируемы. Клиент говорит, что ему нужно, а наши сотрудники собирают для него необходимую конфигурацию. Это делает наши продукты действительно удобными. Ходят слухи, даже о том, что люди привыкшие работать с нашими программами, больше не хотят работать с продуктами конкурентов. Всё это очень мило, но благодаря такому подходу, наши продукты до сих пор не имеют нормальной инсталляции. Точнее имеют, но она была собрана давно на Inno Setup, и используется только для базовой установки. И вот, один из клиентов выдвинул требование, предоставить ему установщик в формате MSI. Если кому-нибудь интересно, я как-нибудь напишу псто о том, почему MSI лучше, чем InnoSetup или Nsis.

Это я плавно подхожу к тому, чтобы начать жаловаться и ругаться. =) Всю неделю я провозился с созданием MSI-инсталляции для наших продуктов. Я выкурил сотни страниц мануалов по Windows Installer и open-source набору инструментов по созданию MSI-файлов – Windows Installer XML (WiX) toolset. В броузере у меня постоянно открыто штук 30 закладок с разными статьями и форумами по Wix. За эту неделю я узнал о процессе установки больше чем за всю предыдущую жизнь. Временами я даже начинал ненавидеть формат XML, за излишнюю придирчивость к комментариям.

И сейчас мне очень хочется написать что-то вроде: но наконец я закончил эту чертвоу инсталляцию. Но это не так. У меня уже есть инсталляха устанавливающая программу, копирующая конфиги и выдающая нужные права, в ней есть даже один hand-made диалог. Но сделать осталось ещё немало. Для начала надо написать DLL-ку для этой инсталляхи, добавляющую нужную запись в hosts-файл. Честно говоря, я уже начинаю жалеть о том, что взялся за это задание. Я оптимистично полагал, что сделаю всё за пару дней, – а на деле получается, что на это уйдёт как минимум 2 недели.

Может кто-нибудь из читателей имел опыт работы с Wix-ом, и может ответить на пару вопросов? Полное описание того, что нужно сделать и вопросы по теме заданы здесь: http://forum.sources.ru/index.php?showtopic=270846

пятница, 24 апреля 2009 г.

Текучка 10: Что может случиться если сначала обнулять переменную, а потом вызывать деструктор.

Прочитал на днях пост GunSmoker-a о том, что всегда нужно использовать FreeAndNil вместо Free. Прочитал, подивился, взял на заметку попробовать завести такую привычку, хотя так и не смог придумать объяснения, кроме как: а почему бы и нет?

И вот бывает же! Как раз сегодня наткнулся на ситуацию, когда из деструктора объекта происходило обращение к самому объекту по имени переменной. Конечно обращение происходило не из самого объекта, а из одного из вложенных. Кстати, дело было в коде Lazy Delphi Builder.=) Из-за частых изменений в иерархии классов, и постоянной работе над проектом в режиме “скорей бы уже релиз выпустить” у меня там развёлся довольно милый бардачок, с большим количеством глобальных переменных.

Итак..

вторник, 21 апреля 2009 г.

Пример добавляющий поддержку новых интерфейсов в существующие классы

Недавно писал, как здорово было бы, если бы в Delphi были определены интерфейсы для базовых классов. Например, если бы все контролы, имеющие свойство Caption(например TLabel; TButton; TCheckBox; TRadioButton; TGroupBox; TBitBtn; TSpeedButton), реализовывали интерфейс ICaptionedControl с методом GetCaption. Подробнее читайте здесь.

Я просто мечтал, а Алексей Казанцев взял и показал, что подобное можно реализовать уже сейчас, и даже выложил у себя в блоге пример, показывающий, как добавить поддержку интерфейса ICaptionedControl для классов TControl и TPanel. Реализация сделана с помощью хука на метод TObject.GetInterface и представляет собой практически готовое решение. =)))

p.s. я до сих пор не могу поверить своим глазам. =) Это же действительно работает! O_o

p.p.s. Даже код читать – одно удовольствие.

понедельник, 20 апреля 2009 г.

Кое-что о dcc32

Началось всё с того, что ctapmex сообщил об ошибке, найденной в последней альфе билд-машины Lazy Delphi Builder. Суть ошибки сводилась к тому, что после компиляции, в папках с исходниками оставались dcu. Причём, некоторые dcu-файлы всё-таки попадали в нужную папку. Почти неделю я проковырялся с этой ошибкой пытаясь понять причину и найти способ их исправить. В результате узнал кое-что новое о работе компилятора командной строки dcc32.exe.

Условия возникновения ошибки в Lazy Delphi Builder.

Есть следующие файлы:

D:\Dummy\Test1.dpk
D:\Dummy\Test1.RES
D:\Dummy\TestUnit1.pas
D:\Dummy\TestUnit2.pas
D:\Dummy\Source\TestUnit3.pas

Если скомпилировать package Test1.dpk, указав в качестве папки для dcu, папку D:\Dummy\Build\dcu, то все файлы.dcu остаются рядом с соответствующими файлами.pas.

Но, при этом, если вместо D:\Dummy\Build\dcu указать папку D:\Dummy\dcu, то все файлы.dcu оказываются там где нужно.

При этом, если вместо D:\Dummy\ использовать папку с более длинным именем, например D:\DummyTest\Build\dcu то всё работает как надо.

Отладка осложнялась тем, что Lazy Delphi Builder при запуске dcc32 пытается всеми правдами сократить длину полной команды, преобразуя все используемые пути в относительные и укороченные. Причина такого поведение – баг в dcc32.exe, когда в случае, когда длина командной строки превышает критическую, dcc32 начинает выбрасывать невразумительные сообщения типа System.pas not found, или даже AV. Мне не удалось сейчас найти упоминания об этом в интернете, хотя я точно его видел раньше(и даже сталкивался с ним сам) поэтому я просто приведу комментарий из JclBorlandTools.pas:

суббота, 18 апреля 2009 г.

О тестировании udf-ки

Мне нравится читать отчёты о том, как программисты решают поставленные задачи. Особенно, если запись достаточно подробная и включает в себя постановку задачи, рассмотрение альтернатив, принятие решений, совершение ошибок и их анализ.

После недавней перекомпиляции udf-ки для Firebird, я подумал, что неплохо бы её как-нибудь протестировать, чтобы убедиться что:

  1. она работает на Firebird 2.1.x
  2. будет работать и на других версиях сервера(опционально)
  3. работает так же как и последняя версия, считающаяся стабильной
  4. нормально переносит многопоточность
  5. не вызывает утечек памяти

Тестировать нужно и под Linux и под Windows, да ещё и для 64-битных версий(в будущем), и что для этого наверняка понадобится по многу раз вызывать функции на разных серверах. Udf-ка экспортирует 70 функций.

четверг, 16 апреля 2009 г.

Продолжение темы интеграции с Funambol

Первый проект, с которым я начинал работать на текущем месте работы представлял собой адскую смесь CRM и ERP, интегрированную с офисной телефонной станцией, сдобренную системой управления типовыми проектами. Говоря проще, система представляет собой каталог клиентов с их адресами, телефонами и персоналом; развитую систему планирования и учёта рабочего времени, а интеграция с телефонной станцией даёт возможность видеть, кто из клиентов звонит, и сразу же запланировать встречу. Встречи можно оформлять в проекты. Можно смотреть кто из клиентов когда звонил, а также просматривать полученные мейлы и факсы. Всё это очень активно используется в нашем офисе, для планирования визитов и консультаций.

Недавно, поднялся вопрос о массовой покупке телефонов, для всех сотрудников работающих с клиентами. И тут всплыла та старая идея с экспортом данных в мобильные телефоны. Нужно было исследовать этот вопрос, и составить список требований к мобильным телефонам.

вторник, 14 апреля 2009 г.

Хотелка для Delphi: поддержка интерфейсов базовыми классами VCL

Я вот тут подумал, что здорово было бы, если бы в Дельфи были определены интерфейсы для базовых классов. Например, был бы интерфейс IList, реализуемый классом TList. IStringList, реализуемый TStringsList и т.п. А особенно классно, было бы если бы были определены интерфейсы реализующие взаимодействие с компонентами.

Например интерфейс:

ICaptionedControl = interface
  property Caption:string;
end;

Если бы все контролы, имеющие свойство Caption(например TLabel; TButton; TCheckBox; TRadioButton; TGroupBox; TBitBtn; TSpeedButton), реализовывали его, было бы намного проще их изменять. Хотя, подобное на практике нужно только, когда начинаешь реализовывать собственный механизм перевода программы.

Пример с Db-control-ами

Более полезным было бы применение интерфейсов в Db-контролах. Например, имея интерфейсы:

понедельник, 13 апреля 2009 г.

Доступна вторая альфа Lazy Delphi Builder 1.1.7.117

Доступна для скачивания вторая альфа-версия(после введения поддержки относительных путей) Lazy Delphi Builder.

Исправления

  1. Не срабатывает смена текущей версии IDE.
    При первом сканировании и последующем удалении пакетов и компиляции, программа показывает неверное число выбранных пакетов.
  2. Info-panel не отображается автоматически для проектов собравшихся с ошибкой.
  3. Если в IDE в путях использовались переменные окружения(напр. $(BDS), $(DELPHI7)), то Lazy Delphi Builder пытался работать с ними как с директориями. Теперь он их раскодирует(как системные, так и переменные IDE).

Новое(сделано)

  1. Сделать, чтобы при добавлении папок не приходилось делать 2 лишних клика. При клике на +, если текущая папка не указана, сначала показываем Browse диалог, а потом её сразу добавляем.
  2. Сделать, чтобы папки не удалялись и не создавались, если ничего не будет компилироваться и копироваться. Например, если в профиле нет и одного проекта, то папка Bin будет проигнорирована. Если не установлен флажок "Copy Resources", то папка Res будет проигнорирована и при удалении и при создании. Папка DebugDcu будет удалена/создана, только если включен флажок компиляции Debug Dcu. И т.п.
  3. Сделать, чтобы формы всегда открывались по центру.

Что-то ещё…

Жду новых баг-репортов, историй успешного использования и предложений улучшений.

Скачивать здесь: www.lazyproject.info/downloads