Задать вопрос
  • Характеристика микроконтроллера. Что означает 32-разрядный? А если сказать 32-битный, это одно и тоже?

    15432
    @15432
    Системный программист ^_^
    Что означает 32 — разрядный
    Что микроконтроллер в своих машинных кодах может оперировать с 32-битными значениями. Размер регистров у него 32 бит.

    А если сказать 32 битный, это не одно ли и тоже?
    Да, одно и то же. 32 бита данных в один регистр помещается. 32 разряда в регистре.

    Память: 520 КБ памяти SRAM
    Внутри микроконтроллера встроена оперативная память типа SRAM объёмом 520 КБ

    Wi-Fi: 802.11 b / g / N, Bluetooth: v4.2 BR/EDR and BLE
    В чипе есть встроенный аппаратный модуль WiFi / BT, не нужно ничего дополнительного подключать для обеспечения беспроводной связи

    12-разрядный АЦП до 18 каналов
    Контроллер умеет измерять напряжение на своих 18 выводах с точностью до 12 бит, тем самым преобразуя аналоговый сигнал в цифровой

    2 × 8 бит ЦАПа
    Контроллер умеет формировать напряжение на двух своих выводах с точностью до 8 бит, тем самым создавая аналоговый сигнал
    Ответ написан
    25 комментариев
  • Что такое литерал объекта?

    Seasle
    @Seasle Куратор тега JavaScript
    Это вот это.
    {} // литерал объекта
    [] // литерал массива
    '' // литерал строки
    "" // тоже литерал строки
    `` // ещё один литерал строки
    /./ // литерал регулярного выражения (конкретно для примера - любого символа)
    Ответ написан
    Комментировать
  • Как указать что аргумент функции - это значение из массива?

    Kozack
    @Kozack
    Thinking about a11y
    const arr = ['name', 'age', 'surname'] as const;
    type arrKeys = typeof arr[number]
    
    const obj: {[k in arrKeys]?: any} = {}
    const prepareFn = (key: arrKeys) => { obj[key] };
    
    
    
    prepareFn('name')
    // @ts-expect-error
    prepareFn('name2')
    
    obj.name
    // @ts-expect-error
    obj.name2


    https://www.typescriptlang.org/play?#code/MYewdgzg...
    Ответ написан
    1 комментарий
  • Почему не работает v-for?

    @tema1302
    Помогло? Отметь решением!))
    Наверное потому, что вы не указали в теге script ровным счетом ничего, кроме подключенного vue.js? :))
    У вас банально нет экземпляра Vue))) Предлагаю вернуться к выводу "Hello World", там вы увидите, в чем ошибка.
    Ответ написан
    Комментировать
  • Как заставить функцию ждать выполнения события click?

    Обернуть в Promise и использовать async await как написал 0xD34F но есть одно но
    Для того чтобы это работало, функцию Func делают асинхронной async function Func() { а это значит что она не возвращает результат, она возвращает Promise, который вам тоже нужно обрабатывать асинхронно.
    Прежде чем лезть в асинхронщину, нужно понять что обратно оттуда вам не выбраться.

    Хорошенько подумайте прежде чем спрашивать "как подождать результат колбека?"
    https://habr.com/ru/company/mailru/blog/269465/
    https://developer.mozilla.org/en-US/docs/Web/JavaS...
    Ответ написан
    Комментировать
  • Не могу правильно сделать условие?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Слушать лучше событие не клавиатуры, а input — так не пропустите, например, вставку ctl+v

    Почему бы не заменять запятые точками?

    Наверное, допустим вообше лишь один знак: не может же быть числа 12.34.56? Тогда регулярка валидации примерно такая \d*[\.,]?\d+
    Ответ написан
  • Как сделать вывод очереди из чисел в обратном порядке через список?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Раз в обратном порядке выводить, то это не очередь, а стек получается.

    А дальше - просто добавляйте элементы в начало списка. Потом выводите весь список.
    Ответ написан
    Комментировать
  • Как сделать вывод очереди из чисел в обратном порядке через список?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    1. Реализовать список.
    2. Реализовать очередь на списке.
    3. Выполнить задание.
    Ответ написан
    1 комментарий
  • Что предпочтительнее insertAdjacentHTML или создавать элементы через createElement?

    y0u
    @y0u Куратор тега JavaScript
    dev
    Всё зависит от ситуации. Предпочтительнее createElement, так как в момент создания сохранится ссылка на элемент для последующей работы с ним. Если работать с этим элементом не нужно, например если с сервера пришел ответ в виде html строки и нужно всего лишь отобразить результат без дополнительных действий, то createElement здесь не нужен.
    Ответ написан
    Комментировать
  • Как указать тип возвращаемого значения?

    Lynn
    @Lynn
    nginx, js, css
    function foo<K extends keyof State>(key: K, callback: (value: State[K]) => void) {
        // ...
    }


    https://www.typescriptlang.org/play?#code/JYOwLgpg...
    Ответ написан
    Комментировать
  • Как массив превратить в связный список?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Давайте напишем функцию, принимающую массив и, опционально, имя свойства, которое должно будет содержать ссылку на следующий элемент списка. Чтобы можно было делать так:

    const list = arrToSinglyLinkedList(arr, 'child');

    Вариант раз - перебираем массив от конца к началу, на каждом шаге создаём копию текущего элемента массива, к которой будет добавлена ссылка на объект, полученный на предыдущем шаге:

    const arrToSinglyLinkedList = (arr, nextKey = 'next') =>
      arr.reduceRight((acc, n) => ({ ...n, [nextKey]: acc }), null);
    
    // или
    
    function arrToSinglyLinkedList(arr, nextKey = 'next') {
      let list = null;
    
      for (let i = arr.length; i--;) {
        const node = Object.assign({}, arr[i]);
        node[nextKey] = list;
        list = node;
      }
    
      return list;
    }

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

    const arrToSinglyLinkedList = (arr, nextKey = 'next', i = 0) =>
      i < arr.length
        ? Object.fromEntries([
            ...Object.entries(arr[i]),
            [ nextKey, arrToSinglyLinkedList(arr, nextKey, -~i) ]
          ])
        : null;
    
    // или
    
    function arrToSinglyLinkedList(arr, nextKey = 'next', i = 0, n = arr[i]) {
      const node = n ? {} : null;
      if (node) {
        for (const k in n) {
          if (n.hasOwnProperty(k)) {
            node[k] = n[k];
          }
        }
        node[nextKey] = arrToSinglyLinkedList(arr, nextKey, i + 1);
      }
    
      return node;
    }
    Ответ написан
    1 комментарий
  • Как перехватывать все вызовы console.log?

    0xD34F
    @0xD34F Куратор тега JavaScript
    const oldLog = console.log;
    
    console.log = function(...args) {
      // здесь можете что-нибудь сделать с переданными значениями
    
      oldLog(...args);
    };
    Ответ написан
    Комментировать
  • Что будет за использование чужих ассетов в проекте с открытым исходным кодом?

    zenwalker
    @zenwalker
    0xABADBABE
    Как я должна указывать права на эти самые ассеты и могу ли вообще их использовать?

    Здесь всё просто. Если автор этих произведений явно разрешает вам использовать их в той форме, в которой вы их используете — у вас нет проблем, если не разрешает — не можете. Если автор произведений и условия, по которым они лицензируются не известны, либо не оговорены — это просто интеллектуальная собственность, с которой вы ничего не можете делать. Иными словами, только смотреть там, где они сейчас находятся, но не копировать, не распространять и не использовать в личных произведениях.

    Репозиторий под открытой лицензией

    Вы упомянули, что используете изображения «с другого сайта» а их лицензия как раз может быть несовместима с вашей и запрещать такого рода использование и распространение.

    Какие последствия этого и можно ли как-то через упоминание автора избежать писем добра?

    Упоминание автора вы можете сделать только при условии, что он на это согласен: либо ввиде пункта в тексте лицензии (то есть там есть пункт а-ля «разрешено использовать при наличии ссылки на автора»), либо ввиде личного согласия автора о том, что он не будет иметь претензий к такой форме использования.

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

    P.S.: Не юрист.
    Ответ написан
    Комментировать
  • Как преобразовать имена свойств объекта из kebab-case в camelCase?

    0xD34F
    @0xD34F
    const toCamelCase = val =>
      val instanceof Array
        ? val.map(toCamelCase)
        : val instanceof Object
          ? Object.fromEntries(Object
              .entries(val)
              .map(n => [
                n[0].replace(/_+(.)/g, (m, g1) => g1.toUpperCase()),
                toCamelCase(n[1]),
              ])
            )
          : val;
    Ответ написан
    1 комментарий
  • В чем опасность регистрации/авторизации по номеру телефона?

    DevMan
    @DevMan
    обычно делается наоборот: сначала логин/пароль, затем уже код.
    иначе можно достаточно легко вас разорять на смс в никуда.

    архитектурно – это достаточно простая задача: пока не получили всех данных – ничего не делаем кроме показа формы.

    лично я терпеть не могу коды по смс, и считаю их антипаттерном: интернет может быть, а мобильной связи может не быть (у меня такое было не раз, и достаточно часто). лучше использовать другие способы otp.
    Ответ написан
    3 комментария
  • Что такое Доменный объект и Предметная область, простым языком?

    @deliro
    Предметная область — множество всех сущностей и их отношений в рамках контекста.

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

    В целом, это всё, что понимает твой менеджер и ничего, что он не понимает. В предметную область не входит, например, то, где именно ты хранишь данные — в mysql, в файлах, получаешь и сохраняешь их по API или хранишь их в redis'е. Но входит абстрактная сущность "хранилище". Она же — интерфейс репозитория. Репозиторий — это паттерн, который скрывает реализацию конкретного хранилища и который оперирует объектами доменной модели — элементами предметной области, как будто они хранятся у тебя в оперативной памяти. Например, у репозитория могут быть методы
    users.getByID(1234), users.save(user), users.getByEmail("hello@world")
    и т.п. Реализация репозитория определяет, куда именно сохранится этот user или откуда он скачается. В одну таблицу или в несколько. Нормализованные ли будут данные лежать в РСУБД или денормализованные. Именно здесь можно реализовать запись в master, а чтение с реплик. Или энкодинг в msgpack и передачу его по API куда-то. Или по gRPC. Потому что предметная область не должна перегружаться деталями реализации хранилищ.

    Про доменную модель:
    Словарь (он же хэш, он же ассоциативный массив) — это не доменная модель (хотя в некоторых функциональных языках может быть). Объект ORM — это тоже не доменная модель, хотя много где пытается ей быть. Доменная модель не зависит от конкретных фреймворков, баз данных, оптимизаций этих баз и прочих навязанных технической составляющей сущностей. Чаще всего это обычный класс на языке, на котором пишется код (или struct в случае Golang).

    Недавний пример:
    У сущности есть теги по категориям:
    {"category1": ["foo", "bar"], "cat2": ["foo", "hello", "world"]}
    . Их так удобно представлять на уровне предметной области, об этой структуре я могу общаться с заказчиком. Но в монге они сохраняются в виде
    ['category1%%foo', 'category1%%bar', 'cat2%%foo', 'cat2%%hello', 'cat2world']
    , потому что так их легче индексировать и быстрее по ним искать. Но это скрыто в реализации репозитория, доменная область про это ничего не знает. Это даёт сразу много преимуществ:
    1. Это очень просто тестировать, без всяких моков. Вместо репозитория с монгой я делаю репозиторий, который хранит сущности в оперативе. Всё, тесты бизнес-логики не зависят от инфраструктуры. А репозиторий монги я тестирую отдельно, мокая запросы в саму монгу или даже не мокая
    2. Это облегчает понимание всего продукта. Мозг не пытается составить полную картину, когда запросы в БД перемешаны с логикой, тут же сплиты-джойны строк, какие-то ещё низкоуровневые действия. Мозгу легко ориентироваться в пределах уровня. На уровне репозитория я думаю о том, как сущности хранить и доставать из хранилища, на уровне служб я думаю о том, как сущности взаимодействую и какие их них нужно извлечь/сохранить, но не как
    3. Рефакторинг очень простой. Даже теоретическая смена БД. Завтра с монги нужно будет перенести одну сущность на постгрес — без проблем. Я напишу один новый репозиторий, не затронув ни строчки кода за его пределами, кроме места, где он создаётся. При этом, остальные сущности могут лежать всё также в монге

    Доменные модели бывают богатыми и анемичными (но не бескровными). Оба подхода применяются и, имхо, не является антипаттерном ни один из них. Лично я использую анемичные модели, а всю бизнес-логику храню в службах.
    Ответ написан
    2 комментария
  • Почему функция не видна за пределами функции?

    IonDen
    @IonDen
    JavaScript developer. IonDen.com
    В ES5 нельзя было задать блочную область видимости.
    if (true) {
      var foo = 'bar';
    }
    
    console.log(foo); // bar


    В ES6 такая возможность появилась, но не для всех, а только для новых переменных
    if (true) {
      var foo = 'bar';
      let baz = 'biz';
      const alpha = 'beta';
    }
    
    console.log(foo); // bar
    console.log(baz); // ReferenceError: baz is not defined
    console.log(alpha); // ReferenceError: alpha is not defined


    По этому если вы присвоите функцию одной из переменных const/let то вы добьетесь того же эффекта:
    if (true) {
      const foo = () => {};
    }
    
    console.log(foo); // ReferenceError: foo is not defined


    Функциональная область видимости существовала всегда
    function foo () {
      function bar() {}
    }
    
    console.log(bar); // ReferenceError: bar is not defined
    Ответ написан
    Комментировать
  • Можно ли считать любой фрагмент программного кода алгоритмом?

    1. можно ли написать код, который не будет являться алгоритмом?

    Да. Например так работают декларативные языки, типа HTML, SQL, CSS.
    2. Является ли алгоритмом инструкция с единственным действием?

    Да.
    3. Является ли алгоритмом верстка и можно ли её вообще считать кодом?

    Кодом - да. Алгоритмом - нет, тк вёрстка не описывает шаги по достижению результата.
    Ответ написан
    Комментировать