• Как отменить git reset --hard ???

    @Chalovik Автор вопроса
    Вроде бы нашел решение, помогла команда git reset --hard HEAD@{1}
    Ответ написан
    2 комментария
  • Как сделать в webstorm стрелки одним символом?

    @arswarog Автор вопроса
    Спасибо за ответ Сергей
    Всего лишь установить шрифт с поддержкой лигатур, например FiraCode
    Разумеется активировать его в IDE и включить поддержку лигатур
    Ответ написан
    Комментировать
  • Как перенести изменения одной ветки на другую?

    max_front
    @max_front
    frontend
    берешь хэш коммита (его можно узнать используя команду git log), который тебе надо перенести в другую ветку, затем переключаешься на нужную ветку и вводишь git cherry-pick <хэш коммита>, например git cherry-pick 3ea6207fe84 и будет тебе добро
    Ответ написан
    Комментировать
  • Yii2: Почему не возвращается массив?

    webinar
    @webinar Куратор тега Yii
    Учим yii: https://youtu.be/-WRMlGHLgRg
    Но почему то ошибка:
    Invalid Parameter – yii\base\InvalidParamException
    Response content must not be an array.

    Потому что ответ сервера не может быть массивом. Так и написано. Возвращайте в виде json, он для этого и нужен.
    Ответ написан
    Комментировать
  • Как настроить доступ из интернета к нескольким сайтам на OpenServer?

    @alex_dark Автор вопроса
    Я поанализировал некоторые факты и ответ hap2yman:

    При обращении по адресу myIP/domain не открывается нужный сайт, хотя по логике должен, ведь для IP адреса dev.testN.ru это папка, которую он должен открывать.

    Если есть папка localhostи в ней различные сайты, то в адресной строке можно обращаться localhost/someSiteName- все открывается. А папка localhost соответствует адресу 127.0.0.1 (локальной машине)

    В документации openServerнаписано:

    Чтобы при наборе IP адреса вашего компьютера открывался определенный локальный сайт, можно создать алиас вида ваш_внешний_ip => ваш_локальный_домен


    ------
    Итак. Как сделать несколько сайтов на внешку:

    1) В папке domainsудаляем папку localhost(или изменяем её название, чтоб убрать ассоциацию с 127.0.0.1)

    2) В папке domainsсоздаем папку, которая послужит корнем для доменов. Например routeFolder. В ней уже будут лежать папки dev.test1.ru, dev.test2.ru, dev.test3.ru и т.д.

    3) В настройках -> вкладка "Сервер" -> IP-адрес сервера ставим наш внешний IP

    e2c68b8f38b947ceae2aed8948c8d576.jpg

    4) В настройках -> вкладка "Алиасы" -> привязываем IP к папке `routeFolder` и сохраняем настройку

    ba6086d760874e188a463e05b1b097c8.jpg

    Всё, перезагружаем сервер.

    P.S. Не забываем открыть порт для входа с внешки.

    P.P.S. При наборе IP будет видна папка с нашими доменами. Чтоб их не было видно, можно в корень (т.е. в папку routeFolder) кинуть .htaccess, который будет автоматом с корня перенаправлять, например, на сайт№1
    Ответ написан
    Комментировать
  • Как в git перенести некомиченные изменения из одной ветки в другую?

    Denormalization
    @Denormalization
    Можно так же использовать git stash для этого.
    Особенно если нужно переключиться на другую ветку, там что-то сделать и потом вернуться обратно.
    Ответ написан
    1 комментарий
  • Yii2 Active Record Как правильно написать запрос больше или равно?

    webinar
    @webinar Куратор тега Yii
    Учим yii: https://youtu.be/-WRMlGHLgRg
    MyModel::find()->where(['>','id',3])->one();
    Ответ написан
    3 комментария
  • Как индексировать одна ко многим таблиц на sphinx?

    @rotarepmipoleved
    Предлагаю посмотреть со стороны корректировки архитектуры для конкретного случая.
    Таблицы parent и child можно объединить в одну - family, получив структуру аналогичную таблице child.
    - id
    - parent_id
    - name
    - age

    Получим что-то вроде:
    --------------------------------
    id | parent_id | name | age
    --------------------------------
    1 | 0 | Отец | 30
    2 | 1 | Дочь | 9
    3 | 1 | Дочь2 | 7
    4 | 0 | Отец2 | 41
    5 | 4 | Дочь3 | 12

    Тогда в самом индексе получим три поля:
    - name
    - age
    - parent_id

    Ищем среди родителей:
    WHERE parent_id = 0 AND MATCH('@name "Отец"')

    Ищем среди детей:
    WHERE parent_id > 0 AND MATCH('@name "Дочь"')

    Есть еще минимум 1 вариант избегания дублей информации - группировать по необходимому признаку и конкетировать поля с помощью MySQL функции GROUP_CONCAT использовав разделитель для дальнейшего обращения в массив.
    Например, при группировке по полю parent_name нужно конкетировать 3 поля - child_id, child_name, child_age:
    SELECT \
            row_number() OVER () AS id, \
            p.id as parent_id, \
            p."name" as parent_name, \
            p.age as parent_age, \
            GROUP_CONCAT(ch.id SEPARATOR '|') as child_id, \
            GROUP_CONCAT(ch.name SEPARATOR '|') as child_name, \
            GROUP_CONCAT(ch.age SEPARATOR '|') as child_age\
    FROM parent p\
    JOIN child ch ON ch.parent_id=p.id\
    GROUP BY parent_id


    При SELECT * FROM index WHERE parent_id = 1 получим что-то подобное:
    ----------------------------------------------------------------------------
    id | parent_id | parent_name | child_id | child_name | child_age
    ----------------------------------------------------------------------------
    1 | 1 | Отец | 1|2|3 | aa|ab|ac | 2|3|4

    После выполнения запроса конкетированые строки нужно обработать для нормальной работы с child_* полями.

    В целом, способ и саму необходимость каких-либо изменений хорошо определять опираясь на конкретные задачи.
    Ответ написан
    Комментировать
  • Как сравнить два массива в js?

    Stalker_RED
    @Stalker_RED
    Обновил ответ, старая реализация была с багом.
    function diff(a1, a2) {
        return a1.filter(i=>a2.indexOf(i)<0)
        .concat(a2.filter(i=>a1.indexOf(i)<0))
    }
    function compare(a1, a2) {
        return a1.length == a2.length && a1.every((v,i)=>v === a2[i])
    }

    jsfiddle.net/Stalk/7h5ahq5k/2

    upd: в ES7 (2016) появился метод includes
    const diff = function(a1, a2) {
        return a1.filter(i=>!a2.includes(i))
        .concat(a2.filter(i=>!a1.includes(i)))
    }
    https://jsfiddle.net/Stalk/7h5ahq5k/9/
    Ответ написан
    2 комментария
  • Почему данном случае теряется контекст this?

    Aetae
    @Aetae Куратор тега JavaScript
    Тлен
    Простой ответ:
    Берём метод:
    метод = function(){
      console.log(this)
    };
    и(не важно как) пихаем его в какие-то объекты.
    Получаем:
    хрень.метод() // this - хрень
    хрень.кишки.метод() // this - хрень.кишки
    метод() // this - window
    
    хрень.метод.call(хрень.кишки) // this - хрень.кишки
    метод.call(хрень.кишки) // this - хрень.кишки
    метод.call(null) // this - null
    
    элемент.addEventListener('оппа', хрень.метод) //  this -элемент
    элемент.addEventListener('оппа', метод) //  this -элемент
    элемент.addEventListener('оппа', хрень.кишки.продукт.метод) //  this -элемент

    По сути this для фукции - это то, что идёт перед точкой, кроме тех случаев когда он переопределён явно. Всё, никакой эзотерики.)

    fn.call(!this ? this : obj) - это чушь скорее всего. Если this - falsy, то ставим его как this при вызове функции fn, иначе ставим obj. Falsy this может быть только при явном указании(или в strict режиме, при вызове функции напрямую("без точки перед ней")), и скорее всего передача пустого this в таком случае просто сломает выполнение fn.

    Ну ещё следует упомянуть стрелочную фукнцию:
    метод = () => {
      console.log(this)
    };
    это можно считать за явное указание this, потому что this тут всегда привязан тот, что был при создании стрелочной функции, независимо от того как и откуда её вызывают.
    Ответ написан
    3 комментария
  • Где используется паттерн "Репозиторий"?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Паттерн репозиторий используется для изоляции логики хранения данных. Например:

    interface UserRepository {
        function getUser($id);
        function getUsersWhichSatisfyMyCustomBuisnessRulecs(BuisnessRules $rules);
        function saveUser(User $user);
    }
    
    class InMemoryUserRepository implements UserRepository {
        private $users = [];
    
        function getUser($id) {
             return isset($this->users[$id]) ? 
                 $this->users[$id] : null;
        }
    
        function getUsersWhichSatisfyMyCustomBuisnessRulecs(BuisnessRules $rules) {
             return array_filter($this->users, function (User $user) use ($rules) {
                   return $user->isSatisfyRule($rules->getSomeRule());
             }
        }
        function saveUser(User $user) {
            $this->users[$user->getId()] = $user;
        }
    }


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

    - что нет жесткой привязки к реализации. Вы можете использовать внутри репозитория plain sql, data mapper, active record, ассоциативные массивы, файлы... ну вы поняли. Главное интерфейс заимплементить.

    - репозиторий позволяет вам построить архитектуру приложения не связывая все с логикой хранения данных. Таким образом мы организуем слабую связанность системы и придерживаемся принципа единой ответственности.

    martinfowler.com/eaaCatalog/repository.html
    Ответ написан
    5 комментариев
  • Подключение платежного шлюза СберБанк. Как реализовать подключение?

    voronkovich
    @voronkovich
    Недавно столкнулся с той же проблемой. Почему-то Сбербанк не делает библиотек для работы со своим API, как все нормальные платежные шлюзы. Да и API у них - совершенно безумное. Документации в открытом доступе нет, какие-то пдфки в письме прислали. В итоге, сделал небольшую библиотеку на PHP https://github.com/voronkovich/sberbank-acquiring-... Надеюсь пригодится кому-нибудь еще.
    Ответ написан
    23 комментария