• Кто знает хороший учебник по ассемблеру и справочник по командам (windows)?

    TrueBers
    @TrueBers
    Гуглю за еду
    Справочник по командам никто лучше, кроме производителя процессоров вам не даст. Заходите за сайт интел/амд и качайте референс.
    А учебник для ассемблера не имеет смысла. Ибо всё, что относится к ассемблеру — это команды. Остальное — платформозависимые вещи, которые будут различаться в каждой системе, архитектуре, и т. п. Соответственно, в этих учебниках вас будут учить вещам, которые уже либо почти не используются, либо про них уже забыли.

    В ассемблере половина команд это mov, lea и call. Прочитайте, что они делают, и уже половину поймёте. Ещё 45% сверху — около 20 команд всего. Остальные 5% занимают сотни и тысячи других инструкций, которые никто в живую в глаза не видел. Это можно взять за 10% от "знания ассемблера". Остальное зависит от архитектуры, системы, компилятора, разрядности, и ещё кучи факторов.

    Сейчас нет такого учебника, чтоб научил вас ассемблеру. Если хотите основы с 16 бит, то берите любой. По современным вещам информации нет нигде, кроме официальных документов производителей процессоров.
    Ответ написан
    Комментировать
  • С или modernC++ для IoT?

    TrueBers
    @TrueBers
    Гуглю за еду
    Так говорите, как будто С++ это 2 вещи: shared_ptr и исключения :D

    Вы смутно понимаете, похоже, в чём их назначение.

    Эксепшены и атомики в плюсах использовались всегда. Просто, нужно понимать, для чего они вам.
    Исключения, на то они и исключения, что используются в исключительных ситуациях. Если вы их пихаете везде, и жить без них не можете, значит, с вашей архитектурой приложения что-то не так. Это раз.

    Два. Любые эксепшены, rtti, наследования, диспетчеризация и т. п. в embed'е это дикий оверхед. Но при этом, почему-то многие софтовые компании, включая гугл, просто выключают у себя в проектах поддержку исключений и rtti. И на этом "огрызке" всё работает почему-то. К тому же, размер бинарника для имбеда довольно важен и не на последнем месте. Выпилив исключения и rtti, можно очень хорошо выкинуть мусор.

    shared_ptr — не серебряная пуля. Как уже сказал fshp, они используются в, ну просто, очень ограниченном количестве случаев. Их, как и исключения, нельзя пихать куда попало. Посмотрите выступления Шона Парента, почитайте его пейперы. Очень толковый мужик из Adobe, один из главных инженеров Фотошопа. Он там хорошо описывает и показывает на примерах, что shared_ptr — это просто хорошо замаскированная глобальная переменная, по сути, да ещё и с оверхедом от атомиков. И перед тем, как его использовать, сто раз подумайте, зачем он вам здесь нужен. В 99% случаев, можно обойтись без него, так же как и без RTTI. При этом, unique_ptr — очень удобная и полезная штука.

    Вам современный C++ предлагает множество сишных способов возврата значения вместо эксепшенов. Вы можете возвращать тот же tied tuple, optional, variant, any, error_condition, error_code. Хоть они и сами любят повыбрасывать исключения, но код намного чище и легче отлаживать и понимать, чем миллион вложенных исключений с дикой иерархией и оверхедом.

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

    Если вы из всего вышеперечисленного, пользуетесь только shared_ptr и исключениями, то C++ вам не нужен.
    Ответ написан
    1 комментарий
  • Как использовать make?

    TrueBers
    @TrueBers
    Гуглю за еду
    Там же один файл в исходниках. Просто запустите компиляцию руками. Там какой-то древний Makefile.
    $ gcc -march=native -O2 -lz afsctool.c -o afsctool
    Ответ написан
    Комментировать
  • Как уговорить провайдера подключить частный сектор?

    TrueBers
    @TrueBers
    Гуглю за еду
    Попробуйте пообщаться с этими ребятами, может чего посоветуют.
    Ответ написан
    Комментировать
  • Объясните: какую базу нужно иметь для изучения Dirext X [C++]?

    TrueBers
    @TrueBers
    Гуглю за еду
    Вам нужны знания графики. Понимания, как оно всё там работает под капотом. Без этого всего DirectX будет казаться чем-то космическим и непонятным. DirectX никак не завязан на чистый WinAPI. Он базируется на технологии COM. Это посложнее для понимания, чем WinAPI. Ну и, соответственно, это всё работает только на Windows.
    OpenGL чуть проще, там чистое Сишное API. Можно писать для множества операционных систем, в том числе, для мобильных платформ.

    Оба API используют конечный автомат для рендеринга, все состояния которого тоже нужно отлично понимать. У OpenGL, на мой взгляд, он более лёгок для понимания.
    Но для всего этого вам нужно знать, что используется там под капотом. Бездумно искать строки кода и копипастить их к себе не получится. Нужно знать что делает каждая функция, какие состояния конечного автомата меняют, и т. п.

    Если хотите начать учить всё это дело, советую начать с отличных статей на Хабре. Если вы осилите весь этот курс, то сможете писать хоть на OpenGL, хоть на DirectX, хоть на Unity/Unreal/CryEngine.
    Ответ написан
    Комментировать
  • C++ fstream. Не работает чтение из бинарного файла, почему?

    TrueBers
    @TrueBers
    Гуглю за еду
    Т.е по сути моя i должна быть равна 3
    Не должна она вам ничего, пока документацию не прочитаете.

    Зачем вы добавили ios::trunc при открытии файла?
    trunc от слова truncate, переводится как: обрезать, усекать, урезать, сокращать.

    В документации ясно написано же: trunc discard the contents of the stream when opening. Что переводится как, отбрасывает содержимое потока при открытии.
    Он же вам его очищает и открывает новый пустой файл, вы его читаете, а там нечего читать. Вот и результат.
    Ответ написан
    1 комментарий
  • Что использовать для даты?

    TrueBers
    @TrueBers
    Гуглю за еду
    С чего это он deprecated? У него deprecated конструктор без локали, а сам класс живёт и здравствует.
    Создаётся через поиск в гугле... тьфу ты, через java.util.Calendar
    Ответ написан
    3 комментария
  • Debian определить генератора процессов?

    TrueBers
    @TrueBers
    Гуглю за еду
    Подскажите, пожалуйста, каким образом выявить и уничтожить эту заразу?

    Полной переустановкой сервера.
    Ответ написан
    3 комментария
  • Сервер на Си, как и зачем?

    TrueBers
    @TrueBers
    Гуглю за еду
    libuv
    libevent

    Самые шустрые и распространённые библиотеки.
    Первая используется в ядре Node.js.
    Вторая — в куче проектов типа хрома, тора, файрфокса, мускуля. Умеет http-роутер из коробки.

    На Си дурной тон писать сервер, когда не знаешь Си. Бред наркомана.
    90% всех существующих серверов написано на Си. Другое дело, что надо знать одновременно и язык, и тонкости ОС, и тонкости сетей, уметь пользоваться профилировщиками памяти. Ну, и времени нужно очень приличное количество.
    Ответ написан
    Комментировать
  • Как завернуть весь трафик в SSH тунель?

    TrueBers
    @TrueBers
    Гуглю за еду
    Ответ написан
    Комментировать
  • Как скомпилировать нормально в Clion?

    TrueBers
    @TrueBers
    Гуглю за еду
    Я хочу просто получить .exe файл который будет работать на компьютере! один файл в котором сраный hello world
    Что на C++ это невозможно?
    На C++ возможно всё, просто это такой язык, в котором за вас никто ничего не будет делать, вы несёте ответственность за каждую мелочь, за каждую опцию, и должны это всё понимать, в отличие от других языков.

    Погуглите, что такое статическая и динамическая линковки, что такое единица компиляции, объектный файл, почитайте про процесс линковки, как разрешаются имена во время линковки, почему могут быть коллизии, и т. п.
    В любом языке программирования существуют runtime-библиотеки. В них хранится вся встроенная логика и стандартные библиотеки языка. В нормальных условиях принято линковать динамически. Это когда есть динамическая библиотека (DLL, SO, dynlib), она загружается в память единожды и её могут использовать все, кто к ней прилинкован.

    Вы же используете Clion, который, в свою очередь, использует CMake для управления проектом. У CMake, как и, собственно, у многих других систем сборки, есть такая штука, Deploy называется. Вы же, как PHP-разработчик, ведь тоже выполняете деплой, верно? Точно так же делается и здесь, особенно на винде. Вам нужно написать CMake-target для деплоя, который сам посмотрит, что нужно вашему "сраному hello world'у", и соберёт в одном каталоге эти все дела для запуска. Дальше вы выбираете в CLion в поле Build/Run Configuration свою цель деплоя, жмёте Build. И все оказывается в одной папке и беспроблемно запускается везде.

    Вот здесь есть пример использования модуля BundleUtilities для деплоя (fixup_bundle).
    Ответ написан
    2 комментария
  • Какая хорошая книга для начинающего программиста на С/C++ с уклном в сети?

    TrueBers
    @TrueBers
    Гуглю за еду
    Сети — это сети. А C++ — это C++. Не бывает такого, чтобы была книга сразу по двум громадным направлениям.

    Сначала учите C++, а потом сети.
    К тому же, под C++ нет сетевых API. Они все всё равно написаны изначально на чистом Cи и никак не пересекаются.

    Изучив понятие сетей, можно писать на любом языке.
    Ответ написан
    9 комментариев
  • Возможно ли вывести элементы list используя for_each?

    TrueBers
    @TrueBers
    Гуглю за еду
    Откройте документацию хотя бы, и прочитайте про входные параметры for_each:
    template< class InputIt, class UnaryFunction >
    UnaryFunction for_each( InputIt first, InputIt last, UnaryFunction f );

    От вас требуют на вход итератор на первый элемент first и итератор на последний элемент last. Ниже можно найти, что InputIt значит InputIterator.

    Теперь смотрим документацию std::list.
    Iterators
    begin   returns an iterator to the beginning 
    cbegin  (public member function)
    
    end     returns an iterator to the end 
    cend    (public member function)

    То, что нам нужно. begin() даст нам итератор на первый элемент, т.е. first, а end() — на last.

    Смотрим дальше
    Member types
    Member type	Definition
    
    iterator	BidirectionalIterator

    Смотрим, что такое BidirectionalIterator. Написано, что он должен быть в свою очередь ForwardIterator'ом. А ForwardIterator удовлетворяет концепту InputIterator. Как раз то, что нам нужно.

    В итоге, достаточно написать for_each(test.begin(), test.end(), show);

    Но, сейчас на дворе 2017 год, давно уже введены новые фишки в C++. Например, можно сходу передать анонимную функцию (лямбду) вместо обычной функции, в случае, если она однострочная:
    for_each(test.cbegin(), test.cend(), [](int v) {std::cout << v << std::endl;});

    Также, C++11 добавляет новые методы для получения константного итератора cbegin() и cend(), т. к. нам не нужно модифицировать список, лучше воспользоваться константными итераторами, чтобы избежать ошибок в случае случайной модификации.

    Либо, как уже сказали, если у вас слишком большое тело цикла, чтобы не городить из лямбд спагетти и чтобы это всё легко читалось, можно использовать range-for:
    for(const auto &v : test)
      std::cout << n << ' ';
    std::cout << '\n';
    Ответ написан
    Комментировать
  • Как создать кольцевой список на основе list?

    TrueBers
    @TrueBers
    Гуглю за еду
    Достаточно перегрузить итератор, закольцовывая его на начало при достижении конца, и наоборот. Вот и весь кольцевой список.
    Ответ написан
    Комментировать
  • Какую IDE выбрать для С++ под Linux?

    TrueBers
    @TrueBers
    Гуглю за еду
    Clion для начала вполне годный. Со сложными исходниками и последними стандартами у него беда, конечно. Глючит порядочно, но постоянно что-то фиксят. Был бы бесплатный, ещё ладно. Но платить за это поделие желания нет. Если у вас меньше 4-х ядер и 8-ми гигабайт, можете даже не пробовать, будет жутко бесить тормозами. Хотя, в последних EAP довольно неплохо улучшили отзывчивость в нагрузке. Раньше даже печатать было невозможно, пока он там шуршит.

    Есть ещё простенькая IDE — juci++. Но она пока что в активной разработке и очень спартанская, мало чего умеет, но не тупит и очень неплохо автодополняет.

    VSCode от майкросовта занудная штука. Вроде, сначала всё работает, а стоит подключить какой-нибудь boost и привет, шаблонную магию не переваривает. Может дополнить пару неймспейсов, а дальше в упор не видит ничего.

    QtCreator до сих пор не научился HiDPI. У меня на обоих девайсах dpi достаточно высокий, всё выглядит как пережатый 50 раз jpeg. Может быть, если у вас обычный монитор, то будет нормально.

    Если есть желание позамарачиваться, можете освоить vim. Для него есть неплохой плагин YouCompleteMe. Но там всё надо тюнить, крутить 50 тысяч параметров. Но настроив под себя, довольно удобно получается, хотя, мало кто это осиливает.
    Ответ написан
    Комментировать
  • Opengl 4.* или vulkan?

    TrueBers
    @TrueBers
    Гуглю за еду
    Это вообще разные вещи.
    Нужно отличать изучение API, от изучения технологии. Если вы хотите выучить просто API, учите что угодно, ибо разницу заметите только, когда поймёте основы, базу.

    OpenGL проектировался когда были другие архитектуры железа. Мультипроцессорность была только в теории, и считалась уделом суперкомпьютеров и ненужной для пользовательских ПК.
    Можно привести аналогию: OpenGL == C++, Vulkan == асинхронный Assembler + hardware threads. Например, в C++ сейчас довольно много архитектурных косяков, которые пытаются решить новыми стандартами, объявляют какие вещи устаревшими, потому что они концептуально неверны и не подходят под современные реалии.
    Но, при этом, вы можете всё то же самое написать на ассемблере, но нужно намного лучше понимать, как работает процессор и ОС, самому писать примитивы синхронизации, и т. п.

    Для этих же целей и создавался вулкан. Для программирования на нём, нужно знать все тонкости железки, читать кучи пейперов от той же НВидии, исследовать, придумывать новые фичи для современных архитектур с нуля, которые изначально были придуманы в OpenGL, но для старого железа.
    Т. е. на Вулкане нужно делать больше руками, больше оптимизировать. Вместо одного вызова функции OpenGL, на вулкане придётся несколько сотен строк написать. При этом, если вы не понимаете какой-то одной тонкости, вы сделаете менее эффективнее то, что изначально было хорошо реализовано в OpenGL. К тому же, OpenGL умеет выбрасывать ошибки, в случае, когда вы где-то накосячили. Вулкан же их не выбрасывает, он полагается на то, что вы уже знаете как этим пользоваться. Точно так же, как ассемблер просто меняет состояние регистров, у него нет понятия ошибки. Как интерпретировать эти регистры, зависит от того, насколько хорошо разработчик читал мануал к процессору.

    В итоге, я бы ответил так:

    Если вы будете заниматься графикой как наукой, дико задротить а-ля Кармак в студенчестве с его движками, что-то исследовать, писать какие-то гениальные алгоритмы, защищать на этом диссертации, публиковать их, рассказывать потом на конференции, как вы круто справились с какой-то насущной задачей, повысили производительность, то тогда учите Vulkan. Vulkan — это именно про графику как технологию, про производительность, про инжиниринг и архитектурный дизайн, а не про API и само программирование. С вулканом придётся больше сидеть с диаграммами, документациями и строить архитектуру, придумывать методы взаимодействия частей этой архитектуры, синхронизации состояний, нежели писать код.

    Если же вы пишете простые прикладные вещи, которым нужно показать какую-то графику, то учите OpenGL. Здесь вы учите только API, соглашаясь с уже готовым, слегка устаревшим, архитектурным дизайном.

    Если хотите писать игры не мирового класса, то учите готовые движки, Unity или Unreal. Они уже поддерживают за вас Vulkan, продумали за вас API и архитектуру.
    Ответ написан
    2 комментария
  • Как понять принцип работы кода из книги "Философия Джавы"?

    TrueBers
    @TrueBers
    Гуглю за еду
    Вы руками что ли исходники из книги набиваете?
    Вот же официальные исходники от автора. Скачайте и разбирайтесь себе спокойно.
    Ответ написан
    4 комментария