Задать вопрос
  • Как правильно сохранять пользователя, аутентифицированного через гугл?

    no_one_safe
    @no_one_safe
    Не пускать таких пользователей при авторизации в обоих случаях. Необходимо выдавать месседж, "пользователь с таким email уже зарегистрирован", предлагать сначала войти на сайт (тем способом, который был выбран изначально) , а уже потом из ЛК предлагать либо связать свой акк с Гуглом, либо, в обратном случае, ввести пароль для авторизации.
    Ответ написан
    Комментировать
  • Сложно ли перейти с c++ на c#?

    saboteur_kiev
    @saboteur_kiev Куратор тега IT-образование
    software engineer
    Очень сложно если ты недоджуниор, который и С++ еще не освоил. Просто потому что тебе собственно все еще надо учить все почти с нуля
    А если ты мид/сеньор, то ты таких вопросов и задавать не будешь.
    Ответ написан
    2 комментария
  • Насколько правильно и оптимально написан код?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Сравнивайте, делайте выводы:

    document.querySelector('#check').addEventListener('change', e => {
      document.querySelector('#password-input').type = e.target.checked
        ? 'text'
        : 'password';
    });
    Ответ написан
    Комментировать
  • Почему на одних сервисах просят сначала email, а потом пароль, а на других сразу оба?

    profesor08
    @profesor08
    Все просто. Вот есть сохраненная кука, она еще не протухла, а у сервиса она протухла, сервис делает предположение, что ты тот-же самый юзер и предлагает ввести только пароль, заранее подставив емейл.

    Что касается гугла, то он сам по себе поддерживает несколько учетных записей. Сколько тебе надо, столько и поддерживает. И когда тебя разлогинило, он предлагает ввести только пароль, так как знает, под каким последним емейлом ты там логинился. Так-же предлагает список логинов для переключения между ними.
    Ответ написан
    Комментировать
  • Почему на одних сервисах просят сначала email, а потом пароль, а на других сразу оба?

    @xfg
    Началось всё с того, что помимо стандартной формы входа на сайт также стали появляться кнопки входа через социальные сети. Например вы зарегистрировались на целевом сайте используя свой аккаунт на твиттере. Затем какое-то время не пользовались целевым сайтом, после чего вернулись и... Вы точно помните что у вас уже есть аккаунт на данном сайте, но вы не помните какой способ входа вы использовали. Перед вами с десяток различных кнопок. Какую из них нажимать? Думаю, история знакомая многим.

    Так вот в какой-то момент появилось исследование суть которого в том чтобы изменить форму входа таким образом, чтобы пользователю теперь было достаточно указать только email-адрес, а дальше система сама определит через какой провайдер был зарегистрирован пользователь на сайте с этим email-адресом и в зависимости от этого может либо отобразить пароль для ввода, сделать редирект на сайт провайдера для подтверждения входа или сразу аутентифицировать пользователя на целевом сайте, если пользователь уже авторизован и имеет необходимые разрешения для целевого сайта на сайте-провайдере (например на twitter.com).

    Таким образом это ничто иное как улучшение взаимодействия с пользователем. Но как и всё в мире имеет определенные недостатки. Например теперь можно узнать зарегистрирован ли определенный пользователь на определенном сайте зная лишь только его email адрес или номер телефона. То есть страдает конфиденциальность.

    Пример реализации можно увидеть на сайте yandex.ru.
    Ответ написан
    Комментировать
  • Почему на одних сервисах просят сначала email, а потом пароль, а на других сразу оба?

    AgentSmith
    @AgentSmith
    Это мой правильный ответ на твой вопрос
    Всё зависит от реализации бэкенда на этих сайтах
    Ответ написан
    5 комментариев
  • Почему на одних сервисах просят сначала email, а потом пароль, а на других сразу оба?

    @Flying
    По-моему всё началось c Google, который действительно применяет разную логику в зависимости от того, какой email введён и поэтому ему важно разделять ввод email и пароля.

    Другие сервисы в основном просто тупо копируют без реальной необходимости, потому что "ну вот Google (или кто-то ещё большой) же так делает, значит так надо". Вплоть до того, что форма по факту одна, просто на JavaScript скрывают поле и показывают после первого submit'а.

    Другими словами в большинстве случаев - карго-культ и "следование моде" без реальной потребности. Конечно, есть сценарии при которых это действительно нужно, но их меньшинство.

    Кстати, дополнительно, подобный подход ещё и ломает ввод логина / пароля из менеджеров паролей.
    Ответ написан
    3 комментария
  • Если перенести таблицу с одной бд в другую, сохранив старые _id. Могут ли быть какие-то проблемы в плане производительности в новой бд?

    Hecc
    @Hecc
    Frontend. Дизайн. Шрифт.
    Ответ на этот вопрос кроется в понимании того, чем является ObjectId в MongoDB.

    ObjectID - это 12 байтов информации, которые состоят из:
    - 4 байта. Timestamp даты создания
    - 5 байтов. Рандомное число
    - 3 байта. Инкрементируемый счетчик

    Никакой информации, которая хранит какие-то специфичные данные об коллекции или самом объекте там нету.
    Можете попробовать воспользоваться сервисом чтобы получить timestamp из любого _Id.

    В целом, перенос объекта с одной коллекции в другую не должен как-то повлиять на производительность
    Ответ написан
    Комментировать
  • Как отобразить компоненты через *ngFor?

    mmmaaak
    @mmmaaak
    Это не ангуляр запрещает, а javascript, так как у массива arr нет свойства name
    Ответ написан
    1 комментарий
  • В чем разница между статическими и динамическими данными WEB, на примере картинки во вложении?

    Как вы правило в nginx напишите так и будет разделятся. Обычно статика - это файлы на винте.
    php-файл тоже статика. Но обычно ее отдавать не нужно, а нужен результат выполнения php кода в этом файле - а это уже динамика.
    Ответ написан
    Комментировать
  • Почему метод filter, в отличие от старого for, не отрабатывает корректно?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    фигурные скобки лишние: нужно возвращать true / false

    let resultArr = products.filter((product) => {
      return product.price > 100;
    });
    
    // или
    let resultArr = products.filter((product) => product.price > 100);
    Ответ написан
    2 комментария
  • Как получить аудио с роута, который защищён токеном?

    @vshvydky
    если речь о том, чтобы передавать в хтмл блоки ссылки на аудио, то заголовки пробросить в элементы нельзя, итого либо для таких ссылок надо делать одноразовые билеты на скачивание и передавать их как квери парамы в ссылке, либо использовать куки, сессии.
    Ответ написан
    Комментировать
  • Как взять символы с конца до точки?

    @NewSantaClaus
    Можно так сделать

    const str = 'Это строка и в ней есть точка. А это после точки'
    
    const sub = str.substring(
         str.lastIndexOf(".") + 1, 
         str.length
    );
    
    console.log(sub) // А это после точки
    Ответ написан
    Комментировать
  • Как взять символы с конца до точки?

    Stalker_RED
    @Stalker_RED
    str.split('.').pop()
    На больших строках решение от NewSantaClaus будет заметно выигрывать в скорости.
    Ответ написан
    Комментировать
  • Как правильно провалидировать чек?

    402d
    @402d
    начинал с бейсика на УКНЦ в 1988
    либы удобная обертка над накладными расходами на вызов .
    проверка (валидация покупки) это простой гет запрос
    https // androidpublisher.googleapis.com/androidpublisher/v3/applications/ {packageName} /purchases/products/ {productId} /tokens/ {token}

    в ответ если покупка существует придет ответ в виде json .

    Приложение должно передать своему баксерверу минимум две вещи
    productId или по другому sku name - строка симвотлов которую вы назначили как идентификатор покупки и
    token - длинная строка символов, которую приложение может получить в хуке на покупку
    и через запрос к апи .

    в общем приложение увидело покупку. запросило ваш бакенд .
    Бакенд обратился самостоятельно к апи гугла.
    Получил ответ .
    Принял решение делать или нет.
    Сделал.
    Приложение об этом должно узнать.
    Если все хорошо, то покупка помечается известной или потребленной.
    С подписками похоже.

    Ссылка на Google Play Developer API
    https://developers.google.com/android-publisher/ap...
    Ответ написан
    Комментировать
  • Как удалить свойство объекта?

    Aetae
    @Aetae Куратор тега JavaScript
    Тлен
    Ну наверное оно не configurable.
    Пересоздайте объект:
    const {password, ...rest} = user;
    console.log(password);
    console.log(rest);
    return rest;
    Ответ написан
    6 комментариев
  • 10 000 строчек проще рефакторить или переписать?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега JavaScript
    Обычно код такого качества проще переписать. Есть и дополнительные плюсы:
    - вы в деталях поймёте, как работает проект и что делает;
    - вы, вероятно, найдёте и исправите какие-то баги по дороге.

    Но это индивидуально, вообще. Кому-то проще инкрементально рефакторить, лично мне проще в такой ситуации писать с нуля, ориентируясь на имеющийся код, но критически его оценивая.
    Это и от размеров проекта ещё зависит, от общей его сложности, от нагрузки на разработчиков (можно ли остановить активную разработку на какое-то время). 10k строк, в принципе, не очень большой размер.
    Ответ написан
    Комментировать
  • Как составить все возможные комбинации?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Рекурсивный алгоритм:
    1. На первой позиции должна побывать каждая из букв.
    2. Выбрали первую – надо всеми возможными способами перебрать оставшиеся. Смотрим на задачу точно так же: из (n - 1) букв надо перебрать все варианты. Go to 1)
    мопед – мой
    function permut8(arr, prepend) {
      var i, version, el, result = [];
      prepend = prepend || [];
      if(arr.length === 1) return [arr];
      for( i=0; i<arr.length; i++) {
        if( arr.length === 2) {
          result.push( prepend.concat( [arr[i], arr[(i+1)%2]] ));
        } else {
          version = arr.slice();
          el = version.splice(i,1);
          result = result.concat( permut8( version, prepend.concat(el)));
        }
      }  
      return result;
    }
    
    var test = permut8( 'abcd'.split('') );
    test.map( e=>e.join(' ')).join("\n")
    /*
    a b c d
    a b d c
    a c b d
    a c d b
    a d b c
    a d c b
    b a c d
    b a d c
    b c a d
    b c d a
    b d a c
    b d c a
    c a b d
    c a d b
    c b a d
    c b d a
    c d a b
    c d b a
    d a b c
    d a c b
    d b a c
    d b c a
    d c a b
    d c b a
    */
    Его минус в том, что он не учитывает значения элементов. Если встретятся повторяющиеся – создадутся дублирующиеся варианты. Например, из ["a", "a"] получим два одинаковых [["a", "a"], ["a", "a"]]

    Нерекурсивный алгоритм.
    longclaps говорит, давай, мол, напишем, чтобы корректно без повторов генерил и при повторяющихся элементах.

    Использовал известный с 14 века нерекурсивный алгоритм индуса Нарайана Пандита. Из любого порядка в массиве генерится следующая итерация, учитывая лексикографический (по алфавиту) порядок сортировки.
    Мопед – мой, мыт
    function nextLexInPlace(arr){
      var i, a = -1, b = -1;
      for( i = 0; i < arr.length-1; i++) if(arr[i] < arr[1+i]) a = i;
      if( !~a) return; // no more permutations
      for( i = a + 1; i < arr.length; i++) if(arr[a] < arr[i]) b = i;
      swap(arr, a, b);
      a++;
      b = arr.length - 1;
      while( a < b) swap(arr, a++, b--);
      return true;
    }
    
    function swap( arr, a, b) {
      var xx = arr[a];
      arr[a] = arr[b];
      arr[b] = xx;
    }
    
    function allMutations( source) {
      var result = [], arr = source.slice();
      result.push( arr.sort().slice());
      while( nextLexInPlace(arr)) result.push(arr.slice());
      return result;
    }
    
    var test = ['a','c','c']; JSON.stringify( allMutations(test))
    // [["a","c","c"],["c","a","c"],["c","c","a"]]

    И тот же мопед, но
    с генератором
    function* permutator(arr) {
      var i, a, b;
    
      function swap( arr, a, b) {
    		var xx = arr[a];
    		arr[a] = arr[b];
    		arr[b] = xx;
    	}
      
      yield arr.slice();
    
      while(true) {
        a = -1, b = -1;
    		for( i = 0; i < arr.length-1; i++) if(arr[i] < arr[1+i]) a = i;
    		if( !~a) return;
    		for( i = a + 1; i < arr.length; i++) if(arr[a] < arr[i]) b = i;
    		swap(arr, a++, b);
    		b = arr.length - 1;
    		while( a < b) swap(arr, a++, b--);
    		yield arr.slice();
      }
    }
    
    function allMutations( source) {
      var all = [], result, G = permutator(source.slice().sort());
      while(true) {
        result = G.next();
        if(result.done) break;
        all.push( result.value);
      }
      return all;
    }
    
    var test = ['a','c','c']; JSON.stringify( allMutations(test))
    // [["a","c","c"],["c","a","c"],["c","c","a"]]
    Ответ написан
    Комментировать
  • Плюсы от знания F#?

    rundll32
    @rundll32
    Язык сам по себе - просто инструмент. F# позволяет писать программы в более функциональном стиле, чем C#, но возможности их не отличаются, и под капотом будут одни и те же инструкции MSIL.
    Ответ написан
    2 комментария
  • Плюсы от знания F#?

    samodum
    @samodum
    Какой вопрос - такой и ответ
    нет
    Ответ написан
    Комментировать