Dmitry Develop
cmdPrompt.png
Иногда в группе по vs code я видел желание некоторых людей в терминале скрыть длинный путь до виртуального окружения python или до папки проекта.
У меня такого желания не было, но понять их я могу, всё-таки кастомизация это интересно и удобно.
Например, чтобы вместо:
Стало такое:
Я видел решение то ли специфичное для python, то ли для конкретной оболочки или терминала, то ли только для linux или macos, типа сделать export какой-то переменной среды и всё получится.
Но для windows cmd мне ни разу не попадалось такое решение, я даже представить не мог, можно ли это сделать и как это реализовано.
Сейчас во время поиска информации для решения одной проблемы я нашёл решение для другой проблемы).
Называется команда (или программа) prompt.
В примере выше использовалась следующая команда: "
Почитать какие есть параметры можно по ссылке на документацию или при помощи команды "
ссылка на канал | ссылка на группу
У меня такого желания не было, но понять их я могу, всё-таки кастомизация это интересно и удобно.
Например, чтобы вместо:
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 /?".ссылка на канал | ссылка на группу
👍1🔥1
Dmitry Develop
image_2024-08-23_12-34-30.png
Разбираюсь с ventoy, хочу научиться устанавливать его вручную без помощи их программы, то есть вручную записать загрузчик, вручную разбить диск и сделать другие этапы.
Сначала было отчаянье, ничего не получалось, не работало, я ничего не понимал.
Но сейчас постепенно начинают появляться успехи).
Возможно, было бы хорошо записать видео и всё-всё рассказать, вместо текстового поста.
Так будет интереснее и информативнее.
ссылка на канал | ссылка на группу
Сначала было отчаянье, ничего не получалось, не работало, я ничего не понимал.
Но сейчас постепенно начинают появляться успехи).
Возможно, было бы хорошо записать видео и всё-всё рассказать, вместо текстового поста.
Так будет интереснее и информативнее.
ссылка на канал | ссылка на группу
🔥3
Dmitry Develop
IMG_20240823_225928.jpg
Всё ещё мучаюсь с китайским велокомпьютером, о котором я говорил в своей группе.
После замены провода и геркона он довольно долгое время работал, но потом снова перестал реагировать на датчик.
Мультиметром в режиме прозвонки я проверил, что датчик на магнит реагирует и обрыва нигде нет.
И что велокомпьютер работает, если пинцетом замыкать его два подпружиненных контакта.
Полдня ещё мучился, но в итоге после всех тестов и экспериментов я обратил внимание на наличие сопротивления между проводами в несколько мегаом.
Подумал, что это довольно большое сопротивление, чтобы микроконтроллер велокомпьютера реагировал на него или оно как-то мешало различать низкий и высокий логический уровень.
Велокомпьютер, если что, считает оборот на переходе между логическими уровнями: с низкого на высокий или с высокого на низкий.
Дальше подумал, а что, если этого сопротивления как раз хватает, чтобы велокомпьютер считывал низкое логическое значение, а когда датчик просаживает напряжение, получается то же низкое логическое значение, и следовательно перехода между уровнями нет и соответственно оборота колеса и какой-либо скорости.
Немного времени спустя я вспомнил закон Ома из школьного курса физики и решил параллельно запаять резистор на 10 мегаом, чтобы при замыкании геркона его сопротивление поделилось на два.
Таким образом я немного сдвинул напряжения разомкнутого и замкнутого геркона.
В итоге я идеально угадал напряжения срабатывания: велокомпьютер снова заработал.
ссылка на канал | ссылка на группу
После замены провода и геркона он довольно долгое время работал, но потом снова перестал реагировать на датчик.
Мультиметром в режиме прозвонки я проверил, что датчик на магнит реагирует и обрыва нигде нет.
И что велокомпьютер работает, если пинцетом замыкать его два подпружиненных контакта.
Полдня ещё мучился, но в итоге после всех тестов и экспериментов я обратил внимание на наличие сопротивления между проводами в несколько мегаом.
Подумал, что это довольно большое сопротивление, чтобы микроконтроллер велокомпьютера реагировал на него или оно как-то мешало различать низкий и высокий логический уровень.
Велокомпьютер, если что, считает оборот на переходе между логическими уровнями: с низкого на высокий или с высокого на низкий.
Дальше подумал, а что, если этого сопротивления как раз хватает, чтобы велокомпьютер считывал низкое логическое значение, а когда датчик просаживает напряжение, получается то же низкое логическое значение, и следовательно перехода между уровнями нет и соответственно оборота колеса и какой-либо скорости.
Немного времени спустя я вспомнил закон Ома из школьного курса физики и решил параллельно запаять резистор на 10 мегаом, чтобы при замыкании геркона его сопротивление поделилось на два.
Таким образом я немного сдвинул напряжения разомкнутого и замкнутого геркона.
В итоге я идеально угадал напряжения срабатывания: велокомпьютер снова заработал.
ссылка на канал | ссылка на группу
🤔2👻1
👍1
Dmitry Develop
cm559ugreen1.jpg
Бывает, необходимо 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 😏)
ссылка на канал | ссылка на группу
У меня есть два способа подключить диск с таким разъёмом: в мой ноутбук и ПК, у них обоих есть разъём 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 диске, они не дают защёлке полностью зафиксировать диск.
Потом я найду бонку или гайку и винт, и по-нормальному зафиксирую диск вместо этого недоразумения.
В остальном мне всё очень понравилось).
ссылка на канал | ссылка на группу
В процессе написания функции, которая будет вычислять количество цифр в числе, в варианте реализации через умножение (как бы вычисление логарифма), я столкнутся с двумя проблемами.
Первая, это переполнение знакового числа при аргументе
Вторая, это отсутствие изменения знака числа с отрицательного на положительное при аргументе
Из-за этого число оставалось отрицательным, проверка в цикле выдавала false, и это приводило к досрочному завершению работы функции и результату 0 знаков.
Всё дело в способе хранения знаковых чисел в языке C++ и допустимом диапазоне значений.
Формат two`s complement (двойное дополнение) имеет следующий диапазон допустимых значений:
И если изменить знак минимального числа -4 для данного диапазона значений, то получится 4, что не может быть в нём представлено, всё просто.
В конкретном случае для этой функции и с текущим алгоритмом нужно строго положительное число,
Хотя в будущем хотелось бы отказаться от такого "костыля" и переписать алгоритм по-другому.
Для реализации функции проверки переполнения выражения a * b, пришлось много искать информацию в google, вспомнить законы умножения, которые когда-то давно многим нам в школе рассказывали учителя.
Вот если бы все учителя не только интересно рассказывали и объясняли материал, но и показывали где можно в реальной жизни применить эти знания на практике...
Что ж, мне понадобился переместительный закон умножения (от перестановки множителей произведение не изменяется) и одно из тождественных преобразований (если обе части уравнения умножить или разделить на одно и то же число, не равное нулю, то получится уравнение равносильное данному).
Прежде чем составлять уравнение или неравенство, надо задать вопрос или описать проблему.
Будет ли произведение a и b больше c?
С этого и начнём, пусть a будет первым числом, b будет вторым числом, а c будет
Так же, чтобы не допустить деления на ноль, этот случай нужно обработать отдельно.
Если один из множителей является нулём, произведение будет всегда ноль (это ещё одно математическое тождество), так что в таком случае можно просто добавить проверку на ноль и вернуть false.
В итоге получается такая простая функция, которая поможет определить переполнение производного и избежать UB кода и сопутствующих проблем:
(Спустя время после тестирования я обнаружил, что функция работает некорректно с отрицательными аргументами и при изменении их порядка, а ещё отрицательный результат проверяет на INT_MAX, хотя нужно на INT_MIN).
Кто умный?
Я умный?
Да нее, сам я ничего не знал и не понимал).
Вот буквально недавно столкнулся с проблемой.
Начал разбираться, читать, анализировать, делать выводы.
И тут бим-бим, бам-бам, бум-бум и пост родился, и типа я такой умный и всё знаю и понимаю)).
Математика и другие точные науки наше всё).
ссылка на канал | ссылка на группу
Первая, это переполнение знакового числа при аргументе
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 > ca > c / ba > 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).
Я умный?
Да нее, сам я ничего не знал и не понимал).
Вот буквально недавно столкнулся с проблемой.
Начал разбираться, читать, анализировать, делать выводы.
И тут бим-бим, бам-бам, бум-бум и пост родился, и типа я такой умный и всё знаю и понимаю)).
Математика и другие точные науки наше всё).
ссылка на канал | ссылка на группу
❤2
Dmitry Develop
ссылка на канал | ссылка на группу
Уже прошёл месяц с того момента, как я открыл issue в github репозитории расширения code lldb для vs code, но мне так никто и ничего не ответил.
https://github.com/vadimcn/codelldb/issues/1127
Суть проблемы в том, что при использовании LLDB на windows 10 в vs code во время отладки кнопка изменения значения переменной неактивна, если переменная типа псевдонима из stdint.h (cstdint), а если стандартного типа, то всё работает, как ожидается.
Через консоль отладки значения переменных обоих типов спокойно изменяются.
Такое наблюдается что на одном расширении, что на втором, если использовать LLDB.
Если вместо LLDB использовать GDB, проблема пропадает.
Проблема в vs code, в расширении, в отладчике?
Подскажите, с чего мне начать, что почитать, что попробовать?
Может, есть какой-то ключ для отладчика?
ссылка на канал | ссылка на группу
https://github.com/vadimcn/codelldb/issues/1127
Суть проблемы в том, что при использовании LLDB на windows 10 в vs code во время отладки кнопка изменения значения переменной неактивна, если переменная типа псевдонима из stdint.h (cstdint), а если стандартного типа, то всё работает, как ожидается.
Через консоль отладки значения переменных обоих типов спокойно изменяются.
Такое наблюдается что на одном расширении, что на втором, если использовать LLDB.
Если вместо LLDB использовать GDB, проблема пропадает.
Проблема в vs code, в расширении, в отладчике?
Подскажите, с чего мне начать, что почитать, что попробовать?
Может, есть какой-то ключ для отладчика?
ссылка на канал | ссылка на группу
👍1