Pull to refresh
30
0
isotoxin @isotoxin

пользователь С++

Send message
Не скажу за другие версии студии, но в 2015-й, если символы объявлены в стандартной библиотеке и в вашем коде, то студия без лишних разговоров берет ваши. Проверено.
По правде, много места оно не занимает. Я всегда линкую рантайм статически (не люблю лишние зависимости), но после перехода на VS2015 с VS2013 обнаружил, что почти все, что я собираю, стало чуточку меньше в размерах. Т.е. лишний код телеметрии не превышает выгоды от улучшенного оптимизатора новой студии.
Но, соглашусь, сам факт наличия бесполезного кода вносит в мою тонкую душевную организацию немного хаоса.
Для статически линкуемого рантайма способ отключения этой гадости я предложил в комменте ниже.
Спасибо. Добавил в свой проект:
// disable VS2015 telemetry
extern "C"
{
    void _cdecl __vcrt_initialize_telemetry_provider() {}
    void _cdecl __telemetry_main_invoke_trigger() {}
    void _cdecl __telemetry_main_return_trigger() {}
    void _cdecl __vcrt_uninitialize_telemetry_provider() {}
};
Одинаковое поведение с разных ip, из разных стран. При чем человек так себя не ведет.
Иногда, с ip, который я уже пометил, как ip бота, происходит регистрация (видимо вручную, т.к. капча решается с первого раза, никаких попыток), затем этот аккаунт пишет спам.
Ну и мой форум мало кому известен, чтобы на него пытались зарегистрироваться разные люди непрерывно, круглосуточно, по десятку уникальных ip в час.
Мой форум непрерывно атакуется ботнетом. Мне пришлось написать свою собственную капчу, т.к. готовые известные капчи ботнет спокойно обходил. Зато теперь, по тому, как бот пытается решить капчу, я могу со 100% достоверностью понять, что это именно бот, а не человек. Аккуратно логирую все ip-шники ботнета. Интересно, такой список может помочь в обезвреживании этой гадости?
Психологический пресс снят — всё равно на круг уже проиграл. Играл на расслабоне. Вот и выиграл :)
.lib файл подключать к проекту как ресурс? Че, реально работает? Это я так отстал от прогресса?

Коли речь о msvc, то подключать либы лучше всего прямо в исходниках:

pragma comment(lib, "ssleay32.lib")
pragma comment(lib, "libeay32.lib")
(символ решетки перед словом pragma парсер съедает)
Но зачем?! Майнер станет больше зарабатывать? Ровно до того момента, пока это железо не появится у остальных майнеров и то, не факт, что отобьются вложения на апгрейд. Затем биткоин сеть поднимет сложность расчетов и все вернется туда же. Плюс, сеть будет наводнена блоками с неправильно посчитанным хэшем.
Хотя, сама идея неплоха, но ей лучше найти другое применение.
Я вообще не пишу на си. Но приходится пользоваться си библиотеками. Всякий раз, когда заглядываю под капот очередной библиотеки, хочется всё там переписать. Вот недавно подключал библиотеку hunspell. Это проверка орфографии, используется очень много где (firefox, chrome, open office и т.д.). И казалось бы, написана на c++. Как бы не так. Практически полностью там си код, за исключением нескольких мест. Вот, например функция, возвращающая список строк:
int suggest(char*** slst, const char* word);
Что это? с++?

Для меня у си только одно преимущество: возможность подключать си библиотеку со всеми оптимизациями к debug сборке c++ проекта.
Не холивара ради. Я знаю, что на си можно писать достаточно эффективно. Вопрос тут только в том, насколько громоздко это получится. Классический пример — qsort. На си вызывается функция сравнения через указатель. На c++ на шаблонах функция сравнения встраивается в код быстрой сортировки и в итоге работает, иногда даже в разы, быстрее. Да, на си вы можете выполнять быструю сортировку также быстро, но для этого вам придется ее код копипастить всякий раз, когда вам потребуется сортировать новый тип данных. И так во всём. Вот пример из недавнего. В librsvg есть функция смешивания двух изображений с использованием разных функций смешивания (normal, multiply, darken, lighten и т.п.). Так вот на си это сделано так: сначала цикл по пикселям, затем цикл по компонентам пикселя и уже в самой глубине switch, выбирающий нужную функцию. На c++ тоже самое: сначала switch, затем вызов одной и той же шаблонной функции обхода пикселей и компонент, но в качестве аргумента — лямбда функция обработки одной компоненты. Итог — меньше кода + быстрее работает.
Ни в коем случае не критикую, вы молодец. Работа действительно проделана огромная. По себе знаю, как тяжело даются всякие парсеры. У меня только вопрос, почему все таки си? Неужели вокруг c++ невозможно сделать обвязку для других языков? Спрашиваю, как полный дилетант в этих вопросах. Я к тому, что всякого рода парсеры значительно более эффективны, будучи написаны на c++, чем на голом си. Я тут недавно занимался разбором парсера svg формата (librsvg). Там голый си и весь код построен на ужасных костылях из glib, имитирующих работу с объектами. Кроме того (не знаю как у вас), обычно код на си изобилует выделением/освобождением памяти на каждый чих, что, очевидно, не лучшим образом сказывается на скорости работы.
Если много enum-ов, требующих рефлексии, то да, громоздко.
Метод на макросах лучше применять не часто. По моему опыту, даже крупные проекты имеют не более 5 таких списков.
Кстати, на макросах — это даже не рефлексия. Это больше похоже на мета программирование. enum — это порождение списка и лишь малая часть возможностей.
Например, в своем проекте я сделал список таблиц, которые читаются из sqlite базы. Для каждой таблицы создаются свои классы обработки (по списку инстанцируются шаблоны), всего 8 мест генерации. Добавляя в список новую таблицу, я экономлю кучу времени на написании оснастки этой таблицы — весь код генерирует за меня компилятор.
Я использую метод на макросах. По сравнению с предложенным в статье, этот метод не имеет оверхеда, а также дает дополнительные возможности.
// объявляем список
#define MY_ENUM_DESC \
    EITM( vasya ) \
    EITM( petya ) \
    EITM( vova ) \

// генерируем enum
enum my_enum {
#define EITM(itm) itm,
    MY_ENUM_DESC
#undef EITM
    my_enum_max
};
// функция для получения строки
const char * my_enum_s(my_enum e) {
    static const char * tbl[] = {
    #define EITM(itm) #itm,
        MY_ENUM_DESC
    #undef EITM
    "" };
    return tbl[e];
}

Кроме того, по списку можно делать практически все что угодно: объявлять другие типы, создавать функции/классы, делать сериализацию и т.п.
Недостаток — трудночитаемый код. Но мне кажется, это приемлемая цена за надежность.
Выходит, я могу прочитать сообщения пользователя, имея доступ к его профилю.

Справедливости ради, придумать защиту от этого довольно сложно. Точнее, все решения можно поделить на три группы:
1. С привязкой к железу/ос без шифрования
2. С привязкой к железу/ос с шифрованием
3. С шифрованием паролем

У всех способов есть недостатки, и весьма существенные:
1 Вообще не решает проблему. Зная алгоритм привязки, всегда можно данные прочитать.
2 Большая вероятность потерять все данные при смене параметров привязки (например, привязавшись к mac адресу сетевой карты, вы теряете профиль, если эта сетевая карта у вас сгорит)
3 Требует от пользователя ввода пароля, что может быть неудобным.

PS. В Isotoxin'е я использовал 3-й вариант (опционально)
Я не смог смириться в «Туманности Андромеды» с таким ляпом: отсылка сообщения жителям других миров в «прямом эфире». Т.е. аппаратура, посылающая межзвездные радиосигналы, не имела возможности отправить запись, только прямой эфир.
Потому что долги и есть деньги. Если я вам займу миллион и вы мне займете миллион, то у нас с вами на двоих будет 2 миллиона. Но при этом мы друг другу должны. Понятно, что этих денег у нас нет. Но зато у нас есть долговые расписки. У меня есть расписка, что вы мне должны миллион и у вас есть расписка, что я вам должен миллион. Если такую расписку продать (а долги продаются, вы знали?) то уже получаются реальные деньги. По сути, мировая экономика так и работает.
Нет, не буду. Просто мне кажется, что это излишне. У меня UI движок порождает готовую картинку, которую просто нужно выплюнуть на экран, а с этим, как я понимаю, неплохо справляется голый X11. Впрочем, в вопросах программирования под никсы я полный профан.
На весь экран хочу сделать, но перед этим хочу переписать передачу видео. В текущем варианте видео сильно портится на слабых каналах. Я уже писАл об этом.
запускать вторую копию с ключем multi (описание ключей есть тут)
правда, если вторая копия будет пытаться открывать тот же профиль, то тоже не запустится. Специально делал защиту, иначе можно логически покарраптить профиль
Ну, вы с таким кодом вот встретились.

В Isotoxin'е использованы 16 сторонних C библиотек. И только в toxcore используются эти массивы.

Information

Rating
Does not participate
Registered
Activity