Программирование

CMake, mingw, codeblocks – level up

March 7th, 2010 Begemot

И опыт, сын ошибок трудных…(c)

Напряженная выдалась неделька. Решил все-таки потихоньку приближаться к давней мечте, к портированию на линукс\макос.

Начать решил с освоения CMake’а – кроссплатформенной системы автоматизации сборки. Штука, по идее, архиполезная если разработка ведется более чем одним разработчиком\на более чем одном компе или системе. Написал Cmak’овский проект научился генерировать солюшен для студии, make файл для mibgw и (почти) проект для CodeBlock’sa.

Еще меня убедили, что перед тем как суваться с кодом в линукс – целесообразно добиться компиляции под виндой на mingw (это порт gcc под винду – если кто не знает) – легче будет править ошибки. Я решил, что это не лишено здравого смысла. Поставил minwg и кодеблокс, и заставил собиратся на все этому тестовые примеры. Спасибо одному хорошему человеку с этим с этим справился довольно быстро.

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

В общем пять дней прошло в поисках пути через тернии, но зато я стал ближе к идеалу, и можно поставить пару лишних галочек в резюме, при случае:)

В планах заставить программы собираться на wingw, освоение cmake под линуксом и потом в конце коммунизм:)


Если вам понравился этот пост вы можете подписаться на RSS или мы можем доставлять вам новые посты прямо в ваш почтовый ящик.


Учимся проектировать архитектуру как Microsoft

February 19th, 2010 Begemot

MS устроил бесплатную раздачу слонов - «Руководство Microsoft по проектированию архитектуры приложений, 2-е издание» на русском языке.

Как утверждают, книга содержит собственные методики компании Microsoft, собранные на основе многолетней успешной работы над продуктами Microsoft и общения с заказчиками. И это все должно быть “интересно и полезно не только архитекторам, но и разработчикам”.

Раздают бесплатно, но надо зарегистрироваться.  Если вдруг кто попробует, напишите пожалуйста, стоит ли читать, а то что-то мне сейчас так все лениво… :)

P.S.  Software Testing Service – обязательно тестируйте ваши приложения, так как даже использования всей мощи MS при проектировании архитектуры, не гарантирует отсутствие ошибок:)

Updated:  еще сегодня попалось - Основы Программной Инженерии, прямо как-то инженерный день :)


Если вам понравился этот пост вы можете подписаться на RSS или мы можем доставлять вам новые посты прямо в ваш почтовый ящик.


Почему я стал программировать на wxWidgets

November 23rd, 2009 Begemot

Уже не первый раз задают этот вопрос, решил написать развернутый ответ, возможно в немного вольном стиле, вечер, после релиза, однако.

Выбор это я сделал 2 с копейками года назад. Почему именно wxWidgets? Знаете какой был самый распространенный ответ в нашем вузе на вопрос “а как ты попал в ХАИ?” - “Случайно”:) Вот почти так же и я выбрал wxWidgets.

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

  • WINAPI – я сразу отбросил ввиду низкоуровневости. Я на нем не писал, но слышал много страшилок.
  • ATL\WTL – вроде как идеально подходил для моего класса утилит, и я думал его попробовать, хотя и смущала низкоуровневость, но руки не дошли.
  • MFC – уже был пройденный этап
  • QT – его все хвалили, но лицензия… это потом он стал бесплатным, а тогда стоил более чем приличных денег. Сейчас уже можно использовать почти свободно, но все равно остаются проблемы с ненативностью, скоростью и размером, в общем для моих продуктов не подходит.
  • HTMLLayout – наверное весьма приятная и перспективная штука, по крайней мере многие хвалят. Но css для меня темный лес и даже хуже, писать _красивые_ интерфейсы на хтмл я тоже с роду не умел, даже не стал смотреть.
  • Delphi – хоть  его все и хвалили, в свете применимости для шаровары, в качестве средства для быстрого написания быстрых шароварок, но ведь это не наш путь, правда?:) Есть у меня один проект на дельфи, в общем, я его не выбрал.
  • Python – мне всегда заочно нравился и нравится сейчас, я даже опять вернулся к идее его использовать, буквально вчера скачал и установил, буду пробовать. Но опять же для моего класса продуктов он не подходит.
  • Java – всегда мне заочно не нравилась. Заочно, потому что я на ней никогда не писал и её не знаю, но вот не нравится, и все тут.
  • NET – для меня, в принципе тоже самое что и джава. Как по мне так тормоз тормозом, а мне надо было что-то быстрое…

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

Я скачал, попробовал, получилось, понравилось. В принципе, это почти тоже MFC, только с потенциальной кроссплатформеностью, к тому же открытое – это иногда помогает. Хотя мфц все-таки более вылизанная, меньше глюков.

Что в итоге? У меня есть несколько продуктов написанных на wxWidgets clipboar manager, quick notes, blogspreading. И несмотря на то что есть определенные недовольства wxWidgets, я все-таки доволен. В принципе, считаю что даже если отбросить кроссплатформенность и писать только под винду, то все равно достойный выбор – работать можно. Как говорит мой друг, миссионер wxWidgets “на вкус и цвет, фломастеры разные” кому-то нравится мфц, кому-то вх, кто-то вообще полностью все пишет свое с нуля (зачем спрашивается?),  а кто-то и на php программит и доволен, прости господи :)


Если вам понравился этот пост вы можете подписаться на RSS или мы можем доставлять вам новые посты прямо в ваш почтовый ящик.


И снова про иконки

November 21st, 2009 Begemot

На этот раз правда, не про бесплатные наборы иконок, а про правильное их использование в программе.

Заказал у дизайн главной иконки иконки у фрилансера,  $40, мне понравилось - я доволен, результат тут, спасибо маньяку за наводку. В процессе интеграции выяснил что, код который генерирует визард студии для работы с иконками – неправильный, и все эти годы у меня криво отображалась главная иконка. Раньше она и сама была кривая, так что на это внимание не обращал,  а теперь стало явно видно. Что генерирует визард

m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);

SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon

Проблема в том что LoadIcon грузит иконку весьма паршиво. И гораздо лучше использовать LoadImage, вот так

SetIcon(HICON(LoadImage(AfxGetApp()->m_hInstance, MAKEINTRESOURCE(IDR_MAINFRAME), IMAGE_ICON, 32, 32, 0)), TRUE); // Set big icon
SetIcon(HICON(LoadImage(AfxGetApp()->m_hInstance, MAKEINTRESOURCE(IDR_MAINFRAME), IMAGE_ICON, 16, 16, 0)), FALSE); // Set small icon

Теперь и маленькая (таскбар, заголовок окна) и большая (алт-таб) иконка загрузятся корректно.

Но и это еще не все тонкости, грузить иконку для использования в трее надо так как написано выше, это понятно. Но если вы хотите корректно отображать иконку в трее для Windows 2000 – то необходимо делать две ветви кода, и для W2K грузить иконку с опцией LR_VGACOLOR

HICON(LoadImage(AfxGetApp()->m_hInstance, MAKEINTRESOURCE(IDR_MAINFRAME), IMAGE_ICON, 16, 16, LR_VGACOLOR)

2000 винда умеет отображать в трее только 16 цветную иконку (ужас!), это нужно учесть и иметь формат с 4х битным цветом в вашем ico файле.

В общем намаялся я с этими иконками по полной программе, особенно учитывая, что я решил пользуясь случаем массово сменить иконки в меню\на тулбаре – потому что там тоже был ужас. Часть иконок заменил, часть взял старые но правильно их обработал, в результате программа стала смотреться намного приятнее, как по мне. А ведь страшно подумать, много лет продавалась с кривыми иконками, только потому что я 5 лет назад неумел\поленился разбираться с цветностью, форматами етс, а потом привык и как-то не замечал.

Отсюда мораль, если вы уже давно разрабатываете продукт – попробуйте абстрагироваться и посмотреть на него свежим взглядом…

За помощь и посвящения в тайны иконок, благодарю эксперта в этом вопросе  и по совместительству автора приятной программы для работы с иконками.

Кстати, тут сегодня Агентство переводов Alconost Translations выложило в открытый доступ Follow-up templates (шаблоны писем потенциальным клиентам), можно брать, пользоваться и даже добавлять свой любимый text repository for instant inserting :)


Если вам понравился этот пост вы можете подписаться на RSS или мы можем доставлять вам новые посты прямо в ваш почтовый ящик.


Ручная загрузка функций из DLL или как в программе использовать функции из Vista API

October 26th, 2009 Begemot

Наконец и до меня дошел прогресс и я все-таки решил перейти на Vista Clipboard API в своем Clipboard Manager. Логику продумал, код написал, код что-то наподобие :

if (vista)
CallNewVistaAPI();
else
UseOldAPI();

Запускаю в дебаге под XP, программа выдает ошибку и закрывается:

Clipdiary.exe - Entry Point Not Found
---------------------------
The procedure entry point AddClipboardFormatListener could not be located in the dynamic link library USER32.dll.

То есть даже в случае когда код не пытается вызвать новую функцию, программа все равно не запускается, плохо. Гугл мне почему-то не чем не помог, зато помогли добрые люди. Решение – не вызывать напрямую функции api появившиеся только в висте, а тихонько вручную подгружать их из USER32.dll, запоминать адреса и использовать через указатели. Мне собственно дали готовый класс для всего этого, который я переписал под свои нужды и свой стиль, и теперь могу поделиться:)

Заголовочный файл:

#pragma once

#pragma pack (push, 8)

class CDLLFunctionImports
{
public:
CDLLFunctionImports(void);

typedef BOOL (WINAPI * PADDCLIPBOARDFORMATLISTENER)(HWND);
typedef BOOL (WINAPI * PREMOVECLIPBOARDFORMATLISTENER)(HWND);

PADDCLIPBOARDFORMATLISTENER pRemoveClipboardFormatListener;
PREMOVECLIPBOARDFORMATLISTENER pAddClipboardFormatListener;

private:
void Import(void);
HMODULE GetModuleHandle(TCHAR * ModuleName);
};

extern CDLLFunctionImports DLLFunctionImports;

#pragma pack (pop)

typedef’ом определяем типы указатели на функции с нужной нам сигнатурой. В принципе, мне бы тут хватило и одного типа, но пусть уж будет два для благозвучия. Потом определяем экземпляры указателей на эти функции. Все просто. Еще объявляем глобальный объект, экземпляр нужного класса.

Файл реализации:

#include "ph.h"
#include "dllfunctionimports.h"

CDLLFunctionImports DLLFunctionImports;

CDLLFunctionImports::CDLLFunctionImports(void)
{
pAddClipboardFormatListener = NULL;
pRemoveClipboardFormatListener = NULL;

Import();
}

void CDLLFunctionImports::Import(void)
{
OSVERSIONINFO OSVersionInfo;
OSVersionInfo.dwOSVersionInfoSize=sizeof(OSVersionInfo);

if (GetVersionEx(&OSVersionInfo))
{
if (OSVersionInfo.dwMajorVersion >= 6)
{
HMODULE hModule = GetModuleHandle(_T("USER32.DLL"));
if (hModule != NULL)
{
pAddClipboardFormatListener = PADDCLIPBOARDFORMATLISTENER(GetProcAddress(hModule, "AddClipboardFormatListener"));
pRemoveClipboardFormatListener = PREMOVECLIPBOARDFORMATLISTENER(GetProcAddress(hModule, "RemoveClipboardFormatListener"));
}
}
}
}

HMODULE CDLLFunctionImports::GetModuleHandle(TCHAR * ModuleName)
{
HMODULE hModule = ::GetModuleHandle(ModuleName);
if (hModule == NULL)
{
hModule = ::LoadLibrary(ModuleName);
}

return hModule;
}

В конструкторе вызываем import, который убедившись что у нас подходящая версия операционки, получает и сохраняет адреса необходимых процедур. Все магия закончилась, дальше когда нам необходимо вызвать новую функцию, используем такой вызов:

DLLFunctionImports.pAddClipboardFormatListener(handle);

Пользуясь случаем, хочу сказать спасибо человеку, который это все написал и поделился кодом. Еще он написал отличный и пока еще бесплатный lightweight yet powerful icon and bitmap editor, так что если кому приходится редактировать иконки, берите, а то он скоро зарелизит и захочет денег :)


Если вам понравился этот пост вы можете подписаться на RSS или мы можем доставлять вам новые посты прямо в ваш почтовый ящик.


Что читать

September 7th, 2009 Begemot

Ездили тут вчера второй раз отдыхать на Aрабатку, по пути прочел книжку “Секреты управления программистами” – произвел upgrade, теперь  могу идти работать тимлидом, как раз я только с работы ушел :)

Книжка не плохая, хотя бы тем то что можно прочесть за два часа не напрягаясь :) Маленький объем, большой шрифт, качественная бумага, приятный стиль. Воды нету, бреда вроде тоже нету, ну разве за исключением того, что в книжке для project manager’ов объясняется что такое Open Source.  В принципе умные, но банальные вещи о том что стоит и чего не стоит делать хорошему менеджеру что-бы иметь хорошую команду, работу, карьеру. Менеджерам наверное почитать полезно, мысли то хоть и банально-известные, но наверняка многие им не следуют.

А пишу я собственно для того что бы спросить совета. Меня тут озон недавно обрадовал, что у меня оказывается день рождения как партнера озона:) И посему они мне дарят бесплатную доставку… я решил раз такой праздник, я должен обязательно себе что-нибудь подарить. Вот не могу выбрать:

 

 

Совершенный код   или  Рефакторинг. Улучшение существующего кода. Давно хочу и то и то прочесть… Есть кто читал – выскажитесь в комментариях что лучше, с чего начать. Что лучше уметь сразу писать совершенный код или уметь совершенствовать любой код :)


Если вам понравился этот пост вы можете подписаться на RSS или мы можем доставлять вам новые посты прямо в ваш почтовый ящик.


О безопасном приведении типов

August 3rd, 2009 Begemot

Семь раз отмерь - один отрежь (с)

Ну или вернее о той ерунде которую я сегодня написал.

Задача была такая: подменяем оконную процедуру, при получении определенного сообщения берем wParam, преобразуем к указателю на нужный класс и вызываем функцию член. Сразу представили ужасы, ждущие пользователя если нам придет это сообщение (откуда-нибудь), но без указателя на наш класс. А значит надо, как-то проверять. Как?

Первое что приходит в голову - dynamic_cast<>(), читаем что бы освежить запас мудрости:

Безопасное приведение по иерархии наследования, в том числе и для виртуального наследования.
dynamic_cast(base_class_ptr_expr)
Используется RTTI (Runtime Type Information), чтобы привести один указатель на объект класса к другому указателю на объект класса. Классы должны быть полиморфными, то есть в базовом классе должна быть хотя бы одна виртуальная функция. Если эти условие не соблюдено, ошибка возникнет на этапе компиляции. Если приведение невозможно, то об этом станет ясно только на этапе выполнения программы и будет возвращен NULL.
dynamic_cast(base_class_ref_expr)
Работа со ссылками происходит почти как с указателями, но в случае ошибки во время исполнения будет выброшено исключение bad_cast.

Спасибо Алёне, там же читаем и про остальные возможности приведения типов в c++.

dynamic_cast<>() приведение конечно безопасное, но wParam в XXX* преобразовывать оно разумеется не хочет, не компилится. Выкрутился следующим образом, благо у меня был базовый класс:

XXXBase  * t = reinterpret_cast<XXXBase*>(wParam);
XXX * p = NULL;
try
{
   p = dynamic_cast<XXX>(t);
}
catch(...) {}

if (p)
{
// all ok...
}

Абсолютно не представляю насколько это идеологически правильно, переносимо или хорошо, скорее всего неправильно, криво и непереносимо:). Но у меня работает, почему dymamic_cast кидает исключение вместо того что бы вернуть NULL, я правда не понимаю, но практика (Visual Studio 2008) показывает что так и есть.

Тестировалось передачей 0 в качестве wParam и заменой первой строчки на

int * tt = new int(4);
XXXBase  * t = reinterpret_cast<XXXBase>(tt);

Все ок - исключение ловится, замалчивается, указатель остается нулевой.


Если вам понравился этот пост вы можете подписаться на RSS или мы можем доставлять вам новые посты прямо в ваш почтовый ящик.


Каталог UI паттернов

February 3rd, 2009 Begemot

Каталог UI паттернов - примеры что и как делают лидеры софтостроения, чтобы облегчить жизнь простым пользователям. Не то что бы прямо руководство к действию или пошаговый алгоритм, но пробежатся глазами, посмотреть интересно. Заодно интересно посмотреть что можно делать на Silverlight, по-моему весьма недурственно.


Если вам понравился этот пост вы можете подписаться на RSS или мы можем доставлять вам новые посты прямо в ваш почтовый ящик.


Прогресс не остановить

January 3rd, 2009 Begemot

Все течет, растет и меняется раньше, еще два года назад мне писали в Uninstall form'у:

Takes up too much memory. 4-5Mb of constant memory usage, even with zero saved notes, is too much for what should be a very simple background utility. Also uninstalled Clipdiary for the same reason, as I already have a slightly simpler, but more functional and *much* smaller clipboard extender that I prefer. Flashnote especially should be under 1Mb, all the time. Even the full free NoteTab Lite text editor, with 5 open full text documents, consumes only 6Mb memory. All that app then needs is a hotkey to activate the window and it does *way* more than Flashnote for equivalent memory usage. I like the idea of Flashnote a lot, and would use it if it took only in the Kb range of memory.

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

This freeware improves your productivity by making information copying/managing task easier. It consumes little memory (around 5MB); a good software especially for a slow computer.

Прогресс... :)


Если вам понравился этот пост вы можете подписаться на RSS или мы можем доставлять вам новые посты прямо в ваш почтовый ящик.


Орки атакуют!

October 17th, 2008 Begemot

Интересно что хотела MS этим сказать?

Галактека в опасносте, Орки атакают

 

А вы говорили китайцы, китайцы...  :)

MS собирается выпустить русскую версию 28 октября сего года. будут локализованны все версии студии от Express до Team Suite и MSDN (!)

Можно ли оценить объем работ по полной локализации Visual Studio 2008?

Да, в общей сложности – это порядка 12 миллионов слов, из которых 1 миллион слов для локализации интерфейса и 11 миллионов слов для локализации документации, библиотеки MSDN. По количеству слов это приблизительно равно объему 10 томов Большой Советской Энциклопедии.

Вообщем ждем и боимся:)


Если вам понравился этот пост вы можете подписаться на RSS или мы можем доставлять вам новые посты прямо в ваш почтовый ящик.




Page 1 of 3123