Задать вопрос
  • Как хранится c++ struct в памяти и как определить размер вручную?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    поэтапаный алгоритм определения размера

    Если откинуть тонкости связанные с битовыми полями, то алгоритм простой. Обозначим выравнивание всей структуры A, размер всей структуры S, размер головы структуры из i полей Si, размер i-го поля SFi, выравнивание i-го поля AFi, операцию округления X вверх до ближайшего кратного Y R(X, Y) (т.е., например, R(4, 4) = 4, R(5, 4) = 8), количество полей структуры n. Тогда

    S0 = 0
    Si = R(Si - 1, AFi) + SFi
    A = maxi = 1..n(AFi)
    S = R(Sn, A)

    Второй и третий шаги гарантируют, что в выравненной структуре каждое поле тоже выравнено.
    Четвёртый шаг гарантирует, что если такие структуры поместить в массив, то все элементы массива будут одинаково выравнены.

    Разумеется всю эту математику имеет смысл делать если пишешь компилятор, во всех остальных случаях размеры и выравнивания структур можно узнать непосредственно у компилятора.
    Ответ написан
    Комментировать
  • Почему умножение матрицы 8x8 медленнее чем 10x10?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Скорее всего тут дело в кеше процессора. После первых запусков так получилось, что данные оказались в кеше.

    Вообще, писать бенчмарки - очень сложно. Надо сначала прогонять тест несколько раз и отбрасывать результаты, а уже потом мерять. Надо быть очень внимательным, если вы запускакте разные тесты в одной программе подряд: результаты работы одного теста могут повлиять на остальные.

    Ну и главное, выполнять такое короткое действие всего один раз - это вообще моветон. Надо выполнить его сотню тысяч раз и потом общее время делить на количество запусков. Иначе вы меряете случайный шум в основном. Может тут вам просто все время (не)везет и вот так третий тест оказывается быстрее остальных.
    Ответ написан
    3 комментария
  • Как в С++ проверить double на целочисленность?

    @vanyamba-electronics
    При обработке вещественных чисел следует определиться, которая точность вас устраивает в данном случае.
    В идеале 1.0 - это явно целочисленная дробь, но на практике возникает вопрос: а 0.99999999 - это достаточное приближение, чтобы принимать это число за 1.0?
    Поэтому функция должна иметь параметр точности:
    bool is_integer(double val, double precision = 0.000005)
    {
        return abs(val - round(val)) < precision;
    }
    Ответ написан
    2 комментария
  • Нужно ли взять деньги за оценку больших ТЗ веб-разработчику?

    Нужно. Назови это чем-то типа "анализ и уточнение технического задания, и составление плана работ " назначь цену изходя из размера ТЗ и количества необходимых созвонов и доработок.

    Дай скидку, если в итоге решите сотрудничать.

    В случае возражений - проведи аналогию с реальным миром: замер окон, геодезические работы перед стройкой, итд.

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

    @pumpkinm
    Добавить start """ """
    runas.exe /user:admin /savecred "cmd /C start """ """ """C:\Program Files\Corel\CorelDRAW Graphics Suite 2022\Programs64\CorelDRAW.exe"""
    Ответ написан
    1 комментарий
  • Где могла закрасться ошибка?

    wataru
    @wataru Куратор тега Алгоритмы
    Разработчик на С++, экс-олимпиадник.
    В вашем рассуждении ошибка в том, что вы не домножаете условную вероятность 2/6 на вероятность условия. Вы же полную вероятность считатете а P(A) = P(A|B)*P(B)+P(A|!B)*P(!B). У вас P(A|B) = 0, как вы заметили - если они встретились в первом туре, то во втором уже не встретятся. Но все-равно надо 2/6 домножать на P(!B) - вероятность того, что они не встретились в первом туре. А это 1-1/7 = 6/7. В итоге получается все то же 2/6*6/7=2/7.

    Но рассуждения автора проще. Можно рассмотреть все независимые элементарные исходы "где в сетке оказался второй игрок". Их 7, они равновероятны по симметрии. Дальше надо домножить на вероятность, что они начиная так встретятся (выиграют свои матчи).
    Ответ написан
    4 комментария
  • Почему файл из github постоянно на ~37% больше, чем указан?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    А вы сами то открывали файл по ссылке из data.git_url?
    Там отдаётся JSON с файлом, закодированным в Base64.
    В Base64 каждые 6 бит исходного файла кодируются одним символом (8 бит) текста, а после каждых 60 символов добавляется символ переноса строки. Вот и получаем ~ (2/6 + 8/360) = 35.6% дополнительно к объёму.
    Если хотите получить файл сам по себе, то используйте поле download_url.
    Ответ написан
    4 комментария
  • Как восстановить каталог с git репозиторием на ext4 (в linux)?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Сделай снова git clone с remote.
    Ответ написан
    Комментировать
  • Что делать, если начальство запрещает публиковать код на github?


    1. Как тогда другие программисты имеют свое портфолио?

    Свои проекты и вклад в проекты с открытым исходным кодом - это вариант раз.
    Или не имеют - это вариант два.

    Портфолио на гитхабе - опциональная штука, которую может мельком один работодатель из десяти глянет.
    Хороший гитхаб не заменяет интервью. А при хорошем прохождении интервью - гитхаб легко игнорится.
    (Если спросили - просто говори что был занят рабочими задачами и не до пет проектов было)

    2. Что именно нужно публиковать на гитхаб? Весь проект или именно то, что внес лично я?

    Не надо вообще публиковать то, на что ты не имеешь права. Код, который ты написал для заказчика принадлежит заказчику.
    Если ты его опубликуешь - это будет очень жирный красный флаг для других работодателей, что на работу тебя брать нельзя.


    3. Я правильно понял, что у меня не остается выбора как делать свои личные проекты и загружать их на GitHub?

    Повторюсь, что ты можешь и не делать их вообще.
    У большинства разработчиков - гитхаб это просто помойка, в которой ничего интересного нет.


    4. Тогда что если я делаю игру с другом? Как в будущем работодатель поймет что именно из проекта сделал я?

    Работодатель не будет это смотреть скорее всего.
    Ну и ты можешь на словах описать, что делал - автор же в коммитах написан.

    Часть проекта ценности вообще иметь не будет

    5. Что будет если загрузить на гитхаб проект, ну или ту часть, которую делал я, наперекор начальству, и скрыть его от посторонних, а потом перед собеседованиям открыть?

    Читай п2. Тебе скорее всего отказ дадут, тк никому не нужен разраб, который сливает защищённый код.
    Ответ написан
    2 комментария
  • Откуда взялся const?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    const char* взялся вот отсюда: "Hello world". Это строковая константа в коде. Ее программа менять никак не может. Компилятор ее засовывает в read only секцию исполняемого файла.
    Ответ написан
    Комментировать
  • C выдаёт ошибку при попытке сравнить 2 int?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Отключити оптимизацию и соберите проект в режиме Debug.

    У вас там Undefined Behavior и, очевидно, проблемы работы с памятью. Ошибку вы замечаете не там, где она, собственно, происходит.

    Сразу вижу проблему вот тут:
    strcat(result, alph[mod]);

    Тут вы приписываете строку с адресом alph[mod] к строке по адресу result. Обратите внимание, не строку, начинающуюся с позиции mod в массиве alph, а строку с адресом вроде кода символа 'F'.

    Ну и, вряд ли вы хотите часть строки alph скопировать в result. Плюс у вас в alph[] нет места под терминирущий 0, поэтому strcat вызовет переполнение буфера. Вам там надо дописывать один символ в конец result. Библиотечных функций именно для этого нет. Заведите счетчик количества символов в ответе и тупо переписывайте значение result[cnt].
    Ответ написан
    2 комментария
  • Как выбрать монитор для программиста?

    Mike_Ro
    @Mike_Ro
    Python, JS, WordPress, SEO, Bots, Adversting
    - Flicker Free.
    - Вместо IPS > VA матрицу (посмотрите глазами на оба, сразу поймете в чем разница).
    - Не менее 24 дюймов (желательно больше, чтобы был именно широким) и разрешение 2/4к.
    Из вашего личного опыта, при работе к какими мониторами у вас напрягались глаза, а с какими нет?

    Если свет вокруг монитора будет аналогичен яркости монитора, то глаза гораздо неменьше напрягаются.
    Ответ написан
    Комментировать
  • Как передать пул белых IP-адресов через интернет с разными провайдерами?

    @dronmaxman
    VoIP Administrator
    AS ("автономная система") не привязана к адресу, соответственно можно договориться с провайдером и настроить пиринг (подключение) на другой локации.

    Другой вопрос, если IP адреса из этой AS необходимы на обоих локациях (адресе1 и адресе2).
    Тогда да, тебе нужен тунель (VPN или GRE или VxLAN или QinQ или ISP privacy vlan) между локациями поверх интернета.

    QinQ или ISP privacy vlan - наверное самый простой вариант в реализации с твоей стороны, надо задать вопрос провайдеру предоставляет ли он такую услугу (протащить через свою сеть нужных тебе vlan)
    Ответ написан
    Комментировать
  • Как передать пул белых IP-адресов через интернет с разными провайдерами?

    SignFinder
    @SignFinder
    Wintel\Unix Engineer\DevOps
    Автономная система не привязана к провайдеру и может быть перенаправлена к любому провайдеру (и соответственно к вам через другого провайдера) анонсом соответствующих BGP маршрутов https://datatracker.ietf.org/doc/html/rfc7705
    Ответ написан
    Комментировать
  • Стоит ли читать лутца в 2023?

    sergey-gornostaev
    @sergey-gornostaev
    Седой и строгий
    Лучше Лутца ещё ничего не написали. Да и Python за годы с последнего издания сильно не поменялся.
    Ответ написан
    Комментировать
  • Как проанализировать ошибку в установке ssl соединения?

    paran0id
    @paran0id Куратор тега Linux
    Умный, но ленивый
    openssl s_client -connect securepayments.sberbank.ru:443

    в половине случаев получаем:
    $ openssl s_client -connect securepayments.sberbank.ru:443
    CONNECTED(00000003)
    write:errno=104
    ---
    no peer certificate available
    ---
    No client certificate CA names sent
    ---
    SSL handshake has read 0 bytes and written 338 bytes
    Verification: OK
    ---
    New, (NONE), Cipher is (NONE)
    Secure Renegotiation IS NOT supported
    Compression: NONE
    Expansion: NONE
    No ALPN negotiated
    Early data was not sent
    Verify return code: 0 (ok)
    ---


    во второй половине - Verify return code: 19 (self-signed certificate in certificate chain), что означает отсутствие корневого сертификата

    такое впечатление, что там балансировщик кидает то на хороший сервер, то на плохой
    Ответ написан
    2 комментария
  • Задания с CodeForces. Вариант решения есть, но не подходит для всех тестов. Может неправильно понял реализацию решения?

    Alexandroppolus
    @Alexandroppolus
    кодир
    тебе надо отдельно рассмотреть D > 0 и D < 0, потому что в первом кейсе сначала едем вверх по 3 этажа и потом чуть вниз по 2, а во втором - сначала вниз по 2 этажа, потом чуть вверх по 3

    далее, в первом случае могут быть 3 кейса, по остатку от деления D на 3. Если 0, то "-2" не понадобится, если 1, то можно будет обойтись одним нажатием на "-2", иначе двумя. Для D<0 - аналогично.

    и всё можно решить формулами, без цикла, за O(1)
    Ответ написан
    5 комментариев
  • Как на одном IP-адресе прикрутить несколько доменов?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    SRV вам тут не поможет, браузеры с SRV-записями не работают.
    Вам нужно в DNS сделать CNAME-запись для admin.qwerty.ru на qwerty.ru, на сайте добавить admin.qwerty.ru как псевдоним и сделать перенаправление с этого адреса на qwerty.ru:8006.
    Ответ написан
    Комментировать
  • Как исправить данную оишбку?

    @dima20155
    you don't choose c++. It chooses you
    Проблема в операторе []
    А именно в условии
    while (current->next != NULL)
    Должно быть
    while (current != NULL)

    Также у вас данный оператор не возвращает ничего в случае, индекс больше, чем количество элементов в листе, а также не проверяет условие по типу:
    index < size

    Помимо этого у вас ещё много проблем в коде, но если вы начинающий, то что же, учитесь, все впереди. Попробуйти найти себе человека, который сможет скорректировать/отревьюить ваш код, потому в текущем виде он весьма плохо может работать, из-за сырых указателей, таких же сырых выделений памяти, отсутствия её освобождения, непонятно зачем наличие оператора [] у linked list (в стандартной библиотеки их нет не случайно и нужна веская причина чтобы пользоваться оператором [] в linked list )
    Ответ написан
    1 комментарий
  • Какой VPN выбрать?

    xenon
    @xenon
    Too drunk to fsck
    Я бы все-таки предпочел wireguard и пока что не слишком волновался насчет того, что его блокируют - это все легко обходится. Раз у вас свой сервер, то решается все легко.

    Думать о том, как там будет через 3 года, и готовиться обязательно к самому худшему сценарию пока не нужно. А то потратите силы на подготовку к самому худшему, а он не случится - обидно будет. Но даже если случится, через три года если что и переставите, а там может или шах или ишак. А все это время лучше жить с быстрым VPN, пользоваться которым одно удовольствие. И ставится он "красиво", системным способом, а не как Outline.

    У wg очень простая сигнатура для DPI, поэтому легко его детектят и блочат. Но для этой проблемы несколько вариантов решений.

    Решение 1 от ValdikSS : Сначала с того же клиентского порта и на тот же серверный "пробить" соединение другим пакетом (без сигнатуры). Так как для DPI этот пакет - часть соединения, то оно уже не похоже на wg. А вот wg сервер просто проигнорирует первый мусорный пакет, выбросит, а на второй ответит.

    wg0.conf: ListenPort = 56789

    sudo nping --udp --count 1 --data-length 16 --source-port 56789 --dest-port DEST_PORT DEST_IP


    Как проверить, что wireguard не заблокирован?
    https://ntc.party/t/wireguard/4968/6
    (обратите внимание на то, что на клиенте нужно зафиксировать ListenPort)

    2. Тот же самый эффект, но без ручного запуска nping каждый раз (просто автоматизируем то же решение):
    в конфиг wg (wg0.conf или какой у вас) просто пишем:
    [Interface]
    PrivateKey = ....
    Address = 10.9.0.2/24
    ListenPort = 12345
    
    PreUp = nping --udp --count 1 --data-length 16 --source-port 12345 --dest-port 12345 123.123.123.123


    3. Можно чуть больше заморочиться, и замаскировать (обфусцировать) wg трафик через netfilter - если на клиенте и сервере закодировать его с одинаковым ключом (и самым простым шифрованием) - DPI его не видит.
    https://github.com/infinet/xt_wgobfs

    В общем, wireguard сам по себе искаропки не умеет "прятаться" (это и не его задача), но если нужно его спрятать - это делается в две минуты. (Ну первый раз подольше, пока разбираешься). Силы зла и негетеросексуализма и так уже вынуждены применять дорогой и тяжелый DPI для блокировки очень простого VPN. Блокировать обфусцированный, как в этих примерах - на порядок (порядки) сложнее (если вообще возможно) и точно неэффективно - огромные затраты, чтоб заблочить VPN всего паре десятков тысяч ITшников, которые тут же как-то иначе наладят себе VPNы (в крайнем случае перейдут на Outline или что-то еще) - бессмысленно, поэтому, думаю, никогда и не случится.
    Ответ написан
    Комментировать