пятница, 20 июня 2008 г.

Про руководство

Цитата вот отсюда:

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

Понятно, что контекст важен, да, но и в отрыве смотрится не плохо.

пятница, 13 июня 2008 г.

Про торговые марки

Увидел тут рекламу по телевизору. Причем видел ее сто раз, но щелкнуло в башке впервые. Интересно как ребята: Eclipse vs Eclipse между собой разруливают? Или аудитории совсем не пересекаются? :)

Google кстати "голосует" за софтовый Eclipse, что, в общем, не удивляет, нет.

Про Opera 9.50

Поставил себе новую оперу (версия 9.50). Вроде стала пошустрее. Грузится быстрее, и закрывается быстрее. Предыдущая версия выгружалась просто дико долго. Переделали дизайн, но есть возможность скачать скин, который приводит все в исходное состояние. Писать в блог все равно из нее невозможно. Но, в принципе, стало лучше.

четверг, 12 июня 2008 г.

Про работу

Все таки оптимальнее всего иметь несколько задач. Причем разнонаправленных. У меня сейчас, например, их в общей сложности штук 10. С утра вот пытался понять как лучше заделать jpeg энкодер. Начитался спецификацию, понял что с ходу ничего не придумывается, отложил, начал прикручивать новые опции в STDU Viewer. С одной стороны мозг там чего-то в фоне шуршит за jpeg, но и время за зря не тратишь полезное чего-то делаешь. Не было бы другой задачи, все равно ничего бы не написал, лазил бы по интернету или худ. лит. какой читал.

понедельник, 9 июня 2008 г.

Про skin-ы

Вот кто бы мне объяснил, что это за мода такая во всех программах втыкать скины. Причем, что не программа, то тихий ужас. Сегодня скачал очередного уродца, вроде полезные вещи делает, но даже разбираться не стал, ибо выглядит как сон обкуринного наркомана. Нет, конечно, есть некоторые вещи, которые в стандртном виде уже не смотрятся. Ну там менюшки лучше на мой вкус когда плоские, панели инструментов опять же. Для меня примером отличного функционального дизайна является микрософтовская студия (причем 2003-я в 2005-ой и 2008-ой тоже мягко говоря не все нравится). А все вот эти потуги дизайнеров, которые позавчера закончили художественную шарагу, вчера изучили книжку Photoshop for Dummies (в переводе надмозга, и не всю, а только первые 20 страниц), зато имеют необхватных размеров художественный вкус, и готовы порвать любого, кто с этим не согласится. Так вот их потуги, они меня лично не радуют. Потому что гавно получается, назовем вещи своими именами. Причем зачастую настолько неудобоваримое, что до функционала уже и не добираешься, просто физически тяжело одновременно работать и блевать.

И вот этот вот продукт жизнедеятельности дизайнеров мутным потоком льется со всех сторон и ни конца ни края ему не видно.

пятница, 6 июня 2008 г.

Про программы для чтения книг

Понадобилось тут книжки почитать художественные. Они сейчас в основном в FB2 формате. На своей Nokia я пользую FBReader - доволен. Ничего лишнего, но все что надо есть. Главный плюс - можно указать каталог на диске из которого автоматически соберутся книжки в дерево по автору и по сериям внутри автора. Для Nokia - программа на пять.

Решил найти себе чего-нибудь и для домашнего компьютера.

FBReader есть под Windows, но он как бы мультиплатформенный и соответственно дизайн общий для всех, и под WindowsXP он мне не понравился. Но программа хорошая, под Nokia самое оно.

ICE Book Reader - вот, кто бы мне объяснил, зачем так делать? Программа под одну платформу - Windows. При этом вместо того чтобы использовать стандартные контролы, приделали какой-то мегаинтерфейс - страшный как моя жизнь. Но этот мегаинтерфейс он только для части программы, а другая часть реализована на стандартных контролах, но и здесь авторам удалось сделать так, что без слез не взглянешь. Создать свою библиотеку с деревом книг, сортировкой по авторам и т.п. вроде как бы и можно, но пять минут потыкав мышкой, мне этого сделать, не удалось, а разбираться было лень. Да и на интерфейс этот дикий дольше смотреть сил не было. Снес.

CoolReader - хороший. Вот выбрать папку, чтобы он из нее все файлики в библиотеку собрал, не позволяет. А по одной, книжки открываются вполне, так что на нем и остановился. Только вот выделить и скопировать текст нельзя, что совершенно не удовлетворительно.

Haali Reader - и эта мне тоже понравилась, я ее еще жене на HP-шный Pocket ставил - вполне рабочий вариант. Настроить папку, чтобы по ней построить список книжек, нельзя. Плюс, программа изначально делалась для WinMobile, что накладывает отпечаток на интерфейс для большого Windows. Это не шибко портит дело, правда не стандартные OpenDialog-и выглядят странно, плюс почему то не запоминается папка из которой последний раз открывалась книга. Но, в принципе, для КПК-шек программа самое оно.

В общем, пока для домашнего компьютера подходящей программы не нашел, хоть сам пиши. Ужас какой-то.

четверг, 5 июня 2008 г.

Установил Warcraft на Nokia

Поставил себе на таблетку (которая Nokia N800) второй Warcraft в какой-то линуксовой реинкарнации. Ностальгирую. На мой вкус одна из лучших игр за всю историю. Считаю три часа времени на установку потрачены не зря. Полный восторг. Хотя играть наверное не буду - времени нет.

воскресенье, 1 июня 2008 г.

Про регистрацию COM объектов при помощи манифестов

Одна из проблем возникающая при попытке сделать "portable" версию некоторой программы, это использование основным exe-файлом COM-объектов.

COM-объекты обычно реализуются в виде dll-файлов, которые регистрируются в системе примерно так:

regsvr32.exe SomeCOMObjects.dll

На самом деле вся регистрация сводится к прописыванию в реестре ключей со списком GUID-ов и ссылками на путь к SomeCOMObjects.dll.

Понятно, что теперь, чтобы программа заработала на компьютере отличном от того, где она установлена, не достаточно утащить туда только exe-файл. В рамках нашей задачи создания portable версии программы, которую можно будет носить на внешнем винчестере или Flash Drive, неплохим вариантом решения будет следующие действия:

1. На внешнем носителе создаем папку для программы и копируем туда, непосредственно exe-файл и все используемые им dll-файлы с COM-объектами.

2. Создаем два bat-файла (или, например, два vbs-файла): COMDllRegister.bat и COMDllUnregister.bat в первом для каждой dll прописываем

regsvr32.exe SomeCOMObjects.dll

во втором

regsvr32.exe /u SomeCOMObjects.dll

Приходя на новый компьютер, запускаем вначале COMDllRegister.bat, потом саму программу, работаем, а перед уходом запускаем COMDllUnregister.bat. Если кроме COM-объектов никаких других привязок в системе у программы нет, то все работает замечательно.

Какие минусы у данного способа?

Минусы очевидны. Если в системе уже были зарегистрированы COM-объекты используемые программой, с которой Вы работаете (известно, что COM это в том числе и способ разделения кода и многие программы используют одни и те же COM-объекты, например, DirectX это исключительно набор COM-компонентов). То при запуске первого bat-файла Вы перенаправите пути с Dll-файлов, расположенных на компьютере, на Dll-файлы на вашем внешнем диске, а после запуска второго, эти COM-объекты из системы исчезнут, что может отрицательно сказаться на работоспособности программ на этом компьютере.

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

Но есть способ лучше. Он подробно, с примерами, расписан в статье Registration-Free Activation of COM Components: A Walkthrough.

Суть этого способа сводится к тому, чтобы вместо регистрации COM-объектов в реестре системы, использовать manifest-файлы. Таким образом, в том числе можно использовать в программе вместо dll-зарегистрированной в системе свою.

Итак, что надо сделать.

1. Для каждой dll, содержащей COM-объекты надо создать manifest-файл. Можно это сделать вручную (предварительно придется зарегистрировать dll, а затем воспользоваться утилитой OLE/COM Object viewer), можно воспользоваться утилитой mt.exe из Visual Studio 2005. В результате должен получится набор manifest-файлов примерно такого содержания


<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity type="win32" name="STDUCore.X" version="1.0.0.0"/>
<file name="STDUCore.dll">
<comClass
clsid="{2BB2E135-4B81-4840-B7CD-A744DD236AB0}"
threadingModel = "Apartment"/>
<comClass
clsid="{1740E2A8-ACF7-4930-B6DF-5D0C85E874DA}"
threadingModel = "Apartment"/>
<typelib tlbid="{A11D2AA5-3D39-448E-B9D0-177A73707C98}" version="1.0" helpdir=""/>
</file>
<comInterfaceExternalProxyStub
name="ISTDUImage"
iid="{3905360D-3C87-498C-93D2-27E002B941B1}"
proxyStubClsid32="{00020424-0000-0000-C000-000000000046}"
baseInterface="{00000000-0000-0000-C000-000000000046}"
tlbid="{A11D2AA5-3D39-448E-B9D0-177A73707C98}"/>
<comInterfaceExternalProxyStub
name="ISTDUTransform"
iid="{721B21ED-7BCD-4127-9EFF-6C06AA95FE31}"
proxyStubClsid32="{00020424-0000-0000-C000-000000000046}"
baseInterface="{00000000-0000-0000-C000-000000000046}"
tlbid="{A11D2AA5-3D39-448E-B9D0-177A73707C98}"/>
</assembly>



2. Необходимо создать manifest для основной программы, он будет выглядеть как-то так


<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity type = "win32" name = "client" version = "1.0.0.0" />
<dependency>
<dependentAssembly>
<assemblyIdentity type="win32" name="STDUCore.X" version="1.0.0.0" />
</dependentAssembly>
</dependency>
<dependency>
<dependentAssembly>
<assemblyIdentity type="win32" name="STDUDjVuFile.X" version="1.0.0.0" />
</dependentAssembly>
</dependency>
<dependency>
<dependentAssembly>
<assemblyIdentity type="win32" name="STDUPDFFile.X" version="1.0.0.0" />
</dependentAssembly>
</dependency>
<dependency>
<dependentAssembly>
<assemblyIdentity type="win32" name="STDUTiffFile.X" version="1.0.0.0" />
</dependentAssembly>
</dependency>
<dependency>
<dependentAssembly>
<assemblyIdentity type="win32" name="STDUViewer.X" version="1.0.0.0" />
</dependentAssembly>
</dependency>
</assembly>


STDUCore.X, STDUViewer.X и т.п. это имена файлов manifest для соответствующих dll.

3. Теперь собираем все dll-файлы, основную программу, и manifest-файлы в одну директорию - "portable" версия программы готова.

Выше в качестве примера используются куски manifest-файлов для "portable" версии STDU Viewer



Какие минусы у данного способа?

Во-первых, не всегда возможно определить, какие COM-объекты из каких dll-файлов использует конкретная программа. Во-вторых, мне так и не удалось заставить работать этот способ под Windows Vista, что скорее всего это связано с UAC (но нельзя сказать, что я сильно старался). И, наконец, создание manifest-файлов в ручном режиме, для серьезной программы, мягко говоря, работа не простая, и не шибко веселая.