• Какой смысл в PasswordEncoderInterface когда есть и используется везде UserPasswordEncoderInterface?

    BoShurik
    @BoShurik Куратор тега Symfony
    Symfony developer
    UserPasswordEncoderInterface - всего лишь сахар при использовании в простых кейсах.
    К примеру у вас есть сущность
    class User implements UserInterface
    {
        public function __construct(string $username, string $password)
        {
            $this->username = $username;
            $this->password = $password;
        }
    }

    В данном случае $password - это не plainPassword, а уже захешированный.
    Как создать такую сущность, если UserPasswordEncoderInterface требует инстанс этого класса?

    $user = new User($username, $this->encodePassword($plainPassword));

    private EncoderFactoryInterface $encoderFactory;
    private function encodePassword(string $plainPassword): string
    {
        $encoder = $this->encoderFactory->getEncoder(User::class);
    
        return $encoder->encodePassword($plainPassword, null);
    }


    Eсли уж быть точнее, то ответ на вопрос "Какой смысл в PasswordEncoderInterface если есть UserPasswordEncoderInterface?" - нельзя, не нарушая SRP, реализовать UserPasswordEncoderInterface, не имея при этом PasswordEncoderInterface и EncoderFactoryInterface, т.е. это интерфейс более высокого уровня, чем PasswordEncoderInterface

    P.S. Соль хранить не надо. В данном случае это рудимент, который остался от первых версий, когда не использовался password_hash, который добавляет метаданные рядом с хешем. Достаточно создать метод-заглушку:
    public function getSalt()
    {
        return null;
    }
    Ответ написан
  • Какие проекты Laravel разработчик должен разобрать и понять?

    glaphire
    @glaphire
    PHP developer
    Когда-то тоже задавалась этим вопросом, и ответ нашелся в том, что надо критично оценивать документацию и вендорный код ларавеля по мере чтения книг по архитектуре приложений.
    Один из проектов из статьи "25 оперсорсных проектов на ларавель": koel - выглядит прилично и почти свежий (ларавель 7.0), но его приличность мне видна после нескольких месяцев чтения заумных книг и курсов по симфони, чтобы видеть эти положительные стороны - нужно искать их за пределами ларавель однозначно
    Ответ написан
  • Как добавить номер строки в v-datatable?

    0xD34F
    @0xD34F Куратор тега Vue.js
    Что-то не видать в документации соответствующей настройки, видимо, придётся закостылить.

    Опишите в headers столбец для номера:

    headers: [
      {
        value: 'index',
        text: '#',
      },
      ...

    И задайте его разметку через слот:

    <v-data-table>
      <template #item.index="{ item }">
        {{ protocolData.indexOf(item) }}
      </template>
      ...

    UPD. Вынесено из комментариев:

    если после этого отсортировать таблицу по какому-нибудь другому полю, то нумерация строк сбивается

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

    <v-data-table>
      <template #body="{ items, headers }">
        <tbody>
          <tr v-for="(item, index) in items">
            <td v-for="n in headers">
              {{ n.value === 'index' ? index : item[n.value] }}
            </td>
          </tr>
        </tbody>
      </template>
    </v-data-table>

    Или, используйте слот item, в нём доступен индекс. Тоже придётся самостоятельно рендерить весь контент:

    <v-data-table>
      <template #item="{ item, index, headers }">
        <tr>
          <td v-for="n in headers">
            {{ n.value === 'index' ? index : item[n.value] }}
          </td>
        </tr>
      </template>
    </v-data-table>
    Ответ написан
  • Посмотреть к чему и от чего был запрошен и получен доступ?

    Stalker_RED
    @Stalker_RED
    я не знаю что за софт

    Есть такой Марк Руссинович, он очень круто разбирается в устройстве винды, пишет книги об этом, и делает всякие забавные утилитки. Когда-то он их отдельно выпускал от компании sysinternals, а потом они стали подразделением майкрософт.

    Самые известные утилиты - regmon (монитор реестра), filemon (монитор файловой системы) и более поздний procmon, который вобрал себя фичи из обоих предыдущих утилит. Ну и соседние странички можешь посмотреть, там много полезного.
    Ответ написан
  • Как дебажить приложение собранное Apache Cordova?

    mrhard
    @mrhard
    web разработчик
    console.log()
    дебажить можете в хроме (Remote Devices) для ведра, iOS можно в xCode или в сафари (dev)
    Ответ написан
  • Google Recaptcha Type?

    Aetae
    @Aetae
    Тлен
    И, какие проблемы?
    Идёшь сюда и смотришь есть ли то, что тебе надо. Если нет - то скорее всего нигде нет и надо писать самому, но можно погуглить: иногда некие персонажи с "уникальной личностью" не делятся типами в общий репозиторий.
    В твоём случае, впрочем, всё есть: @types/recaptcha2 и @types/grecaptcha.
    Ответ написан
  • Как сделать полукруглую линию по вертикале?

    Ankhena
    @Ankhena Куратор тега CSS
    Нежно люблю верстку
    Можно радиальным градиентом.
    ПРосто множественным фоном или еще проще применить его к псевдоэлементу

    Либо SVG либо clip-path
    Ответ написан
  • Как гиганты индустрии проверяют соблюдает ли сотрудник NDA?

    xmoonlight
    @xmoonlight
    https://sitecoder.blogspot.com
    Два аспекта должно сработать, чтобы был факт нарушения подписанного NDA:
    1. Компания должна установить личность того, кто выложил код.
    2. Эта личность должна была ранее подписать NDA.

    Иначе - нет никаких нарушений.
    Ответ написан
  • Подсчитать какое место игрок занимает в leaderboard?

    BojackHorseman
    @BojackHorseman Куратор тега SQL
    ...в творческом отпуске...
    SELECT COUNT(*) + 1 FROM <tablename> WHERE `score` > ?
    Ответ написан
  • Vue array of objects is not reactive?

    0xD34F
    @0xD34F Куратор тега Vue.js
    public get isServiceAnime(): boolean {

    @Watch('isServiceAnime', {immediate: true, deep: true})

    Для boolean значения включаете deep? Круто.

    да, проверял я доку тут

    А здесь? Очевидно же - если одно свойство должно зависеть от другого, его следует сделать вычисляемым.
    Ответ написан
  • Как правильно инициализировать свойства класса?

    @twoone
    Данное поведение возможно благодаря совокупности таких опций компилятора как --strictNullChecks и --strictPropertyInitialization, первая из которых запрещает присваивание null и undefined в качестве значений (при условии что они не были указаны в аннотации типа), а второй флаг переносит поведение первого на поля класса.

    Если в javascript (да и вообще как мне кажется везде) инициализировать поля класса в месте объявления, то фактически она произойдет в конструкторе. Поэтому компилятор typescript не считает за ошибку присвоение значений не инициализированным полям в конструкторе. Но метод вызываемыцй из конструктора не считается допустимым.

    В качестве решения предлагается воспользховаться модификатором definite assignment assertion modifier , который указывается перед двоеточием предшествующим аннотации типа и перекладывает ответственность за возможные казусы связанные со значчениями null или undefined на разработчика.
    В вашем случае это будет выглядеть так -
    class Menu extends Vue  {
        private menuItems!: Item[]; // восклицательный знак перед двоеточием
    
        public constructor() {
            this.initMenuItems();
        }
    
        private initMenuItems() {
            let item = new Item();
            item.title = 'Home';
            this.menuItems.push(item);
            let item2= new Item();
            item2.title = 'Login';
            this.menuItems.push(item2);
        }
    }
    Ответ написан
  • Есть ли смысл делать @Prop типизацию?

    Aetae
    @Aetae
    Тлен
    Если стоит ts-флаг emitDecoratorMetadata - то vue-property-decorator автоматически проставит type для простого примитивного типа, т.е. конкретно тут вручную можно не указывать. Однако если тип сложный или юнион простых - то это работать уже не будет, и тогда уже надо вручную. (У меня валяется недописанный ts-плагин-трансформер для расширения этого поведения, но руки всё никак не дойдут.)
    Это что касается взаимодействия ts и vue.

    Если вопрос - "нужно ли вообще vue-типизировать свойства", то ответ в целом: на ваш вкус.
    Есть две причины это делать:
    1. Использование вашего компонента вне ts окружения.
    2. Поведение свойства, первый тип которого Boolean, отличается от обычного: такое свойство устанавливается в true если стоит на компоненте, даже если значение отсутствует:
    <component boolean-prop></component>
    // если type: Boolean - booleanProp === true
    // если type иной или отсутствует - booleanProp === undefined
    Ответ написан
  • Vue + typescript для чего классы и как их использовать?

    Aetae
    @Aetae
    Тлен
    Ты не понимаешь что происходит.
    Декоратор @Component превращает класс в Vue-компонент.
    Делая new <name> ты создаёшь не инстанс исходного класса, ты создаёшь инстанс Vue-компонента.
    @Component работает только с классам, коструктор которых не принимает никаких параметров(потому что нет никакой возможности на самом деле их передать).
    Какие параметры принимает конструктор Vue, смотреть надо здесь.

    Условно говоря(на самом деле потроха сложнее), этот код:
    @Template
    @Component
    export default class Item extends Vue {
        @Prop({required: true}) private title!: string;
    
        private get getter() {}
    
        private method() {}
            
        constructor(title: string) {
            super();
        }
    };
    превращается в этот:
    class Item extends Vue {
      constructor() {
        super();
      }
    };
    
    export default Vue.extend({
      template: '<содержимое ./_template.html>',
      props: {
        title: {
          type: String, // только при emitDecoratorMetadata
          required: true
        }
      },
      data: () => new Item(),
      methods: {
        method() {}
      },
      computed: {
        getter() {}
      }
    })

    Для чего? Для того чтоб было красивее, всё было в одном месте и тайпинг с наследованием работал.

    P.S. На всякий случай: декоратор это просто функция, которая работает с переданными параметрами и тем что стоит после него, возвращая результат преобразования. Никакой магии.
    Код:
    @Template
    @Component({})
    export default class Item extends Vue {}
    равносилен:
    export default Template(
      Component({})(
        class Item extends Vue {}
      )
    )
    Ответ написан
  • Vue async mounted() when to use?

    Aetae
    @Aetae
    Тлен
    Когда? Когда хочешь.
    Async функциия - это просто функция возвращающая Promise. Не более того.
    Хуки в Vue никак не используют возвращаемое значение.

    Конкретно в примере компонент стартует с путым массивом в качестве данных и только через некоторое время подгружает значения.
    Результат? Компонент некоторое время ничего не отображает.
    Если тебя это устраивает - всё ок. Можешь ещё крутилку нарисовать, пока грузит.
    Ответ написан
  • JsonLd for vue + typescript?

    Aetae
    @Aetae
    Тлен
    Если для чего-то нет тайпинга, ты сначала смотришь в @types/<libname> и если там нет - делешь его сам.
    Таковы реалии typescript - ты работаешь преимущественно в javascript окружении.

    Добавь куда-нибудь такое расширение интерфейса:
    declare module 'vue/types/options' {
      interface ComponentOptions<V extends Vue> {
        jsonld?: any; // на самом деле не any, а то чего ждёт либа
      }
    }

    Либа вроде как написана на ts, так что хз, почему автор не озаботился тайпингом пакета. Зато ты можешь получить нужные декларации из его сорцов.)
    Ответ написан
  • Для чего указывать тип комонента @Component?

    Aetae
    @Aetae
    Тлен
    В данном конкретном случае - ничего. Однако данный дженерик используется для выведения типов внутри объекта переданного в @Component.
    @Component({
      methods: {
        getd(){
          alert(this.messages) // Property "mesages" does note exist on type Vue
        }
      }
    })
    export default class Home extends Vue {
      messages: string
    }
    @Component<Home>({
      methods: {
        getd(){
          alert(this.messages) // ok
        }
      }
    })
    export default class Home extends Vue {
      messages: string
    }


    Увы из-за особенностей реализации декораторов, вывести тип неявно в таких случаях не получится.
    Ответ написан
  • Vue watch vuex getter state?

    0xD34F
    @0xD34F Куратор тега Vue.js
    У геттера нет зависимостей, вот наблюдатель и не вызывается.

    Зачем функция? Собирайте объект, где ключами будут postId, а значениями - соответствующие isCommentsShown. Так ещё и в наблюдателе можно будет увидеть, кто изменился, сравнив старое и новое значения.
    Ответ написан
  • Ремонтировать монитор, когда часть экрана отрисовывается медленнее?

    DanceM
    @DanceM
    Кто хочет -ищет способ, кто не хочет -ищет причину
    Похоже не проблемы с вертикальной синхронизацией.

    Попробуйте поиграться с частотами монитора в настройках видеоадаптера. Может достаточно переключить с 59Гц на 60Гц или наоборот. Если это только в фильмах, смените видеоплеер, может он некорректно vsync использует.

    В остальном - тратить Вы будете не силы, а деньги. Если сервис скажет, что проблема устранима, то вопрос лишь в цене, ведь зачем тратить больше на новый?

    PS: пишет Алексей Харченко
    Это не проблемы с софтом или какой-то синхронизацией. Это дохлая матрица. А точнее, пропадание одного из напряжений (или проседание) после одного из дешифраторов матрицы. В ряде случаев лечится подпайкой тонкого проводочка в другую точку, с тем же напряжением. Но это довольно узкоспециализированная неисправность, даже с опытом сложно будет найти как устранить. А может быть и вовсе не получиться устранить.


    Ок, отвечу и на другие вопросы
    - в среднем раз в два-три года покупаю один новый (у меня мониторов пять на одном ПК)
    - БП через пять лет сдыхают, ремонтирую сам или меняю БП
    - у меня такого ни разу небыло за 20 лет. Если проблемы с матрицей - на выброс, ремонт обычно не целесообразен
    - разные покупаю, у одного LG было матрица сдохла, а БП дохнут у всех, рано или поздно
    Ответ написан