• Я усложняю или так правильно?

    yellow79
    @yellow79
    Senior Software Engineer
    По ссылке нет никаких принятых сообществом правил. Это просто чья-то фантазия, о чём писал Расс Кокс в issue данного репозитория.

    Интерфейсы в go принято объявлять там, где они будут использоваться, а не там, где создаётся структура реализующая данный интерфейс. У вас функции возвращают интерфейс, так в go не принято, функция может принимать значения и интерфейсы, но возвращать должна значения, исключение интерфейс error.

    Я бы вам рекомендовал ознакомиться с переводом советов от Дэйва Чейни, многое прояснится, там же есть ссылка на оригинал. Сам регулярно перечитываю данный материал
    Ответ написан
    Комментировать
  • Какой простенький менеджер паролей для оффлайна выбрать?

    Francyz
    @Francyz
    Photographer & SysAdmin
    keepass
    Ответ написан
    Комментировать
  • Как захостить телеграм бота на yandex cloud используя .Net?

    vabka
    @vabka
    Токсичный шарпист
    Вариантов несколько:
    1. Создать виртуальную машину в Compute Cloud с какой-нибудь убунтой и дальше по обычной инструкции:
    https://learn.microsoft.com/ru-ru/aspnet/core/host...
    Если у тебя там нет вебхуки, то достаточно будет просто выпилить всё что связано с nginx

    2. Используя Serverless Containers - нужно будет внимательно прочитать руководство от яндекса:
    https://cloud.yandex.ru/docs/serverless-containers...
    Там примеры даны для nodejs, но в принципе всё почти 1-в-1 переносится на .NET
    Dockerfile и так автоматически будет тебе добавлен при создании проекта.
    В случае телеграм-ботов этот способ подойдёт только в случае вебхуков

    3. Cloud functions:
    https://cloud.yandex.ru/docs/functions/lang/csharp/
    Совсем специфичный вариант и тоже проще именно с вебхуками подружить

    4. Через managed k8s кластер:
    https://cloud.yandex.ru/docs/managed-kubernetes/
    Подход ничем не различается от использования k8s не в яндексе. Создаёшь образ своего контейнера и через kubectl поднимаешь под.

    Я бы выбрал вариант с Compute Cloud, тк он сравнительно не дорогой (если сравнивать с managed k8s), достаточно гибкий (в отличие от cloud functions и serverless containers), и при этом простой (опять же, в отличие от serverless containers)
    Ответ написан
    1 комментарий
  • Реально ли заменить gulp на vite?

    bingo347
    @bingo347
    Crazy on performance...
    Есть сборщик gulp
    То что под gulp есть сборщики не делает сам gulp сборщиком. Gulp - task runner, запускалка задач. То есть сборщик под капотом может быть любой, хоть тот же vite.
    Теперь про vite, основная его фишка - это ускорение dev сборок и за счет этого ускорение самого процесса разработки. Достигает он это за счет того, что по сути не собирает Ваши исходники, а только применяет к ним трансформации, хотя зависимости все же собирает с помощью esbuild. При этом для прода вся сборка переадресуется на rollup. И то что в dev и в prod у Вас будут по сути разные сборщики изредка приводит к багам, которые воспроизводятся только в prod сборках. Rollup надо сказать тоже не идеален и на больших проектах порой ломает код, хоть и редко.
    Тут мое ИМХО и не более
    Rollup для сборки библиотек.
    Webpack для сборки конечных приложений.
    Vite интересен скорее интегрированным в него vitest, который позволяет писать unit тесты ближе к логике (привык я к хорошему в Rust).

    А по факту, смена сборщика чревата ошибками, сильными изменениями в структуре проекта и прочими подводными камнями.
    Если вопрос "стоит ли переезжать" появился только из hype-driven-development (погоней за модой по-простому), то ответ однозначный - нет, не стоит.
    Если же текущая сборка накладывает на Вас сильные ограничения и борьба с этими ограничениями занимает очень много времени, настолько, что потенциальные проблемы от смены сборки скорее всего займут времени меньше, то да, стоит переезжать.
    Ответ написан
    1 комментарий
  • Стоит ли углубленно изучать многопоточность, асинхронное и паралельное программирование?

    vabka
    @vabka Куратор тега .NET
    Токсичный шарпист
    Хочется ответить цитатой:
    Нужно бежать со всех ног, чтобы только оставаться на месте, а чтобы куда-то попасть, надо бежать как минимум вдвое быстрее!
    Ответ написан
    Комментировать
  • Какой хостинг выбрать для ТГ бота на .Net?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    Боты используют лонг-поллинг, поэтому DNS имя покупать/арендовать не надо, ровно как и платить за HTTP траффик приходящий (запросы). P.S. если ты на кол-беках делаешь, то надо.

    В данном случае подойдет любой хостинг, который поддерживает контейнеры.
    Такими могут служить:
    - Яндекс.Облако
    - Selectel
    - Hostinger
    - Digital Ocean

    и т.д. Просто вбиваешь - хостинг докер контейнеров.

    Если тебе нужно, хостить полноценное приложение (без докера), то круг выбора ссужается. Подсказать не могу.

    Лично я пользовался яндекс облаком - разворачивал полноценный Backend-Frontend на докеркомпозе. При регистрации дают бесплатные деньги (около 3тыс.)
    Ответ написан
    5 комментариев
  • Как с помощью смартфона проверить ширину лазерного реза?

    GavriKos
    @GavriKos
    С такой точностью не каждая линейка справится. Смартфон с его погрешностями и переменной средой с тонной преобразований и подавно.

    Самый правдоподобный вариант - взять смартфон, на пресе его сплющить до 0.5 мм с нужной точностью, и пихать в рез как щуп.
    Ответ написан
    2 комментария
  • Как проверить, что wireguard не заблокирован?

    ValdikSS
    @ValdikSS
    Самый простой вариант — отправить любой мусор первым UDP-пакетом, а затем устанавливать соединение.

    1. В конфигурационном файле клиента задать статичный ListenPort, например, ListenPort = 56789
    2. Выполнить
    sudo nping --udp --count 1 --data-length 16 --source-port 56789 --dest-port DEST_PORT DEST_IP

    3. Подключаться.

    https://ntc.party/t/wireguard/4968/6
    Ответ написан
    5 комментариев
  • Замыкания не существует?

    vabka
    @vabka
    Токсичный шарпист
    Замыкания есть.
    Только в спецификации это называется "Lexical Environment" (п 8.1)
    https://262.ecma-international.org/10.0/#sec-lexic...
    Вот ещё с MDN:
    https://developer.mozilla.org/en-US/docs/Web/JavaS...
    Ответ написан
    Комментировать
  • Как можно отрефакторить эти циклы?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Я так понял, вы там перебираете 8 соседей клетки на замкнутом поле (после последней строки идет первая, перед певрой идет последняя и так же для столбцов). Вам поможет опреация взятия остатка от деления (она же деление по модулю).

    Можно так:
    for (int dx = -1; dx <= 1; ++dx) {
      for (int dy = -1; dy <= 1; ++dy) {
        if (dx == 0 && dy == 0) continue;
        int nx = (i + dx + height) % height;
        int ny = (j + dy + SIZE) % SIZE;
        neighbours += proc_states[iter][nx * SIZE + ny];
      }  
    }


    Или можно завести
    const int dx[8] = {0, 1, 1, 1, 0, -1, -1, -1};
    const int dy[8] = { 1, 1, 0, -1, -1, -1, 0, 1};
    ...
    for (int k = 0; k < 8; ++k) {
      int nx = i + dx[k];
      int ny = j + dy[k];
      ...
    }


    Можно не заводить временные переменные и ужать код до двух строк.

    В конструкции (i + dx + SIZE) % SIZE есть лишний +SIZE, ибо -1 % SIZE == -1 и чтобы для 0 предыдущее значение было SIZE-1 надо прибавить лишний SIZE под модулем.
    Ответ написан
    Комментировать
  • Какую легковесную IDE выбрать для C++?

    vabka
    @vabka
    Токсичный шарпист
    Я бы попробовал VS Code.
    Он, конечно, жрёт сильно больше ресурсов, чем ST, но в нём работать будет гораздо комфортнее.
    + Остаётся ощущение легковесной среды, почти как от ST.
    Ответ написан
    2 комментария
  • Какую легковесную IDE выбрать для C++?

    Wohlstand
    @Wohlstand
    Инженер-программист С++
    Я сам для себя использую Qt Creator. По мне очень удобная и шустрая среда. Однако, хочу предупредить: в последних версиях присутствует модуль clangd (модель кода CLang): штука очень полезная, позволяющая находить различные косяки на лету без необходимости собирать проект, однако, она жрёт оперативку очень знатно. Поэтому, если машина слабая, то лучше отключить эту штуку. Мне лично среда ОЧЕНЬ нравится не только за её легковесность, но и за встроенный функционал по рефактрорингу (умному переименованию элементов кода, например, быстрому созданию тел функций и методов из прототипов сразу в нужном месте, и т.п.). Сравнивал я с Clion: последняя удобная по части быстрых подсказок и некоторой автоматизации по исправлению косяков, но по большей части менее удобная и невероятно тяжеловесная (да "здравствует" Java).
    Ответ написан
    Комментировать
  • Почему не возникает ошибка при вводе слова больше длины чем выделена память?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    должна возникнуть ошибка, но по факту её не возникает.

    А ты собери свою программу с санитайзером памяти (-fsanitize=address) и будет тебе ошибка.
    Обращение к памяти за пределами выделенных массивов -- это UB, отсутствие видимого эффекта -- допустимый вариант поведения при UB.
    Ответ написан
    Комментировать
  • Может ли быть MVC Без views?

    vabka
    @vabka
    Токсичный шарпист
    View - это не всегда то, что видит пользователь.
    Под View также вполне подпадает json-объект, который возвращает контроллер в случае апишки.


    Или для чистого API есть более подходящие архитектуры?

    MVC - это не то чтобы архитектура, строго говоря. Скорее паттерн, который может быть реализован по разному.
    У тебя есть какие-то объекты-представления, которые отдаются клиенту, какая-то модель предметной области, в которой описаны все ограничения и возможные операции, и контроллер, который гоняет из одного в другое.

    PS: Не нужно придумывать красивое название для архитектуры, чтобы писать нормально.

    А так вообще для вдохновения посмотри на:
    - Hexagonal architecture
    - Onion architecture
    - Clean architecture
    - Ports and adapters
    - N-tier architecture
    - Vertical slice architecture
    Ответ написан
    1 комментарий
  • Почему программа вообще заходит в цикл и почему тут же завершается при присваивании?

    Ответ для C++
    Не указав инициализатора при объявлении переменной num, вы используете default initialization. Почему? Смотрим по ссылке:
    Default initialization is performed in three situations:
    1) when a variable with automatic, static, or thread-local storage duration is declared with no initializer;

    Это как раз ваш случай.

    Далее:
    The effects of default initialization are:
    ......
    otherwise, no initialization is performed: the objects with automatic storage duration (and their subobjects) contain indeterminate values.

    Итого, согласно третьему описанному случаю, ваша переменная num содержит неопределённое значение (indeterminate value).

    Читаем далее:
    Use of an indeterminate value obtained by default-initializing a non-class variable of any type is undefined behavior (in particular, it may be a trap representation), except in the following cases:
    ...

    Ваш случай не попадает под исключения, следовательно вы схлопотали undefined behavior.

    Что такое undefined behavior? Это значит, что компилятор что хочет, то и генерирует на выходе:
    Compilers are not required to diagnose undefined behavior (although many simple situations are diagnosed), and the compiled program is not required to do anything meaningful.

    Вывод: не делать так, чтобы в программе был undefined behavior.

    Ответ для C
    Не указав инициализатора при объявлении переменной num, вы используете implicit initialization. Смотрим по ссылке:
    If an initializer is not provided:
    - objects with automatic storage duration are initialized to indeterminate values (which may be trap representations)
    ...

    Это как раз ваш случай.

    Читаем далее:
    If an indeterminate value is used as an argument to any standard library call, the behavior is undefined. Otherwise, the result of any expression involving indeterminate values is an indeterminate value (e.g. int n;, n may not compare equal to itself and it may appear to change its value on subsequent reads)

    Итого, у вас либо неопределённое поведение, либо неопределённое значение выражения, если там используется num. Значение в num может даже самопроизвольно меняться между операциями чтения из этой переменной.

    Вывод: не делать так, чтобы в программе встречалось использование indeterminate values.
    Ответ написан
    3 комментария
  • Для чего нужна двойная ссылка &&?

    Это называется rvalue reference
    Ответ написан
    Комментировать
  • Какая само мало требовательная ос кроме Chrome OS?

    leahch
    @leahch
    Я мастер на все руки, я козлик Элек Мэк :-)
    Alpine Linux наверное
    Ответ написан
    Комментировать
  • Сколько занимает в памяти Struct{}{}?

    не смотря на то что сама структура занимает 0 байт, конечно же есть накладные расходы на ее объявление, хранение указателя, ссылки и т.п. Так что это совсем не 'ничего', но использование struct{} имеет наименьшее потребление памяти https://medium.com/easyread/golang-series-empty-st...

    P.S. https://www.reddit.com/r/golang/comments/om990a/ho...
    Там есть интересное пояснение как работает empty struct в golang.
    Ответ написан
    Комментировать