fa
Feedback
Dmitry Develop

Dmitry Develop

رفتن به کانال در Telegram

Этот канал в основном будет интересен новичкам в программировании и людям немного поопытнее. Здесь я буду делиться своими новостями и достижениями в программировании. Разработка, программирование; c++, gcc, g++, gnu, mingw; winapi, windows; vscode.

نمایش بیشتر
205
مشترکین
اطلاعاتی وجود ندارد24 ساعت
اطلاعاتی وجود ندارد7 روز
اطلاعاتی وجود ندارد30 روز
آرشیو پست ها
В процессе написания функции, которая будет вычислять количество цифр в числе, в варианте реализации через умножение (как бы вычисление логарифма), я столкнутся с двумя проблемами. Первая, это переполнение знакового числа при аргументе INT_MAX и умножении на 10, такой код является UB (undefined behavior), и в моём случае он проявился, как бесконечный цикл и зависание программы навечно. Вторая, это отсутствие изменения знака числа с отрицательного на положительное при аргументе INT_MIN. Из-за этого число оставалось отрицательным, проверка в цикле выдавала false, и это приводило к досрочному завершению работы функции и результату 0 знаков. abs(INT_MIN) возвращает INT_MIN, не знаю почему было сделано именно так вместо возвращения INT_MAX, но можно понять, почему так произошло. Всё дело в способе хранения знаковых чисел в языке C++ и допустимом диапазоне значений. Формат two`s complement (двойное дополнение) имеет следующий диапазон допустимых значений: [-2 ^ (N - 1), +2 ^ (N - 1) - 1]. Если рассмотреть 3 битную переменную, то у неё будет следующий диапазон значений: [-4, 3]. И если изменить знак минимального числа -4 для данного диапазона значений, то получится 4, что не может быть в нём представлено, всё просто. В конкретном случае для этой функции и с текущим алгоритмом нужно строго положительное число, INT_MIN и INT_MAX имеют одинаковое количество цифр, поэтому будет достаточно такого кода:
if(number == INT_MIN)
{
    number = INT_MAX;
}
Хотя в будущем хотелось бы отказаться от такого "костыля" и переписать алгоритм по-другому. Для реализации функции проверки переполнения выражения a * b, пришлось много искать информацию в google, вспомнить законы умножения, которые когда-то давно многим нам в школе рассказывали учителя. Вот если бы все учителя не только интересно рассказывали и объясняли материал, но и показывали где можно в реальной жизни применить эти знания на практике... Что ж, мне понадобился переместительный закон умножения (от перестановки множителей произведение не изменяется) и одно из тождественных преобразований (если обе части уравнения умножить или разделить на одно и то же число, не равное нулю, то получится уравнение равносильное данному). Прежде чем составлять уравнение или неравенство, надо задать вопрос или описать проблему. Будет ли произведение a и b больше c? С этого и начнём, пусть a будет первым числом, b будет вторым числом, а c будет INT_MAX, произведение больше которого не должно быть, чтобы не было UB. a * b > c a > c / b a > INT_MAX / b, где b != 0 Так же, чтобы не допустить деления на ноль, этот случай нужно обработать отдельно. Если один из множителей является нулём, произведение будет всегда ноль (это ещё одно математическое тождество), так что в таком случае можно просто добавить проверку на ноль и вернуть false. В итоге получается такая простая функция, которая поможет определить переполнение производного и избежать UB кода и сопутствующих проблем:
bool multiplyOverflow(int64_t a, int64_t b)
{
    return b != 0 && a > INT64_MAX / b;
}
(Спустя время после тестирования я обнаружил, что функция работает некорректно с отрицательными аргументами и при изменении их порядка, а ещё отрицательный результат проверяет на INT_MAX, хотя нужно на INT_MIN). Кто умный? Я умный? Да нее, сам я ничего не знал и не понимал). Вот буквально недавно столкнулся с проблемой. Начал разбираться, читать, анализировать, делать выводы. И тут бим-бим, бам-бам, бум-бум и пост родился, и типа я такой умный и всё знаю и понимаю)). Математика и другие точные науки наше всё). ссылка на канал | ссылка на группу

Бывает, необходимо m.2 диск новый или из другого ПК подключить, как внешний накопитель, чтобы напрямую установить на него windows, например, или сделать резервную копию данных. У меня есть два способа подключить диск с таким разъёмом: в мой ноутбук и ПК, у них обоих есть разъём m.2. Но разбирать каждый раз ноутбук или ПК не удобно и не безопасно. Я давно хотел себе внешний корпус для m.2 ssd, и сегодня настал тот день, когда я его купил. Можно сказать, я уже стал любителем техники от производителя ugreen, поэтому именно у него я и купил ugreen CM559. Так как ещё я любитель универсальности, я стал разбираться: какие бывают контроллеры, какие у них особенности поддержки интерфейсов m.2, какие есть ключи и в чём их особенность, всякий ли m.2 диск подойдёт в m.2 разъём, будет ли поддерживать его контроллер, в общем разбираться, как мне выбрать тот самый универсальный переходник. Начать решил со спецификации m.2, она предусматривает 12 ключей (или прорезей), интересуют меня не все, а только два из них: это B и M, и три их комбинации: B, M, B & M. Отличия между ними, если не учитывать контроллер, в поддерживаемом интерфейсе передачи данных, в скорости и в количестве линий. Ключ B: SATA и / или PCIe x2. Ключ M: SATA и / или PCIe x4. Ключ B + M: SATA и / или PCIe x2 (является самым универсальным). Однако, эта информация ничего не гарантирует, нужно смотреть спецификацию контроллера и его поддержку интерфейсов и разъёма m.2, что печально и создаёт одни трудности. Ugreen CM559 мне сразу понравился своим внешним видом и массивным радиатором, а так же поддержкой двух протоколов: PCIe и SATA с ключами M или B + M. Однако, тут очень важно учесть ревизию или номер продукта: есть два CM559, только один с P/N 90408 с контроллером RTL9210B, который поддерживает PCIe и SATA, и диск до 8 TB, а другой с P/N 15511 с контроллером JMS583, который поддерживает только PCIe и диск до 4 TB. Мне то ли повезло, то ли повлияло моё сообщение продавцу - не знаю, но мне пришёл CM559 именно 90408 модели, как я хотел. Как я уже говорил, мне он очень понравился по внешнему виду, тяжёленький такой, весь металлический, толстая крышка. Комплектация богатая: два 10 gbps type c на type c и type c на usb a провода, силиконовый чехол, отвёртка, термопрокладка и запасная защёлка, которую я сейчас обсужу отдельно. Насчёт пластиковой или резиновой защёлки, это какая-то лютая ошибка и просчёт инженеров ugreen, почему нельзя было просто сделать, как у всех, крепление на бонку и винт? Тем более, из-за особенностей расположения банок памяти и радиатора на моём ssd диске, они не дают защёлке полностью зафиксировать диск. Потом я найду бонку или гайку и винт, и по-нормальному зафиксирую диск вместо этого недоразумения. В остальном мне всё очень понравилось). (Ugreen, пришлите на обзор мне внешний корпус для 3,5 HDD 😏) ссылка на канал | ссылка на группу

Всё ещё мучаюсь с китайским велокомпьютером, о котором я говорил в своей группе. После замены провода и геркона он довольно долгое время работал, но потом снова перестал реагировать на датчик. Мультиметром в режиме прозвонки я проверил, что датчик на магнит реагирует и обрыва нигде нет. И что велокомпьютер работает, если пинцетом замыкать его два подпружиненных контакта. Полдня ещё мучился, но в итоге после всех тестов и экспериментов я обратил внимание на наличие сопротивления между проводами в несколько мегаом. Подумал, что это довольно большое сопротивление, чтобы микроконтроллер велокомпьютера реагировал на него или оно как-то мешало различать низкий и высокий логический уровень. Велокомпьютер, если что, считает оборот на переходе между логическими уровнями: с низкого на высокий или с высокого на низкий. Дальше подумал, а что, если этого сопротивления как раз хватает, чтобы велокомпьютер считывал низкое логическое значение, а когда датчик просаживает напряжение, получается то же низкое логическое значение, и следовательно перехода между уровнями нет и соответственно оборота колеса и какой-либо скорости. Немного времени спустя я вспомнил закон Ома из школьного курса физики и решил параллельно запаять резистор на 10 мегаом, чтобы при замыкании геркона его сопротивление поделилось на два. Таким образом я немного сдвинул напряжения разомкнутого и замкнутого геркона. В итоге я идеально угадал напряжения срабатывания: велокомпьютер снова заработал. ссылка на канал | ссылка на группу

Разбираюсь с ventoy, хочу научиться устанавливать его вручную без помощи их программы, то есть вручную записать загрузчик, вручную разбить диск и сделать другие этапы. Сначала было отчаянье, ничего не получалось, не работало, я ничего не понимал. Но сейчас постепенно начинают появляться успехи). Возможно, было бы хорошо записать видео и всё-всё рассказать, вместо текстового поста. Так будет интереснее и информативнее. ссылка на канал | ссылка на группу

Иногда в группе по vs code я видел желание некоторых людей в терминале скрыть длинный путь до виртуального окружения python или до папки проекта. У меня такого желания не было, но понять их я могу, всё-таки кастомизация это интересно и удобно. Например, чтобы вместо: C:\users\hecker\Desktop\my\very\deep\path\to\my\project> build.bat Стало такое: > build.bat Я видел решение то ли специфичное для python, то ли для конкретной оболочки или терминала, то ли только для linux или macos, типа сделать export какой-то переменной среды и всё получится. Но для windows cmd мне ни разу не попадалось такое решение, я даже представить не мог, можно ли это сделать и как это реализовано. Сейчас во время поиска информации для решения одной проблемы я нашёл решение для другой проблемы). Называется команда (или программа) prompt. В примере выше использовалась следующая команда: "prompt [$T$H$H$H] $G ". Почитать какие есть параметры можно по ссылке на документацию или при помощи команды "prompt /?". ссылка на канал | ссылка на группу

Использовать компилятор mingw в vs code довольно просто. Если путь до mingw/bin/ указан в переменных среды, то редактор кода и расширения могут автоматически найти g++.exe и получить все необходимые пути и настройки. Если же компилятор ещё не добавлен в переменные среды или не хочется по какой-либо причине, то можно просто указать полный путь до исполняемого файла компилятора и отладчика, так тоже всё будет работать. Если предыдущий компилятор можно просто скачать в виде 7z или zip архива, просто разархивировать в любое удобное место, а потом просто запустить gcc.exe или g++.exe без каких-либо дополнительных настроек и трудностей, то с компилятором от microsoft (MSVC, cl.exe) так просто не будет. Для установки MSVS отдельно от IDE visual studio придётся сначала скачать и запустить Build Tools for Visual Studio 2022, выбрать необходимые рабочие нагрузки (workloads). Но если после установки вы попробуете запустить компилятор cl.exe, то получите такую ошибку:
>cl.exe
"cl.exe" не является внутренней или внешней
командой, исполняемой программой или пакетным файлом.

>
Кстати, установка MSVC будет весить примерно 8 Гб, когда mingw примерно 0.5-2 Гб в зависимости от версии и наличия clang. Есть несколько способов использовать компилятор cl.exe в vs code: 1) Если вы компилируете вручную и только через терминал, то открываете терминал, запускаете bat файл "C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Auxiliary\Build\vcvarsall.bat" (у вас путь может отличаться) с аргументом x64. Готово, в данном конкретном терминале будут установлены все переменные среды и компилятор будет работать.
>"C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Auxiliary\Build\vcvarsall.bat" x64

**********************************************************************
** Visual Studio 2022 Developer Command Prompt v17.6.3
** Copyright (c) 2022 Microsoft Corporation
**********************************************************************
[vcvarsall.bat] Environment initialized for: 'x64'

>
2) Создать bat файл, в котором сначала будет запускаться vcvarsall.bat, а потом запускаться cl.exe с нужными аргументами, и tasks.json, в котором будет запускаться скрипт:
call "C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Auxiliary\Build\vcvarsall.bat" x64
cl.exe %*
{
    "version": "2.0.0",
    "tasks":
    [
        {
            "label": "run cl",
            "type": "shell",
            "command": "build.bat",
            "args":
            [
                "/Fe:", "main.exe",
                "main.cpp"
            ],
            "problemMatcher":
            [
                "$msCompile"
            ],
            "group":
            {
                "kind": "build",
                "isDefault": true
            }
        }
    ]
}
3) Запустить терминал, выполнить "C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Auxiliary\Build\vcvarsall.bat" x64, запустить code.exe (или его ярлык). Если я найду ещё какие-то другие способы, я дополню этот пост или сделаю отдельный, если помешает лимит символов. ссылка на канал | ссылка на группу

За несколько месяцев я увидел много разных интересных или полезных сайтов, которые добавил в свою подборку: Полезные ссылки для С++ разработчиков Это довольно старый пост, поэтому многие из вас могли его пропустить, даже при наличии ссылок на этот и многие другие посты в единственном закреплённом сообщении сверху. Какие ещё интересные или полезные сайты знаете вы, которых ещё нет в моей подборке? ссылка на канал | ссылка на группу

Ура, в моём списке portable программ теперь появился obs studio). Скачал программу в виде zip-архива, удалил все старые настройки в %appdata%, удалил уже установленную obs, разархивировал новую obs, запускаю её и вижу, что она сохранила все настройки в %appdata% — не порядок, что это за portable программа, которая выходит за границы своей папки. Немного поискал, почитал, и нашёл, что есть два пути: добавить аргумент командной строки "--portable" или создать в корне папки obs файл с названием "portable_mode.txt", и только после этого portable программа сохраняет настройки в распакованной папке. Инструкция: https://obsproject.com/forum/resources/obs-and-obs-studio-portable-mode-on-windows.359/ Такая же история была с vs code и vs codium, их zip версия тоже требует некоторых действий, чтобы не хранить свои файлы за пределами папки установки. ссылка на канал | ссылка на группу

Когда я только собрал новый ПК, у меня не было какого-либо sata или M.2 накопителя. Поэтому я windows установил на внешний usb ssd диск и пользовался так ПК некоторое время. В играх всё было хорошо и стабильно, но потом я начал замечать графические артефакты, которые были только в игре Dying Light. Некоторые случайные текстуры, которые от запуска к запуску были разными, заменялись на какую-то разноцветную сетку, и от расстояния немного менялись. В инвентаре так же вместо правильной текстуры могла быть какая-то другая: карта высот или что-то другое техническое. Переустановка игры, сброс настроек, обновление видеодрайвера и другие способы не помогли, но после покупки M.2 ssd проблема ушла. Как думаете, в чём была причина, кто сталкивался? У диска или контроллера забивался буфер, повредилась файловая система или какая-то другая причина? ссылка на канал | ссылка на группу

Я не слежу за IT новостями, но эту я совершенно случайно увидел, когда искал есть ли проблема сейчас скачать и установить MSVC в России. Winlator выпустили android приложение, которое позволяет запускать windows x86 и x86_64 приложения при помощи Wine и Box86/Box64 в операционной системе android. Официальный сайт разработчика У habr очень хорошо работает индексация в google: посту всего несколько часов, а он уже есть в поисковой выдаче. Новость на сайте habr ссылка на канал | ссылка на группу

Что-то меня vs codium начинает разочаровывать. Вроде тот же vs code, а трудностей больше. В vs code я в основном писал на C++, поэтому чуть больше понимаю как работает поддержка и интеграция этого языка, какие инструменты и расширения нужны, чем для других языков. С переходом на vs codium пришлось отказаться от привычных настроек и расширений и искать другие. Да, можно установить те же самые расширения через vsix, но с некоторые расширения проверяют название сборки и отказываются работать на неофициальной сборке vs code. Ладно, для vs codium и C++ я нашёл расширения, которые мне понравились и работают быстрее или дают больше возможностей по сравнению с расширением от microsoft: clangd (llvm-vs-code-extensions.vscode-clangd), Native Debug (webfreak.debug) или CodeLLDB (vadimcn.vscode-lldb). А вот в случае python я не сразу заметил подвох. Было установлено расширение python (ms-python.python), вроде всё работало как обычно, но классы и другие сущности из других модулей или файлов не подсвечивались и были белого цвета. При наведении очень долго редактор кода думает и спустя время показывает объявление и комментарий выделенного символа. Но перейти к определению не работает, подсказки не работают. Я даже не заметил, но расширения pylance не было и в vs codium он без модификаций работать из коробки не будет, его даже нет в списке расширений. Я думал расширение python самодостаточное и ему не нужно для работы какие-то дополнительные зависимости. По итогу для python я не нашёл какой-то нормальный аналог. Видимо, придётся вернуться к vs code, так как на python я пишу по работе и мне кроме подсветки синтаксиса нужны и другие привычные в IDE инструменты, как intellisense и другие. ссылка на канал | ссылка на группу

Вот так вот, занимаешься волонтёрством, следишь за спамом в чатах, удаляешь его или упоминаешь администраторов, а в один прекрасный день ты забанен в одной из групп). Изменение: Похоже, это всё произошло из-за нового бота, который меня и забанил. Администратор группы разобрался в ситуации и разбанил меня). ссылка на канал | ссылка на группу

Каким-то образом за последнюю неделю я стал популярным и мне начали писать с предложением сверстать сайт по фотографии и написать серверную сторону на node js + express. Вообще не имел опыта с этим стеком технологий, а на HTML так вообще более 5 лет не писал. Благо некоторый опыт в поиске и анализе информации помог мне базово разобраться как работает node js и какой код написать, а ещё было просто интересно). ссылка на канал | ссылка на группу