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

О web-разработке

January 27th, 2013 Begemot

Занимаюсь последнее время. Давно хотел, а тут вдруг случай удобный подвернулся. Узнал много нового, оказывается за последнее время прогресс шагнул далеееко вперед. И все это стало так сказать намного ближе простому народу. По крайней мере то что я ни разу не дизайнер теперь меня не останавливает, а раньше главная загвоздка была в этом. Сейчас есть куча всего готового, главная проблема – это все освоить, выбрать лучшее и состыковать 🙂

Пишу небольшой портал на Django + django-cms + zinnia ++. Показывать пока нечего.


Поворачиваю к Qt

May 20th, 2010 Begemot

Язычники живут в своем аду.
Я там чужой и дел их не веду.
Но средство есть. (c)

Жизнь удивительна и не предсказуема:) Пару лет уже пишу на wxWidgets мечтаю о том что когда-нибудь у меня все-таки дойдут руки до портирования своих утилит на unix\Mac OS. В свое время выбрал wxWidgets вместо Qt, так как Qt на тот момент была еще слишком дорога и из-за ряда преимуществ wxWidgets конкретно для моих проектов.

Месяц назад начал писать новый проект, не мой, на заказ. Задание – переписать существующее приложение, кроссплатформенно с тем что бы добиться поддержки 64х битных систем (сейчас есть проблемы, спасибо MS:) и захватить рынок MacOS пользователей, которые неоднократно выражали желание купить эту программу.

Начал писать как специалист по wxWidgets, написал прототип – уперся в некоторые проблемы, не то что бы совсем не решаемые, но все-таки… В общем так сложились обстоятельства что сейчас я резко осваиваю Qt, и похоже мой первый реальный кроссплатформенный проект будет именно на нем, забавно правда? 🙂

За полторы недели изучения библиотеки, сложилось мнение что штука эта вполне приятная, в плане вылизаности и наполненности – писать на ней можно легко и быстро – хотя пока это мнение в основном благодаря статьям и книге, в реальном использовании делаю только первые шаги. Разочарование тоже есть, но об этом позже, когда будет реальный опыт.


TidyForums – про питон, форумы, модеров и хрень

April 20th, 2010 Begemot

В связи с переездом в Севастополь зарегистрировался и начал общаться на Севастопольском городском форуме – типа надо быть в курсе событий места где живешь:) В процессе встретилось одно неудобство – беглое слежение за форумом отбирает слишком много времени. Подумалось что могу это исправить небольшим скриптом, заодно и попробую питон на “реальной” задаче.

Питон попробовал – мне по прежнему нравится:) Писать\тестировать\осваивать язык – легко. Ехешники делать можно – они даже работают, хотя конечно вес и размер занимаемой памяти соответствующий, вопрос насчет того насколько доступны исходники после компиляции в exe для меня остается открытым.

Интересно будет попробовать собрать это для мака или линукса, по идее скрипт достаточно просто и проблем быть не будет – но надо пробовать.

На форуме меня сразу же забанили, после того как написал про скрипт, так что путевки в жизнь программа не получила:) Вообще конечно админы меня удивили, интересно в чем причина такой …эээ неадкватности, ну да ладно. Пока еще не решил обидеться и послать все в *** или все-таки зарегаться под новым ником и начать жизнь с нуля 🙂

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

Tidy Forums – оптимизируем процесс чтения форума


С++ Получение списка процессов и путей к exe файлам

March 23rd, 2010 Begemot

Вот неожиданно понадобилось получить список из всех запущенных exe файлов. Xотя казалось бы зачем оно такое может быть надо в simple end-user utility for storing clipboard history, но оказалось что надо. Пришлось изобретать велосипед, что бы труды не пропадали – решил опубликовать.

Вкратце получаем снимок всех процессов в системе CreateToolhelp32Snapshot, итерируясь по нему, для каждого процесса делаем снимок его модулей и получаем полный путь к ехе файлу. Если полный путь не нужен, а достаточно только имени файла – то вторую часть делать не нужно.

Теперь просто код, он простой, написан для универсальности с использованием stl.

typedef  map<wstring, wstring> ProcessMappingType;

wstring GetFullPathForProcess(DWORD pid)
{
    // Take a snapshot of all modules in the specified process.
    HANDLE hModuleSnap = NULL;
    hModuleSnap = ::CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, pid);
    if (hModuleSnap == INVALID_HANDLE_VALUE) return _T("");

    MODULEENTRY32 me32 = {0};
    me32.dwSize = sizeof(MODULEENTRY32);
    if (!::Module32First(hModuleSnap, &me32))
    {  
        ::CloseHandle(hModuleSnap);
        return _T("");
    }
    ::CloseHandle(hModuleSnap);
    return wstring(me32.szExePath);
}

ProcessMappingType GetAllRunningApplication()
{
    ProcessMappingType m;

    HANDLE hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    if (hSnap != INVALID_HANDLE_VALUE)
    {
        PROCESSENTRY32 proc;
        proc.dwSize = sizeof(PROCESSENTRY32);
        if (Process32First(hSnap, &proc))
        {
            m[proc.szExeFile] = GetFullPathForProcess(proc.th32ProcessID);
            while (Process32Next(hSnap, &proc))
                m[proc.szExeFile] = GetFullPathForProcess(proc.th32ProcessID);
        }
        else wxFAIL_MSG(wxString::Format("Error Process32First: %i", GetLastError()));
       
        ::CloseHandle(hSnap);
    }
    else  wxFAIL_MSG(wxString::Format("Error Load ToolHelp:  %i", GetLastError()));  
   
    return m;
}

Все, с вас конфетка 🙂

P.S. И еще, хорошие люди просили сослаться на скандинавский аукцион в Киеве, дык мне не трудно 🙂 А вы верите в подобное?


CMake, mingw, codeblocks – level up

March 7th, 2010 Begemot

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

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

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

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

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

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

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


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

February 19th, 2010 Begemot

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

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

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

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

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


Почему я стал программировать на 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 программит и доволен, прости господи 🙂


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

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 🙂


Ручная загрузка функций из 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, так что если кому приходится редактировать иконки, берите, а то он скоро зарелизит и захочет денег 🙂


Что читать

September 7th, 2009 Begemot

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

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

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

 

 

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