• Node.js(как вариант для хранения временных данных)?

    k12th
    @k12th
    console.log(`You're pulling my leg, right?`);
    В БД (или быстрый кэш, типа Redis). Причин несколько:
    • Ваше приложение может упасть. Игрокам не понравится, если у них вдруг пропадут карты. БД тоже падают, но вероятность этого гораздо меньше (у них больше разработчиков и тестеров).
    • Массивы в памяти не масштабируются. Положим, пару десятков одновременных партий в памяти держать можно, но когда счет пойдет на тысячи, это будет жрать RAM, плюс тормоза на GC. А БД можно вынести на отдельный сервер и даже на отдельный кластер.


    Ну, понятно, что в учебном примере пофиг на надежность и масштабируемость, но почему бы не делать сразу правильно?
    Ответ написан
    7 комментариев
  • Как решить эту задачу?

    У меня дискретной математики не было, но решал бы так. Есть утверждения:
    Л: Пс Бд
    П: Лс Бд
    Б: Лс Пе

    Найдём пару утверждений из которых один оба раза сорвал, другой оба раза сказал правду. Поскольку утверждения Л-П связаны через Бд, а П-Б через Лс, остаётся пара Л-Б – кто-то из них оба раза правда, другой оба раза ложь.

    Ложное утверждение обозначу с воскл. знаком (логическое НЕ) – например, !Лс.

    Итак, один раз соврал и один сказал правду, выходит, Пончик: П: !Лс Бд

    Чтобы Лс было ложным, надо так же сделать ложными утверждения Б. Значит, Б оба раза соврал, а Л оба раза сказал правду:
    Л: Пс Бд
    П: !Лс Бд
    Б: !Лс !Пе

    Итого, точно знаем: Пс и Бд. Остаётся Ле.
    Ленчик – ель; Пончик – сосна; Батончик – дуб.

    upd. Таблица истинности так составляется?
    Л П Б  Пс Бд  Лс Бд  Лс Пе
    0 1 2  0  0   1  1   0  1  конфликт Бд и Лс
    0 2 1  0  0   0  1   1  1  конфликт Бд и Лс  
    1 0 2  1  1   0  0   0  1  конфликт Бд
    2 0 1  0  1   0  0   1  1  конфликт Бд и Лс
    1 2 0  1  1   0  1   0  0  ОК
    2 1 0  0  1   1  1   0  0  конфликт Лс

    Переменные три: истинность утверждений каждого персонажа. Три возможных состояния: 0 – оба раза соврал, 1 – оба раза правда, 2 – соврал-правда. Дальше раскрываем их значение по каждому из утверждений (0 ложь, 1 истина). Во всех вариантах, кроме одного возникают логические конфликты.
    Ответ написан
    Комментировать
  • Можно ли вернуть деньги, списанные регистратором доменных имен?

    Скорее всего оспорить покупку с 1and1 не получится – у них юристы, мелкий текст и формально они окажутся правы. Попробуйте через Сбербанк оспорить платёж по карточке – сходите в отделение.

    Возможно, с вас сразу сняли за 5 лет обслуживания домена: $0.99 за первый год и по $15 за 4 следующих. Вы сноски смотрели? Например, на главной у них привлекательные цены на домены:
    c7f0300fa57643d7ad734546f5810c34.png
    Но рядом мелкие цифры, а внизу страницы неприметная ссылка, раскрывающая блок с разъяснениями:
    bbc43530860242a6b75ac839dfae06e2.png
    "Payable in advance" (оплачивается вперёд) вполне может означать, что вперёд аж за 5 лет оплачивается сразу.

    Ещё ниже про 1–6 пишут:
    f778ba32ed6244f0a7428d47595df3e2.png – вы же российской карточкой платили, значит, на вас, вне "US territories", этот оффер не распространяется. Первичный платёж в $1 – просто проверка работоспособности карточки.

    В их правлах (Terms & Conditions, T&C) про возврат денег значится, что по доменам они ничего не возвращают: 5e7e14b8fb8c4ddfb33abb251d8febb4.png

    Так что, либо через Сбербанк отменяйте транзакции без подтверждения, либо, увы, «наслаждайтесь» доменами.
    Ответ написан
    Комментировать
  • Как декодировать JS []?

    @vshvydky
    В конце вашего кода есть () признак выполнения, меняем ее на toString() и получаем функцию как текст
    "function anonymous() {
    $(document).ready(function() {
      $('i').hide();
    })
    
    $(window).load(function() {
      $('i').show();
    
      var twitterPos = $('#twitter').position();
      var githubPos = $('#github').position();
      var stackPos = $('#stack').position();
      var linkedinPos = $('#linkedin').position();
      var codePos = $('#code').position();
      var plusPos = $('#plus').position();
      var mailPos = $('#mail').position();
      var imgPos = $('.me').position();
      
      $('i').css({
        position: 'absolute',
        zIndex: '1',
        top: imgPos.top + 100,
        left: '47%'
      });
      
      setTimeout(function() {
        $('#twitter').animate({
          top: twitterPos.top + 10,
          left: twitterPos.left - 10
        }, 500);
      }, 250);
      
      setTimeout(function() {
        $('#twitter').animate({
          top: twitterPos.top,
          left: twitterPos.left
        }, 250);
        
        $('#github').animate({
          top: githubPos.top + 10,
          left: githubPos.left - 6
        }, 500);
      }, 500);
      
      setTimeout(function() {
        $('#github').animate({
          top: githubPos.top,
          left: githubPos.left
        }, 250);
        
        $('#stack').animate({
          top: stackPos.top + 10,
          left: stackPos.left - 3
        }, 500);
      }, 750);
      
      setTimeout(function() {
        $('#stack').animate({
          top: stackPos.top,
          left: stackPos.left
        }, 250);
        
        $('#linkedin').animate({
          top: linkedinPos.top + 10,
          left: linkedinPos.left
        }, 500);
      }, 1000);
      
      setTimeout(function() {
        $('#linkedin').animate({
          top: linkedinPos.top,
          left: linkedinPos.left
        }, 250);
        
        $('#code').animate({
          top: codePos.top + 10,
          left: codePos.left + 3
        }, 500);
      }, 1250);
      
      setTimeout(function() {
        $('#code').animate({
          top: codePos.top,
          left: codePos.left
        }, 250);
        
        $('#plus').animate({
          top: plusPos.top + 10,
          left: plusPos.left + 6
        }, 500);
      }, 1500);
      
      setTimeout(function() {
        $('#plus').animate({
          top: plusPos.top,
          left: plusPos.left
        }, 250);
        
        $('#mail').animate({
          top: mailPos.top + 10,
          left: mailPos.left + 10
        }, 500);
      }, 1750);
      
      setTimeout(function() {
        $('#mail').animate({
          top: mailPos.top,
          left: mailPos.left
        }, 250);
      }, 2000);
      
    })
    }"
    Ответ написан
    1 комментарий
  • Как удалить\закомиттить только нужный коммит?

    muhammad_97
    @muhammad_97
    PHP-разработчик
    git rebase -i HEAD~N

    - где N - количество мусорных коммитов. Нужно будет выполнить squash. Для этого на первой строке пишем p (pick up), а на остальных s (squash).

    После того, как исправите ситуацию в локальном репозитории сделайте принудительный пуш:

    git push -f
    Ответ написан
    2 комментария
  • Какой диапазон ip у поисковика Yandex?

    BuriK666
    @BuriK666
    Компьютерный псих
    https://yandex.ru/support/webmaster/robot-workings...
    IP-адресов, с которых «приходят» роботы Яндекса, тоже много, и они часто меняются. Поэтому мы не разглашаем их список и не рекомендуем использовать фильтрацию на их основе.
    Ответ написан
    Комментировать
  • Как это реализовано в Laravel?

    @D3lphi
    Это называется рефлексия. Пример:
    $class = new \ReflectionClass('Название класса');  // Создаем объект для рефлексии класса
    $method = $class->getMethod('Имя метода');   // Получаем метод по имени
    $params = $method->getParameters();   // Получаем массив с параметрами
    $paramName = $params[0]->getName();   // Берем первый элемент массива, он имеет тип ReflectionParameter, и получаем его имя.

    Можно сразу создать объект для рефлексии метода "напрямую":
    $method = new \ReflectionMethod('Класс', 'Имя метода');
    // Далее, аналогично

    С помощью рефлексии можно не только получать имена параметров, но и их типы, значения по умолчанию. Можно получать даже док-блоки для методов/свойств и тд. С помощью рефлексии, например, работает doctrine orm. Он использует аннотации (как один из вариантов конфигурации) для описания сущностей.
    Ответ написан
    Комментировать
  • Правильно ли я выгрузил комментарии на сайт?

    Stalker_RED
    @Stalker_RED
    1. Преждевременная оптимизация - зло.
    2. Денормализация БД - тоже зло, но можно попытаться его "правильно готовить".

    У вас получилось этакое кеширование в БД. Я бы писал готовый html-блок или json в файл или в memcache, потому что для базы эта информация - мусор. Причем такого рода мусор может в будущем выйти боком, при каких-то сложных операциях с таблицей постов.
    Ответ написан
    1 комментарий
  • Как найти максимальный id в ассоциативном массиве?

    Negwereth
    @Negwereth
    lvivcss.com.ua
    let maxId = Math.max(...array.map(i => i.id));
    Ответ написан
    Комментировать
  • Кто знает, что за распиновка на этом вентиляторе?

    a_volkov1987
    @a_volkov1987
    Инженер-схемотехник
    Да все как обычно: два пина на питание, один пин - детектор частоты вращения. Если стоит задача просто запустить - подаете только питание. Если стоит задача определить, вращается ли кулер и задавать точную скорость вращения - надо "слушать" третий пин и задавать напряжение питания в зависимости от частоты, с которой приходят импульсы от этого пина.
    1 GND (Black)
    2 +5V (Red)
    3 Sense (Yellow): spin sensor
    Ответ написан
    4 комментария
  • Как присвоить значение переменной по умолчанию, если она равна null?

    @Camaro67
    Помог? - жми "Отметить решением"
    // Начиная с версии PHP 7
    $name = $name ?? 'anonimous';
    
    // До PHP 7
    $name = $name === null ? 'anonimous' : $name;
    // или более предпочтительный вариант
    // т.к. идет проверка объявлена переменная или нет
    $name = isset( $name ) ? $name : 'anonimous';


    // Самое простое, это что-то вроде
    if($a == null) $a = 'default';
    // Но это не очень красиво.

    Вы ошибаетесь, здесь переменной $a значение default будет присвоено далеко не только если она null, но и если false, 0, [] и т.д.

    В данном случаи можно упростить до
    $a = $a ?: 'default';
    Ответ написан
    Комментировать
  • Какую информацию можно получить через API соцсетей?

    webinar
    @webinar
    Учим yii: https://youtu.be/-WRMlGHLgRg
    Где можн получить подробную информацию по этому вопросу?

    У каждой соц сети есть документация, там все описано:
    https://vk.com/dev
    https://developers.facebook.com
    https://apiok.ru

    какие данные можно получить о пользователе

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

    riot26
    @riot26
    <:З )~~
    Обычно поднимают дев-версию на отдельном домене без костылей типа хитрых флагов. Дев-версия скрывается от поисковиков, БД используется урезанная без деликатных данных на случай чего. Дев-версия, понятное дело, в отдельной git-ветке. И есть, наверное, тыща способов деплоя этого добра на сервера.
    Ответ написан
    Комментировать
  • Как в php формируется ответ сервера?

    sHinE
    @sHinE
    веб-разработчик, php/js/mysql и сопутствующее
    Если надо увеличить количество - то начинайте тело ответа с переносов строки.
    Ответ написан
    Комментировать
  • Когда надо и не надо использовать скобки в relations?

    amelihovv
    @amelihovv
    Фулстек веб разработчик

    $author->post()

    возвращает query builder, поэтому вы можете продолжить вызывать методы query builder'а, например,
    $post->comments()->where('published', true)->get();

    А во втором случае вы получаете сразу модель или коллекцию моделей.
    Ответ написан
    6 комментариев
  • Почему в самовызывающейся фукнции переменная undefined?

    @bogomazov_vadim
    Дело в hoisting. Присваивание значений не поднимается вместе с объявлением переменных.
    Ваш код аналогичен следующему:
    var p = 'val';
    (function () {
        var name; // undefined
        if (typeof name === 'undefined') {
        console.log(name);
            name = "newVal";
            console.log(name);
        } else {
            console.log(name);
        }
    })();// newVal


    Про hoisting и область видимости
    Ответ написан
    2 комментария
  • Ошибка в калькуляторе на js, почему не срабатывает?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    1. значения строк – в кавычки: if (a == "умножить"
    2. Л – Логика: не может одновременно a равняться и "умножить" и "разделить". Поменяйте логическое-И на логическое-ИЛИ: вместо && надо ||
    3. поэтому у вас ни одно ни второе условие не выполняется. Был бы дальше блок else – выполнился бы он
    Ответ написан
    6 комментариев
  • Ошибка в калькуляторе на js, почему?

    leshikgo
    @leshikgo
    Это пока то, что заметил.
    if (a === "умножить")
    alert(result)
    = присвоение
    == это сравнение равенства
    === сравнение равенства значения и типа переменной, то есть сравниваем строку с строкой и только.
    Ответ написан
    Комментировать