понедельник, 23 марта 2009 г.

Qt Creator 1.0.0

Некоторое время назад вышла версия 1.0.0 среды разработки Qt Creator IDE. Раз уж разработчики объявили такую версию, то уже стоит попробовать. Пробовать будем на Ubuntu. Ставит продукт собственная инсталяшка в директорию /opt по умолчанию, поэтому без админских прав не обойтись. Ставим так:
sudo ./qt-sdk-linux-x86-opensource-2009.01.bin --installer-language ru
Если язык не указать, то установка будет проходить на английском языке. Сразу же предлагается выбрать директорию назначения и ещё можно выбрать ставить ли дополнительные библиотеки. Я все оставил по умолчанию и процесс пошел...


Ставится сравнительно недолго, в конце предлагая сразу и запустить. Я отказался, помня что установка работает с админскими правами. На десктопе появляется ярлык, по нему и запускаем установленную среду от фирмы Nokia (о чем сообщает нам экран приветствия):


Попробуем создать проект. Выбор предлагается небольшой, но оно и понятно — среда предназначается для разработки Qt приложений, а не чего попало. Выбираем Qt4 GUI, отвечаем на несложные вопросы, и заготовка проекта готова к сборке:


Только подумал, что все неплохо работает, но тут же сборка завершилась с ошибкой. Оказывается нужно ставить библиотеки дополнительно, хотя Qt4-dev и шли в составе SDK. Мне понадобилось доустановить следующие пакеты:
sudo apt-get install libfreetype6-dev libglib2.0-dev libsm-dev libxrender-dev libfontconfig1-dev
Уже после этого сборка прошла до конца и можно запустить программу. Пустой диалог появился, что и требовалось для начала.

Далее попробовал что-то за пределами визарда. Заменяем код в main на следующий:
int main(int argc, char *argv[])
{
std::wstring buf( L"Test string" );
buf = L"Строка на русском";

return buf.size();
}
Отладчик почему-то не захотел показывать переменную buf. Хотя позже выяснилось, что std::string показывается нормально и содержимое его тоже. И даже содержимое сonst wchar_t* показывается, но только позорными числами, а не как строка.

Это очень плохо и уже на этом этапе можно сделать вывод, что пользоваться этим средством будет очень трудно. Кстати, и документация поставляется в комплекте только по Qt, но не по С++. Эта проблема, возможно, решается в коммерческой версии продукта (а я ставил ту, что дается даром), но об этом мне ничего неизвестно. Если даже простейший эксперимент вскрывает такие проблемы, то страшно подумать что будет, если копнуть глубже.

Подытоживая сказанное можно заявить, что пока ещё рано использовать это средсво для чего-то более серьезного, чем «Hello world» программы. Ждем следующюю версию...

четверг, 19 марта 2009 г.

Format day of week as string

Неожиданно столкнулся с проблемой, что в Windows нет(или просто я не нашел) тривиального способа получить список всех дней недели в определенной локали. Первым делом, конечно, выбор пал на функцию strtime. Код получился вот такой:
 setlocale( LC_ALL, ".1251" ); 
struct tm tm_temp = {0};
wchar_t day_buf[50];
for ( int n = 0; n < 7; ++n ) {
tm_temp.tm_wday = n;
wcsftime( day_buf, 50, L"%A", &tm_temp );
wcout << day_buf << endl;
}
Тут вроде все как нужно за тем исключением, что setlocale принимает не LCID. В Windows есть свои NLS функции. Попробуем их — получается что-то такое:
 // LCID langid где-то определен
SYSTEMTIME sys_time = {0};
wchar_t day_buf[100] = {0};
for ( int n = 0; n < 7; ++n ) {
sys_time.wDayOfWeek = n;
GetDateFormat( langid, 0, &sys_time, L"dddd", day_buf, 100 );
wcout << day_buf << endl;
}
Однако, GetDateFormat не смотрит на параметр wDayOfWeek. Пришлось взять дату, в которую было воскресенье и от неё выводить дни. Как-то так:
 // LCID langid где-то определен
SYSTEMTIME sys_time = { 2009, 3, 0, 15, 0, 0, 0, 0 };
wchar_t day_buf[100] = {0};
for ( int n = 0; n < 7; ++n ) {
int res = GetDateFormat( langid, 0, &sys_time, L"dddd", day_buf, 100 );
wcout << day_buf << endl;
sys_time.wDay++;
}
Таким образом можно получить список дней недели на нужном языке. Может есть способ попроще?

суббота, 14 марта 2009 г.

Прошел Microsoft Innovation Day в Москве

Закончился Microsoft Innovation Day в Москве. Целый день представители Microsoft рассказывали о программах партнерства, сертификации продуктов под Windows Vista, Server 2008 и Windows 7. Из интересной информации по операционкам стоит отметить, что Windows Server 2008 R2 с ядром Windows 7 будет выпускаться только в варианте 64-бит. Нам дают однозначно понять, что эра 32-бит программ подходит к концу. Что касается партнерских программ и сертификации, то нам весь день напоминали, что вся основная информация по этим темам собрана на сайте InnovateOn.com, в том числе на русском языке.

Вся техническая сессия проходила в рассказах о новый фичах Windows 7. Основная «фича» — это планомерный отказ от форматов PostScript и PDF в сторону XPS и ребята из Microsoft пообещали, что PDF со временем уйдет в прошлое. Уже ведутся переговоры с производителями принтеров и прочей техники для обеспечения аппаратной поддержки XPS.

Про остальные новинки Windows 7 уже много писали и все они, в общем, были в очереной раз показаны в выступлениях докладчиков. А выступали на технической сессии Алексей Федоров, Георгий Баркан и Антон Шепитько. Все презентации показывались с нетбука под управлением новой ОС. Хотел бы отметить новую функцию поиска, Federated Search, которая позволит искать файлы в сети таким же способом как и на своем компьютере, и будет реализована на стандарте Open Search 1.1. А также, что предлагается новое API на замену GDI и GDI+ — Direct2D и DirectWrite. Это вместо когда-то заявленного аппаратного ускорения GDI+, которое так и не было реализовано, будет ускорение вывода картинок и сглаженного текста уже на Direct2D и DirectWrite.

Много говорилось о Cloud Computing и немного об ОС Windows Azure, которая будет доступна только в датацентрах Microsoft. А в России такой строить не собраются, т.к. стоит он 500 млн. долларов, а оборот Microsoft в России только недавно перевалил за 1 миллиард тех самых долларов. Возникает вопрос — зачем было про неё рассказывать? А затем, что докладчики упомянули, как бы неофициально, что возможно будет организовавыть датацентры в рамках предприятия и на них запускать Azure.

Весь день доклады шли точно по часам, но под конец сессия вопросов-ответов задержались более, чем на час, а народ не спешил уходить. Вопросов задавали не много, что не мешало докладчикам много отвечать о совместимости Windows 7 с прошлыми операционками. Отметили интересный факт, что 54% проблем совместимости связано с проверкой разработчиками версии ОС на строгое равенство пяти и отказом запускаться под любой другой версией (даже под более новой). Поэтому, в Windows 7, на всякий случай, не стали менять major версию ОС, а оставили равной 6. Ещё рассказали о том, как Windows 7 справляется сама с проблемами совместимости, но это скорее полезная информация для пользователей, чем для разработчиков, т.к. разработчики должны писать код, который и так совместим.

В качестве заключения: читателям, наверное, интересно будет узнать, что Windows 7 все-таки выйдет уже осенью, по крайней мере в 32-битном варианте. И хотя официально это и не заявлялось, но постоянно намекалось.

вторник, 10 марта 2009 г.

Windows Genuine Advantage в Firefox

Качал что-то с сайта MSDN и заметил, что проверка подлинности ОС прошла вполне себе нормально с установкой плагина, при том что браузер был Firefox. Зашел в плагины и увидел там вот что:

Получается, что теперь в Microsoft признают, что пользователи Windows могут браузить интернет не только из IE, и сами пишут плагины к Firefox...

четверг, 5 марта 2009 г.

Ночные сборки

В отличии от Visual Studio 2005, в версии 2008 появилась возможность собирать sln файлы из командной строки не загружая IDE. Ранее, конечно, можно было собрать солюшен из командной строки, но IDE все равно запускалось хотя и было скрыто. Но Wine не обманешь простым сокрытием окна — запуск студии не удавался.

В Visual Studio 2008 такое удобное средство как MSBuild наконец смогло собирать солюшены(sln файлы) для С++ проектов. Это позволяет организовать так называемые «nightly builds» на сервере под управлением Ubuntu Server. Это у меня такой сервер и сборка там была в VirtualBox, а теперь, в связи с открытием новых возможностей, в планах есть пункт сделать под Wine. Предполагается, что такой способ будет потреблять меньше ресурсов сервера, чем вторая операционка... А тем временем, под Windows сборка производится одним кликом по файлу rebuild_all.cmd:
@call "C:\Program Files\Microsoft Visual Studio 9.0\VC\vcvarsall.bat" x86
@msbuild All90.sln /t:Rebuild /p:Configuration="Unicode Release"
Думаю, что все параметры понятны без дополнительных объяснений.

У нас сборка, помимо самой сборки, включает в себя автоматизированное сливание с SVN стабильной версии(ну т.е. разработчики думают, что там что-то стабильное и помечают такие ревизии меткой STABLE). Затем производится обновление всех rc и rc2 файлов проектов, а их много, поэтому тоже автоматизированно. В версиях проекта проставляется последняя цифра — это как раз номер ревизии проекта(по сути ревизия каталога, где лежит vcproj файл), и полностью меняется версия продукта, а также всякие копирайты и т.п.

После сборки все dll, exe и pdb заливаются на Symbol Server(что позволяет позже автоматически разбирать дампы программ), после чего продукт доступ для тестирования в сыром виде.

вторник, 3 марта 2009 г.

Microsoft Innovation Day

Пришло приглашение из Microsoft посетить их Форум компаний-разработчиков. Пройдет он 13 марта 2009 г. в Москве по адресу: гостиница «Radisson SAS Славянская» (пл. Европы, д. 2, ст. м. «Киевская»).

Форум традиционно будет разделен на две части: техническую и бизнес-секцию. На технической части будут освещены новые возможности Windows 7, вопросы совместимости решений компаний-разработчиков с клиентскими операционными системами Microsoft, а также будет рассмотрена web-платформа Microsoft(Silverlight?); на бизнес-секции — новая информация о партнерских программах для компаний-разработчиков и возможностях по созданию и продвижению совместных продуктов с Microsoft.

Участие в мероприятии бесплатно. Зарегистрироваться можно по ссылке:
http://www.microsoft.com/rus/events/detail.mspx?eventid=1032405960

Я уже зарегистрировался и буду на технической части.

понедельник, 2 марта 2009 г.

Давно про компилятор не писал

Давно про компилятор не писал, который в состав Visual Studio входит. Но там все идет как и раньше. Я уже не обращаю внимания на то, что компилится код вроде такого:
#include <stdio.h>
int main()
{
int x = (enum Fff)1;
enum Fff { dx, dy };
return 0;
}
В GCC выдется ошибка, но мистер Кейвс (Jonathan Caves) из Visual C++ Compiler Team весьма нервно отнесся к моим аппеляциям к GCC при демонстрации того, что в VC++ ошибка и как все должно работать, поэтому я уже не отсылаю такого рода репорты.

А вот код вроде того, что приведен ниже, уже вызывает интерес, хотя формально и не имеет ошибок:
class MyClass
{
public:
MyClass() {};
MyClass( int ) {};
};

int main()
{
MyClass (x);
MyClass (0);
return 0;
}
Получилось что-то вроде этого в результате опечатки — хотелось объявить переменную x и инициализировать её чем-то. Почему это скомпилировалось вообще? Коллега предположил, что должен вызываться конструктор MyClass и инициализироваться x-ом, однако, это не так. Это все то же объявление переменной x. Мне тут хотелось бы получать предупреждение на этапе компиляции, потому что я так и не придумал зачем может понадобиться объявлять переменные в таком синтаксисе.

А настоящая программа скомпилировалась и упала в рантайме, ошибка была сразу найдена, но лучше до рантайма не доводить imho.

Кстати, как вызвать конструктор MyClass, создав объект на стеке? Во втором случае так и будет, но имеется ввиду без константы. Ну все так-же как обычно — MyClass (x)(y).

Вывод тут простой — не стоит так писать(с лишними скобками), поскольку путает других разработчиков. А разработчикам компилятора пора уже ввести Warning level 5 и выдавать там предупреждения на коде вроде такого.

Антикризисное средство поиска утечек памяти

При современном подходе к программированию на языке C++ довольно просто избежать всех проблем связанных с утечками памяти. Аллокаторы, в общем, неплохо заботятся о пямяти — тут вам и автоудаление, и слежение за фрагментацией (например, boost::pool_alloc), и прочие радости. Однако, иногда попадается код, где выделение памяти организовано плохо(с ошибками, а значит плохо).

В составе Debugging Tools for Windows присутствует утилита umdh (user-mode dump heap). Пользоваться этой тулзой довольно просто. Сначала делается пара дампов состояния памяти с помощью команд:
umdh.exe -p:3804 -f:p:\result1.log
umdh.exe -p:3804 -f:p:\result2.log
, где 3804 — идентификатор процесса (его можно посмотреть в task manager). Потом можно сравнить эти два состояния следующей командой:
umdh.exe p:\result1.log p:\result2.log -f:p:\final.log
Самое интересное начинается при сравнении. umdh умеет подгружать pdb файлы из путей, определенный переменной _NT_SYMBOL_PATH (как и все прочие тулзы в Debugging Tools).

Результат сравнения позволяет посмотреть стек и количество выделенных байт. Выглядит это так:
// Each log entry has the following syntax:                                 
//                                                                          
// + BYTES_DELTA (NEW_BYTES - OLD_BYTES) NEW_COUNT allocs BackTrace TRACEID 
// + COUNT_DELTA (NEW_COUNT - OLD_COUNT) BackTrace TRACEID allocations      
//     ... stack trace ...                                                  
//                                                                          
// where:                                                                   
//                                                                          
//     BYTES_DELTA - increase in bytes between before and after log         
//     NEW_BYTES - bytes in after log                                       
//     OLD_BYTES - bytes in before log                                      
//     COUNT_DELTA - increase in allocations between before and after log   
//     NEW_COUNT - number of allocations in after log                       
//     OLD_COUNT - number of allocations in before log                      
//     TRACEID - decimal index of the stack trace in the trace database     
//         (can be used to search for allocation instances in the original  
//         UMDH logs).                                                      

+     2f0 (   2f0 -     0)      1 allocs BackTraceA39
+       1 (     1 -     0) BackTraceA39 allocations

ntdll!RtlpAllocateHeap+000000C6
ntdll!RtlAllocateHeap+000001E3
gdiplus!GpMalloc+00000016
gdiplus!GdipCreateBitmapFromGdiDib+00000090
DkClient2!Gdiplus::Bitmap::Bitmap+00000069 (c:\program files\microsoft sdks\windows\v6.0a\include\gdiplusbitmap.h, 653)
DkClient2!Gdiplus::Bitmap::FromBITMAPINFO+00000064 (c:\program files\microsoft sdks\windows\v6.0a\include\gdiplusbitmap.h, 736)
DkClient2!CAlarmZone::OnFrame+00000095 (p:\svn\orwell\head\dkclient\trunk\alarmzone.cpp, 361)

Total decrease ==   25ea requested +    41e overhead =   2a08

По такому отчету уже вполне можно определить место утечки и разбираться дальше. Конечно, есть дорогие средства с красивым интерфейсом вроде BoundsChecker'a. Однако, не все могут позволить себе покупку таких средств, а umdh совершенно бесплатна.

Более подробно по этой теме можно почитать на сайте автора программы. Ах, да... забыл написать, что сделали эту тулзу в небольшой компании из Редмонда. Теперь компания уже немаленькая, однако, программке красивый интерфейс не прикрутили — это, может, и к лучшему... а то стоила бы как BoundsChecker...