Задать вопрос
  • ЯП С. Аналог или замена graphics.h для работы через OSX?

    TrueBers
    @TrueBers
    Гуглю за еду
    Используй SDL
    Ответ написан
    Комментировать
  • Вместо символов иегроглифы на arch linux xfce [Noto sans], что делать?

    TrueBers
    @TrueBers
    Гуглю за еду
    Попробуйте поставьте Noto Extra
    Ответ написан
    Комментировать
  • Что делать с нерабочей подсветкой синтаксиса Visual Studio 2019?

    TrueBers
    @TrueBers
    Гуглю за еду
    Попробуйте Import and Export Settings -> Reset all settings
    Ответ написан
  • Как реализовать SSL Pinning?

    TrueBers
    @TrueBers
    Гуглю за еду
    Может быть, как написано в официальной документации?
    Ответ написан
    Комментировать
  • Как делать спавн существ в javascript?

    TrueBers
    @TrueBers
    Гуглю за еду
    Комментировать
  • Как можно установить нативный Linux-дистрибутив на телефон?

    TrueBers
    @TrueBers
    Гуглю за еду
    For fun на портирование ядра и блобов может уйти нереальное количество времени. Почитать можно на kernel.org. Пары лет должно хватить.
    Если практичекая цель -- ставьте Termux, там все фичи от линуксов есть.
    Чуть менее практичный -- Linux Deploy.
    Ответ написан
    2 комментария
  • Как указать для правила iptables несколько интерфейсов?

    TrueBers
    @TrueBers
    Гуглю за еду
    iptables -A FORWARD -i eth+ -o eth2 -j ACCEPT
    "Плюс" будет значить, что имя интерфейса начинается на eth, а дальше идёт что угодно.
    Ответ написан
    Комментировать
  • Linux для изучения C++ новичку?

    TrueBers
    @TrueBers
    Гуглю за еду
    Современный С++ это ОЧЕНЬ много времени на изучение. Будет уходить ВСЁ свободное время. С++ ОГРОМЕН. Изучать что-то ещё параллельно не будет ни минуты, брось эту идею.

    Другое дело, если хочешь изучать современный стандарт С++20, то нужна последняя версия компилятора. А такую редко где найдёшь в Линуксах. В убунте слишком старый компилятор будет. В Федоре более-менее свежий. Самые свежие в Арче, но он для новичка очень сложен даже в установке.

    А вообще, можно не делать мозги, скачать под винду Visual Studio 2019 Community Edition, поставить в настройках проекта /std:c++latest и кодить себе спокойно. Это лучший, быстрый и самый беспроблемный вариант.
    Ответ написан
    Комментировать
  • Как удалить файлы из /sys со смартфона xiaomi?

    TrueBers
    @TrueBers
    Гуглю за еду
    Каким образом вы с него собрались что-то удалить?
    Раздел /sys — виртуальный. Вы с него ничего не можете удалить. Файлы на нём создаются ядром и модулями драйверов устройств.

    Начитались статей очередных диванных гуру оптимизаций в интернетах?
    Ответ написан
    3 комментария
  • Почему в C++ нужно строить всю программу на ООП (длинный вопрос)?

    TrueBers
    @TrueBers
    Гуглю за еду
    Длинному вопросу — длинный ответ:

    при этом под полиморфизмом понимается динамический полиморфизм

    А почему вы отрицаете статический? У динамического, например, есть накладные расходы на vtable, инвалидации кешей, и т. п. Если бы STL использовал динамический полиморфизм, у нас бы не было такой эффективности. А у статического таких проблем нет.

    инкапсуляция (то есть в C++ это будет выражено классом с private и public функциями-членами)

    Инкапсуляция — это совсем не про private и public. А скорее про интерфейс и его сокрытую реализацию.
    www.ddj.com/cpp/184401197

    Про отрисовку виджетов, на самом деле, вопрос холиварный. С виджетами изначально мы имеем поломанный интерфейс. Т. е. Widget может добавить в себя тип Widget* или Widget&. А теперь делаем так:
    class Widget {
    public:
      void add(shared_ptr<Widget> child);
    };
    
    auto root = make_shared<Widget>();
    root->add(root); // о_О шта?

    Мы так сделать можем, а значит интерфейс неверный. Кучи проверок в функции add() никому не нужны. Есть такой мужик Sean Parent, может слышали, вот он предложил этой проблеме замену на другую структуру данных со статическим полиморфизмом, без ненужных оверхедов. Они это используют в Фотошопе. На каком ещё языке это можно сделать столь эффективно?

    мы не знаем в данном месте кода, какой это именно виджет, но нам нужно вызвать draw, который может быть разным в зависимости от типа виджета

    А как же мы у STL-контейнеров тогда это вызываем и всё прекрасно работает без наследования и виртуальных функций?

    Вы скажете, что virtual call быстрее switch

    Не факт, зависит от оптимизатора и количества функций. Адекватный оптимизатор разворачивает свитч в jump-table, который на пару процентов может быть быстрее, чем виртуальный вызов. При этом, точно так же, он может девиртуализировать виртуальную функцию если она используется в элементарном базовом блоке, например, в цикле.

    От vector'а не рекомендуется наследоваться

    От него и никогда не требуется этого. Достаточно набросать адаптер, идеология C++ в трёх, как вы сказали, китах: контейнеры, итераторы и алгоритмы. Написав адаптер, он будет работать со всей стандартной библиотекой и алгоритмами, чего обычно более, чем достаточно. Например, те же std::queue, std::priority_queue и std::stack являются адаптерами и могут изменять вектор (и не только), ни от кого при этом не наследуясь.

    Я не вижу тут необходимости в классах. Той редкой ситуации, как было с теми виджетами, когда у нас есть указатель непонятно на что, тут нет. Так что наследование и полиморфизм тут не нужны

    Ну, дык, верно. Вас собеседуют же не всегда гении. Бывают дурни, задроты, идеалисты, холиварщики, ЧВСшники. Ничего хорошего от них обычно не стоит ждать. От таких надо валить подальше просто.

    Насчёт виртуальных функций в Си и прочих притаскиваний функций плюсов в этот язык. Считаю, что это дурость, когда можно просто создать coding convention для плюсового кода, и писать на нём в стиле Си, но при этом юзать множество полезных плюсовых фич. Это верный подход, имхо. А когда начинается имитация этого всего: забыл инициализировать, или где-то, непойми где, инициализировал не тем, пока найдёшь проблему, вместо того, чтоб просто открыть код конструктора.

    Итого, мой ответ:
    1. Своей задаче — свой инструмент. Не забивайте гвозди микроскопом, он вам пригодится целым для другого.
    2. Не холиварьте. Если так "положено", но нихрена ни в какие рамки не лезет, не нужно это дальше туда пихать. Нужно переступить через гордость и идеалы, и сделать по-другому.
    3. Выжимайте максимум из каждой парадигмы и технологии. Благо, в C++ этого навалом. Где-то функциональщина больше попрёт, где-то лучше шаблонами нагородить. А уж где не получилось, придётся костыли пихать.
    Ответ написан
    2 комментария
  • Как заменить utf8 символы?

    TrueBers
    @TrueBers
    Гуглю за еду
    Правильно понимаете.
    Осталось понять, для чего вам это нужно. Вероятно, вы хотите поиск реализовать? Типа ищешь 'а', при этом матчится 'ā'? Других вариантов не могу придумать...

    Если так, то достаточно при поиске использовать форму декомпозиции NFKC с последующей канонической рекомпозицией. Она проводит рекомпозицию по правилам совместимости, будут матчиться даже те глифы, которые визуально не похожи на исходный. Т. е. когда в языке может заменяться один символ на абсолютно другой, но при этом иметь то же самое значение.

    Если нужно "просто снять крыжечку", то используйте обычную каноническую декомпозицию NFD. Она разберёт всё на составные части. Потом нужно пройтись снова по массиву и очистить диакритику, т. е. можно взять категории Lu и Ll, если у вас чистый текст, либо очистить от Mn будет достаточно.

    Пример на Питоне:
    >>> import unicodedata
    >>> unicodedata.decomposition(unicodedata.lookup('LATIN SMALL LETTER A WITH MACRON'))
    '0061 0304'
    >>> unicodedata.decomposition(unicodedata.lookup('LATIN SMALL LETTER A WITH TILDE'))
    '0061 0303'
    Ответ написан
    8 комментариев
  • Способы обхода NAT?

    TrueBers
    @TrueBers
    Гуглю за еду
    Пробитие НАТа -- это оооочень сложная и неоднозначная тема. Там используется целый комплекс различных процедур, который называется Interactive Connectivity Establishment.
    То, что вы описали, это самый элементарный вариант техники. Который применим в 15-20% случаев.

    Торрент-клиентам, по сути, это не так важно как, например, для стримминга видео или голоса. Но они тоже используют очень много всего для этой задачи: от UPnP и NAT-PMP до довольно сложных техник из стандарта ICE.
    Ещё в торрентах используется DHT, у которой часто есть bootstrap-узлы с постоянными белыми адресами, потом через эти узлы идёт уже инициализация всей системы, и последующий поиск адресов в ней.

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

    Если нужно на поиграться, можете взять существующую библиотеку, например, PJNATH или libnice. Если для серьёзного проекта, то лучше выдрать реализацию из гугловского WebRTC, там она постабильнее будет.
    Ответ написан
    1 комментарий
  • Как вытолкнуть значение из стека и присвоить его переменной в TASM?

    TrueBers
    @TrueBers
    Гуглю за еду
    Просто возьмите онлайн компилятор, вбивайте в него нужный эквивалентный код на Си или C++, если знаете хотя бы основы одного из них, он будет давать ассемблерный код, подсвечивая строки соответствующим цветом. Так легче понимать будет.

    В моём примере можно увидеть, как уже сказал Антон, что для этого используется инструкция fstp. Можно поставить на неё курсор и нажать Ctrl+F8 — появится отличное подробное описание команды.
    Ответ написан
    Комментировать
  • Что изучать дальше?

    TrueBers
    @TrueBers
    Гуглю за еду
    то делать дальше?
    1. перечитать книгу
    2. Прочитать новую
    3. Начать ещё одну

    Вы чтением книг зарабатывать будете? Или это хобби такое?

    Техническую литературу не нужно читать. Читать нужно Войну и Мир, например, Мастера и Маргариту.
    А на языке нужно писать, практиковаться, делать что-то конкретное. Вы можете прочитать и 20 книг, но при этом точно так же ничего не сможете сделать. Нужна практика, книги — это справочники, в основном. Когда что-то непонятно, идёт и смотришь, как это решает автор. А просто читать это абсолютно бессмысленная трата времени.

    Возьмитесь уже за дело и начните реализовывать одну из ваших задумок проектов, параллельно заглядывая в книгу по необходимости. Будет намного больше пользы.
    Ответ написан
    2 комментария
  • Как заменить символы в текстовом файле?

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

    Если прям true C++ way, то вам нужно использовать std::fstream. Для него нужно реализовать стандартный std::streambuf и во время записи в файл, когда буфер сбрасывается, у std::streambuf вызывается виртуальный метод overflow(), вот его перегружаете, проходите по буферу, делаете нужные вам изменения и сбрасываете буфер дальше на запись. Примерно, как тут.
    Это если важна архитектура, гибкость, переиспользование кода и трушность C++.

    А если более-менее простой вариант, то недо-true C++ way выглядит
    примерно так
    #include <algorithm>
    #include <fstream>
    #include <iostream>
    #include <iterator>
    
    int main() {
    
      std::ofstream out_file( "out.txt" );
      std::ifstream in_file( "in.txt" );
      std::string/*stream*/ some_buffer;
    
      using char_type = decltype(out_file)::char_type;
      using in_iter = std::istream_iterator< char_type >;
    
      if ( !in_file.is_open() || !out_file.is_open() )
        return EXIT_FAILURE;
    
      std::transform(in_iter(in_file), in_iter(), std::ostream_iterator< char_type >(out_file),
                     [&some_buffer] (const char_type &c) {
    
                       if ( !std::isalpha( static_cast<unsigned char>(c) ) || c == '\n' || c == '\r' )
                         return ' ';
    
                       // if шило, then мыло, буферизуем если надо, и т. п.
    
                       return c;
                     });
    
      return EXIT_SUCCESS;
    }
    Ответ написан
    3 комментария
  • Почему в Си допускается переполнение массива?

    TrueBers
    @TrueBers
    Гуглю за еду
    Потому что это проверка на переполнение даёт лишние накладные расходы при выполнении. Изначально язык разрабатывался с расчётом на эффективность, с девизом что-то типа: «не нужно платить за то, чем не пользуешься».

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

    TrueBers
    @TrueBers
    Гуглю за еду
    Чтобы их делать, нужно уметь проводить вот такие вот исследования. Соответственно, нужно на зубок знать то графическое апи, на котором написана игра. А про реверс-инжиниринг уже сказали.
    Ответ написан
    Комментировать