• Что одновременно компонент DrawGrid позволяет отображать?

    @Mercury13
    Программист на «си с крестами» и не только
    Этот компонент позволяет отобразить всё, что можно нарисовать программно: картинки, тексты, списки, формулы и прочее. Форма — это не только рисование, но и размещение объекта со своим оконным дескриптором, так что отпадает. «Вычисления» — это слишком общий термин, но если придумаешь, как нарисовать схему/формулу вычислений, то пожалуйста. А остальное катит.
    Ответ написан
  • Нужно ли программисту изобретать велосипед?

    @Mercury13
    Программист на «си с крестами» и не только
    Представьте себе, у меня в одной коммерческой программе есть велосипед и чужая библиотека, занимающиеся одним и тем же, доступом к XLSX.

    В одном месте пользователи иногда скармливают программе огромный XLSX размером мегабайт этак в 20, что соответствует ≈100M памяти, если развернуть в структуры данных, >130M — если сериализовать в XML, и добрых полгига — если этот XML разобрать рекордной библиотекой, а ведь в той XLSX-библиотеке, которую мы купили, ничего рекордного не было. На x86 не хватало памяти ни на что, на x64 тормозило адски. В общем, сделал потоковый разбор XML с пространствами имён «из коробки» и предельно простой разбор XLSX без стилей, без картинок и диаграмм, без сохранения — этот XLSX грузило ≈3 с, из которых <0,5 — раззиповка, ≈1,1 — разбор XML, остальное — собственно разбор XLSX. Для сравнения: Excel грузил 10 секунд, LOo до 6-й линейки вообще не мог загрузить такой файл. Расход памяти — исключительно та сотня, что идёт на структуры данных; расходы памяти на раззиповку и разбор пренебрежимо малы.

    В другом месте таких проблем нет, и я даже не пытался перевести этот момент на свою библиотеку.

    К слову о велосипедах: они тоже глючат, и один японец обнаруживал не одну и не две ошибки, связанных с этим разбором специальных японских XLSX.

    В общем, с велосипедами надо быть осторожным, и причины сделать велосипед в производственном коде — это…
    • Производительность. Пример выше.
    • Функциональность. Хочется написать своё сохранение в XLSX, потому что нужны заметки, которых, кажется, не поддерживает ни одна библиотека.
    • Глючьё. Допустим, я отказался от встроенного в Qt диалога открытия файла, потому что он прикрывал одну важную функцию WinXP+: сохранял, какой каталог был текущим.
    Ответ написан
    Комментировать
  • Какую оптимизацию отключить в g++ -O1, чтобы не было [optimized out]?

    @Mercury13 Автор вопроса
    Программист на «си с крестами» и не только
    -fno-tree-* (в общем, все, начинающиеся на tree и входящие в O1).
    Дальше выделять бессмысленно, каждая из них делает что-то маленькое.

    Но не включаем -fno-tree-copy-prop, оно выводит адову кучу ложных тревог.

    UPD. В настоящее время лучше использовать линкер LLD, и точка. Проект разросся, а линковка длится «целых» ДВЕ секунды.
    Ответ написан
    Комментировать
  • Написать программу, сильно тормозящую Windows?

    @Mercury13
    Программист на «си с крестами» и не только
    Много дёргать ввод-вывод. Например, помногу, в несколько потоков, читать диск.
    Если винт механический, Windows становится абсолютно неюзабельной.
    Ответ написан
    Комментировать
  • Как установить OpenCV для C++ в QT Creator?

    @Mercury13
    Программист на «си с крестами» и не только
    LIBS += -LC:/opencv/pro/lib -lxxx

    xxx — это имя файла с расширением a, без расширения и префикса lib.
    Если он libopencv_core.a, то надо -lopencv_core
    Ответ написан
    Комментировать
  • Какие действия несут эти знаки @ & % # ^ в delphi или pascal?

    @Mercury13
    Программист на «си с крестами» и не только
    Это символ не Delphi, а Win32. Как налаживается горячая клавиша в других ОС — я не в курсе, но в Qt под всеми ОС горячая клавиша задаётся точно так же, амперсандом. В текстовой системе Turbo Vision было ~H~otkey.
    Никакого особого смысла эти символы в окнах Win32 не несут. Но могут нести где-то в других местах, сами понимаете:
    • на некоторых сайтах #hashtag или @user
    • в строках типа printf процент — это символ подстановки типа «Привет, %s»
    • а какой смысл несут все эти символы в Паскале — вы и так должна знать.
    Ответ написан
    Комментировать
  • Как защититься от мультизапросов (Charles)?

    @Mercury13
    Программист на «си с крестами» и не только
    Транзакции и блокировка строк. Точка.
    https://ru.wikipedia.org/wiki/Уровень_изолированно...
    https://dev.mysql.com/doc/refman/8.0/en/innodb-tra...

    Вам вроде нужен самый сильный уровень изоляции транзакций, SERIALIZABLE.

    Более сложный, но более высокопроизводительный способ — SELECT FOR UPDATE.
    https://dev.mysql.com/doc/refman/8.0/en/innodb-loc...
    Тут уровень изолированности транзакций не важен, поскольку вы сами выбираете, какую строку как изолировать.
    Ответ написан
    Комментировать
  • Сколько всего может быть паролей + rainbow-tables?

    @Mercury13
    Программист на «си с крестами» и не только
    1. Что такое радужная таблица? Будучи раз вычисленной, она многократно используется другими для задачи «обратить хэш».
    2. В Wi-Fi используются два параметра: ANonce и пароль — так что перед нами протокол типа challenge-response, предназначенный именно для того, чтобы радужные таблицы были непрактичны — задача взлома, решённая для одной сессии, не поможет взломать другую.
    3. Так сколько же ломать? Если вы пытаетесь взломать чужую сеть и ставите разумные рамки на чужой пароль, так и есть. Если налаживаете политику безопасности — в счёт лучше брать только самый короткий из вариантов: если ограничение 8…24 символа, то для расчётов брать именно 8.
    Ответ написан
    Комментировать
  • Почему запускается первым конструктор mainwindow.cpp?

    @Mercury13
    Программист на «си с крестами» и не только
    Я бы переписал архитектуру программы.
    1. Перед вами модальное окошко. Вот его и вызывайте, как модальное — au.exec().
    2. Чтобы проверить, что авторизация верна, надо соединиться. Так что сделайте невизуальный объект «соединение» и протащите в exec. Ну или создайте в exec.
    3. А уж там собирайте основную программу.
    QApplication a(argc, argv);
    FmAutoriz au;
    std::unique_ptr<SomeConnection> connection = au.exec();   // SomeConnection и exec придётся написать
    if (connection) {
      FmMain m(connection);
      m.show();
      return a.exec();
    } else {
      return 0;
    }
    
    std::unique_ptr<SomeConnection>FmAutoriz::exec()
    {
      bool b = QDialog::exec();
      if (b) {
        return std::move(this->connection);
          // connection — поле FmAutoriz.
          // Такой же unique_ptr, в обработчиках кнопок пытаемся создать соединение.
      } else {
         return nullptr;
      }
    }
    
    void FmAutorize_on_btOk_click()
    {
       connection = new SomeConnection();
       if (connection.connect(someLogin, somePassword)) {
          accept();
       } else {
          // сообщи об ошибке
       }
    }

    Вижу побочку этого (но, может, и не надо избавляться) — на панели задач анимацией сменяется кнопка с диалогом авторизации на кнопку с главным окном.
    Ответ написан
  • Как получить кол-во записей, которые помещаются в окне QTableView?

    @Mercury13
    Программист на «си с крестами» и не только
    Это на самом деле сложная задача, и я её решил вот так.
    QHeaderView* header = ui->tableView->verticalHeader();
    QWidget* viewport = header->viewport();
    int i1 = header->logicalIndexAt(0);
    int i2 = header->logicalIndexAt(viewport->height() - 1);
    if (i2 < 0)
        i2 = header->count() - 1;
    QString s = QString::number(i1) + " - " + QString::number(i2);
    ui->lbResult->setText(s);


    Если в очень упрощённом виде — то немного не так.
    return m_tableView->viewport()->height() / m_tableView->rowHeight(0);
    Ответ написан
    Комментировать
  • Что такое "программирование сокетов"?

    @Mercury13
    Программист на «си с крестами» и не только
    Сокет — это абстракция, принятая в Unix и перешедшая в Windows, представляющая собой сетевое соединение.
    https://ru.wikipedia.org/wiki/Сокеты_Беркли
    Ответ написан
    Комментировать
  • Почему не запускается browser action в расширении Firefox?

    @Mercury13 Автор вопроса
    Программист на «си с крестами» и не только
    Опять приходится отвечать самому. Разобрался, хотя мучился долго.

    В браузерном расширении два скрипта: фоновый и контентный. Фоновый умеет работать с браузером и его окнами, контентный — со страницей. Единственный обмен между ними — сообщения.

    Поскольку конкретно на этом сайте довольно много AJAX, начинающему JS’нику трудно обойтись одним контентным скриптом, так что пусть фоновый скрипт с браузерной панели инициирует жульничество, а контентный — вмешается в страницу. Делается это так.
    manifest.json
    {
    
      "manifest_version": 2,
      "name": "Green Way Cheat",
      "version": "1.0",
     
      "description": "A simple addon for cheating in green-way.com.ua",
      "icons": {
        "48": "icons/green-way-48.png"
      },
      
      "applications": {
        "gecko": {
          "id": "green-way-cheater@merc.com",
          "strict_min_version": "45.0"
        }
      },
    
      "permissions": [ "activeTab", "tabs" ],
    
      "browser_action": {
        "default_icon": "icons/green-way-48.png",
        "default_title": "Green Way Cheat"
      },
     
     "content_scripts": [
        {
          "matches": [ "https://green-way.com.ua/*" ],
          "js": [ "content.js" ]
        }
      ],
      
      "background": {
          "scripts": [ "bg.js" ]
      }
    
    }
    bg.js
    function getActiveTab()
    {
    	return browser.tabs.query({active: true, currentWindow: true});
    }
    
    function cheatMain()
    {
    	getActiveTab().then((tabs) => {
    		browser.tabs.sendMessage(tabs[0].id, { command: "cheat" } );
    	});
    }
    
    browser.browserAction.onClicked.addListener(cheatMain);
    content.js
    function cheatHere()
    {
    	alert("Cheat!");
    }
    
    browser.runtime.onMessage.addListener(cheatHere);
    Ответ написан
    Комментировать
  • Можно ли поставить свежую видеокарту в старую материнку?

    @Mercury13
    Программист на «си с крестами» и не только
    Менять компьютер. Видеоплата встанет, но не решит задачу, компу не хватает процессора/памяти.
    Ответ написан
    Комментировать
  • А можно ли, создать железный Интернет браузер, который будет полностью изолирован от OS?

    @Mercury13
    Программист на «си с крестами» и не только
    1. Главный вопрос: что, по-вашему, «железный»?
    Если это отдельный процессор с ОС и программой — мы пришли к тому, от чего начинали: раз тут программа для фоннеймановской архитектуры, её так же можно хакнуть и заполучить пароли.
    Как заметил Adamos, чаще браузера обновляется только Флэш, а ведь браузеры пишутся высококлассными спецами. Когда Течнера «ушли» из Оперы, браузер начал загибаться.

    2. Хорошо, делаем реально железный браузер, например на ПЛИС — только стоить он будет сотни-тысячи долларов, непонятно, как объединить фоннеймановскую архитектуру и ПЛИС, и непонятно, как обновлять.

    3. Кроме того, есть концептуальные проблемы веба: XSS, XSRF, подслушивание по сторонним каналам (скажем, цифровой отпечаток путём рисования текста на холсте). Как известно, между безопасностью и танцующими котиками обыватель выберет котиков — вот и начали наворачивать, и в этих наворотах находят всё больше проблем. Чтобы быть безопасным, надо идентифицировать канал, отойти (!) от спецификации и зашумить его.

    Хром (а с ним и Яндекс, и Хроперу, а потом и Рыжая подключилась) стараются делать не отказоустойчивыми, а отказобезопасными: чтобы крайне сложно было довести взлом до реального овладения системой. И для этого они по-чёрному используют механизм, имеющийся в Windows: разделение памяти для процессов. (Потому, кстати, и говорят, что память сжирается со звуком «хром-хром».) В нашем простеньком процессоре, возможно, будет упрощённая ОС без такой защиты памяти.

    Наконец, типичный браузер очень жирный, частично из-за «защитного» программирования, частично из-за сложных спецификаций, частично из-за «злой» оптимизации. Реально хотите в стик впаять гигабайты ОЗУ?

    Откуда вообще берут пароли?
    1. Подслушивают троянской программой. Раз мы их вводим — значит, можно и подслушать. Или мы к нашему браузеру будем подключать и клавиатуру тоже?
    2. Подбирают. Крайне редко и обычно владелец пароля сам себе злобный буратино.
    3. Утекают открытым текстом или с недостаточной силы шифром. Железка бессильна.
    4. Сервер сам сдаёт данные кому надо. Железка бессильна.
    5. Провайдер сам перешифровывает трафик и требует установить самоподписанный сертификат. Железка бессильна.
    6. Выцыганивают. Пользователь сам себе злобный буратино.
    И на далёком-околопоследнем месте взлом браузера.
    Ответ написан
    Комментировать
  • Приложения корректировки форматирования кода?

    @Mercury13
    Программист на «си с крестами» и не только
    Первое. Нужен сильно упрощённый синтаксический анализ, который делит код на директивы препроцессора, лексемы, операторы и комментарии, понимающий вложенность операторных скобок.
    Второе. Все эти лексемы выкидываем в выходной поток, добавляя незначащие символы по всоему усмотрению.
    Третье. Комментарии тоже придётся переформатировать, и с этим отдельный геморрой.
    Для Си — там есть ещё #define. Идеал — развернуть каждый #define, добавив спецсимволы «тут начало #define», «тут конец #define», форматнуть код, передвинуть левый спецсимвол как можно правее по незначащим символам (а правый — как можно левее), а потом опустить всё между спецсимволами, оставив только #define в том виде, как он был.
    Ответ написан
    Комментировать
  • Как сформулировать алгоритм для визуального редактирования запросов?

    @Mercury13 Автор вопроса
    Программист на «си с крестами» и не только
    С вопросом 3 оказалось всё одновременно просто и сложно. Дырка — это НЕ тождественный TRUE, это нечто нейтральное к операциям до или после (что приоритетнее). Если OR — внешняя операция, AND — приоритетная, TRUE/FALSE — соотв. нейтральный элемент, то…
    A OR (B AND TRUE) OR C = A OR B OR C, то есть AND уходит
    (A AND B) OR (TRUE AND C) = (A AND B) OR C, то есть OR занимает место AND.
    Так что действительно получается наименее приоритетный из () AND () и AND.

    С вопросом 1 так пока и есть.

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

    С другой — для каждого элемента стека мы держим op, firstIndex и lastIndex (индексы начала/конца операнда).
    Для первого элемента кидаем (⌀, 1, 1). Или (⌀, 0, 0), если индексы с нуля.
    Для второго (AND, 2, 2).
    Когда попадается третий (OR, 3, 3), срабатывает условие, и мы делаем операцию «сброс AND», состоящую из трё1х вещей:
    1. Для первого lastIndex в случае TRUE делаем переход на второе firstIndex.
    2. Где-то записываем: у первого lastIndex переход в случае FALSE будет таким же, как и у второго lastIndex.
    3. Объединяем эти два элемента, присвоив второй lastIndex первому элементу.
    Ну и добавляем наш (OR, 3, 3) в стек — это делается всегда, независимо от того, сколько раз сработало условие сброса.
    Как сбросить OR — думаю, понятно.
    Таким образом, теперь наш стек будет такой: (⌀, 1, 2) (OR, 3, 3).
    Наш план: (+2 −?) (+? −?) …
    Наш список аналогов: (1, 2, FALSE)

    Четвёртый элемент уйдёт в стек, пятый вызовет сразу два сброса.
    Стек (⌀, 1, 4) (OR, 5, 5).
    План: (+2 −?) (+? −3) (+4 −?) (+? −?)…
    Наш список аналогов: (1, 2, FALSE), (3, 4, FALSE), (2, 4, TRUE)

    Когда список кончится, проводим операцию сброса, пока в стеке не останется (⌀, 1, 8), а затем заполним список аналогов с конца.
    Если вопросительный знак всё-таки остался — это будет +TRUE или −FALSE.
    Ответ написан
    Комментировать
  • Variadic template c++?

    @Mercury13
    Программист на «си с крестами» и не только
    Этот шаблон вычисляет при компиляции такое:
    rbv<false, false, true, true>() = 11002.

    И состоит из двух частей.
    1. Для одного параметра у нас напрямую написан шаблон.

    2. Для false, false, true, true — у нас используется второй шаблон: a=false, b=false, d = (true, true).
    И он равняется (rbv<false, true, true> << 1) + false.

    Чтобы вычислить новый rbv, снова работает второй шаблон: a = false, b = true, d = (true).
    И он равняется (rbv<true, true> << 1) + false.

    Для третьего rbv у нас a = true, b = true, d = ().
    Внимание, список d может быть и пусттым. Потому, чтобы не было конфликта с первым шаблоном, второй пишется для двух и более параметров.
    И третье наше значение равняется (rbv<true> << 1) + true.

    Вот тут работает первый шаблон и получается 112.
    Дальше уже можно вычислить все rbv по очереди и получить 11002.
    Ответ написан
    4 комментария
  • Как запросить число через cin в C++ чтобы оно заканчивалось на цифру 5?

    @Mercury13
    Программист на «си с крестами» и не только
    Это невозможно, мэн волен ввести в консоль что угодно.
    Но ваша задача как программиста — каким-то образом не допустить некорректного ввода. То ли вывести ошибку, то ли самостийно округлить, то ли потребовать повторный ввод… Вы уж сами думайте, что требуется именно от вашей программы.
    Условие «кончается на 5» эквивалентно  «не делится на 10, но делится на 5».
    Ответ написан
  • Иконки и лицензия?

    @Mercury13
    Программист на «си с крестами» и не только
    Смотря какие работы, но там CC-BY-ND, то есть производные работы запрещены и нужна ссылка на них.
    Простое преобразование в PNG — НЕ производная работа, но вы, вероятно, не просто в PNG преобразуете…
    Ответ написан
  • Как работает данная программа C++?

    @Mercury13
    Программист на «си с крестами» и не только
    Это обычная учебная программа и я за такой код бил бы по рукам. Нарекания к ней.
    1. Одновременное пользование printf и cout. Впрочем, несмотря на глючность, printf — хорошая штука, я и сам сделал более мощный аналог.
    2. Есть немного случаев, когда допустимы такие названия переменных/функций.
    • для счётчика цикла (i, j, k для переменной, it, jt, kt для итератора, u, v, w для новой фичи Си++11 — того, на что итератор указывает);
    • если мы преобразуем научную статью в код, и переменные так названы в статье.
    3. Даже название Count слишком расплывчатое — лучше что-то вроде nFound.
    UPD2. 4. Я бы переписал функцию P так, что for [0…горизонталь), при бое return false, цикл удался — return true.
    5. В музей говнокода!
    if (i == k)
        return true;
      else if (i != k)
        return false;
      else
        return !true && !false;

    Верно
    return (i==k);

    Программа проходится по 1-й горизонтали и ставит ферзя на каждую клетку. Если поместился — рекурсивно делает то же самое для 2-й горизонтали, если нет — значит, не повезло. Как только расчёт дойдёт до N-й горизонтали — мы нашли расположение ферзей, можно выводить.

    UPD. Ну, допустим, я бы переписал 2-ю функцию так (не меняя порядок параметров).
    void Backtracking(int currX, int &nFound, int boardSize, int queenY[])
    Ответ написан
    5 комментариев