• Бэкап через git - идиотизм?

    Jump
    @Jump Куратор тега Системное администрирование
    Системный администратор со стажем.
    Теоретически можно, и оно будет работать.
    По факту - велосипед из костылей скрученных скотчем.
    Ответ написан
    Комментировать
  • Как html перевести в pdf?

    @bushart
    За ~10 лет жутко намучился с разными плагинам и модуля "под язык" и совсем недавно открыл для себя стороннюю утилиту wkhtmltopdf. Я думаю, что инструмента лучше, просто не найти. Единственный минус, что в надо писать отдельный сервис для преобразования ваших обращений в команду, но это работы на час, максимум.
    Ответ написан
    2 комментария
  • Русскоязычное сообщество Elm?

    pandas
    @pandas
    Сообщество Elm разработчиков в телеграме тут: https://t.me/elm_ru
    Ответ написан
    Комментировать
  • Подходит ли PHP для парсинга сайтов, достаточно ли его возможностей чтоб удовлетворить большинство заказчиков на фрилансе?

    @malbaron
    Любой универсально-развитый язык подходит.
    Но для некоторых есть готовые крайне удобные библиотеки. Например, Scrapy для Python.
    Наверное есть что то подобное и для PHP.

    Для всех нет.
    Сейчас много сайтов с Javascript, на голом PHP их не распразнить.
    Нужно эмулировать браузер в чем то типа PhantomJS или т.п.
    А эти штуки как правило управляются из языка JS.
    Ответ написан
  • Подходит ли PHP для парсинга сайтов, достаточно ли его возможностей чтоб удовлетворить большинство заказчиков на фрилансе?

    T_y_l_e_r
    @T_y_l_e_r
    Еще как подходит
    Так же поддерживает многопоточность в CUrl
    Кукисы и все прочее
    Запускать нужно как консольное приложение
    Из инструментов есть всякие эмуляторы браузеров
    А либа dom поможет распарсить по дум элементам
    А screen в линукс позволит запустить несколько парсеров
    В общем изучайте
    База городов вк выкачалась за неделю в 100 потоков и проверкой на ошиби при скачивании
    аптайм не 100% оказался
    Ответ написан
    3 комментария
  • Влияет ли число столбцов таблицы MySQL на производительность?

    xmoonlight
    @xmoonlight
    https://sitecoder.blogspot.com
    У меня в MySQL таблице товаров 100 столбцов с данными
    Я бы всё-таки это делал с использованием типов товаров, которые будут храниться в отдельной таблице, а здесь - только ID-шники на структуры типов. Также, все доп. характеристики - связываются через ID-шники полей-характеристик, которые хранятся тоже в других таблицах.

    В итоге: будет удобно создавать фасетный фильтр (для поиска товаров с определённым набором) и максимально сделать индексацию через ID-полей внутри базы.
    Ответ написан
    2 комментария
  • Что и зачем "Symfony Workflow Component"?

    Добавлю к ответу Юрий:

    Одна из основных вкусняшек Workflow в подобных компонентах/фреймворках/системах - это инверсия контроля над сущностями и прочими моделями. Клиент не изменяет статус сущности через условный сеттер setStatus('approved') с дополнительными сайд-эффектами, а осуществляет переход (действие, процесс) apply('approve'), одним из сайд-эффектов которого является изменение статуса. Вроде бы разница незначительная с технической точки зрения, но бизнес-заказчики обычно оперируют процессами, в которых задействованы сущности, а не операциями самих сущностей, они говорят "в результате подписания договора ему присваивается статус "действующий"", а не "присвоение договору статуса "действующий" означает что договор подписан". Когда их требование меняется на "в результате подписания договора ему присваивается статус "подписан" (которого раньше не было), а "действующий" присваивается когда менеджер его утвердит", то нам, разработчикам, значительно меньше приходится менять и чаще всего не код даже, а конфиги, код только дописывается, но не меняется, ну или меняется значительно в меньшей степени.
    Ответ написан
    Комментировать
  • Как правильно организовать обработку данных в экшене контроллера?

    Alex_Wells
    @Alex_Wells
    PHP/Kotlin
    К сожалению, никак. Чекни это: https://github.com/illuminate/validation/blob/mast...
    Запросы к базе идут напрямую, по-этому передать готовую модель валидатору невозможно. Так-же посмотри на это: https://github.com/illuminate/validation/blob/mast...
    Тоже хардкодинг. Laravel - не волшебная палочка, и очеень далек от совершенства. С ним стает очень тяжело при выполнении задач сложнее CRUD. Но всегда есть варианты:

    1) Можно создать свой класс валидатора, который будет наследовать обычный, там переписать методы проверки из базы, а так-же переписать DatabasePresenceVerifier, дабы тот юзал переданную модель. Но все это явно не будет элегантным и привальным решением, чисто как вариант.
    2) Использовать сторонние валидаторы.
    3) И самый простой - просто доставать модель, а потом уже $model->toArray() передавать валидатору. Таким образом можно полностью контролировать что и откуда достается, а так-же делать разные типы валидаций, выходящие за рамки обычного валидатора. Но в таком подходе тоже есть минусы - часть обычных методов валидатора можно выкинуть, таких как unique и тд.

    Если 3 вариант не подходит, что скорее всего именно так, то нужно искать абсолютно кастомные верификаторы.

    Других вариантов нету. Использовать встроенные средства Ларьки - ад. Я вот UUID в виде binary храню, так мне тут половину фреймворка раскопать надо, что-бы реализовать это нормально. Symfony в этом плане явно выигрывает.
    Ответ написан
    1 комментарий
  • Проект со сложной логикой на Symfony – как проектировать? Примеры?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Как хранить бизнес-логику чтобы модели не превратились в монстров из десятков тысяч строк?

    Тут не совсем модели. Entity - это просто объект данных, умеет хранить их в себе и бросать исключения, если не правильные данные вставляете, все. Repository - умеет работать со своим Entity И БД.

    БЛ находится в классах сервисах.

    Читал про Command Bus где, если правильно понял, на каждое действие в системе – свой класс?

    Вообще под каждое дествие - не обязательно, тут нужно руководствоваться здравым смыслом.

    Как их организуете (их тогда будут сотни)?

    Иерархически. Путь к классу должен быть "понимаем".

    Есть ли смысл выносить каждую доменную модель в модуль/микросервис, хранить всю связанную логику где-то там внутри, а с остальными общаться по внешнему API?

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

    За ответы в клиентскую часть – отдельный сервис-фронтенд?

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

    Каков оверхед?

    Ничтожный.

    Используют ли такое на практике?

    Да

    Какие подводные камни?

    Следствием серьезной декомпозиции в любом случае будут лишние сущности, чем раньше от них будете избавляться - тем лучше.

    Как не превратить кидание/получение событий типа PostBeforeEdit/PostBeforeEditHandler в "callback hell"?

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

    Функционал "PostBeforeEdit/PostBeforeEditHandler" часто дешевле и проще вынести в сервис, но опять же руководствуйтесь здравым смыслом.

    ACL Где храните указанную логику?

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

    Какие структуры для описанного выше – best practice?

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

    В моём понимании это выглядит как куча трёхмерных кубов доступа "crud – group – entity – field", как это сделать более плоским пока только одна идея – делать кучу таблиц many-to-many.

    Гибкая настройка вплоть до каждого поля 90% что не нужна. Если можно свести к понятию скопов прав - сделайте это.
    Структуру можно предлагать только зная ваш проект.

    Версионирование. Как вы версионируете подобные проекты?

    Semver.

    А если нужна "N-1" рабочая версия на продакшене?

    Значит на прод попадает ваша версия с тегом "N-1"))

    Есть ли смысл разделять версии в рамках единой кодовой базы проекта и как (неймспейсы, конфиг, модуль, что-то ещё)?

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

    И, самое главное – как всё это совместить?

    • РУКОВОДСТВУЙТЕСЬ ЗДРАВЫМ СМЫСЛОМ
    • Принимаете жесткие соглашения по правилам написания кода, например такие
    • Постарайтесь убедить бизнес в том, что без покрытия кода автотестами будет дороже, нестабильней и дольше. + Пишите тесты. Если объем тестов в 4 раза больше кода, который они тестируют - это норм. У меня бывали случаи, когда для критичного функционала тестов было в ~16 раз больше, чем кода.
    • Жесткие, обязательные кодревью.
    • Если задача крупная - декомпозируйте ее.
    • Технический долг - возвращайте обязательно И как можно скорее.
    • Перед тем как писать код для работы с внешним сервисом - имеет смысл написать его эмулятор.
    • Спешите только в случае серьезных проблем на проде)). Фичи "на вчера" отличаются от фич "на потом" только приоритетом выполнения, более ничем.
    Ответ написан
    6 комментариев
  • Как найти пересечения слов в строках и объединить в группы похожие строки (php)?

    littleguga
    @littleguga
    Не стыдно не знать, а стыдно не интересоваться.
    Примерно так: https://ideone.com/kylhD6

    Конечно, надо немного доработать, чтобы определяло именно слова, а не совпадения по буквам. То есть сейчас он в Ленинград и "Ленинградский" запихнет.

    upd:
    https://ideone.com/aBSGzA
    Допилил так, чтобы искал именно слова, а не просто вхождения строки.
    Если нужно искать именно слова, то можно допилить так:
    strpos(" ".$phrase." ", " ".$word." ") !== false

    Исходный код:
    spoiler
    <?php
    $arr = [
    'Концерт группы Ленинград',
    'Группа ZebraHead',
    'ZebraHead',
    'Группа СПЛИН',
    'Ленинград',
    'Концерт группы ZebraHead',
    'ZebraHead. Презентация альбома',
    'СПЛИН в Олимпийском',
    'Крематорий',
    'Группировка Ленинград'
    ];
    $newarr = [];
     
    $words = [];
    $result = [];
     
    foreach($arr as $key => $val){
        //приводим к нижнему регистру
        $val = strtolower($val);
     
        //убираем знаки препинания и прочие символы
        $val = str_replace(".", "", $val);
        $val = str_replace(",", "", $val);
        $val = str_replace("/", "", $val);
        $val = str_replace(";", "", $val);
        $val = trim($val);
     
        //запоминаем "очищенные" слова
        $newarr[$key] = $val;
     
        //разделяем слова в массив
        $cw = explode(" ", $val);
     
        //запоминаем весь список слов
        foreach($cw as $word){
        	array_push($words, $word);
        }
    }
     
     
    foreach($words as $word){
    	$ca = [];
     
    	foreach($newarr as $key => $phrase){
    		//проверяем, что фраза содержит это слово
    		if(strpos($phrase, $word) !== false){
    			//если так, то запоминаем
    			array_push($ca, $arr[$key]);
    		}
    	}
     
    	$result[$word] = $ca;
    }
     
    print_r($result);

    Ответ написан
    Комментировать
  • Как найти пересечения слов в строках и объединить в группы похожие строки (php)?

    lxsmkv
    @lxsmkv
    Test automation engineer
    Токенайзер вроде бы вполне подойдет.
    www.w3schools.com/php/func_string_strtok.asp
    И алгоритм на первый взгляд вполне простой: для каждого токена в энной строке перебери все остальные строки и сохрани под ключом те, в которых встречается этот токен. Ну и конечно если токен уже занесен в ответную таблицу, то обходить все строки не нужно, потому что при первом занесении список для этого токена уже был сформирован (по первой инструкции).
    Как-то так вобщем :)
    Ответ написан
    Комментировать
  • PHP или NodeJS использовать для парсера?

    DangelZM
    @DangelZM
    Для парсера я бы выбрал Go lang.
    То как быстро вы получите ответ из HTTP запроса зависит от сервера который будет отдавать страницу. То есть с вашей стороны язык в этом вам не поможет.
    По поводу же обработки ответа или же возможности обработки одновременно нескольких ответов тут уже есть разница.
    Ответ написан
    Комментировать
  • Почему на node.js до сих пор нету фреймворка уровня symfony или zend?

    djsv
    @djsv
    IT-генералист
    Если нужен большой монолитный фреймворк — можно посмотреть на Meteor. А вообще в мире JS/Node.js всё стремительно меняется, потому, как и писали другие выше, монолитному фреймворку здесь трудно выжить (отчасти потому React потеснил Angular). Более гибкий подход — собрать то, что нужно в конкретном проекте из независимых npm-модулей.
    Ответ написан
    Комментировать
  • Почему на node.js до сих пор нету фреймворка уровня symfony или zend?

    inf
    @inf
    DevOps Engineer
    Дык sailsjs есть. Всё равно все из рельс всё будут тащить.
    Да и пхп 20 лет уже развивается, а нода за 2015 год прошла от версии 0.11 до 4.2 За таким быстрым развитием платформы фреймфорки не успевают писать))
    Ответ написан
    1 комментарий
  • Штатные программисты или аутсорсинг?

    @poiuy7
    Найти хороших "Оутсорсеров" очень сложно. Как правило это очень некачественная работа.
    (у них работа по принципу как-то сделать и получить побольше)
    И за их некачественную проделанную работу в будущем вы будете платить больше, что покроет все сэкономленные траты.

    Хорошие штатные программисты будут стоить дорого, но лучше иметь 5 хороших программистов чем 10 плохих.

    Если объём задач неравномерный (типа 1 месяц большая загразку, а 2 месяца делать особо нечего).
    То имеет смысл держать небольшое количество штатных программистов и привлекать "Оутсорсеров", но по принципу, что штатные программисты полностью контролирую работу оутсорсеров.
    Ответ написан
    7 комментариев
  • В чем моя причина провала тестового задания Яндекса?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Ну давайте я покритикую:

    возьмем файлик

    1) вы не разобрались как объявлять методы у прототипов с новой нотацией `class`:

    class Travelsort {
        constructor() {}
        sortTickets(tickets) {}
    }


    2) вы не умеете пользоваться исключениями.
    if (!Array.isArray(cards)) {
        throw new ValueError('Wrong input');
    }


    3) использование let там где должен использоваться const

    4) в принципе использование переменных там где их быть не должно

    5) вы зачем-то реализовали свою функцию сортировки, я не увидел в требованиях отсутствия возможности использовать старый добрый Array.prototype.sort

    6) Общие замечания по кодинг стайлу. snake_case там где должен быть camelCase, пишите с большой буквы то что должно быть с маленькой и т.д.

    7) нарушения принципа единой ответственности. У вас объеткт умеет и сортировать и писать куда-то. Это категорически плохо.

    8) Если исправить 7-ой пункт то наш класс превращается просто в функцию.

    Далее... берем следующий файлик

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

    2) вы зачем-то тут в прототип объекта строки впихиваете функции для парсинга CSS. Таким образом мы нарушаем принцип единой ответственности. Да и в целом расширять без надобности прототипы объектов как-то не ок.

    Чуть дальше проскролил - вы пытаетесь расширить прототип строк для того что бы добиться API jquery? ух, батенька.

    3) очень много дублирования.

    4) очень плохо с protected variations.

    Справедливости ради, ваш код входит в категорию ">50% JS кода", так что не расстраивайтесь. Просто для работы в яндексе нужен чуть более высокий уровень и понимание вещей.
    Ответ написан
    17 комментариев
  • На чем писать фронтенд легко и непринужденно?

    @mik222
    Языки:
    ClojureScript. Быстро просто и удобно.
    TypeScript. Если нужны типы и вы привязаны к семантике JS(В команде много JS разработчиков не готовых учить нормальные языки).
    ------
    Ractive.JS если вам нужна типичная(живая) страничка с большим количеством зависимостей от состояния.
    Плохая композабельность, однако прекрасно работает в модели серверного рендеринга(вам не придется учить новые концепты). Т.е. У вас есть шаблон(mustache). К нему применяется состояние, рендерится вьюшка.
    Плохая композабельность потому-что mustache в mustache вы не вложите так-же красиво как компоненты в реакте.
    -------
    React. Сильно продвигаемый и довольно удобный. Если используете React, то смотрите сюда https://react.parts/web
    очень много готовых компонентов
    -------
    Скажем так
    SPA: ClojureScript/React/TypeScript
    Оживленная страничка: es6/Ractive
    Ответ написан
    Комментировать
  • Я хочу хорошую библиотеку на PHP для MySQL. Я зажрался, или такое есть и активно используется?

    Вот вам функциональный комбайн для работы с БД www.doctrine-project.org
    Ответ написан
    Комментировать
  • Я хочу хорошую библиотеку на PHP для MySQL. Я зажрался, или такое есть и активно используется?

    catanfa
    @catanfa
    Судя по описанию, лучше всего подходит RedBeanPHP, потому что она большую часть телодвижений берёт на себя.
    Ответ написан
    Комментировать