Задать вопрос
  • QLabel: как лучше оформлять гиперссылки?

    @Mercury13 Автор вопроса
    Программист на «си с крестами» и не только
    Пока лучшим решением выходит такое…
    static const QString someCss = "<style>...</style>";
    
    lbLabel->setText(someCss + MSG_LINK)

    Конструкция MSG_LINK выходит достаточно простая, чтобы переводчик её с лёгкостью обработал, да и someCss — единое место для стилей.
    Ответ написан
  • Почему не отрабатывает перегруженный конструктор класса?

    @Mercury13
    Программист на «си с крестами» и не только
    Попробую рассказать об этом же более простыми словами.

    Текст String s3 = "Нас обманули, расходимся."; означает вот что. Мы создаёт временную строку «Нас обманули, расходимся», а затем присваиваем её нашему s3. Конечно, компилятор это потом заоптимизирует, но это семантика языка, и ей надо следовать.

    Есть два способа передать временный объект в функцию. Любую: хоть простую, хоть конструктор, хоть операцию =.
    Первый — константная ссылка: String(const String &S).
    Второй способ из C++11 — временная ссылка: String(String &&S).

    Из-за этих временных объектов конструктор копирования и операция «присвоить», по-хорошему, должны брать const-ссылку. Вот вам аналогичный пример с операцией «присвоить».

    class String
    {
    public:
        String() {}
        String& operator= (String& s) { return *this; }
    };
    String operator+ (String a, String b) { return String(); }
    
    int main()
    {
        String s1;
        String s2 = s1;
        String s4;
        s4 = s1 + s2;
    }


    Решается String& operator= (const String& s).
    Ответ написан
    Комментировать
  • У монитора Dell появляется и пропадает рябь розового цвета - что за мистика?

    @Mercury13
    Программист на «си с крестами» и не только
    Розовая рябь случается, когда помирает лампа подсветки. Правда, S2340LS загуглить не удалось, а у S2340L подсветка светодиодная и ряби в принципе быть не может. Даже странно.
    Ответ написан
  • Qt: авторесайз колонки по образцу?

    @Mercury13 Автор вопроса
    Программист на «си с крестами» и не только
    Нашёл способ.

    namespace {
    
        // Пока делегат стандартный, использую шаблон «Паблик Морозов».
        // Если нет — он сам и будет Морозовым.
        class QStyledItemDelegateMorozov : public QStyledItemDelegate {
        public:
            using QStyledItemDelegate::initStyleOption;
        };
    
    }
    
    
    void SomeReport::autoResize()
    {
        QHeaderView* header = table->horizontalHeader();
        QStyledItemDelegateMorozov* delegate =
                reinterpret_cast<QStyledItemDelegateMorozov*>(
                dynamic_cast<QStyledItemDelegate*>(table->itemDelegate()));
        QStyle* style = table->style();
        QStyleOptionViewItem option;
        for (int col = 0; col < model.columnCount(); ++col) {
            QModelIndex index = model.index(0, col);
            delegate->initStyleOption(&option, index);
            option.text = "12345678901234";
            int headerSize = header->sectionSizeHint(col);
            int cellSize = style->sizeFromContents(
                    QStyle::CT_ItemViewItem, &option, QSize(), table).width();
            table->setColumnWidth(col, std::max(headerSize, cellSize));
        }
    }
    Ответ написан
    Комментировать
  • Как рассчитать длины сторон фигуры?

    @Mercury13
    Программист на «си с крестами» и не только
    Чтобы перейти от пикселей к метрам, надо вычислить площадь фигуры в квадратных пикселях. Проще всего это делать по формуле трапеций.

    Для каждой стороны надо вычислить площадь трапеции OX — x=xA — AB — x=xB, с плюсом или минусом. Насколько я помню, она равна 0,5(yA + yB)·(xA − xB). Если все сложить и взять абсолютную величину, получится площадь.

    Тогда масштабный коэффициент будет sqrt(Spx / Sм).
    Ответ написан
  • Как и где можно применить дискретную математику в программировании?

    @Mercury13
    Программист на «си с крестами» и не только
    В программу дискретной математики моего факультета входили…
    • теория множеств
    • теория графов
    • комбинаторика
    • алгебра логики, исчисление высказываний
    • теория автоматов

    Теория множеств — это основа ВСЕЙ университетской математики. Не зря её повторяли ещё и на муть-анализе.
    К тому же в теории множеств есть два классных понятия — отношение эквивалентности и отношение порядка. Операции == и <= перегружать приходилось?
    Соответствие везде определённое, функциональное, сюръективное, инъективное, биективное. Теория баз данных. Допустим у нас есть сотрудник и телефон, как они соотносятся? У всех ли сотрудников есть телефоны? Бывает ли у сотрудника два телефона? У всех ли телефонов есть сотрудники? Бывает ли у телефона два сотрудника? Ну а биективное — это соответствие «1:1».

    Теория графов — понятное дело, в алгоритмах на сетях. Создание, уничтожение, обход, поиск пути…

    Комбинаторика — это а) количество элементов в том или ином конечном множестве; б) способы перебрать их все. Например, мне реально приходилось перебирать комбинации из N элементов не более чем по M. Нерекурсивно.

    Алгебра логики — это основа работы компьютеров. Когда булевское условие многоэтажное — как записать его в понятном виде и как его упростить?

    Теория автоматов — это крайне упрощённый принцип работы процессоров. Поэтому если надо написать предельно простого вида виртуальную машину — см. конечные автоматы. А также автомат Мура — это лексический анализатор в любом языке программирования.
    Ответ написан
  • Объем флешки 8 гб компьютер видит 7.20 гб?

    @Mercury13
    Программист на «си с крестами» и не только
    Я просто вынесу ответ из обсуждений.

    Ёмкость механических дисков и SSD — неформатированная доступная пользователю в десятичных единицах. Для них надо вычесть:
    • коэффициент перевода из десятичных гигабайт в более привычные двоичные гигабайты (или гибибайты, как их недавно обозвали);
    • главный загрузочный сектор;
    • таблицу разделов, загрузочные сектора разделов, скрытые разделы, неразбитое место;
    • технические поля файловой системы.
    Технические поля винта/SSD скрыты и вычитать из номинальной ёмкости их не надо.

    Ёмкость флэшек — полная ёмкость чипов памяти в двоичных единицах. Для флэшек надо вычесть:
    • технические поля самóй флэшки (в них пишется как минимум таблица сбойных секторов, жёстко заданная на заводе);
    • главный загрузочный сектор;
    • таблицу разделов, загрузочные сектора разделов, скрытые разделы, неразбитое место (если есть; чаще флэшки форматируют в единый раздел);
    • технические поля файловой системы.
    Из-за особенностей адресации не имеет смысла делать чипы полупроводниковой памяти не двоичного размера. Просто во флэшке один-два чипа, в SSD — целая батарея, и чтобы износ, неизменный спутник системного раздела, не сделал в SSD дыру, там есть сложные механизмы резервирования секторов и балансировки износа. Потому в SSD принцип винчестерный, а не флэшечный.

    «Десятично-круглая» цифра — неплохая оценка, сколько поместится на флэшку. Цифра не точная, т.к. зависит от модели флэшки и файловой системы на ней, но очень близкая к реальности. А на винчестер столько гарантированно не поместится.

    www.ixbt.com/storage/flashdrives/svodka/size.shtml
    Вот по этой ссылке видим, что в Windows может быть доступно как немного больше 4 млрд, так и немного меньше. А если взять неформатированную ёмкость первой попавшейся флэшки — у меня получилось 4039114752 байт, круглое плюс 1%. Для сравнения: неформатированная ёмкость моего «хитати» будет 2000395698176 байт — круглое плюс 0,02%. Вот вам разница между флэшкой и жёстким диском.

    P.S. У меня экономии ради диски только механические, завтра на работе проверю ёмкость SSD.
    UPD. Посмотрел. «СамСунь» неформатированного объёма в 256.052.822.016 байт. Отформатирован в один раздел объёмом 255.466.663.936. Так что тут явно по-винчестерному, с заделом в 0,02%.

    P.P.S. Возьмём реальную флэшку Verbatim на 8Г = 8589934592.
    Если вычесть технические поля, получится неформатированный размер, который равняется 7640M = 8011120640. Съедено 579 млн байт.
    Загрузочный сектор и таблица разделов — мизер.
    Куда больше занимают технические поля файловой системы. Раз на диске доступно 8010067968 байт, то съедено всего 1,05 млн. Но это NTFS, вероятно, там нет таблицы размещения файлов, которая всегда занимает определённые секторы.
    Действительно, форматирование в FAT дало размер 7993294848 байт, т.е. технические поля FAT заняли 17,8 млн.
    Ответ написан
  • Как работать с спец символами Delphi?

    @Mercury13
    Программист на «си с крестами» и не только
    Думаю, ваша задача более высокого уровня такова. Пользователи разрисовывают свои имена всякими там картинками, задача — убрать их.

    Немного непонятно, с какой версией Delphi вы работаете, но, предположим, с 2010+.
    Там string эквивалентно UnicodeString, 16-битной строке неограниченной длины, управляемой подсчётом ссылок средствами Delphi.
    Юникод очень велик и будет расширяться, в идеале там может быть 1,15 млн. символов. Из них 120 тыс. уже занято.
    Поэтому лучшим решением будет делать не чёрный список символов, а белый.

    Качаем базу символов Unicode (есть где-то на unicode.org).
    Делаем из неё фильтр по каким-нибудь признакам: например, буква/цифра/знак/комбинирующий/пробел и направление письма — либо слева направо, либо адаптирующееся.
    Также для простоты исключаем символы с кодом 65536+ (с дополнительных плоскостей, они кодируются двумя WideChar).
    Вот этим белым списком и пользуемся. Проходимся по строке и убираем все лишние.
    Ответ написан
    1 комментарий
  • Как хранить записи со стены ВК?

    @Mercury13
    Программист на «си с крестами» и не только
    Не громоздко и не ресурсоёмко (особенно в C++11 — кстати, скоро Qt вообще откажется от 03).
    Однако я бы в таких нагромождениях делал struct’ы из одного элемента. Что-то типа
    struct Comment {
      QMap<QString, QString> objects;
    };
    
    struct Post {
       QList<Comment> comments;
    };

    Так код проще будет разобрать.

    Только одно непонятно. Что собой представляют эти objects и на что тебе эта «строкотипизированность»?
    Ответ написан
    Комментировать
  • Как конвертировать list в string[]?

    @Mercury13
    Программист на «си с крестами» и не только
    Итератор — это объект с семантикой указателя, который может указывать на N+1 точку в объекте.
    5f40aef227644b9ca57224ffeb571a97.png
    Раз он с семантикой указателя, у него есть операции «унарная звезда» и −> (разыменование и разыменование+взятие поля). Также у итератора есть операция ++ (сдвинуться на следующую позицию). Если это т.н. «однонаправленный итератор» — всё, больше ничего.

    Также бывают т.н. двунаправленные итераторы (есть операция −−), и итераторы произвольного доступа (их можно свободно складывать с числами — ну совсем как указатели). В частности, у std::list итераторы двунаправленные.

    У итераторов неопределённое поведение…
    • при попытке выйти за начало или конец;
    • при попытке разыменовать, если он смотрит на последнюю позицию (отмеченную как «конец»).

    Конкретно о задаче.
    1. std::vector предпочтительнее std::list.
    2. Не нужно возвращать string*, хватает какого-нибудь контейнера (std::vector<std::string> или std::list<std::string>).
    3. Если функциональности и скорости istringstream хватает, флаг в руки! Я бы написал по хардкору, с нуля. Вот мой код, выдранный из моего проекта, наверно, будет несложно переделать его в учебный.

    void parseCommaList(
            const char *aStart,   // указатель на начало
            const char *aEnd,    // указатель на символ за концом
            char aComma,        // символ-разделитель
            bool aSkipEmpty,   // true, если пустые подстроки пропускать
            ProcParseCommaList aCallback,   // функция-нагрузка
            void *aData)   // этот параметр нужен, чтобы передавать какие хочешь данные в функцию-нагрузку, удаляй его смело!
    {
        str::trim(aStart, aEnd);    // моя функция; пододвигает aStart вперёд и aEnd назад, убирая пробелы.
                                    // Если удаление пробелов не нужно — удаляй! Если нужно — пиши сам.
        if (aStart == aEnd) return;
        const char *sstart = aStart;
        for (const char *p = aStart; p != aEnd; ++p)
        {
            if (*p != aComma) continue;
            const char *send = p;
            str::trim(sstart, send);   // то же самое, можно убрать
            if (p != sstart || !aSkipEmpty)
                aCallback(sstart, send, aData);    // замени на боевую нагрузку
            sstart = p + 1;
        }
        str::trim(sstart, aEnd);   // то же самое, можно убрать
        if (sstart != aEnd || !aSkipEmpty)
            aCallback(sstart, aEnd, aData);    // замени на боевую нагрузку
    }


    И, соответственно, версия для std::string.

    inline void parseCommaList(
            const std::string &aIn,
            char aComma,
            bool aSkipEmpty,
            ProcParseCommaList aCallback,
            void *aData)
    {
        parseCommaList(aIn.data(), aIn.data() + aIn.length(), aComma, aSkipEmpty,
                aCallback, aData);
    }
    Ответ написан
    Комментировать
  • Реальный размер iphone 6, 375 × 667px или 750 × 1334px(экран)?

    @Mercury13
    Программист на «си с крестами» и не только
    Размер экрана iPhone 6 — 750×1334 px.
    Для рекламных тизеров его действительно стоит уменьшить, например, вдвое.
    А когда показываем заказчику/программисту/верстальщику скриншоты, макеты и прочее — только хардкор, только пиксель в пиксель.
    Ответ написан
    Комментировать
  • Держит ли QSqlQuery умный указатель на БД?

    @Mercury13 Автор вопроса
    Программист на «си с крестами» и не только
    Окончательно разобрался.
    1. Да.
    2. Да.
    3. Да.
    Ответ написан
    Комментировать
  • Как добавить все элементы из вектора в контейнер multimap под определенный ключ?

    @Mercury13
    Программист на «си с крестами» и не только
    Если вам нужен именно multimap, другого способа я не вижу. Но если элементов много, стоит задействовать хинт (параметр position, где примерно элемент будет стоять). Что-то типа (в компиляторе не проверял, код почти гарантированно неверный).
    if (!names.empty()) {
        Users::const_iterator hint = users.upper_bound(1);
        for (auto &i :  names) {
          users.insert(hint, {1, i});
        }
    }

    Учтите, что при переходе с 03 в 11 поменялся смысл хинта, тут версия для 11.
    P.S. Извините, код для хинта можно сделать и проще. После вставки и ++ хинт останется тем же.
    Ответ написан
    Комментировать
  • В какой момент пора использовать ООП?

    @Mercury13
    Программист на «си с крестами» и не только
    ООП, как известно, упрощает разработку программ, состоящих из взаимодействующих компонентов с меняющимся состоянием. В вебе этого мало, и потому можно быть успешным вебистом и не знать ООП. ООП даёт двоякий выигрыш.

    1) Инкапсуляция — мы прячем внутреннее состояние, давая его менять специальными выведенными наружу «рычажками».
    • Тесная работа с коммуникационными протоколами (например, почтой).
    • Поддержка какой-то вещи с меняющимся состоянием (в вебе этого мало — может, какая-нибудь автоматическая вёрстка?)

    2) Абстракция и полиморфизм — в общем, поддержка разных вещей под общим фасадом.
    • Неопределённость в технологиях — может, MySQL, а может, SqLite. Тогда создаём абстрактный класс «БД» и от него наследуем MySQL и SqLite.
    • Какие-нибудь штуки из предметной отрасли. Пишем игру — персонажей игры удобно так держать. Хотя можно ли написать многопользовательскую игру целиком на PHP — в этом я не уверен.
    • Ну, не знаю, где ещё. Настольная/мобильная версия, что ли?
    Ответ написан
    Комментировать
  • Как происходит "обновление" кодировок?

    @Mercury13
    Программист на «си с крестами» и не только
    UTF-8 — это кодировка, позволяющая (теоретически) 2 млрд символов.
    Ограничением Юникода сейчас является кодировка UTF-16, она кодирует только 1 млн символов.

    Чтобы устройства по всему миру показывали новые символы, надо…
    1. Консорциуму Юникода где-то среди этого миллиона нарисовать новый символ. Сейчас занято около 120 тыс., ещё 130 тыс. — небольшой диапазон в базовой плоскости и две полных плоскости по 216 шт. — объявлены пользовательскими и их может занимать кто угодно в пределах своей ОС или программы.
    2. Консорциум Юникода публикует изображение символа и обновляет таблицы свойств символа.
    • Тип: буква/цифра/пробел/знак препинания/технический знак/управляющий/комбинирующий/…
    • Положение в двунаправленном письме: слева направо/справа налево/приспосабливается/управляет. Если приспосабливается — в письме справа налево можно поменять местами, например, скобки, для этого тоже есть поле.
    • Письменность: латиница/кириллица/ноты/смайлики/символы валют…
    • Как переводят в заглавные буквы и в нормальную форму. Настройка заглавных букв может переписываться локалью, но есть и «общая юникодная» таблица.
    3. Разработчик ОС переводит таблицу во внутренний формат ОС и обновляет шрифты. С очередным обновлением ОС шрифты и таблицы придут на компьютер, и будут символы.
    4. Чаще всего «левые» символы неверно отображаются в браузере. Для этого разработчики браузеров по хитрым алгоритмам ищут на компьютере пользователя шрифт, где этот символ есть. И, допустим, на вики «рогалика» Brogue (brogue.wikia.com) на моём компьютере ранее отображались все символы монстров, сейчас — пара тотемов не показываются. Видимо, с кучей софта ранее установился подходящий шрифт, а сейчас — фигвам. А на рабочей «десятке» всё в порядке.
    Ответ написан
    1 комментарий
  • Кто такой сливапер?

    @Mercury13
    Программист на «си с крестами» и не только
    Посетитель сайта типа «wikileaks для коммерческих и не только тайн»
    slivup [тощка] biz
    Ответ написан
    Комментировать
  • Как работает аппаратное распараллеливание?

    @Mercury13
    Программист на «си с крестами» и не только
    Попробую рассказать.

    Шаг 1. Конвейерная архитектура (Pentium 1).
    Чем-то напоминает многоствольный пулемёт. Один патрон заряжается, другой выстреливается, третий выбрасывается. Стоп… Одна команда выбирается, вторая декодируется, третья и четвёртая исполняются.

    Шаг 2. Суперскалярность (Pentium то ли Pro, то ли MMX).
    У нас есть несколько исполнительных блоков (в данном случае целочисленных). Если команды не противоречат друг другу, их можно пустить на обоих блоках параллельно.

    Шаг 3. Микрокоманды и VLIW (если не ошибаюсь, из x86 первым реализован в Transmeta Crusoe).
    Состоит из таких этапов.
    1. Разбиваем операции x86 на микрокоманды — например, «перебросить из eax в сумматор», «сдвинуть содержимое сумматора на 1 вправо»…
    2. Собираем это самое «очень длинное слово операции» из микрокоманд, заботясь о том, чтобы не было зависимостей по данным. Один сумматор получает слово из eax, а параллельно второй сдвигает на 1. Каждый из разрядов «длинного слова» управляет своим блоком процессора: сумматором, памятью, вводом-выводом…
    3. Ну и исполняем это самое слово.

    Всем этим архитектурам важно т.н. предсказание ветвлений. Чтобы всё это дело работало, нужно, чтобы несколько операций были декодированы наперёд. Проблема — ветвление: если мы не угадаем, случилось ли ветвление, вся предварительная работа насмарку. В микроконтроллерах с коротким конвейером и предсказуемым до такта временем работы мы на это чхаем: например, в инструкции к AVR говорится, что там двухместный конвейер: один такт декодирование и один (два, три) — исполнение. Обычно такт на декодирование не важен (и не указан в инструкции), но мы теряем его, если случился переход.

    А в x86 алгоритмы предсказания ветвлений довольно сложны.

    ЗЫ. В суперскалярных процессорах несколько десятков регистров, на которые динамически навешиваются ярлыки: сейчас EAX=r5, а через две команды — уже r13. Так называемое «переименование регистров».
    Ответ написан
    3 комментария
  • Как корректно обрезать строку тип string в utf8 на с++?

    @Mercury13
    Программист на «си с крестами» и не только
    Символов Юникода или байтов UTF-8?

    В любом случае байты UTF-8 делятся на три категории…
    • Начальные: 0x00…0x79, и 0xC0…0xF4
    • Дополнительные (не бывают в начале): 0x80…0xBF
    • Запрещённые: 0xF5…0xFF. В наших целях тоже можно отнести к начальным.

    Если задача — получить 10 символов, то находим 11-й начальный символ и обрезаем перед ним.

    Если задача — получить 10 байт и 11-й (s[10], если таковой есть, разумеется) — не начальный, начинаем урезать строку, пока не отрежем начальный символ.
    Ответ написан
  • Как подключить к KVM материнки со спаренным гнездом PS/2 для мыши/клавы?

    @Mercury13
    Программист на «си с крестами» и не только
    Нет, вам нужны разветвители типа 06013 или 06015 — которые «для старых ноутбуков» и на одном конце нарисована клавиатура, на другом мышь.

    USB-адаптеры с али позволяют подключать сколько угодно каких угодно клав и мышей (мультиплексирование на USB, в отличие от PS/2, есть), но, по опыту, многие из знакомых мне адаптеров подглючивают (клавиатура на время пропадает).
    Ответ написан
    3 комментария
  • План подготовки для поступления в Яндекс ШАД?

    @Mercury13
    Программист на «си с крестами» и не только
    Алгоритмы. Немного олимпиадного программирования ОЧЕНЬ не помешает. Алгоритмы там предлагают несложные, но очень нетривиальные, надо чувствовать, как решить задачу. Элементы сложности алгоритмов. Две задачи из восьми гарантированно будут.

    Алгебра и дискретная математика. Первый курс, всё скопом, без доказательств. Линейные уравнения, квадратичные формы, матрицы, собственные векторы, жорданова форма, перестановки, графы, теория множеств, комбинаторика, алгебра логики…

    Интегралы (не слишком «злые», но приёмы «подстановка», «по частям» и «тригонометрический интеграл» всё же освоить стоит). Интеграл средней сложности — постоянный гость в ШАДý. Может быть и ещё одна задача из мутьанализа — но это как повезёт и задача будет гарантированно нетривиальная, но решающаяся на «том, что помнишь с института» — дифференцирование, ряды Тейлора, основы топологии, простейшие пределы, правило Лопиталя. Вспомни, как берутся простейшие двойные интегралы, может попасться, например, на теории вероятностей.

    ФКП. Самое начало. Аналитических функций и рядов Лорана точно не будет. А вот то, что в комплексном поле многочлен n-й степени имеет n корней, знать надо.

    Теория вероятностей. Непрерывные и дискретные вероятности. Нечто несложное, почти что на уровне кубиков и карт, но одна-две из восьми будет. Хотя статистика — важная часть ШАДа, на экзамене не требуют. И пекла типа белых шумов и интегралов Ито не будет. Хотя что-то типа дискретной марковской цепи — а вдруг, хотя знакомые мне три экзамена не было.

    Школьные олимпиадные задачи. Возможна одна.

    Итого.
    Две — алгоритмы.
    Одна-две — вероятность.
    Одна — интеграл.
    Две-три — что угодно из школьной математики, дискретной математики, матанализа, алгебры, ФКП…

    P.S. Очень хороший приём, который мне помог. Конечно, вам придётся держать скан какого-нибудь справочника или распечатку Википедии (это не возбраняется, но электроника запрещена — впрочем, калькулятора задачи не требуют). Печатайте на одной стороне, вторую — на черновик!
    Ответ написан
    4 комментария