Motto

В тихом саду здравомыслия
Пусть на вас постоянно падают
кокосовые орехи пробужденности.
Чогьям Трунгпа РИНПОЧЕ


Версия для мобильного


вторник, 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


Читать дальше..

Постоянные читатели