Сегодня наткнулся на сайте developers.org.ua на две интересные статьи:
первая часть:
Алексей Скрыпник: руководство в стиле джаз
вторая часть:
Алексей Скрыпник: Украина не конкурирует с Чехией, Украина конкурирует с Египтом
Очень интересно подана информация, человек рассказывает о своей компании, о принципах работы, делится личным опытом.
Статьи очень познавательные и интересные. Советую ознакомиться.
воскресенье, 16 мая 2010 г.
среда, 28 апреля 2010 г.
Boost thread и исключения
Небольшая заметка по поводу потоков буста и генерации исключений в них.
Нарвался на интересную проблему.
Использую потоки буста, в потоке класс генерирует исключение, в этом же потоке оно перехватывается. Но вот перехвата не происходит. Исключение почему то уходит в главный поток, хотя такого вроде быть не должно. При попытке выполнить этот же код без потока всё отрабатывает так, как надо.
Предварительный поиск по и-нету не дал ответа на вопрос.
Посмотрим, что покажут дальнейшие эксперименты.
Нарвался на интересную проблему.
Использую потоки буста, в потоке класс генерирует исключение, в этом же потоке оно перехватывается. Но вот перехвата не происходит. Исключение почему то уходит в главный поток, хотя такого вроде быть не должно. При попытке выполнить этот же код без потока всё отрабатывает так, как надо.
Предварительный поиск по и-нету не дал ответа на вопрос.
Посмотрим, что покажут дальнейшие эксперименты.
пятница, 26 марта 2010 г.
Скрипт копирования директории с фильтром файлов
Не так давно игровой движок, надо которым я работаю уже длительное время, был собран в статическую библиотеку. Возникла вот такая проблема: очень неудобно руками выбирать заголовочные файлы из папок проекта в отдельный include каталог библиотеки.
Соответственно появилась идея написать скрипт для автоматизации данного процесса. А так как уже давно интересуюсь скриптовым языком Python, то захотелось опробовать его на этой задаче.
По сути задача простая, и её можно решить множеством способов. Она сводится к обходу всех подкаталогов в заданном родительном и копирование указанного типа файлов и подкаталогов в указанное место.
В Python-не за работу с файлами и папками отвечает модуль os, с чтения документации по его возможностям я и начал. Но хотелось свести писанину к минимуму, и я решил ознакомиться с руководством более подробно. Через некоторое время была найдена функция с очень интересным названием:
которая находится в модуле shutil.
По ней сразу понятно, что она умеет копировать дерево каталогов а так же видно, что можно задавать игнорируемые файлы. Далее даётся подсказка, что файлы фильтруются при помощи функции:
Полностью конструкция, которая у меня получилась, выглядит так:
Осталась только одна проблема, если директория include уже создана, она не будет переписана. Опять поход в документацию для поиска функции удаления каталога.
Собственно вот она:
Далее весь полученный код собирается в один скрипт, который и решает поставленную задачу:
if os.path.isdir(to_dir):
shutil.copytree(from_dir,to_dir ,ignore=shutil.ignore_patterns("*.cpp",".svn"))
На этом всё.
Соответственно появилась идея написать скрипт для автоматизации данного процесса. А так как уже давно интересуюсь скриптовым языком Python, то захотелось опробовать его на этой задаче.
По сути задача простая, и её можно решить множеством способов. Она сводится к обходу всех подкаталогов в заданном родительном и копирование указанного типа файлов и подкаталогов в указанное место.
В Python-не за работу с файлами и папками отвечает модуль os, с чтения документации по его возможностям я и начал. Но хотелось свести писанину к минимуму, и я решил ознакомиться с руководством более подробно. Через некоторое время была найдена функция с очень интересным названием:
copytree(src, dst[, symlinks=False[, ignore=None]])
которая находится в модуле shutil.
По ней сразу понятно, что она умеет копировать дерево каталогов а так же видно, что можно задавать игнорируемые файлы. Далее даётся подсказка, что файлы фильтруются при помощи функции:
ignore_patterns(*patterns)
Полностью конструкция, которая у меня получилась, выглядит так:
from_dir = "..\\..\\K5Engine"
to_dir = "..\\include"
shutil.copytree(from_dir, to_dir ,ignore = shutil.ignore_patterns("*.cpp",".svn"))
Осталась только одна проблема, если директория include уже создана, она не будет переписана. Опять поход в документацию для поиска функции удаления каталога.
Собственно вот она:
rmtree(path[, ignore_errors[, onerror]])
Далее весь полученный код собирается в один скрипт, который и решает поставленную задачу:
import os
import shutil
if __name__ == '__main__':
from_dir = "..\\..\\K5Engine"
to_dir = "..\\include"
if os.path.isdir(to_dir):
shutil.rmtree(to_dir)
shutil.copytree(from_dir,to_dir ,ignore=shutil.ignore_patterns("*.cpp",".svn"))
На этом всё.
вторник, 23 февраля 2010 г.
Класс-геренатор исключаний
Уже не малое время я программирую на С++, было пересмотрено масса кода, разнообразных библиотек и фреймворков. Соответственно пришлось повидать много вариантов реализации системы обработки ошибок: классическое возвращение кода ошибки, генерация разнообразных типов исключений, кидание исключения как строковый класс и так далее. Так же в процессе работы над своим проектом я искал наиболее удобный для себя способ генерации и обработки ошибок. Первоначально опробовал генерацию кода, оказалось несколько неудобно, далее использовал генерацию исключений. Как то, в очередной раз копаясь в stl обратил внимание на систему классов-исключений, которая в нём применялась, это и натолкнуло меня на идею, реализацией которой я уже не один год пользуюсь.
В stl используются классы-исключения, в которых находится текстовая строка с сообщением об ошибке. От базового класса наследуются специализированные классы, например: ошибка времени выполнения или ошибочный параметр.
Собственно система из stl мне не подошла, стиль кода отличается от того, что используется в движке. Был создан собственный класс исключение:
Далее, в процессе использования неудобно постоянно писать конструкции типа:
if(Name != L"Domochewsky"){
Суть его работы достаточно проста, так как любое логическое условие (A>B, Pointer==NULL и так далее) возвращает true или false, то у класса были сделаны методы, которые кидают сообщение, если условие ложное. Вышло некоторое подобие asset-а.
Далее префикс используется для записи места возникновения ошибки, например это тип класса, который использует генератор. Так же для тех случаев, когда условие каким то образом не выполняется, была сделана возможность просто кинуть исключение.
Примеры использования:
1.
Удобно использовать для разнообразных проверок параметров, удобно генерировать сообщение при использовании функций, которые генерируют в качестве своего результата код ошибки, да и вообще, удобно пользоваться. Пока более удобной конструкции я не нашёл.
В stl используются классы-исключения, в которых находится текстовая строка с сообщением об ошибке. От базового класса наследуются специализированные классы, например: ошибка времени выполнения или ошибочный параметр.
Собственно система из stl мне не подошла, стиль кода отличается от того, что используется в движке. Был создан собственный класс исключение:
class TBaseException
{
protected:
wstring Mess;
public:
TBaseException() throw ();
TBaseException(const wstring &NewMess) throw ();
virtual ~TBaseException() throw ();
wstring GetMess() const;
};
Всё достаточно просто.{
protected:
wstring Mess;
public:
TBaseException() throw ();
TBaseException(const wstring &NewMess) throw ();
virtual ~TBaseException() throw ();
wstring GetMess() const;
};
Далее, в процессе использования неудобно постоянно писать конструкции типа:
if(Name != L"Domochewsky"){
throw TBaseException(L"какое то сообщение, описывающее причину ошибки");
}
Запись не лаконичная, особенно если надо проверить большое количество значений, и был придуман и реализован класс-генератор исключений:class TExceptionGenerator
{
protected:
wstring MessPrefix;
public:
TExceptionGenerator();
TExceptionGenerator(const wstring &Prifix);
virtual ~TExceptionGenerator();
void operator() (const TBaseException &Ex) const;
void Run (const TBaseException &Ex) const;
void operator() (const wstring &Mess,const bool &SetPref=true) const;
void Run (const wstring &Mess,const bool &SetPref=true) const;
void operator() ( const bool &Check,const wstring &Mess,
const bool &SetPref=true) const;
void Run ( const bool &Check,const wstring &Mess,
const bool &SetPref=true) const;
void SetPrefix(const wstring &Val);
};
{
protected:
wstring MessPrefix;
public:
TExceptionGenerator();
TExceptionGenerator(const wstring &Prifix);
virtual ~TExceptionGenerator();
void operator() (const TBaseException &Ex) const;
void Run (const TBaseException &Ex) const;
void operator() (const wstring &Mess,const bool &SetPref=true) const;
void Run (const wstring &Mess,const bool &SetPref=true) const;
void operator() ( const bool &Check,const wstring &Mess,
const bool &SetPref=true) const;
void Run ( const bool &Check,const wstring &Mess,
const bool &SetPref=true) const;
void SetPrefix(const wstring &Val);
};
Суть его работы достаточно проста, так как любое логическое условие (A>B, Pointer==NULL и так далее) возвращает true или false, то у класса были сделаны методы, которые кидают сообщение, если условие ложное. Вышло некоторое подобие asset-а.
Далее префикс используется для записи места возникновения ошибки, например это тип класса, который использует генератор. Так же для тех случаев, когда условие каким то образом не выполняется, была сделана возможность просто кинуть исключение.
Примеры использования:
1.
HINSTANCE Instance = GetModuleHandle(NULL);
Exception(Instance!=NULL,L"in CreateWinWindow() cant't get Instance");
2.Exception(ElemEventActions!=NULL,L"in InitQueue(...) ElemEventActions is NULL");
3.Exception(L"in ToCreateAction(...) Action is NULL");
Удобно использовать для разнообразных проверок параметров, удобно генерировать сообщение при использовании функций, которые генерируют в качестве своего результата код ошибки, да и вообще, удобно пользоваться. Пока более удобной конструкции я не нашёл.
вторник, 15 декабря 2009 г.
Установка Linux Mandriva 2010 One на MSI U210
Давно не писал новых сообщений, думал поделиться идеей и примером кода выделения спрайта по контуру, но всё руки не доходили. А тут появилась другая тема для публикации.
И так, попал ко мне нетбук MSI U210. Интересная машинка, мне понравилась сразу. Но вот незадача, у него на борту стоял SUSE Linux 11.0, а так уж сложилось исторически, что сусю я почему то недолюбливаю. И было принято решение поставить на данное устройство мандриву.
После копания на русскоязычной вики-страничке дистрибутива информации о том, как сделать установочную флешку, не нашёл. А вот в англоязычной версии эта информация есть. Предлагают скачать специальную программку для создания установочной флешки из дистрибутива Mandriva One, саму программу можно найти здесь: Mandriva Seed 2010
Соответственно она называется Mandriva Seed. Есть версия для винды и для линуксов.
Далее вставляется флешка, запускается эта программа, в простом меню ей скармливается iso-образ диска, и мы получаем загрузочную флешку с Mandriva One на борту.
Далее флешка вставляется в usb-порт нетбука, во время загрузки заходим в биос и указываем, что запуск будет производиться с нашей флешки.
Установка проходит без проблем.
А вот после установки получил неприятную вещь - отсутствовал звук. И-нет на вопрос "почему" внятного ответа не дал. После тщетных попыток по настройкам понять, что же не так, и уж было собравшись курить мануалы, выручил меня метод научного тыка. Полез в раздел меню "Аудио и видео -> Регулятор громкости PulseAudio". Там в закладке "конфигурация" в выпадающем списке профиль "HDA ATI HDMI" выставил в Off и воля, звук появился.
А далее всё прошло просто, настроил сеть, раздал на машину и-нет, обновления и установка софта.
Были опасения, что Мандрива на нетбуке будет работать не очень шустро, но как оказалось, опасения были напрасны. Всё ворочается быстро даже с включёнными спецэффектами.
Красиво, удобно, практично. Функционала с головой хватает для всех задач, которые возникают при повседневном пользовании устройством.
Мне нравится.
И так, попал ко мне нетбук MSI U210. Интересная машинка, мне понравилась сразу. Но вот незадача, у него на борту стоял SUSE Linux 11.0, а так уж сложилось исторически, что сусю я почему то недолюбливаю. И было принято решение поставить на данное устройство мандриву.
После копания на русскоязычной вики-страничке дистрибутива информации о том, как сделать установочную флешку, не нашёл. А вот в англоязычной версии эта информация есть. Предлагают скачать специальную программку для создания установочной флешки из дистрибутива Mandriva One, саму программу можно найти здесь: Mandriva Seed 2010
Соответственно она называется Mandriva Seed. Есть версия для винды и для линуксов.
Далее вставляется флешка, запускается эта программа, в простом меню ей скармливается iso-образ диска, и мы получаем загрузочную флешку с Mandriva One на борту.
Далее флешка вставляется в usb-порт нетбука, во время загрузки заходим в биос и указываем, что запуск будет производиться с нашей флешки.
Установка проходит без проблем.
А вот после установки получил неприятную вещь - отсутствовал звук. И-нет на вопрос "почему" внятного ответа не дал. После тщетных попыток по настройкам понять, что же не так, и уж было собравшись курить мануалы, выручил меня метод научного тыка. Полез в раздел меню "Аудио и видео -> Регулятор громкости PulseAudio". Там в закладке "конфигурация" в выпадающем списке профиль "HDA ATI HDMI" выставил в Off и воля, звук появился.
А далее всё прошло просто, настроил сеть, раздал на машину и-нет, обновления и установка софта.
Были опасения, что Мандрива на нетбуке будет работать не очень шустро, но как оказалось, опасения были напрасны. Всё ворочается быстро даже с включёнными спецэффектами.
Красиво, удобно, практично. Функционала с головой хватает для всех задач, которые возникают при повседневном пользовании устройством.
Мне нравится.
суббота, 26 сентября 2009 г.
Пачка ссылок.
Пока руки не доходят написать что нибудь полезное по программированию, поделюсь ссылками.
Первая - сайт "электроника для всех"
Очень полезный ресурс для интересующихся электроникой.
Мне он помог некоторые вопросы прояснить, плюс узнал много нового.
Вторая - онлайн браузерная игра Годвилль
При регистрации создаёшь бога, потом бог создаёт героя, и сразу же герой ввязывается в первое приключение.
Герой бегает сам, выполняет миссии, поднимает уровни, покупает шмотки. Все его похождения описываются в дневнике в шуточной форме. Вообще сам проект содержит не малую толику юмора.
Игрок, кроме чтения дневника героя, может "делать хорошо" или "делать плохо", посылай сообщение.
Игра довольно интересная, не обременительная. Лично мне удобно во время компиляции проекта зайти, проверить как там герой поживает.
Довольно забавно следить за его похождениями.
Первая - сайт "электроника для всех"
Очень полезный ресурс для интересующихся электроникой.
Мне он помог некоторые вопросы прояснить, плюс узнал много нового.
Вторая - онлайн браузерная игра Годвилль
При регистрации создаёшь бога, потом бог создаёт героя, и сразу же герой ввязывается в первое приключение.
Герой бегает сам, выполняет миссии, поднимает уровни, покупает шмотки. Все его похождения описываются в дневнике в шуточной форме. Вообще сам проект содержит не малую толику юмора.
Игрок, кроме чтения дневника героя, может "делать хорошо" или "делать плохо", посылай сообщение.
Игра довольно интересная, не обременительная. Лично мне удобно во время компиляции проекта зайти, проверить как там герой поживает.
Довольно забавно следить за его похождениями.
понедельник, 10 августа 2009 г.
Демо игрового движка №6. Загрузка текстур и обектов из xml-файла.
Готова демка загрузки текстур и объектов из xml-файлов конфигурации. Номер шестой, но пятую выкладывать не буду, простой тест, смысла нет его показывать :)
А теперь по порядку, история:
в движке уже давно есть такая вещь, как списки текстур и менеджер списков текстур. В ручную всё обилие файлов грузить не удобно, поэтому был сделан загрузчик, который, читая текстовый файл, создавал списки текстур и в них загружал текстуры. Удобно и просто.
Ещё в старых версиях была читалка как из обычного текстового файла, так и из xml-файла. Так же существовал загрузчик и для спрайтов, но потом, в процессе развития движка, он был убран.
И вот настало время, когда понадобились эти загрузчики в новой версии. Взял уже проверенную на двух проектах библиотеку - TyniXml, быстро собрал для нужных компиляторов, и добавил функционал в загрузчики.
Вот готова демка. С файлом загрузчика текстур, думаю, будет просто разобраться.
А для загрузчика спрайтов специально сделал файл-пример, в котором показан спрайт со всеми тегами и спрайт с частично убранными тегами. Обязательны только: имя спрайта, его текстура и позиция на сцене. Все остальные теги могут не использоваться.
Да, ещё один момент, координата Z показывает глубину расположения объекта на сцене, чем она больше, тем дальше от зрителя находится объект.
Скачать можно здесь:
narod
ifolder
А теперь по порядку, история:
в движке уже давно есть такая вещь, как списки текстур и менеджер списков текстур. В ручную всё обилие файлов грузить не удобно, поэтому был сделан загрузчик, который, читая текстовый файл, создавал списки текстур и в них загружал текстуры. Удобно и просто.
Ещё в старых версиях была читалка как из обычного текстового файла, так и из xml-файла. Так же существовал загрузчик и для спрайтов, но потом, в процессе развития движка, он был убран.
И вот настало время, когда понадобились эти загрузчики в новой версии. Взял уже проверенную на двух проектах библиотеку - TyniXml, быстро собрал для нужных компиляторов, и добавил функционал в загрузчики.
Вот готова демка. С файлом загрузчика текстур, думаю, будет просто разобраться.
А для загрузчика спрайтов специально сделал файл-пример, в котором показан спрайт со всеми тегами и спрайт с частично убранными тегами. Обязательны только: имя спрайта, его текстура и позиция на сцене. Все остальные теги могут не использоваться.
Да, ещё один момент, координата Z показывает глубину расположения объекта на сцене, чем она больше, тем дальше от зрителя находится объект.
Скачать можно здесь:
narod
ifolder
Подписаться на:
Сообщения (Atom)