Задать вопрос
  • MinGW: что за префикс _imp__ и как избавиться от него?

    @Mercury13 Автор вопроса
    Программист на «си с крестами» и не только
    Опять приходится отвечать самому. У меня три ошибки.
    Раз.
    //#define ZIP_EXTERN __declspec(dllimport)
    #define ZIP_EXTERN
    Очевидно, libzip рассчитана только на компиляцию в DLL, и точка.

    Два. -lz. Ну, это понятно, и эта библиотека в нашем дистрибутиве MinGW есть.

    Три — не до конца дописал Юникод.
    Ответ написан
    Комментировать
  • Как возможна замена Юникодов?

    @Mercury13
    Программист на «си с крестами» и не только
    Очевидно, транслятор языка программирования довольно либерально относится к тому, «что такое идентификатор». И все эти смайлики и говняшки (ыгы, эмодзи-говняшка не так давно тоже появилась) также считаются буквами. Однако тут есть маленькая ловушка: если один и тот же символ составить разными способами — например, «и+кратка» против монолитного «й» — это будут разные идентификаторы.

    UPD. Посмотрел, как это делается в Java. Годятся любые символы, являющиеся буквами в Юникоде. Как минимум по спецификации Гослинга.
    Ответ написан
    4 комментария
  • Как безопасно загрузить SVG на сайт?

    @Mercury13
    Программист на «си с крестами» и не только
    К сожалению, в этом плане мы отданы на милость производителю браузера — как, впрочем, и в PNG, и в JPG. С одной стороны, они стараются избавиться от ошибок — например, как-то были скрипты в SVG (вроде в классической Опере). Исправили.
    С другой — векторная графика на порядок сложнее точечной, и всё не предусмотришь.

    Я бы поделил это на три части.
    1. Типичные для XML риски.
    • Entity-бомбы.
    • Проблемы с DTD, особенно отсылки на локальные файлы и файлы-устройства.
    • Сильно вложенные тэги, призванные пробить врагу стек. С этим надо быть предельно осторожным, чтобы не пробить стек себе :)

    2. Известные эксплойты, связанные с SVG.
    • Скрипты (и кто их вообще исполняет сейчас в SVG — но интернет говорит, что немало таких зловредов).
    UPD. Исполняют, но при определённых условиях, и тэг IMG или фон через CSS теоретически безопасны.

    3. SVG, которые не могут работать.
    • Ссылка на внешний растровый файл.
    Ответ написан
    Комментировать
  • Как задать паролем перемешивание 32 элементов?

    @Mercury13
    Программист на «си с крестами» и не только
    Если не нужна криптостойкость, то…
    1. Преобразовать (однозначно) в очень длинное число.
    2. Получаем такие части этого числа.
    • Остаток от деления на 32
    • Неполное частное на 32, затем остаток на 31
    • Неполное частное на 32·31, затем остаток на 30
    • Неполное частное на 32·31·30, затем остаток на 29…
    На словах страшно, алгоритм простейший.
    3. Из 31 числа — первое от 0 до 31, второе от 0 до 30, последнее 0 или 1 — легко получить перестановку.

    Если криптостойкость всё же нужна — придётся пароль «посолить» до достаточной длины и зашифровать чем-то.
    Ответ написан
    1 комментарий
  • Какие предметы в ВУЗе выбрать для обучения программированию?

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

    • Язык Python — с ограничением в 5 лекций ходить на язык не стоит, греби своими руками.
    • Структуры и алгоритмы компьютерной обработки данных — стоит, хотя зависит от программистской подготовки и может быть излишне просто.
    • Программирование на языке Java — с ограничением в 5 лекций ходить на язык не стоит, греби своими руками.
    • Язык C++ — с ограничением в 5 лекций ходить на язык не стоит, греби своими руками.
    • Рекурсивно-логическое программирование — очередная хитрая концепция программирования, фтопку
    • Системы искусственного интеллекта и экспертные системы — 70%, что пользование чужим софтом, тогда нет; 30%, что теория, тогда, возможно, да.
    • Функциональное программирование — интересная штука, но сильно зависит от препода.
    • Математическая логика — зависит от математической подготовки.
    • Основы параллельного программирования — интересная штука.
    • Объектно-ориентированное программирование (на примере C++) — фтопку
    • Компьютерная графика — в этом курсе может быть что угодно от хорошего до дряни. Допустим, на самом шаровом (!) потоке у нас в Киеве под этим скрывались страшнейшие задачи по вычислительной геометрии, половине группы я их решал, как бывший олимпиадчик.
    • Разработка ПО для мобильных систем (Objective C) — может потребоваться, но это инфраструктура Apple.
    • Технология разработки программного обеспечения — может быть что угодно, но в целом стоит разведать.

    • Системы реального времени — может быть что угодно. Пользование ПО — фтопку, что-то из теории и программирования — надо.
    • Операционные системы и компьютерные сети — с твоими интересами можно и забить.
    • Проектирование и администрирование информационных систем — может быть что угодно.
    • Визуальное программирование — фтопку
    • Операционная система Linux — фтопку
    • Операционная система Unix — фтопку

    • Теория автоматов, языков и трансляторов — очень хорошая штука, но с твоими интересами можно и забить.
    • Основы криптографии — аналогично.
    • Дискретная математика для программистов — зависит от математической подготовки
    • Дискретная математика — аналогично.
    • Алгоритмы теории графов — прогеру никогда не помешает.
    • Введение в Маткад и Матлаб — с твоими интересами забей.
    Ответ написан
  • Зачем gcc просит подключить stdlib.h?

    @Mercury13
    Программист на «си с крестами» и не только
    Раз у вас stdlib.h закомментирован, вы, наверно, знаете, откуда malloc взялся. Попробуем раскрутить ошибки.

    note: include ‘ stdlib.h ’ or provide a declaration of ‘malloc’
    Компилятор, очевидно, знает, где этот malloc завалялся…

    warning: implicit declaration of function ‘malloc’ [-Wimplicit-function-declaration]
    …но неявно объявляет функцию.

    warning: incompatible implicit declaration of built-in function ‘malloc’
    Неявное определение int* malloc(int). Реальное void* malloc(size_t). Преобразовать (int*)malloc надо было.

    Почему всё-таки запустилось? А потому, что на целевой машине size_t = unsigned int, а размеры указателей совпадают практически всегда. После того, как функция неявно объявилась, линкер подцепил на её место стандартную, и соглашения вызова совпали.
    Ответ написан
    1 комментарий
  • Что добавить к URL Youtube чтоб при открытии сразу появлялись субтитры с русским автоматическим переводом?

    @Mercury13
    Программист на «си с крестами» и не только
    ?language=russian недавно исчезло и никто не знает, что дальше. Вероятно, теперь личные настройки пользователя перебивают то, что поставил автор.
    Ссылка на время — #t=1h23m34s.
    Ответ написан
    Комментировать
  • Что лучше в mysql одинарные запросы или множественные(мульти) запросы?

    @Mercury13
    Программист на «си с крестами» и не только
    Массовый INSERT всегда лучше multi_query. Хотя multi_query из нескольких таких INSERT’ов имеет право на жизнь.
    Выигрыш по времени незначителен и сводится к тому, что разбор выражения происходит единожды. Сервер всё равно выполнит запросы один за другим.
    Но multi_query может быть хорош, когда надо запустить несколько модифицирующих запросов (INSERT, UPDATE, DELETE) один за другим. Просто код смотрится лучше.
    Когда в SQL-коде много подстановок, стоит обратить внимание на prepare. Это безопаснее и позволит использовать кэш компилированных запросов.
    Ответ написан
  • Можно ли сделать PCI-E звуковую карту внешней через USB?

    @Mercury13
    Программист на «си с крестами» и не только
    К сожалению, нет. Звуковой нужно ОЗУ, чтобы брать участки волны, и процессор, чтобы вызывать прерывания. Другими словами, переходник будет небольшим компьютером.
    Может, в режиме низкой задержки всё не так страшно (не знаком с ним), но системная шина и последовательная шина для периферии — слишком разные интерфейсы.
    Ответ написан
    3 комментария
  • Как реализовать код для срабатывания нефиксированной Кнопки?

    @Mercury13
    Программист на «си с крестами» и не только
    UPD1. У вас опять игрушечное никогда не выполняющееся условие PINB &= 0b00000000.
    Если всё-таки сделаете работающее условие, то должно быть что-то вроде
    char oldState = 0, newState = 0
    ...
    oldState = newState;
    newState = PINB & 0b00000001;
    if (!newState && oldState) {
      // нажатие кнопки зарегистрировано.
      // 1. переключить состояние.
      // 2. Записать что надо в порт.
      // 3. Сделать задержку на дребезг.
    }

    Естественно, считается, что кнопка замыкается на землю и !newState — это как раз «прижата».
    Ответ написан
    3 комментария
  • Изучение линейной алгебры поможет в школьном курсе алгебры?

    @Mercury13
    Программист на «си с крестами» и не только
    Скорее всего, нет, однако стоит посмотреть, какое отношение эта самая линейная алгебра имеет к векторам, прямым и плоскостям в 2D и 3D. Это будет важно в вашей дальнейшей прогерской жизни.
    Ответ написан
    Комментировать
  • Header в header'е и можно ли делать игру на одних Header'ах?

    @Mercury13
    Программист на «си с крестами» и не только
    Такой механизм называется «одна единица компиляции» и вполне имеет право на жизнь: на одном процессоре время полной сборки будет наименьшим, потому так распространяют некоторые библиотеки (SqLite, Google Test). Правда,
    игра — обычно масштабный проект, и чем больше будет кода, тем дольше нужно компилировать, чтобы проверить изменения.

    Потому код обычно разбрасывают по единицам компиляции (*.cpp) в соответствии с его внутренней логикой, и к каждой единице (кроме точки входа) приписывают хедер (*.h), который показывает, что эта единица делает. Повторяю, только описывает, что делает — весь код в CPP. И в большинстве случаев самый длинный этап сборки — линковка (особенно с оптимизацией по ходу линковки aka LTO).

    Единственное, что в 80% случаев не получается закинуть в CPP — это шаблоны.

    Чтобы один хедер не подключался несколько раз — есть include guard. Правда, если вы не продумали зависимость между хедерами, может попасться циклическое включение — это вредно, но лишь потому, что программа может не скомпилироваться.

    Чтобы не было циклических включений, для сохранения скорее всего потребуются два хедера: один отвечает за собственно процедуру сохранения и подключается к одному-единственному модулю — системе меню. Второй — за какие-то общие функции, которые позволяют сохраняться в абстрактный поток плиточному фону, снаряду, монстру… Называется как-нибудь SaveUtils.h и подключается повсюду.

    (Примечание. И SqLite, и Google Test разрабатывались по традиционной схеме, с проектом из кучи CPP. SqLite собирается в один большой *.c автоматикой, и я даже качал традиционный код — на 5-метровом файле некоторые версии Embarcadero вылетали с нехваткой памяти. В Google Test есть файл all.cpp или что-то подобное, в котором #include остальных CPP — пользователь подключает в проект all.cpp, и библиотека отнимает минимум его времени.
    Ответ написан
  • Будет работать ноутбук с ddr3 большей частотой шины, чем предусмотрено?

    @Mercury13
    Программист на «си с крестами» и не только
    В целом да (и даже тайминги масштабируются под реальную частоту шины). Хотя бывают особенности наподобие ёмкости одного чипа — потому надо проверять. Особенно если матплата старенькая, а память современная.

    Потому при апгрейде ноутбуков советую обращаться в фирмы, которые занимаются старыми ноутбуками. Они более-менее профессионально вскроют девайс, поставят память прямо при владельце, а потом проверят то, что сделали — у меня лично были два случая, когда по совершенно непонятной причине матплата не заводится. В одном случае я сменил память на другого производителя, комп служил 5 лет у меня и 5 лет у другого. В другом — матплата была старая, память вернул и решился на полный апгрейд, это дало 2× производительность на одном ядре (оба компа настольные).

    А ещё был случай, когда у дамы был комп с ХРюней (≈2012), DDR1, денег на новый не было, я сказал: с такими запросами надо купить гигабайт, и всё. Купил, всё обошлось, довольна, как слон. В общем, вопрос везения.
    Ответ написан
    Комментировать
  • Доказывают ли изначально аксиомы, чтобы потом принимать их на веру?

    @Mercury13
    Программист на «си с крестами» и не только
    Аксиомы доказать невозможно. Но можно сделать одну классную вещь. А именно — построить модель теории. Другими словами: найти в соседней теории, которой вы «доверяете» (например, теории действительных чисел или евклидовой геометрии) такие «точки» и «прямые», чтобы они отвечали всем аксиомам. И эти аксиомы нужно доказывать, чтобы показать, что, например, R² с «точками» (x,y) и «прямыми» ax+by+c=0 — действительно модель евклидовой геометрии.

    Да, и математики часто, но некорректно говорят: «Векторное пространство — это совокупность из основного множества X, числового поля K, операций x+y и x·k такая, что отвечает аксиомам…» Вообще-то, требованиям, а не аксиомам, и эти «аксиомы» нужно доказывать, чтобы доказать, что, например, R² — векторное пространство над полем R.

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

    @Mercury13
    Программист на «си с крестами» и не только
    Первую букву меняем с последней, вторую с предпоследней, и так далее.
    Ответ написан
    Комментировать
  • Домен и доменное имя. В чем разница?

    @Mercury13
    Программист на «си с крестами» и не только
    example.com — это домен = доменное имя
    https://example.com — это уже URL, состоящий из…
    • схемы URL’а (протокола, типа ресурса) https:
    • и специфичных для протокола HTTP(s) вещей, к коим относятся
      • знак домена //
      • домен example.com

    Когда мы пишем в браузере example.com/path, система понимает, что надо добавить схему и знак домена, но упаси бог такое писать в HTML — получится что-то типа http://local.example.net/example.com/path.
    Ответ написан
    Комментировать
  • Как записать в excel поле время?

    @Mercury13
    Программист на «си с крестами» и не только
    1. Записать время как double в формате «1 сутки = 1; 1 секунда = 1/86400».
    2 — простой путь. Применить какой-нибудь из предопределённых числовых форматов (думаю, лучше всего подходит 2E16 = [h]:mm:ss сверх 24 часов).
    2 — сложный путь. Похимичить с форматными строками.
    Ответ написан
  • Браузер игнорирует keep-alive?

    @Mercury13
    Программист на «си с крестами» и не только
    Это другая штука, имеющая опосредованное отношение к keep-alive. Это загрузка информации в несколько потоков.

    Почему шесть соединений, а не пять — другой вопрос. Я бы предположил вот что. Браузер разобрал index.html и увидел там картинку. Создаём новое HTTP-соединение (нешифрованное) — два пинга спустя поехали данные. Задействуем имеющееся — один пинг спустя. С небольшим пингом браузер просто подумал, что быстрее будет вот так. А может, браузер просто туп и если мы укладываемся в количество соединений с одним сервером — создаём новые, да и всё.

    А вот то, что все картинки в разных потоках — это верно. Если считать скорость сети «бесконечной», для каждой из них информация пойдёт с запозданием в два пинга. Работай мы в один поток — первая пришла бы с запозданием в 2 пинга, вторая в 3 пинга, третья в 4 пинга… А вот протоколы SPDY и HTTP/2 позволяют сказать: «Дай мне картинки А, Б и В»,— и они все, ОДНИМ СОЕДИНЕНИЕМ, придут с запозданием в два пинга.

    Другими словами:
    HTTP (все метки времени — когда они были посланы с клиента/приняты клиентом):
    К: SYN: (+0 пингов)
    С: SYN+ACK (+1 пинг)
    К: ACK (+1 пинг)
    К: Запрос 1 (+1 пинг)
    С: Ответ 1 (+2 пинга)
    К: Запрос 2 (+2 пинга)
    С: Ответ 2 (+3 пинга)

    HTTP2:
    К: SYN: (+0 пингов)
    С: SYN+ACK (+1 пинг)
    К: ACK (+1 пинг)
    К: Запросы 1, 2 (+1 пинг)
    С: Ответы 1, 2 (+2 пинга)

    На реальных «не очень быстрых» соединениях играют роль не только пинги, но и скорость передачи. Тогда картинки начнут появляться не по одной, а по восемь (или сколько там соединений) — это тоже может повлиять на впечатление от браузера. К тому же если случился затор на шлюзе локальной сети — тогда, если одно соединение забарахлит, другие что-то привезут. А если сеть не очень хорошо сконфигурирована — это ещё и ввосьмеро увеличит скорость передачи (реально в начале 2000-х качал в универе 10-мегабайтный драйвер за перемену в 100 потоков).

    Я бы посоветовал сделать штук двадцать картинок — и тогда начнётся повторное использование имеющихся соединений.
    Ответ написан
    Комментировать
  • Почему Eclipse не подсвечивает тип данных string?

    @Mercury13
    Программист на «си с крестами» и не только
    Главная причина: int — ключевое слово Си++, а string — нет.
    Система программирования может подсвечивать стандартные контейнеры STL другим цветом. Вот, например, скриншот Code::Blocks.
    6cd9ef6d6e4346aaaac0de090af78f88.png
    Видите, ключевое слово char синее, а стандартный объект STL std::string — зелёный.
    (Да, специалисты, вижу, что на экране результат не слишком удачного рефакторинга. Для специализированной утилиты в шестьсот строк, думаю, покатит.)
    Ответ написан
    Комментировать
  • Qt(C++) на windows XP?

    @Mercury13
    Программист на «си с крестами» и не только
    Си++ и Qt сделаны кроссплатформенными, то есть скрывают разницу между платформами где-то у себя внутри.

    Компиляторы перестают поддерживать ту или иную ОС последними. Процессор-то остаётся тем же — ну и норма. Думаю, скомпилированное MinGW (без Qt) даже на 98 запустится.

    Так что разницы не будет, если весь наш софт будет работать на хост-ОС и все наши библиотеки будут запускаться на целевой ОС. А вот с поддержкой беда, версия 5.6 объявлена последней, которая официально поддерживает XP как хост-, и 5.7 — XP как целевую. Работает всё-таки? Вот и классно!

    Да. Раз уж в Qt есть три системы сборки — могут возникнуть вопросы, когда нужно редактировать руками pro-файл. Большинство руководств предполагают QMake. Я держусь на нём, потому что так и не выяснил, как QBS работает с многоядерными процессорами. Двести файлов в проекте — сами понимаете.
    Ответ написан
    Комментировать