Как стать автором
Обновить

Как написать компонент к Firefox на C++

Время на прочтение 5 мин
Количество просмотров 3.3K
Firefox C++ *
Как написать на C++ компонент для Firefox, так, чтобы его потом можно было использовать из яваскриптового extension или даже из обычной веб-страницы.
Вот как
Всего голосов 36: ↑35 и ↓1 +34
Комментарии 17

А по другому как то можно?

Время на прочтение 2 мин
Количество просмотров 458
Чулан
Не, развернутый пост писать мне лениво. Итак, если вдруг кто-то что то увидит в моих размышлениях — плюсуйте, или минусуйте, (слова то какие страшные:). Собсно о чем я: вопрос: зачем мы уже пару десятков лет объясняем на разных языках различным процессорам КАК мы хотим выполнить задачу? Причем делаем это миллионы раз, объясняя тупым процессорам на множестве языков программирования ЧТО мы хотим в итоге получить. Причем одни и те же задачи решались уже миллионы раз.

Различные фреймворки конечно же решают общие задачи достаточно просто, но в итоге приходится одни и те же простейшие задачи решать снова и снова. А тогда нафига нам вообще компьютеры, если мы все делаем сами?.. Может пора научить эти устройства, которые мы приручили, самостоятельно принимать простые решения, а не объяснять им снова и снова что мы от них хотим? Вообще это скорее крик души, я честно говоря уже устал писать программы на традиционных языках программирования, снова и снова объясняя моему любимому ПК банальные вещи: smart pointers, ссылки, константные ссылки, указатели, виртуальные функции, стек/динамическая память. С чего вдруг мне обо всем этом заботиться?

Возьмем простую задачу: распарсить XML файл и вывести все имена тэгов на экран. Варианты решения: бесконечно много. Можно использовать множество языков программирования, можно на каждом из них написать совершенно разный код. Скорость работы этих решений: стесняюсь оценить,
может различаться на 1-2-10 порядков. А задача то ведь сверх простая, чтобы достичь максимальной эффективности нужно всего то правильно написать несколько строк(наверное, десятков строк) ассемблерного кода.

Но ведь дело даже не в этом. Сколько, продолжая тот же пример, написано XML парсеров? А ведь логика там одна и та же. И та же «грамматика», очень много общего. А почему бы не сказать нашей любимой платформе, что такое XML по сути. Чтобы он знал, что такое XML, с чем его едят, с чем не едят и т.д. И получив его на входе сам бы преобразовывал его к нужному выходу, получив задачу ЧТО нужно сделать и самостоятельно решая задачу КАК делать.

ЗЫ. XML приведен для очень грубого и простого примера, просьба XML в каментах не трогать:)
ЗЫЫ. Первый пост, не судите строго, я исправлюсь, может быть:)
Всего голосов 27: ↑9 и ↓18 -9
Комментарии 12

Оптимизация производительности в C++ приложениях (Windows)

Время на прочтение 2 мин
Количество просмотров 3.4K
Чулан
Все думаю уже знают, но все же. Иногда нужно оценить, сколько процессорного времени занимает выполнение тех или иных функций программы(преимущественно я говорю сейчас о C++). Ну и ниже привожу свой способ, простой, но вполне меня устраивает.

Можно проинструментировать код различными специальными инструментами(не пробовал, вроде DevPartner один из них, думаю их немало сейчас).
Функции привязанные к времени не очень то хорошо работают, в WinAPI или в каком либо другом API я их не нашел.

Две функции которые мне весьма пришлись по вкусу:

QueryPerformanceFrequency
QueryPerformanceCounter

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

С помощью этой парочки функций можно получить довольно точные оценки времени работы программных вычислений.

Собственно, QueryPerformanceFrequency возвращает количество элементарных операций которые может выполнить ваш процессор за одну секунду.
QueryPerformanceCounter возвращает количество элементарных операций, которое он уже выполнил с момента запуска компьютера.

«GetTickCount» — вроде как альтернатива, но ее точности мне как то не хватило, либо меня не устроило ее поведение, которое не слишком то внятно описано в MSDN, скорее ее можно использовать только для UI-расчетов.

Вычислить, сколько cекунд занимает вызов какой либо функции (метода класса) DoWork() с использованием QueryPerformanceFrequency/QueryPerformanceCounter собственно весьма просто:

LARGE_INTEGER performanceCounter;
::QueryPerformanceFrequency(&performanceCounter);

LARGE_INTEGER performanceCounterStart;
::QueryPerformanceCounter(&performanceCounterStart);

DoWork();

LARGE_INTEGER performanceCounterEnd;
::QueryPerformanceFrequency(&performanceCounterEnd);

double timeElapsed = (double*)(performanceCounterEnd) - (double*)(performanceCounterEnd)



Грешный код конечно, я лишь показал идею, может вдруг кому и пригодится.
Вообще, QueryPerformanceCounter, это «ReaD Time Stamp Counter(RDTSC)» инструкция ассемблера(вру о5, название инструкции #0f, #31, хотя постесняюсь сказать, на каких процессорах она работает, за что прошу меня простить:)

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

CalculateSinus (cobst Double &x)
{
    return sin(x);
}

static const double x = PI / 4;
double y = CalculateSinus(x)


преобразуют так, что вообще ее не нужно будет считать во время выполнения, и y=sin(PI/4) будет просчитан на стадии компиляии.
Всего голосов 12: ↑5 и ↓7 -2
Комментарии 9

Переопределение стандартных типов в C++

Время на прочтение 1 мин
Количество просмотров 3.4K
Чулан
Нередко программисты для удобства и краткости переопределяют простейшие типы данных, дают им другие имена. Чаще всего это делаетс примерно так:

typedef unsingned int uint32;
typedef signed int int32;
typedef unsigned char byte;

Ну и так далее. Выступлю с предложением: а почему бы не переопределить простейшие типы, написав для каждого типа свой класс? Расход памяти при хранении таких объектов увеличиться по идее не должен(ессно, виртуальные функции не используем). Например, пишем класс Double, примерно так:

class Double
{
public:
     Double(const Double& value);
     Double          operator+(const Double &right) const;
     Double          operator-(const Double &right) const;
     Bool              IsPositiveInfinity();
     Bool              IsNegativeInfinity();
     
private:
     double _value;
     
}



Или например для типа char:

class Char
{
public:
    Char(char value);

    Bool IsDecimalDigit() const;
    Bool IsLetter() const;
    Bool IsWhiteSpace() const;
    
    Bool operator==(const Char &other);
    Bool operator!=(const Char &other);

private:
    char _value;
};


Таким образом, можно работать с простейшими типами как с объектами, повысить удобочитаемость кода, иметь больше контроля над тем что происходит в программе(например, для подсчета количества умножений, выполняемых над типом double достаточно поместить счетчик в перегруженный оператор).

Оверхеда по производительности/расходу памяти по идее быть не должно.

Пока не могу поделиться плюсами/минусами такого подхода, но постепенно внедряю его в свои C++ библиотеки.
Всего голосов 12: ↑5 и ↓7 -2
Комментарии 29

Reason — кроссплатформенный С++ фреймворк

Время на прочтение 2 мин
Количество просмотров 503
Чулан
Начну с описания проблемы. При написании приложений на С++ некоторую сложность для начинающих разработчиков может представлять отсутствие стандартных классов для работы со строками, файлами, коллекциями, сетью и выполнения других простых операций. Конечно, есть WinAPI, Standard Library, CRT, MFC, ATL, но они достаточно сложны в использованиии.

К примеру, в серьезных коммерческих проектах считывать файлы с помощью прямых вызовов функции WinAPI СreateFile/ReadFile/CloseFile без создания классовых оберток сложно, и вообщем то неправильно. Другой пример, работа со строками, СRT — неудобно: буферы, незащищенный код. std::string — довольно неполон: отсутствуют такие часто используемые операции как например trim, split. Поэтому многие разработчики в каждом новом проекте пишут собственные классы/обертки для выполнения простых операций.

Ну и, собственно, чем хорош Reason
Всего голосов 16: ↑4 и ↓12 -8
Комментарии 3

Программировать сложно или о вреде догматического мышления

Время на прочтение 5 мин
Количество просмотров 1.3K
Разработка веб-сайтов *
У каждого явления существует «плохая» и «хорошая» сторона. При этом абсолютного зла не существует. Также как и абсолютного добра.

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

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

Начнем с того, что программирование — это плохо. Почему?

Читать дальше →
Всего голосов 65535: ↑32767.5 и ↓32767.5 0
Комментарии 0

Что скрывает class Empty {}

Время на прочтение 3 мин
Количество просмотров 8.1K
C++ *
Это заметка о методах, которые C++ создаёт автоматически, даже если вы их не создавали.

Для кого эта заметка? Надеюсь, что она будет интересна начинающим программистам на С++. А опытным программистам позволит лишний раз освежить и систематизировать свои знания.

Читать дальше →
Всего голосов 65: ↑58 и ↓7 +51
Комментарии 65

Итератор по кортежу (boost)

Время на прочтение 3 мин
Количество просмотров 1K
Чулан
Итератор по кортежу И так, нам нам нужно огранизованно пройтись по всем членам кортежа. Мне это понадобилось для сохранения в xml — файл конструкций типа std::vector<boost::tuple<...>>. Кстати, пишу я это в Qt.

Ну да ладно, к делу.
Читать дальше →
Всего голосов 25: ↑5 и ↓20 -15
Комментарии 3

Leechcraft 0.3.0

Время на прочтение 3 мин
Количество просмотров 1.4K
Я пиарюсь
Здравствуй, %username%.
Сегодня я хочу рассказать тебе об одном своём проекте, который начался давным-давно с простого желания написать что-нибудь абстрактное, модульное и крутое.

image

Быстро пролетело чуть больше трех лет, и получился LeechCraft. LeechCraft — это модульный кроссплатформенный интернет-клиент. Модульный — все по-настоящему важное выполняется плагинами, а ядро программы только связывает их между собой, да показывает общий для них интерфейс. Кроссплатформенный? LeechCraft постоянно используется автором под Linux, запускается под Windows и, теоретически, может работать под Mac OS X. Однако, за неимением Мака работа под ним не была протестирована.

Читать дальше →
Всего голосов 93: ↑84 и ↓9 +75
Комментарии 110

C++ — как латынь

Время на прочтение 1 мин
Количество просмотров 1.1K
Программирование *
Для большинства программистов язык С++ — как латынь:
1. Очень многие современные языки от него произошли, но сейчас им мало кто пользуется.
2. Считается, что на латыни C++ можно написать что угодно. Это, наверное, так, но фразы получаются громоздкими.
3. Учеба в классическом университете подразумевает обязательное изучение C++. После учебы все равно мало кто его понимает.
4. Хорошо понимают в специальных учреждениях, где поддерживают старый софт. Читай «библиотека с манускриптами».
5. Библиотекари считают всех, кто не знает латыни, неучами.

Upd:
6. Латынь часто наделяют мистическими возможностями (см. Г. Поттер). C++ тоже.

Юмор, ага. :)

P.S. Я знаю знал, но теперь уже не люблю.

Upd2: Поместил в юмор. Ибо шутка же.
Всего голосов 110: ↑91 и ↓19 +72
Комментарии 35

Немного Математики, Хабра и Марио или играемся с табулированием

Время на прочтение 1 мин
Количество просмотров 924
Ненормальное программирование *
Здравствуйте!
Возможности компилятора MSVC практически безграничны для творчества, поэтому я решил поэкспериментировать с табулированием и знаками "+"/"-". Пока создан только один экспонат, но я надеюсь развить эту мысль и сделать что-то грандиозное!
Читать дальше →
Всего голосов 24: ↑12 и ↓12 0
Комментарии 12

Google Go = Python и C++

Время на прочтение 1 мин
Количество просмотров 11K
Программирование *
Перевод
Google только что объявил выпуск нового языка с открытым исходным кодом
под названием Go. Компания говорит что, Go эксперементальный язык и
он объединяет производительность и безопасность компилируемых языков(как С++)
со скорость разработки динамических языков (как Python).
Читать дальше →
Всего голосов 61: ↑55 и ↓6 +49
Комментарии 168

Hello World! как ему следует быть на C в Linux

Время на прочтение 3 мин
Количество просмотров 50K
Программирование *
Очень многие начинающие программисты думают, что знают, как написать Hello World. Естественно, с этого примера ведь и начинается большинство учебников.
А давайте посмотрим, как это делается.
Обычно в учебнике по C эта программа выглядит примерно так:
#include <stdio.h>
void main()
{
    printf("Hello world\n");
}

Читать дальше
Всего голосов 226: ↑161 и ↓65 +96
Комментарии 134

Что такое Pimpl по версии Qt, и с чем его едят!

Время на прочтение 12 мин
Количество просмотров 37K
Qt *

Вступление.



Часто в документации от Qt встречается термин Pimpl. Кроме того, те кто хоть немного копался в исходном коде Qt часто видел такие макросы как: Q_DECLARE_PRIVATE, Q_D. А также встречал так называемые приватные заголовочные файлы, название которых заканчивается на "_p.h".
В этой статье я попробую приоткрыть ширму за всей это структурой.

Pimpl, что это?


Pimpl — Pointer to private implementation. Это одно из названий паттерна программирования. Еще его называют чеширским котом — «Cheshire Cat» (это название мне больше нравится). В чем суть этого паттерна? Основная идея этого паттерна — это вынести все приватные члены класса и, в не которых случаях, функционала в приватный класс.
Отсюда название «чеширский кот» — видно только улыбку, а все остальное остается невидимым, но оно несомненно есть :-) Кто не помнит этого замечательного кота, может обратится к первоисточнику, к книге Льюиса Кэрролла «Алиса в стране чудес». Очень интересная книга, особенно если читать в оригинале.
Что это дает?
Читать дальше →
Всего голосов 48: ↑46 и ↓2 +44
Комментарии 70

QST: QsT SQL Tools, инструментарий для Qt

Время на прочтение 11 мин
Количество просмотров 1.2K
Чулан
UPD
Данный блог появился благодаря advix. Этот человек дал инвайт за пост в песочнице, за что я ему искренне благодарен.

Добрый день, уважаемое хабрасообщество!
Хочу представить на ваш суд крохотную библиотеку под Qt, написанную, чтобы упростить программирование приложений баз данных. Используя ее, сделал одну базу данных на заказ, и хотя это была всего лишь курсовая работа, она помогла мне отточить и продумать многие моменты. Сейчас пишу другую базу данных, уже настоящую, для серьезной организации. Понемногу вношу в библиотеку новые возможности. Глядишь, когда-нибудь что-то хорошее получится.

Преамбула

Начиная с лета 2009 года, я активно изучаю Qt. И знаете, по-настоящему счастлив программировать в этой среде. Она решила все мои главные проблемы. Например, я не умел строить интерфейс программы, особенно меня раздражало, что каждый контрол в том же Builder нужно выравнивать, перетаскивать, подгонять размеры и положение. С Qt об этом можно забыть, – и заниматься исключительно эстетикой без всякой рутины. Кроме того, мне нравится STL за ее хитрый подход (хотя еще ее не знаю толком), и в Qt она есть, равно как и собственные контейнеры, – используй с удовольствием. И еще «Кьют» – очень продуманная библиотека, вся такая ООП-шная и технологичная. А я очень чту и уважаю ООП, равно как и паттерны проектирования…
В конце лета получаю заказ на базу данных. Вопрос, на чем писать, не стоит. Конечно, Qt! Практика поможет изучить то, что еще скрыто. Начинаю работать над приложением. Вроде бы формочки красивые получаются, код удобно писать, все есть… И должен бы радоваться, да вот получается лапша из SQL-С++ кода. Ошибкоопасная, в сопровождении трудная, на вид – убожество… Как потом людям в глаза смотреть и называть себя программистом?
Так родился проектик. Да, маленький проект, призванный ото всего этого безобразия избавить. Благо, тропинка проторена, и для всех языков программирования, для всех платформ уже есть подобные вещи. Ну и ладно, что есть. Хочу свою, тем более, под Qt ничего толкового не нашел.

QST: QsT SQL Tools

Это инструментарий, а лучше сказать – библиотека, а еще лучше сказать – набор классов, который избавляет программиста от «SQL-лапши» в коде. Естественно, с помощью генерации запросов, но не простой, а через специальные DFD-описатели, что дает много-много полезных плюшек. Как-то: обращаемся к полям таблицы БД по именам, извлекаем любые данные, имеем разные DFD-описатели под разные запросы, работаем с моделями-представлениями, инкапсулируем все это в классы-хэндлеры, а те еще много чего умеют, поелику отнаследованы от AbstractModelHanlder…
Но – по порядку.
Читать дальше →
Всего голосов 7: ↑6 и ↓1 +5
Комментарии 11

Вызов функции с «неизвестным» именем на C++. Часть 1 — cdecl

Время на прочтение 4 мин
Количество просмотров 14K
C++ *

Постановка задачи


Что же я имел ввиду, когда написал «неизвестное» имя функции? А значит это то, что имя функции, её параметры и, в конце концов, соглашение вызова, становятся известными только во время выполнения программы. Займемся её вызовом! =)
подробности
Всего голосов 79: ↑62 и ↓17 +45
Комментарии 92

Компилируем 64-битную версию Qt под windows

Время на прочтение 3 мин
Количество просмотров 22K
Программирование *
Туториал
logoЗа последние годы кросс-платформенная библиотека Qt получила не только многочисленные улучшения, но также собственную среду разработки QtCreator и удобные инсталляторы под все операционные системы. Теперь для разработки не нужно самому устанавливать необходимое окружение, прописывать пути, интегрировать библиотеку в ide — достаточно запустить инсталлятор и все будет работать «из коробки». К сожалению, версия для windows имеет инсталлятор только для 32-битной сборки библиотеки и ide. А иногда возникает необходимость сделать именно 64-битное приложение — чаще всего это связано с необходимостью использовать чужие 64-битные компоненты: подгружаемые библиотеки, inproc com компоненты и прочие странные штуки. Под катом содержится подробная инструкция как скомпилировать Qt и QtCreator из исходников для 64-битной архитектуры.

Карта обхода подводных камней
Всего голосов 13: ↑11 и ↓2 +9
Комментарии 7

Несколько событий в Delphi-блогосфере

Время на прочтение 1 мин
Количество просмотров 877
Delphi *
Несколько новостей связанных с миром Delphi.

DelphiFeeds.ru


Стараниями Александра Божко, в интернете появился агрегатор русскоязычных новостей о Delphi. Сайт сделан по аналогии с известным западным порталом DelphiFeeds.com. В данный момент там собираются анонсы постов с 25 русскоязычных Delphi-блогов.

Адрес: DelphiFeeds.ru

«Дженерики в Delphi 2009 для Win32» в виде PDF-ки


Перевод статьи «Дженерики в Delphi 2009 для Win32» доступен в PDF файле. За вёрстку спасибо Андрею Тишкину.

Скачать можно здесь, либо на домашней странице Sébastien Doeraene (поиск по фразе «PDF form»).

Сравнивая дженерики в C#, C++ и Delphi(Win32) (перевод)


Ну и, на сладкое, доступен перевод статьи Comparing C#, C++, and Delphi (Win32) Generics. Автор: Craig Stuntz.
Перевод выложен в TDelphi-блоге Алексея Тимохина: тынц.
Всего голосов 39: ↑21 и ↓18 +3
Комментарии 20

Статический анализ Си++ кода и новый стандарт языка C++0x

Время на прочтение 18 мин
Количество просмотров 5.4K
Блог компании PVS-Studio
Аннотация
Введение
1. auto
2. decltype
3. Ссылка на временный объект (R-value reference)
4. Правые угловые скобки
5. Лямбда-функции (Lambdas)
6. Suffix return type syntax
7. static_assert
8. nullptr
9. Новые стандартные классы
10. Новые направления в развитии статических анализаторов кода
Заключение
Библиографический список

Аннотация


В статье рассмотрены новые возможности языка Си++, описанные в стандарте C++0x и поддержанные в Visual Studio 2010. На примере PVS-Studio рассмотрено, как изменения языка отразятся на инструментах статического анализа кода.
Читать дальше →
Всего голосов 93: ↑91 и ↓2 +89
Комментарии 43

PocoCapsule: делаем «Hello world» проще

Время на прочтение 7 мин
Количество просмотров 2.3K
C++ *
image Статья рассказывает об опыте знакомства с IoC-контейнером PocoCapsule (C++), возникших трудностях и способах их преодоления. Помимо прочего статья включает небольшой пример для быстрого старта с PocoCapsule (упрощенный проект «Hello World» с официального сайта).

Читать дальше →
Всего голосов 9: ↑6 и ↓3 +3
Комментарии 3