• Как сделать рекурсию в js await функции?

    Aetae
    @Aetae Куратор тега JavaScript
    Тлен
    При чём тут рекурсия? Обычный цикл:
    let result = false;
    while(result === false) {
      result = await this.download();
    }
    Ответ написан
    3 комментария
  • Как сделать ограниченные права на операции по SSH с помощью iptables?

    @pfg21
    ex-турист
    принцип работы ssh - туннель.
    ssh-клиент c stdin забирает данные и перенаправляются на сервер.
    на ssh-сервере принимаемые данные скармливаются подключенной программке на stdin, а выхлоп c stdout забирается и отправляется клиенту.
    ssh-клиент передает полученные по тунелю символы на stdout.
    ssh может запустить любую програмку, если отсуствует, запускает шелл.

    ssh до сиреневой лампочки какие данные пересылаются. если хочешь фильтровать данные то делай это отдельн от ssh.
    к примеру напиши свой api который будет принимать только правильные команды
    Ответ написан
    1 комментарий
  • Как передать на бекенд требования к API?

    @Vitsliputsli
    Многие фронтендеры относятся к беку, как к некой обертке для работы с базой данной. Когда такие становится лидом команды и начинают диктовать свои требования беку, начинается ад, проект даже с простым беком превращается в нечто монструозное, разваливающиеся на ходу. Но, так как снаружи бек не виден, руководство считает, что дело в отдельных тупых бек-разработчиках, которые артачатся, не хотят работать и увольняются.
    Судя по вашим фразам, вы скорее всего один из них. Так как уверены, что приложение - это то, что на фронте, что api - это хрень, которая завязана на отображении информации на фронте, что разработчики бека не нужны при разработке архитектуры и вообще пофиг, что они там делают, главное чтобы давали то, что хочет фронт.
    Но, раз вопрос задан, значит сомнения вас посещают. Поэтому: приложение это не только фронт, а зачастую фронт это не самая сложная его часть. Бек - это не обертка над базой данных, и если вы поменяете значение в базе, это не значит, что к примеру, в потоковом вещании сменится кодек (вот, кому-то может и смешно, а мне в такой ситуации ни фига не было весело). С помощью API получают данные, поэтому не важно, что там у вас напроектировали дизайнеры, или как эти данные выводит фронт, API должен быть универсальным и не зависить от того как вы отображаете данные, поэтому, к примеру, бек может вам дать для получения данных несколько универсальных запросов, а не один специальный. В общем, все гораздо сложнее, и ваш вопрос как состыковать фронт и бек перерастает в вопрос как формировать архитектуру проекта, и как управлять командой.
    Ответ написан
    17 комментариев
  • Как вытащить значение по ключу из вложенного объекта?

    @slide13
    frontend/web-developer
    usersList.forEach(user => console.log(user.company.name))
    Ответ написан
    Комментировать
  • Как с помощью рекурсии преобразовать массив?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Не надо никакой рекурсии:

    arr.map((n, i, a) => a.slice(0, i + 1).join(''))
    // или
    arr.reduce((acc, n) => (acc.push((acc.at(-1) ?? '') + n), acc), [])

    Но, конечно, если очень хочется, то

    (function xxx(arr, str = '') {
      if (str.length === arr.length) {
        return [];
      }
    
      const newStr = str.concat(arr[str.length]);
      return [ newStr, ...xxx(arr, newStr) ];
    })(arr)
    Ответ написан
    1 комментарий
  • Какая разница между array и ...array?

    Grapeoff
    @Grapeoff
    В чём концепция...?
    ... - spread/rest оператор.

    Оператор spreadраскрывает массив в список аргументов, но также например можно использовать для расширения массивов.

    const arr = [1, 2, 3]
    func.apply(...arr) // [1, 2, 3] -> 1, 2, 3

    const arr = [1, 2, 3]
    const arr2 = [...arr, 4, 5]

    По сути он превращает массив в последовательность через запятую.

    rest наоборот собирает аргументы в массив.

    function func(...args) {
         for (let arg of args) console.log(arg)
    }

    Кстати, это работает и для объектов:

    const obj = {a: 10, b: 20}
    const obj2 = {...obj} // {a: 10, b: 20}
    Ответ написан
    1 комментарий
  • Почему return /^[A-Za-z0-9].{8,}/.test('Passw0rd'); возвращает false?

    Aetae
    @Aetae
    Тлен
    Точка лишняя.
    Сейчас у тебя возвращает false если первый символ не [А-Za-z0-9] или любых символов после первого меньше 8.
    Учи регекспы. Писать научиться их просто, куда проще чем читать и\или пытаться комбинировать.)
    Ответ написан
    Комментировать
  • Как правильно обратиться в CSS к внутреннему тегу иконки svg?

    DanArst
    @DanArst Куратор тега CSS
    Гриффиндор в моде при любой погоде!
    У вас один мелкий недочет: вы обращаетесь к svg, будто это дочерний элемент инпута с классом form-control. Синтаксис должен быть такой:
    .form-control:focus + .account__icon g {
      opacity: 1;
    }
    Ответ написан
    1 комментарий
  • Где искать нормальных менторов?

    @daryada
    solvery.io
    tolk-talk.ru
    Ответ написан
    Комментировать
  • Как работает этот отрезок кода?

    yarkov
    @yarkov Куратор тега JavaScript
    Помог ответ? Отметь решением.

    Так не работает
    return digits.splice(0,0,1)

    Ну так почитайте что метод splice возвращает. Либо в консоли поупражняйтесь. Само собой не работает.
    Ответ написан
    2 комментария
  • Почему GitHub Desktop игнорирует gitignote?

    *.log
    Такая запись исключит файлы из корневого каталога

    **/*.log
    Такая запись исключит файлы из всех каталогов, рекурсивно

    Подробнее https://git-scm.com/docs/gitignore#_pattern_format
    Ответ написан
    4 комментария
  • Как защититься от двойного списания в многопоточном приложении?

    @rPman
    Блокировку во время траты уже сказали, но бывает что процесс может длиться достаточно долго, чтобы пользователь в соседнем окошке не смог совершить параллельно оплату (у него будет все висеть), поэтому блокировки реализуют программно

    Добавь к аккаунту пользователя поле lockedBalance, в начале транзакции покупки добавляй к этому значению нужную сумму для траты (а по окончанию эту же вычитай как от сюда так и из общего баланса), соответственно итоговый баланс при проверке считай из разницы основного баланса и этого блокированного. Если транзакция сфейлится, это придется отслеживать, заблокированный баланс так же уменьшай на сумму сделки но не трогай общий.

    более красиво, вместо одного поля, заводи специальную таблицу - текущие сделки, где в соответствии со статусом вычисляй этот заблокированный баланс (статусы сделка начата, сделка совершена или сделка обломилась), это актуально как раз на тот случай, когда сделка совершается достаточно долго чтобы не проводить ее в пределах транзакции базы данных (а то попадет пользователь на момент обслуживания к примеру перезапуск бд на обновление, и его транзакция пропадет), к тому же эта таблица у тебя уже точно есть, только статусов побольше добавить
    Ответ написан
    Комментировать
  • Паттерн для строки "[a][1][b][2]" как должен выглядеть?

    yarkov
    @yarkov Куратор тега JavaScript
    Помог ответ? Отметь решением.
    const str = "[a][1][b][2]";
    console.log(str.substr(1, str.length - 2).split('][')); // ['a', '1', 'b', '2']


    const str = "    [a]  [1]       [b]      [2]       ".trim();
    console.log(str.substr(1, str.length - 2).split(/\]\s*\[/)); // ['a', '1', 'b', '2']
    Ответ написан
    4 комментария
  • Как указать имя передаваемого параметра при вызове функции?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Деструктурировать – непередеструктурировать:
    можно задать сразу значения по умолчанию, да и сигнатура читабельнее:
    function test({ a = "Aa", b = "bar", c = "Цеце" }) {
      console.log({a, b, c});
    
      // что-то делаем с переменными a, b, c:
      console.log(`${a} ${c} пошла в ${b}`);
    }
    
    test({ a: "100" });  //    { a: "100", b: "bar", c: "Цеце" }
    // 100 Цеце пошла в bar
    Ответ написан
    Комментировать
  • Разница CompareTo() в IComparable и Equals() в IEquatable?

    Nipheris
    @Nipheris Куратор тега C#
    IComparable предназначен для установления отношения порядка между объектами, реализующими этот интерфейс, ну или грубо говоря, для сортировки. Т.е. когда для двух данных объектов А и Б вы можете утверждать, что А < Б ИЛИ А == Б ИЛИ А > Б.

    IEquatable предназначен для установления отношения равенства. Когда для двух данных объектов А и Б вы можете утверждать, что А == Б или А != Б.

    Далеко не для всех типов данных вы хотите и можете устанавливать отношение порядка, в то время как для большинства типов с value-семантикой вы захотите иметь отношение равенства/неравенства. Это настолько частая и необходимая вещь, что записи в C# автоматически реализуют для вас IEquatable.
    Ответ написан
    1 комментарий
  • Как узнать версию windows, если в заголовках и системе они разные?

    1. А зачем?
    2. Никак, тк в заголовке может идти буквально что угодно.
    3. Заголовок в этом случае вполне правдив, и говорит, что у тебя NT 6.1 - это и есть win7
    Ответ написан
    2 комментария
  • Есть ли библиотеки JS для синтеза речи?

    Что значит "хорошее качество"?
    Синтез силами ОС будет считаться?
    Если да, то в браузере есть встроенное API для синтеза речи:
    https://developer.mozilla.org/ru/docs/Web/API/Web_...

    Если хорошее качество - на уровне Яндекса, то нет, и быть не может.
    Ответ написан
    Комментировать
  • Где на Windows имеет смысл хранить приватные SSH-ключи?

    karabanov
    @karabanov
    Системный администратор
    Храни приватный ключ, где хочешь, в любом безопасном по твоему мнению месте, только не выноси его за пределы машины на которой он был сгенерирован и никому не показывай.
    Только при подключении надо будет указывать путь до приватного ключа, но ssh-agent помогает решить эту задачу.
    Ответ написан
    Комментировать
  • Где на Windows имеет смысл хранить приватные SSH-ключи?


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

    Это стандартная директория, с которой работает openssh.
    И вроде нет никаких способов её переназначить.
    Аналогично и в других ОС.


    2. Добирать до папки .ssh не очень удобно, да и смысл её имени неочевиден.

    ~/.ssh - это не очевидно?
    В ней хранится всё что относится к ssh конкретного пользователя: ключи и доверенные хосты


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

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

    2. Добирать до папки .ssh не очень удобно, да и смысл её имени неочевиден.

    Вкусовщина и непонимание используемых инструментов.
    Добираться до неё нужно полтора раза в жизни, чтобы написать
    cat ~/.ssh/id_rsa.pub
    Ввиду этой логики, я думаю что можно на диске `D` (или другом несистемном) создать папку `SSH Private Keys` (или даже по-русски - `Приватные ключи SSH`) и хранить их там. Единственное, при наличии нескольких пользователей необходимо ограничить доступ к этой папке.

    Почему бы тогда программы устанавливать не в "C:\Program files", а в "D:\Все программы"?
    Вот мне неочевидной кажется идея хранить публичные ключи в папке "D:\Приватные ключи SSH" тем более на русском языке.

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

    Aetae
    @Aetae Куратор тега JavaScript
    Тлен
    Прокси очевидно проксирует только один конкретный объект. Если надо проксировать и содержимое - перехватывай get и отдавай тоже Proxy.
    Ответ написан
    Комментировать