• Существует ли переходник USB 3.0?

    @Mercury13
    Программист на «си с крестами» и не только
    Итак, на корпусе, как я понимаю, две пары разъёмов. На матплате всего одна пара.

    Самое простое, что можно предложить,— одну из пар подключить в 2.0. В большинстве матплат этого добра переизбыток. Так я поступил на своём рабочем компьютере (только там одна пара на «морде» и ни одной на матплате).
    https://ru.aliexpress.com/store/product/Computer-M...

    Вариант второй. Купить адаптер и к нему подключить оставшуюся пару.
    https://ru.aliexpress.com/store/product/PCIe-Dual-...

    Вариант третий. Купить переходник на USB-A…
    https://ru.aliexpress.com/store/product/2-pieces-l...
    …или на USB-B…
    https://ru.aliexpress.com/store/product/19-USB-Dua...
    простейший хаб и переходник на 20-штырьковый USB.
    https://ru.aliexpress.com/store/product/Desktop-Co...
    Но это уже, по-моему, извращенство.

    Вариант четвёртый. Взять их с задней панели матплаты.
    https://ru.aliexpress.com/store/product/25-2-USB-3...
    Тоже извращенство, по-моему. К тому же у вас полноразмерный корпус, что, возможно, говорит о том, что матплата тоже полноразмерная и адаптер уместится. В общем, склоняюсь или к 2.0, или к установке адаптера.
    Ответ написан
    3 комментария
  • Можно ли число представить в виде float?

    @Mercury13
    Программист на «си с крестами» и не только
    Float содержит 23 бита мантиссы и неявную единицу. Порядок float запредельный и даже qword не упрётся в него.
    Это значит: всё, что дальше 23 бит от верхней единицы, должно быть нулём.

    bool isPreciseFloat(unsigned long long n)
    {
      // Простейшая проверка: стираем нижние 24 бита
      // Если в них вписываемся — ДА.
      unsigned long long n1 = n & ~((1ULL << 24) - 1);
      if (n1 == 0)
        return true;
    
      // Получаем верхнюю единицу
      // (можно также двоичным поиском, но я этого с листа не напишу)
      while (true) {
        unsigned long long n2 = n1 & (n1 - 1);
        if (n2 == 0)
          break;
        n1 = n2;
      }
    
      // Получаем маску всего, что ниже 23 бит от верхнего бита.
      n1 >>= 23;
      --n1;
    
      // Проверяем по маске
      return (n & n1) == 0;
    }


    Писал «с листа», могут быть ошибки.
    Ответ написан
  • Как отсортировать массив с зависимостями элементов друг от друга?

    @Mercury13
    Программист на «си с крестами» и не только
    Это так называемая «топологическая сортировка». Делается через последовательный поиск в глубину, начиная со всех возможных элементов.

    алг recurse(поссылке x : элемент, поссылке результат : список)
      если x.метка = чёрный
        возврат
      если x.метка = серый
        стоп ("найдена циклическая зависимость")
      x.метка := серый
      для всех y : зависимых от x
        recurse(y)
      x.метка := чёрный
      результат.добавить(x)
    
    алг main()
      для всех x : массив
        x.метка := белый
      result := []
      для всех x : массив
        recurse(x, result)


    Вкратце: проводим стандартный поиск в глубину, начиная со всех элементов, и при выходе вносим элемент в список.
    Ответ написан
    1 комментарий
  • Иероглифы вместо кириллицы в с++?

    @Mercury13
    Программист на «си с крестами» и не только
    Перед нами UTF-8. Перекодируйте исходник в рабочую кодировку (обычно DOS-866 или Windows-1251).

    Или работайте в широких строках. У меня на MinGW 5.3 получился вот такой исходник.
    #include <iostream>
    
    using namespace std;
    
    int main()
    {
        setlocale(LC_ALL, "rus");
        wcout << L"Превед!" << endl;
        return 0;
    }
    Ответ написан
  • Что делать при несовпадении координат на клиенте и сервере?

    @Mercury13
    Программист на «си с крестами» и не только
    Я об играх, где игрок управляет одним объектом: шутерах, гонках…
    Клиент и сервер держат несколько исторических положений.

    Координаты СЕБЯ, ЛЮБИМОГО — клиентские. Если серверные координаты в такт 1234 не совпадают с нашими — откатываемся к серверным, повторно прокрутив нужное количество тактов управления.
    Вещи неуправляемые/слабоуправляемые, вроде запаса жизни, берутся подтверждённые сервером.

    Координаты ВРАГОВ — серверные (возможно, каким-то образом экстраполированные).

    Для физики пуль пишется т.н. «компенсация пинга»: если клиент пишет, что в такт 1234 он стреляет, сервер восстанавливает, что КЛИЕНТ ВИДЕЛ в такт 1234, и сравнивает попадание именно с ТЕМ положением клиента. Для медленных снарядов компенсация обычно не пишется.
    Ответ написан
    Комментировать
  • Что нужно сделать в этой задаче?

    @Mercury13
    Программист на «си с крестами» и не только
    Если N=20, X=3, Y=5, то наш выход — 8.
    3, 5, 6, 9, 10, 12, 15, 18.

    Лобовое решение — пройти [2, N) и пересчитать нужные числа.

    Идея умного решения. Если X и Y гарантированно простые, то эти самые числа повторяются с шагом X·Y.
    3, 5, 6, 9, 10, 12, 15
    18, 20, 21, 24, 25, 27, 30
    А дальше думайте сами.
    Ответ написан
    Комментировать
  • Как подсчитать вероятность каждого гола в матче, если вероятность одного и более голов - 60%, а двух и более - 25%?

    @Mercury13
    Программист на «си с крестами» и не только
    Вероятность ровно одного гола 0,35.
    Тогда получается, что среднее кол-во голов не менее 0,35·1 + 0,25·2 = 0,85.
    Вот и всё, что у нас есть при таких данных.
    Можно подобрать распределение, которое приближает наши голы — но распределением Пуассона всё это дело приближается плохо.
    UPD. Если коряво приблизить распределением Пуассона, получается цифра 0,9 или 1, но реальная цифра скорее ближе к 1, чем к 0,9. В общем, приближение Пуассоном явно неадекватно.
    Ответ написан
    1 комментарий
  • Почему неправильный вывод значений в printf?

    @Mercury13
    Программист на «си с крестами» и не только
    У меня вышло: 0 1074266112 0 1074266112
    Или, в 16-й системе, 0 40080000 0 40080000

    Связано это с такими вещами.
    1. Аргументы типа float записываются в стеке как double.
    2. На x86 порядок байтов Intel (обратный).
    3. Дробные числа хранятся без ведущего разряда (который всегда 1), в формате мантисса-порядок-знак (на порядке байтов Intel).
    4. Для единицы (xxx·20) порядок будет 011…11.

    3 = 1,10…02·2¹, и с учётом отброшенного ведущего разряда мантисса будет 10…0.
    Порядок 011…11 + 1 = 10…0.

    С учётом обратного порядка байтов double 3,0 будет выглядеть так
    • 6 нулевых байтов — мантисса
    • 0000.1000: нижние полбайта — это мантисса, верхние — уже порядок
    • 0100.0000: бит знака и ещё семь битов порядка

    Получается 00.00.00.00.00.00.08.40.
    Разбиваем на два куска памяти по 4 байта.
    [00.00.00.00] [00.00.08.40]
    Опять-таки не забудем, что у целых тоже обратный порядок байтов — и получается 0 и 40080000.
    Ответ написан
    Комментировать
  • Почему не переполняется float?

    @Mercury13
    Программист на «си с крестами» и не только
    Представьте, у нас десятичная арифметика с тремя значащими цифрами. Соответственно, сложение работает не более чем с пятью цифрами: три собственно значащих, слева на перенос и справа на округление. То, что получилось, в любом случае будет округлено до трёх.
     99900000000000
    +             1,00
     -----------------
     9990   →   9,99e13

    Если сделать второе слагаемое покрупнее, то будет
     99900000000000
    +   50000000000
     -----------------
     9995   →   1,00e14 → переполнение


    То есть вот что надо добавить, чтобы случилось переполнение: в зависимости от настроек сопроцессора или ulp(FLT_MAX) (ULP = Unit of Last Place — цена младшего разряда на данном порядке), или ulp(FLT_MAX)/2.
    Ответ написан
    Комментировать
  • Почему за время, равное периоду обращения угол поворота радиуса-вектора равен 2π? Откуда взялось π именно в этой формуле?

    @Mercury13
    Программист на «си с крестами» и не только
    Определение π: отношение длины окружности (P) к диаметру. То есть P=2πR.
    Определение радиана: дуга, равная радиусу. Из предыдущей формулы полный оборот = 2π радиан.

    Угловая скорость измеряется в угловых единицах в секунду. Из-за удобного преобразования из угловых единиц в линейные и наоборот в науке широко используют радианы, которых в полном обороте 2π.

    Если T = секунд/оборот, то T/2π = секунд/радиан, и 2π/T = радианы/секунду. Вот и всё.
    Хотите в градусах? Пожалуйста! T/360 = секунд/градус, и 360/T — градусы/секунду.
    Ответ написан
    Комментировать
  • Зачем во избежание XSS нужно указывать на каждой странице кодировку, если злоумышленник все равно может изменить ее?

    @Mercury13
    Программист на «си с крестами» и не только
    Совет несколько устаревший, и вот он для чего.
    Есть откровенно странная кодировка под названием UTF-7, которую по-чёрному использовали для XSS. Например:
    +ADw-script+AD4-alert(+ACc-utf-7!+ACc-)+ADw-+AC8-script+AD4-


    Задачей хакера было заставить браузер верить, что текст в UTF-7, прежде чем в HTML’е придёт маркер кодировки.
    IE11 поддерживал UTF-7, поддерживает ли Edge — не в курсе. Остальные браузеры отказались лет десять назад.

    Подробнее:
    https://nedbatchelder.com/blog/200704/xss_with_utf...

    Ну и будет просто некрасиво, если пользовательские данные появляются до маркера кодировки и браузер эту самую кодировку неверно опознал. Но хоть XSS не будет ни в одной кодировке, основанной на ASCII.
    Ответ написан
    3 комментария
  • Почему n^3 работает быстрей чем 2^n?

    @Mercury13
    Программист на «си с крестами» и не только
    Одно из двух.
    А. O(n³) и O(2n) — сложность каких-то алгоритмов.

    Читайте определение символов Ландау, и будет всё понятно.
    n³ = o(2n) при n→∞, что означает:

    lim{n→∞} n³ / 2n = 0.

    Что означает: при безграничном повышении n алгоритм, работающий за n³, будет иметь всё большее и большее преимущество перед конкурентом.

    Б. n³ и 2n — функции, которые нам надо вычислить.

    Сложность первой O(1) (всегда два умножения), сложность второй в общем случае — O(log n) (из-за того, что логарифмы от разных оснований отличаются на константу, а константу символы Ландау не учитывают, основание логарифма не пишут).

    UPD. Что значит «в общем случае»? Оценку могут увеличить различные второстепенные алгоритмы вроде выделения памяти и преобразования в десятичный вид, и уменьшить — то, что 2n можно вычислть сдвигом. Не забудьте, что сложность алгоритмов определяется при n→∞.
    Ответ написан
    Комментировать
  • Так ли необходима TN матрица для дизайна?

    @Mercury13
    Программист на «си с крестами» и не только
    «Среднепотолочный» IPS для дизайна лучше «среднепотолочного» TN, независимо от разрядности ЦАПа и разрешения.
    На IPS удобнее сидеть долго, и на TN принципиально нельзя настроить цветопередачу: меняется даже при повороте головы.

    UPD. Пишу «среднепотолочный», потому что видал плохие IPS на уровне TN’ов. Может, появились хорошие геймерские TN на уровне IPS’ов средней руки, я лично таких не видел.
    Ответ написан
  • Могут ли порты сломать материнку?

    @Mercury13
    Программист на «си с крестами» и не только
    Закорот USB обычно приводит к отключению компьютера, проверено на собственной шкуре.

    Ранние USB не выдерживали переполюсовку, это было реальной проблемой, когда разводка косички была не стандартизирована. Я с ней не сталкивался, первый комп с USB 2.0 у меня появился в 2008 и тогда вроде всё было не так мрачно.

    Наушникам закорот не вреден.

    UPD. Стандарт USB таков, что устройство ОБЯЗАНО выдерживать переполюсовку, но «гладко было на бумаге»…
    UPD2. Вставка наушников в компах определяется физическим присутствием штыря, в телефонах — как придётся.
    Ответ написан
    Комментировать
  • Насколько можно уменьшить длину строки уникального ключа, используя вместо 16-тиричных цифр 32-х знаковый алфавит?

    @Mercury13
    Программист на «си с крестами» и не только
    Длина ключа 128 бит.
    1 из 32 — это 5 бит.
    1 из 64 — это 6 бит.
    Вот и считайте. Например, 128:5 = 25,6, то есть 26 символов.
    Ответ написан
    Комментировать
  • Возможно смешной вопрос, но - в Delphi существует аналог "методов-раширений C#"?

    @Mercury13
    Программист на «си с крестами» и не только
    Метод-расширение: XE3+, helper class.
    docwiki.embarcadero.com/RADStudio/Tokyo/en/Class_a...

    Условная компиляция: ещё со времён Трубо-паскаля, директивы компилятора
    {$IFDEF DEBUG}
    {$ENDIF}
    docwiki.embarcadero.com/RADStudio/Tokyo/en/Conditi...
    Ответ написан
    Комментировать
  • Что такое бизнес логика android приложения?

    @Mercury13
    Программист на «си с крестами» и не только
    Бизнес-логика — это то, что программа делает с точки зрения пользователя. По-другому (и более понятно) — логика предметной отрасли.

    Например, у нас есть игра в шахматы. Бизнес-логика — это правила шахмат, принципы работы часов, команды «попросить ход назад», «сдаться» и «согласиться на ничью». Если нужно начинать не с исходной позиции, а с любой — то редактор.

    Крайне спорно, относить ли к бизнес-логике — анимация фигурок на манер Battle Chess и боты.

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

    @Mercury13
    Программист на «си с крестами» и не только
    Да хоть XnView.
    Tools → Batch processing.
    Ответ написан
    4 комментария
  • Правильно ли я спаял адаптер TRS в TRRS?

    @Mercury13
    Программист на «си с крестами» и не только
    Работает в новых мобилах. В старых надо поменять провода местами.

    Чтобы определить, где земля, где микрофон, берём подходящую гарнитуру и звоним. От земли до уха 30 Ом, от микрофона до уха — очень много (килоомы).
    Ответ написан
  • Зачем std::forward иметь две сигнатуры и явно указывать тип?

    @Mercury13
    Программист на «си с крестами» и не только
    std::forward предназначен для использования в шаблонах; без шаблона можно использовать старый добрый std::move.
    Кроме того, std::forward налажен таким образом, что шаблонный параметр надо указывать явно.

    Задача std::forward — передать далее простую или временную ссылку в зависимости от того, какую ссылку передаёт пользователь.
    Ответ написан
    6 комментариев