• Как извлечь ссылку из строки?

    0xD34F
    @0xD34F
    $dom = new DOMDocument();
    $dom->loadHTML($str);
    
    $result = [];
    
    foreach ($dom->getElementsByTagName('a') as $n) {
      if (in_array('some-class', explode(' ', $n->getAttribute('class')))) {
        $result[] = $dom->saveHTML($n);
      }
    }
    Ответ написан
    Комментировать
  • Как отфильтровать массив в массиве?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Как будем определять, должен ли элемент остаться: const mustStay = n => n !== null;.

    Собираем новый массив:

    const newArr = arr.map(n => ({
      ...n,
      array2: n.array2.filter(mustStay),
    }));

    Обновляем существующий:

    arr.forEach(n => n.array2.reduceRight((_, n, i, a) => mustStay(n) || a.splice(i, 1), 0));
    
    // или
    
    for (let i = 0; i < arr.length; i++) {
      const a = arr[i].array2;
      a.splice(0, a.length, ...a.filter(mustStay));
    }
    
    // или
    
    for (const { array2: a } of arr) {
      let numDeleted = 0;
    
      for (const [ i, n ] of a.entries()) {
        a[i - numDeleted] = n;
        numDeleted += !mustStay(n);
      }
    
      a.length -= numDeleted;
    }
    Ответ написан
    Комментировать
  • Почему Service Locator это зло и что использовать вместо?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Все эти страшные слова - они на самом деле всегда про одно и то же - про связность. Когда ты хардкодишь внутри класса вызов какого-то конкретного сервиса - ты намертво к нему привязываешься. И чтобы поменять сервис на другой, ты будешь вынужден поменять код класса. Окей, поменял. И тут же в другом месте, где этот же класс использовался, что-то сломалось! И что теперь? Делать два класса, которые различаются одной строчкой? Нет конечно. А как тогда использовать один и тот же класс для обработки разных входящих данных (или одних и тех же данных, но разными способами)? Сделать его поведение изменяемым. То есть сделать изменяемыми те инструменты, которыми он пользуется - т.е. его зависимости.

    Поэтому все зависимости обычно передаются через конструктор (и поэтому и называются инъекция зависимостей.)

    Таким образом мы можем менять поведение класса, не меняя его код

    Но тут надо понимать, что всё это работает только при правильном применении ООП. А точнее просто при применении ООП. Потому что 98% "ООП" кода, который пишется на РНР - это голимая процедурщина, даже если она обёрнута в классы и методы. Если у тебя метод класса представляет из себя стену кода, которую ты тупо перенёс из файла, инклюдившегося в любимое похапешное спагетти - то это не ООП. Это та же процедурщина, вид сбоку. И смысл использования dependency injection ты с ним не почуствуешь. Будешь конечно применять, но в качестве карго культа - потому что тебе это на тостере написали.
    А вот когда твой код начнет становиться действительно объектным - тогда стразу станет понятнее.


    Похожим на сервис локатор является сервис- или DI-контейнер. Используемый вручную, он является тем же самым сервис локатором. Поэтому вручную его никогда не надо вызывать - что и запрещается в симфоневских конроллерах - а только для автоматического создания классов. В МВЦ у тебя ведь очень многие объекты создаются автоматом - сущности, контроллеры. И вот для того, чтобы при автоматическом создании экземпляра класса у тебя были на руках все требуемые сервисы - и нужен контейнер.

    Соотвтственно, ответ на вопрос "что использовать?" очень простой:
    - при ручном создании экземпляра объекта, все зависимости передавать в него через конструктор, а не получать "из воздуха" в коде.
    - при автоматическом создании экземпляра объекта, использовать dependency injection container

    В этим смысле очень полезно освоить Симфони - строгий фрейворк, в котором нет сервис локатора и в котором запрещено пользоваться контейнером напрямую.
    Ответ написан
    4 комментария
  • Как принимать и совершать звонки с ПК через смартфон?

    @anton99zel
    29а класс средней школы №7
    Хм...вариантов так то масса
    1. Купить виртуальный номер (пользоваться им как на смарфтоне (через фирменное приложение или acrobits), так и на компьютере (ПО или WebRTC).
    Сделал скриншот - звоню прям из браузера
    spoiler
    5f352fe801375090208157.png

    2. Если у вас есть мобильный номер, то его можно подвязать к виртуальной атс (работает только с мегафоном по sip-протоколу) и пользоваться также как в п.1.
    Либо без использования виртуальной АТС - ставите ПО на комп PhonerLite или Bria Solo (X-Lite) и прописываете мегафоновские настройки sip (услуга мультифон).
    3. PS: При использовании sip телефонии можно и управление голосом прикрутить (на айфон команды siri, на андроиде наверняка тоже что то есть + телеграм (который на сервер шлет команды для набора номера (обратный звонок)).

    Если исхитрится и погрузиться в тему, то вообще ничего платить не придется (только из пакета минуты будут тратиться). Рекламировать не буду, думаю на скриншоте понятно - какой вам сайт нужно посетить.

    ЗЫ2:
    Блютуз гарнитура + таймвьюер для андроид, не?
    Ответ написан
    Комментировать
  • Как чётные элементы массива сделать ключами, а нечётные значениями нового массива?

    0xD34F
    @0xD34F
    $chunks = array_chunk($arr, 2);
    $newArr = array_combine(array_column($chunks, 0), array_column($chunks, 1));

    или

    for ($i = 0; $i < count($arr); $i += 2) {
      $newArr[$arr[$i]] = $arr[$i + 1];
    }
    Ответ написан
    1 комментарий
  • Зачем точка входа не в корне?

    DevMan
    @DevMan
    не обязательно.
    но назовите хоть одну причину делать иначе?
    Ответ написан
  • Как оценивать сроки?

    php666
    @php666
    PHP-макака
    Прикольно звучат высказывания комментаторов в духе "если вы знакомы с проектом". Мне правда интересно, как в условиях современных монстроподобных корпоративных приложений можно быть "знакомым" с проектом, который, возможно, пилится не один год (пусть хотя бы даже от 3 лет) целой командой? Ни один человек, если он не единоличный автор этого проекта, не может быть настолько хорошо быть "знаком" с проектом, что бы чётко отвечать на вопросы в стиле "сколько времени займет поправить баг". Даже программисту среднего звена ясно, что совсем маленький баг может потянуть за собой чуть ли не фатальный коллапс архитектуры с последующим тотальным рефакторингом всего и вся.

    Невозможно в разработке планировать какие-либо сроки. Тут автор прав.

    Ответ на самом деле очень простой - ты работаешь на весьма хреновой работе. Я сейчас опять пропиарю свою статью про выживание в IT, прочти её, там не касается полностью твоего вопроса, но суть очень близка (пожалуй, я потом её дополню, спасибо за "наводку" - про сроки я там не писал...).

    Как оценивать сроки? Ответ очень простой - да никак не оценивать. Если работодатель построил такую систему, где менеджмент лезет с этими бюрократическими вопросами, не понимает, что разработка или фикс багов в проекте - это не типовая работа, как, например, класть кирпичи или валить лес - то это плохой работодатель. Или плохой менеджмент. А в целом - это компания-эксплуататор, из которой надо бежать.

    Я по себе знаю, когда от меня требовали сроки. Последний раз был вообще трешачок в одной московской компании - от меня требовали сроки на 2 день после назначения задачи на меня, при этом я вообще не понимал ничего в задаче - в её бизнес-логике, т.к. работал в этой компании от силы недели три. Через буквально несколько дней меня вызвали "на ковер", мол, почему так долго. Жалею, что прямо тогда не послал их прямым текстом на три известные буквы, а продолжил работать. Ничего хорошего из этого, конечно же, не вышло.
    Сейчас я работаю в таком месте, где ВООБЩЕ нет никакого понятия сроки, где разработка проектов в корпорации длится годами - IT работает не на внешнего заказчика, а на внутреннего - на саму же корпорацию. Последний проект, в котором я участвовал, занял около 2-х лет. И бОльшая часть была не программинг, а взаимодействие разных отделов, нахождение багов, форсмажорных ситуаций после запуска и т.д. Работать в таких условиях сплошное удовольствие. Никаких стрессов, никаких менеджеров, изображающих бурную деятельность.

    Если хочешь поседеть раньше времени - оставайся и слушай упреки менеджмента. Вместо спокойной работы - придумывай эти цифры сроков. Если нет - просто ищи адекватное место работы. Другого не дано.
    Ответ написан
    Комментировать
  • Есть ли расширение для автоматического редиректа на русскую документацию php.net?

    Я использую стандартный функционал поисковых систем из адресной строки.
    Тоесть начинаю вбивать в адресной строке php.net array_diff + Enter и попадаю сразу на русскую версию документации, и на нужную страницу.
    php.net можно заменить на любую другую удобную строку
    Ответ написан
    2 комментария
  • Как отсортировать массив объектов по массиву значений определённого свойства?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Сортируем существующий массив:

    messages.sort((a, b) => {
      [ a, b ] = [ a, b ].map(n => sortableLanguages.indexOf(n.language));
      return a === -1 ? 1 : b === -1 ? -1 : a - b;
    });

    Собираем отсортированный новый:

    const sorted = (arr, key) => arr
      .map(n => [ n, key(n) ])
      .sort((a, b) => a[1] - b[1])
      .map(n => n[0]);
    
    
    const order = Object.fromEntries(sortableLanguages.map((n, i) => [ n, i + 1 ]));
    const sortedMessages = sorted(messages, n => order[n.language] || Number.MAX_SAFE_INTEGER);
    
    // или
    
    function sorted(arr, order, key) {
      const ordered = new Map(order.map(n => [ n, [] ]));
      const unordered = [];
    
      arr.forEach(n => (ordered.get(key(n)) || unordered).push(n));
    
      return [].concat(...ordered.values(), unordered);
    }
    
    
    const sortedMessages = sorted(messages, sortableLanguages, n => n.language);
    Ответ написан
    1 комментарий
  • Как реализовать функцию проверки подключения файла?

    Stalker_RED
    @Stalker_RED
    Выбросить это все, использовать обычный require_once.
    А на случай ошибок подключить обработчиик:
    https://www.php.net/manual/ru/book.errorfunc.php

    Или вообще переделать все на авттозагрузку.
    https://www.php-fig.org/psr/psr-4/
    Ответ написан
    Комментировать
  • Правда ли что рынок веб разработки "перегрет"?

    php666
    @php666
    PHP-макака
    "Ко-ко-ко, дефицит хороших сотрудников" -- повторяют один за другим вайтишнички. Вторая тема за день с шаблонными ответами как под копирку. При этом, каждая такая макака себя считает именно "хорошим сотрудником", достойная не менее полмиллиона рублей в месяц зарплаты.

    Конечно рынок веб разработки «перегрет». Порог вхождения низкий. Килотонны мануалов на русском языке и басни о богатых айтишниках привлекают сюда всех. Эти толпы может, на начальном этапе, действительно плохо делают свою работу, но большинство без сомнения станут весьма приемлемыми программистами. И рынок будет перегрет еще больше.

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

    И не забывайте о времени - через Н лет все, кто сейчас "на коне", станут вторсырьем, ибо индустрия на месте не стоит и знания ваши обесценятся. Вот смеху то будет, когда после 10 лет упорного труда вы ВНЕЗАПНО поймете, что индустрия рванула вперед, а вы все на [нужное_вписать] кодите. Быгыгы.
    Ответ написан
    51 комментарий
  • Разместил резюме на позицию junior front-end, не понимаю что не так в нем?

    php666
    @php666
    PHP-макака
    переизбыток айтишников на рынке - вот в чем проблема
    Ответ написан
    1 комментарий
  • Есть ли перспективы у программиста за Москвой И СПб?

    php666
    @php666
    PHP-макака
    Живу в подмосковном городе тыц на карту.
    С 2004 года, как я активно работаю программистом, работы ближе, чем в Москве, за 13 км от дома НЕ БЫЛО. Но 13 км для Подмосковья с утра это примерно час-полтора езды (зимой все два), в виду колоссальной загруженности дорог.
    Все, что ниже, левее или правее моего горда на карте - там НИКОГДА не было работы. И это ближайшее Подмосковье, почти центр России! Ни в самом моем городе, ни в ближайшем Домодедово, Подольске и далее, на юг. Одно время ездил в Люберцы за 25 км. Пробки как неминуемая часть жизни. Траты на бензин - огромные. Машина требует вложений. Сейчас у машины пробег 120 тыс км, а реальное количество моточасов (когда двигатель работал) - раз в 50 больше.

    Работы нет не только за МКАДом, работы нет и на окраинах Москвы. В пример - юг москвы. Бывает пара вакансий, сходил на собеседование, что-то не нравится или не взяли и все. Вся работа по IT в центре, рассчитана на приезжих, на тех, кто гол как сокол и кочует как цыган, меняя место жительства. Вот это - реалии этого долбанного It.

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

    Правда ли, что у программиста нет перспектив, если он не работает в Москве или СПб, а в других регионах РФ?
    Открой hh и посмотри. Я смотрел. ЗП - очень маленькие, вакансий на какой-нибудь Воронеж несколько штук. А если живешь в "колхозе", то шансов нет - либо удаленно, если найдешь, либо ехать в Москву и отдавать половину зп за квартиру. Если на периферии своё жилье, семья и иные сдерживающие факторы -- очень мутная затея бросать все и переться в Москвабад.

    городах РФ (кроме Москвы и СПб) программисты не нужны
    А зачем там нужны программисты? Программисты нужны там, где есть компании, которые нуждаются в программистах. Ты думаешь в какой-нибудь Твери много компаний, нуждающихся в программистах? Ну 1с-ники может быть приходящие нужны, может пара веб-макак надо. Там люди не работают в офисах, не занимаются стартапами, там более приземленные сферы деятельности.
    Ответ написан
    8 комментариев
  • Как объединить повторяющиеся значения в массиве и записать их индексы?

    0xD34F
    @0xD34F Куратор тега JavaScript
    const result = Object
      .entries(arr.reduce((acc, n, i) => ((acc[n] = acc[n] || []).push(i), acc), {}))
      .map(([ label, indexes ]) => indexes.length > 1 ? { label, indexes } : label);
    Ответ написан
    1 комментарий
  • Как объединить по свойствам массив объектов?

    0xD34F
    @0xD34F Куратор тега JavaScript
    const result = Object.values(arr.reduce((acc, n) => (
      (acc[n.ID] = acc[n.ID] || { ID: n.ID })[n.FIELD] = n.VALUE,
      acc
    ), {}));
    Ответ написан
    1 комментарий
  • Как получить ID из обеих таблиц при выполнении Inner Join Left?

    mosesfender
    @mosesfender
    Меланхолик, параноик, падал с коек
    В select нужно приделать алиас к полю ID другой таблицы.
    select data.*, internal.ID as internalID, internal.Number as internalNumber, internal.Date, internal.Time, internal.Long from data left join `Internal` on data.Number = internal.Number
    Ответ написан
    1 комментарий
  • Как отследить событие скроллинга НА ЭЛЕМЕНТЕ?

    0xD34F
    @0xD34F Куратор тега Vue.js
    необходимо отлавливать событие скроллинга

    что-то вроде $element.bind('mousewheel',

    Так скролл, или колесо мыши? Вы уж определитесь.

    Ну а так-то всё просто:

    <div @wheel="onWheel" @scroll="onScroll">

    methods: {
      onWheel() {
        console.log('wheel');
      },
      onScroll() {
        console.log('scroll');
      },
    },
    Ответ написан
    2 комментария
  • Как отключить реактивность в компоненте?

    0xD34F
    @0xD34F Куратор тега Vue.js
    При изменении item.department меняется и item_loaded.department

    this.item_loaded = this.item

    Реактивность, как же. Язык не знаете, а лезете фреймворками пользоваться. Правильно будет так (погуглите, в чём разница между примитивными типами данных и объектами):

    this.item_loaded = { ...this.item }

    Не очень понятно, зачем created - в data контекстом является экземпляр компонента, параметры доступны, так что копировать объект можно прямо там:

    data() {
      return {
        item_loaded: { ...this.item },
      };
    },

    Вычисляемое свойство isChanged - можно же сделать в одну строку вместо пяти:

    isChanged() {
      return this.item_loaded.department !== this.item.department;
    },

    Почему в качестве дефолтного значения для item используется null? - вы обращаетесь к его свойствам, если ничего не передать, получится ошибка cannot read property of null. Должен быть объект:

    default: () => ({ /* можно указать какие-нибудь свойства с дефолтными значениями */ }),

    Мутируете параметр (v-model="item.department"). Правильно будет эмитить изменения в родительский компонент и обновлять объект уже там. В родителе цепляете значение для параметра item с модификатором sync, а в рассматриваемом компоненте v-model заменяете на установку значения и обработку события input:

    <input
      :value="item.department"
      @input="$emit('update:item', { ...item, department: $event.target.value })"
    >
    Ответ написан
    1 комментарий