Задать вопрос
  • Как выбрать максимальное значение во вложенных массивах?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    просто и красиво?

    Перебрать массив и получить максимальное значение - это три строчки. Куда проще-то?

    Есть какая-то функция или сочетание функций

    Есть поговорка. "Дурная голова ногам покою не даёт". И ещё есть принцип, KISS, который переводится как "не надо пытаться выглядеть умнее, чем ты есть, дурачок - опозоришься".

    Самый простой и красивый код - это тот который ты написал сам и понимаешь, как он работает. И сможешь в случае чего исправить. А не побежишь снова на Хабр, "мне тут пацаны дали красивое, а можно чтобы оно ещё и работало?"
    Ответ написан
    1 комментарий
  • Возможен ли отступ только второй строки CSS clamp?

    Ankhena
    @Ankhena Куратор тега CSS
    Нежно люблю верстку
    За отступ первой строки отвечает text-indent.
    text-indent: -50px;
     padding: 50px;

    Только не ясно при чем тут line-clamp
    Ответ написан
    2 комментария
  • Делаю видеоплеер и в полноэкранном режиме почему-то не видит div с моими контролами?

    Aetae
    @Aetae Куратор тега JavaScript
    Тлен
    Ну потому что во весь экран ты разворачиваешь само video, а надо videoplayer целиком: при фулсскрине на элементе ничего кроме этого элемента и его содержимого как бы не существует.

    P.S. Ты пытаешься вызывать префиксные webkit и moz requestFullscreen, а чистый по стандарту requestFullscreen даже не пробуешь. Не надо так.
    Ответ написан
    Комментировать
  • Почему meta charset="utf-8"/ работает только если сместить кавычку на meta "charset=utf-8"?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Раз код писали в блокноте, то, скорее всего, в Windows. Значит сохранили в кодировке windows-1251.
    Когда пишете тэг правильно, <meta charset="utf-8">, то указанная вами кодировка utf-8 не совпадает с реальной кодировкой текста, отображаются вопросики.
    Когда пишете тэг неправильно, то он игнорируется и кодировка распознаётся правильно, отображается нормальный текст.
    Кодировка, указанная в тэге, должна соответствовать кодировке, в которой сохранён текст.
    Ответ написан
    1 комментарий
  • Как в html выполнять замену текстового содержимого в зависимости от родительского тега?

    @rPman
    Когда речь идет о строгом следовании html (и не только, там и javascript может быть), то простым поиском или регулярными выражениями не получится.

    Нужно использовать готовый html парсер, либо штатные либо библиотеку simplehtmldom (рекомендую).
    Ответ написан
    Комментировать
  • Что происходит со свойством класса при присвоении извне?

    @mvv-rus
    Настоящий админ AD и ненастоящий программист
    class - это функция. Которая выполняет роль конструктора класса при вызове через new. Если вы добавите к функции свойство, то у функции это свойство останется. А вот в созданный ей объект оно просто так не попадает. И не унаследуется - потому что в ссылку на протоип ([[Prototype]] и т.д.) созданного объекта операция new записывает содержимое свойства prototype функции-конструктора. Хотите добавить свойство в экземпляры class SomeClass - добавляте его в SomeClass.prototype. Или же добирайтесь через свойство constructor объекта-экземпляра (constructor.word) - вот оно указывает на функцию-конструктор.
    Ответ написан
    Комментировать
  • Что происходит со свойством класса при присвоении извне?

    VoidVolker
    @VoidVolker Куратор тега JavaScript
    Dark side eye. А у нас печеньки! А у вас?
    Str.word = 'word'
    Добавили свойство word объекту Str.
    const s = new Str()
    Создали новый объект s с помощью вызова конструктора класса Str. Str и s - это два разных объекта. Str - объект типа класс, а s - это экземпляр класса. Список свойств экземпляра класса и его методы хранятся в отдельном объекте под названием "прототип", а не в самом объекте класса.
    Рекомендую изучить механизмы работы прототипного наследования в мире JS и как работают конструкторы и классы: JavaScript-Garden -> constructors, JavaScript-Garden -> object.prototype
    Ответ написан
    Комментировать
  • Что происходит со свойством класса при присвоении извне?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Вы почувствовали разницу между «статическими» свойствами/методами и просто свойствами/методами.

    Статические – принадлежат самому классу, но не его экземплярам.
    Ответ написан
    Комментировать
  • Как сделать переключение чанков через список или радио кнопку?

    an-tar
    @an-tar Куратор тега MODX
    Full stack web developer
    А через что создаете конфиги? Например, в ClientConfig есть тип Selectbox (xtype: modx-combo), он мог бы помочь, если я верно вас понял.
    Ответ написан
    6 комментариев
  • Как обновить codium plugin для PyCharm?

    Elaryks
    @Elaryks
    Включите VPN, после чего обновляйте плагин.
    Ответ написан
    Комментировать
  • Как добавить кнопки zoom на Яндекс Карту?

    yesbro
    @yesbro
    Думаю, помогаю думать
    YMapZoomControl импортируется из другого места. Сам недавно матерился по этому поводу. У них все самое полезное можно в примерах найти https://yandex.ru/dev/jsapi30/doc/ru/examples/case...

    const {YMapZoomControl} = await ymaps3.import('@yandex/ymaps3-controls@0.0.1')
    Ответ написан
    2 комментария
  • Пустая страница при деплое, как исправить?

    alsolovyev
    @alsolovyev
    ¯\_(ツ)_/¯ Enjoy life, Eat well & Laugh often
    Если вы просто открываете index.html в браузере, то у вас должны быть ошибки в консоле. Что-то тип:
    [Error] Origin null is not allowed by Access-Control-Allow-Origin. Status code: 0
    [Error] Failed to load resource: Origin null is not allowed by Access-Control-Allow-Origin. Status code: 0 (index-n_ryQ3BS.css, line 0)

    Не дает загрузить файлы из-за безопасности.
    Запустите какой сервере простой (live-server или python3 -m http.server) или используйте vite preview:
    // package.json
      "scripts": {
        // ....
        "preview": "vite preview"
        // ....
      },
    Ответ написан
    2 комментария
  • Как тестировать запросы и ответы из базы данных через phpunit?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Мне кажется, что найденные варианты работают не так. Используются они оба, а какой именно - зависит от того, что именно вы тестируете - запрос или ответ.

    Если говорить про "запросы к БД", то для таких тестов "массив с данными" использовать просто глупо. Это получится какой-то формальный тест: "проверяем, что метод возвращает массив из трех строк - и тут же возвращаем этот самый массив". В чем смысл? Если вы тестируете запрос к БД, то и надо тестировать запрос к БД. По-другому никак.

    Здесь я отвлекусь, и порассуждаю на тему того, что на самом деле тестирование - это гораздо более трудоёмкая задача, чем обычно считается. И как следствие, большая часть тестов - это такая вот туфта. Либо тест заранее возвращает нужные данные, либо тестирует один-два кейса. А вариантов неправильных входящих данных ведь может быть огромное количество. То есть по-хорошему на такой заведомо сложный (и принципиально неделимый!) метод нужно десятка два тестов.

    И сюда же использование для тестов БД другой системы. Например основная БД MySQL, а для тестов используется Sqlite. Тут сразу можно сказать, что это профанация. Различие даже в какой-то одной настройке БД может повлиять на результаты запроса (и теста как следствие) - а тут и вовсе используется совсем другая БД.

    С другой стороны, работу с БД скорее стоит тестировать не в юнит тестах, а скажем в интеграционных. Но не будем углубляться.


    Массив же "с данными, симулирующими ответ из базы данных" используется на следующему уровне, там где требуется "ответ из базы данных". Взьмём метод, который использует данные, полученные из БД. Например авторизация юзера. Этот метод должен не сам лезть в базу, а дёргать отдельный метод, вполне возможно, что совсем другого класса. И вот чтобы протестировать авторизацию, вы и мокаете метод для работы с БД, и из этого мока возвращаете тот самый массив без всякого обращения к бд.

    Здесь нелишне будет напомнить название доклада с одной из последних конференций по пхп. Дословно не помню, но что-то вроде "Делайте методы как можно короче. Ваши тесты скажут вам спасибо." Собственно, именно при тестировании очень быстро начинаешь понимать удобство атомарных (то есть выполняющих какую-то одну простую операцию) методов. А без тестов пройдёт довольно много времени, пока не понадобится этот длинный метод отрефакторить, и по итогам менять кучу кода, который его вызывает.

    Так что разбивайте ваши длинные методы на мелкие, и тогда вопрос, как их тестировать, в большинстве случаев отпадёт сам собой.
    Ответ написан
    1 комментарий
  • Совместимы ли блок питания и ноут?

    CityCat4
    @CityCat4
    //COPY01 EXEC PGM=IEBGENER
    А надо было проверить. БП у нас выдает 19V, 6.32A. А ноут потребляет 19.5V, 9.23A - ощущаешь разницу? БП выжимается "досуха" - и все равно его не хватает. Меняй.
    Вот, например в Чип и Дипе - ровно по параметрам - 19.5V, 9.23A
    БП, работающий на пределе, вполне способе сгореть. Буквально, с огнем и дымом. И мерзким запахом паленого пластика.
    Ответ написан
    Комментировать
  • Как избежать загрузки video пока оно не требуется?

    402d
    @402d
    начинал с бейсика на УКНЦ в 1988

    Есть js скрипт добавления нескольких video тегов

    который работает неправильно , значит вместо него надо написать работающий правильно.
    Или прочитать / разобраться в существующем как он устроен и переписать под себя.

    А не добавлять костыли снаружи.

    Логика всех скриптов Lazy Load основана на том, что сперва есть плейсхолдер, который заменяется на реальный контент при входе объекта в область видимости.
    Ответ написан
    Комментировать
  • Лучшие практики для русскоязычных аббревиатур в API?

    fox_12
    @fox_12
    Расставляю биты, управляю заряженными частицами
    Если предполагается в перспективе использование вне РФ - то лучше использование tin вместо inn, и прочие по возможности таким образом заменять.
    Ну а если сугубо для внутреннего пользователя - то можно использовать русские транслитерированные аббревиатуры.
    Ответ написан
    Комментировать
  • Как сверстать 3 колонки, чтобы текст по краям заходил на центральную колонку?

    copyhold
    @copyhold
    вам поможет свойство
    shape-outside
    Ответ написан
    Комментировать
  • Как обеспечить невозможность извлечения шрифтов с сайта?

    Mike_Ro
    @Mike_Ro
    Python, JS, WordPress, SEO, Bots, Adversting
    Разве возможно запретить скачать файл шрифта и при этом использовать этот шрифт?

    Нет. Все что "загрузилось браузером" - доступно для скачивания.

    Лицензируйте шрифт, затем ищите сайт, который использует шрифт без лицензии, нотариально заверяйте каждый год использования, затем, через 3 года подавайте в суд.
    Ответ написан
    7 комментариев
  • Как обеспечить невозможность извлечения шрифтов с сайта?

    @aleks-th
    Технически.
    Никак.
    Права на шрифт можно только юридически в суде защитить.
    На сайте все что загрузил браузер уже лежит на компьютере пользователя.
    Ответ написан
    3 комментария
  • Как должен выглядеть идеальный контроллер?

    Если хотите идеал, то он должен соответствовать следующим пунктам:

    1. Сериализация/десериализация - это дорогостоящее мероприятие, поэтому оно должно делаться только в двух местах: прямо на входе и прямо на выходе. Вход - это ваш контроллер, Выход - это другой сервис, куда вы передаёте данные, или база данных (тут тоже происходит сериализация, либо явно, либо в ORM). Во всех остальных слоях инфообмен должен совершаться уже при помощи объектов PHP либо нативных типов. Это экономит ресурсы. При передаче между слоями приложения объектов вместо значений либо ассоциативных массивов вы сразу будете видеть очепятки, IDE вам прекрасно поможет при помощи автодополнения, объекты могут иметь какие-то полезные методы.

    2. Очень желательно в каждом из слоёв иметь собственный класс, отвечающий за данные. Например, нам в слой API приходит JSON-чик с новым пользователем.
    - Сериализуем JSON в DTO UserInAPI, сразу валидируем всё то, что мы можем валидировать без слоя бизнес-логики, и либо отдаём клиенту ошибку, либо передаём сам объект UserInAPI в следующий слой: слой бизнес-логики
    - В слое бизнес логики, получаем DTO UserInAPI на входе, преобразуем его в свой бизнес-объект UserInBusiness, валидируем его уже с точки зрения бизнеса, и либо возвращаем ошибку в слой API, либо совершаем над ним действия, и передаём объект класса UserInBusiness в слой работы с базой
    - В слое работы с базой данных получаем на входе объект UserInBusiness, преобразуем его уже в сущность базы данных UserInDB, валидируем всё на предмет корректности данных для базы, и либо возвращаем ошибку в бизнес, либо сохраняем сущность класса UserInDB в базу.

    Зачем такие сложности, вы спросите? А просто обратите внимание на то, что скорость изменения кода в разных слоях разная.
    - API вообще должен меняться раз в сто лет, чтобы не злить клиентов. Поэтому DTO класс UserInAPI будет стабильным и редко будет меняться.
    - Бизнес-логика меняется очень часто. У класса UserInBusiness постоянно будут добавляться поля и методы, тут жизнь будет кипеть.
    - Слой базы данных будет меняться реже, чем слой бизнеса, но чаще, чем слой API, потому что нам нужны будут новые поля в базе, новые таблицы и связанные таблицы.
    - И если мы один тип сущности протащим во все слои, то эта сущность обрастёт таким количеством различной хрени, что нам плохо станет, когда будем на неё смотреть. Либо она обрастёт кучей декораторов в каждом из слоёв. Поэтому лучше всё разделить.

    3. Теперь внимание, казалось бы, что мы слишком сильно связываем наши слои, и нижестоящие слои знают что-то о вышестоящих, а это неправильно. Ведь мы передаём объект UserInAPI в слой бизнеса, т.е. слой бизнеса должен уметь работать с этим объектом. И так же слой базы должен уметь работать с объектом бизнеса UserInBusiness. Как же быть? А очень просто. На входе слоёв использовать интерфейсы. Т.е. в слое бизнеса мы будем принимать не сам класс UserInAPI, а объект, имплементирующий интерфейс UserIncoming, который объявим в бизнес слое, и заставим слой API сделать так, чтобы его класс UserInAPI имплементировал этот интерфейс. Таким образом слой бизнеса ничего не будет знать о слое API, а будет ждать на входе данные по контракту, описанному в интерфейсе. Бизнесу плевать на конкретную реализацию, ему нужны только методы getUsername, getEmail из интерфейса. А какой класс ему их предоставит - пофигу. Таким образом мы практически полностью разделяем слои и в два счёта сможем поменять слой API, где у нас HTTP контроллеры, на слой RabbitMQ, SOAP, Grpc и т.д.
    Ответ написан
    6 комментариев