Задать вопрос
  • Как сегодня верстают такие бордеры?

    profesor08
    @profesor08 Куратор тега CSS
    Псевдоэлементы в помощь:
    Ответ написан
    2 комментария
  • Нужен ли репозиторий для Eloquent??

    @Adelf
    Eloquent прекрасно выполняет свои задачи простой и более-менее эффективной ORM для проектов с CRUD и около таких.
    Разумеется частенько нужны запросы посложнее и их выделяют либо в скоупы в самой модели либо в отдельные классы, которые билдят запросы.
    Когда задачи становятся еще сложнее, когда нужно уже делить всю нашу модель на read and write части, Eloquent уже начинает подбешивать :) Плюс невозможность отделить логику класса модели от логики её хранения в бд начинает напрягать на любых моделях сложнее одной строки в базе. В итоге в тех проектах, в которых мы хотим отделять Domain логику от всего остального(в том числе базы данных) намного выгоднее отойти от него.
    Все эти репозитории нам нужны как раз для этого, чтобы абстрагироваться и отделить логику хранения обьектов доменной логики где-либо. А с элоквентом это практически невозможно. Я это подробно буду разбирать в книжке, которую тут уже отрекламировали - https://leanpub.com/architecture-of-complex-web-ap...

    Выделять же классы для некоего query building - вполне нормально для проектов с Eloquent. Вот только не увлекаться желательно. Иногда люди мучаются страшно с этими элоквентовскими билдерами, тогда, когда проще банально написать raw SQL запрос. Обычно это касается всяких отчетов, где много разной интересной агрегации с группировками и т.д.
    Ответ написан
    Комментировать
  • Примеры правильных сайтов на laravel?

    zorca
    @zorca
    Ответ написан
    Комментировать
  • Примеры правильных сайтов на laravel?

    wertex15
    @wertex15
    Ответ написан
    Комментировать
  • Примеры правильных сайтов на laravel?

    xmoonlight
    @xmoonlight
    https://sitecoder.blogspot.com
    Ответ написан
    Комментировать
  • Пожалуйста оцените мое убогое ООП?

    Stasgar
    @Stasgar
    Обученная макака
    Во-первых: начните изучать архитектурную часть программирования, изучите паттерны проектирования, изучите SOLID, DRY, KISS и остальные модные словечки, постарайтесь всё это осознать, или, на крайняк - зазубрить. Всё придет с опытом, изначально все не понимали зачем всё так сложно, но эта сложность обусловлена неисчислимыми литрами слёз и потраченных нервов, всё не просто так.

    Судя по всему это тестовое или учебное задание. От вас требовалось отоверинжинирить простую задачу. Давайте попробуем:

    Суть задачи - есть файл с определенной структурой хранения данных, структура строковая. Требуется этот файл преобразовать в другую структуру данных и вывести эту структуру в json формате. Задача ясна.

    Разобъем задачу на отдельные независимые этапы:
    1) Преобразование одной структуры данных (текстового файла) в другую (объект, понятный PHP, к примеру)
    2) Преобразование этой структуры данных в Json формат.
    Первый вопрос, который может возникнуть - почему сразу не преобразовать в json? Ответ - при расширении системы в будущем - нам понадобится вывести данные в виде массива, или в виде XML, или даже в виде готового файла Excel. Нам будет сложно дополнять логику изначального класса, ничего при этом не сломав и не затронув уже существующий функционал. Также ответом на этот вопрос может являться каждая буква из SOLID принципов, подробнее отвечу дальше, когда буду пояснять за реализацию, см. ниже

    Теперь рассмотрим эту задачу с точки зрения ООП, начнем думать не от конкретной реализации, а от интерфейса и абстракции (мы не парсим конкретный файл, мы парсим просто файл, мы не переводим его в конкретное представление json, мы переводим его просто в представление):
    Нам понадобится 2 класса - непосредственно класс, читающий файл и преобразующий его в простейший тип данных (например PHP array). Второй класс - преобразователь простейшего типа данных парсера в какой-то определенный тип:
    1. LogFileReaded implements/extends FileReaderContract(интерфейс, возможно абстрактный класс, если понадобится предустановленная логика)

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

    2. JsonPresenter implements/extends DataTypePresenterContract

      Абстракция содержит контракт на метод output(), а в конструкторе принимются исходные данные. В конкретной реализации JsonPresenter в output() будет банальный json_encode() (да, это нормально, нет, класс не лишний и нет, json_encode() нельзя пихать в сам парсер) А теперь к вопросу - почему не следует просто запихать это всё в парсер и вместо массива отдать json: в будущем, когда система будет расширяться - нам понадобится представить данные в виде XML - что тогда будем делать - переписывать весь код парсера ради добавления switch case "json" и т.д.? А если что-то сломается во всей системе? А если вариантов представления станет настолько много, что файл будет просто не читаем? А при данном подходе достаточно будет просто написать новый класс XMLPresenter, или даже ExcelPresenter, который на выводе не строку будет выдавать, а целый файл (опустим типизацию output пока)). Также этот класс можно реализовать в виде декоратора (паттерн), да и много еще как.



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

    К примеру: в итоге, если вас уже повысили, и вы вместо парсинга стали заниматься более высшими материями - новому программисту, чтобы дописать логику преобразования данных в Excel не нужно знать как конкретно вы преобразовывали когда-то эти данные в json, ему не нужно дебажить ваш код, ему достаточно посмотреть на интерфейс - отнаследоваться от него и написать свой собственный метод преобразования и дальше использовать его в нужном месте.

    P.S. В данной реализации опускаются и упрощаются некоторые моменты для понятности
    Ответ написан
    21 комментарий
  • В чем смысл библиотеки ReactPHP? Какие задачи решает?

    Caravus
    @Caravus
    DevOps
    1) Берём событийную библиотеку
    2) Пишем в коде sleep(10);
    3) ???
    4) Пишем на тостер вопрос "а чёж оно блокирует то?!".
    Ответ написан
    4 комментария
  • Как изогнуть input?

    JRK_DV
    @JRK_DV
    Рецепты https://codepen.io/jrkdv/full/LKLXdq
    Хотелось бы сделать из этой палки изогнутую палку

    Боюсь спросить на сколько изогнутую, как пример не?
    https://jsfiddle.net/vtLn0596/1/
    Ответ написан
    10 комментариев
  • Как старый принтер заставить работать в Windows 10?

    @Mikhail_Mijhaylov
    На 32-х битную Windows 10 драйвер для Windows 7 32 бит с сайта Canon встает как родной. На 64 битную драйверов нет и не предвидится.
    На моем компьютере для экспериментов стоит много разных систем. Есть принтеры Canon LBP-810 и Canon LBP-1120. Оба принтера настолько простые и так просто заправляются и обслуживаются, и комплектующие стоят копейки, что выбрасывать их рука не поднимается. Чтобы печатать из Windows 7, 8.1, 10 x64 да и разных Linux (хотя есть родной драйвер под Linux, но мне он показался каким то кривым и я его решил не использовать) установил VirtualBox а в нем Windows XP 32 bit (что бы Windows XP 32 bit была видна в сети в настройках сети выбрать "сетевой мост"). В Windows XP 32 bit установил принтер. Один раз установив в виртуалке Windows XP 32 bit потом можно просто подключать этот образ в других системах, соответственно создавайте образ диска на диске, который доступен из других систем. Так как по сети на него напрямую не напечатать (из за неимения драйверов), установил в Windows XP 32 bit принтер, на который есть драйвера в Windows 7, 8.1, 10 x64, Linux. Например что то типа HP LaserJet 4100 PS (нужен именно postscript). С помощью Ghostscript (использовал версию 8.70, с более старшими были проблемы) и RedMon 1.9 - Redirection Port Monitor печать с HP LaserJet 4100 PS перенаправляется в Canon LBP-810. Стоит один раз настроить и печатать по сети без проблем. Решение не моё, вот здесь описано более подробно: https://docs.google.com/document/d/1Mn5rEOlKZ3_KCS...
    Ответ написан
    Комментировать
  • Laravel 5.5 время работы и рендер hello world = ~ 500 мс?

    @deadem
    Дело в том, что в Ларавеле есть куча вещей, которые обычно нужны в больших проектах, и они сразу же включены "из коробки" для облегчения разработки. Поэтому для "hello world" результаты и будут примерно такого порядка.
    https://medium.com/@taylorotwell/make-correct-comp...

    Если нужно ускорить именно "hello world", то можно отключить мидлвари, авторизацию, сессии, очереди, или взять Люмен, который тот же Ларавель, но там почти всё это уже выключено, ибо он, как раз и нацелен на такие крошечные приложения.
    Ответ написан
    Комментировать
  • Как найти сумму чисел массива, которых равна определенному числу?

    rockon404
    @rockon404
    Frontend Developer
    Вот вариант на ES6, используется spread operator:
    const circle_1 = [7, 2, 3, 5, 16, 50, 25, 40],
          circle_2 = [2, 5, 10, 30, 25, 3, 10, 25],
          circle_3 = [25, 10, 2, 10, 5, 2, 10, 5],
          circle_4 = [7, 2, 3, 20, 3, 7, 2, 5],
          circle_5 = [2, 20, 1, 7, 25, 1, 25],
          circle_6 = [3];
          
    function findSum(value, arrays, i = 0) {
      for (let j = 0; j < arrays[i].length; j++) {
        const el = arrays[i][j];
        
        if (i < arrays.length - 1) {
          const result = findSum(value - el, arrays, i + 1);
          
          if (result !== null) {
            return [el, ...result];
          }
        } else if (el === value) {
          return [el];
        }
      }
      return null;
    }
    
    console.log('result', findSum(136, [
      circle_1, 
      circle_2, 
      circle_3, 
      circle_4, 
      circle_5,
      circle_6
    ]));
    
    // => result  [50, 30, 25, 3, 25, 3]


    Демо: https://jsfiddle.net/0ho4g942/
    Ответ написан
    2 комментария
  • Постоянно запущенный скрипт на PHP, как реализовать?

    eXcNightRider
    @eXcNightRider
    FullStack Web Developer | DevOps
    Привожу живой пример из личной продакшн практики. PHP-CLI скрипт как запускаемое приложение
    Начальные условия:
    Наличие GNU Linux (в моём случае это Debian)
    Установленные пакет php, php-cli, остальные по вкусу и зависимостям
    В качестве таймера используется класс React\EventLoop\Factory
    1. Создаём пустой файл, можно без разрешения (например daemon), открываем в текстовом редакторе
    Важно, чтобы в начале была строка #!/usr/bin/php -q
    2. Пишем
    #!/usr/bin/php -q
    <?php
    ini_set("display_errors", 1);
    error_reporting(E_ERROR);
    require "/var/project/vendor/autoload.php";
    require '/var/project/bin/cli_config.php';
    use Ratchet\Session\SessionProvider;
    
    $loop = React\EventLoop\Factory::create();
    //вызовы $loop->addPeriodicTimer можно ставить в нужном количестве, первый параметр - количество секунд
    $loop->addPeriodicTimer(120, function(){
    //код здесь будет выполняться каждые 120 секунд
    });
    //если нужен повторяющийся цикл 
    //$loop->run();
    //а если нужен один раз на вызов
    $loop->tick();

    3. chmod a+x /www/project/bin/daemon - даём права на выполнение
    4. запускаем ./daemon будучи в папке с файлом. Если ошибок нет, всё будет работать
    5. А ещё скрипт можно установить как демон в systemd и управлять с помощью /etc/init.d/daemon.service (start|stop|restart) и есть ещё bash-скрипт который будет держать службу на контроле и перезапускать если что, так как не всегда ошибка возвращает код и systemd считает, что процесс не упал, а его остановили, но это уже другая история

    6. Для решения задачи "Требуется по запросу юзера (нажал кнопку) вести отсчет таймера от 120 секунд до 0 и произвести действие" в php на действие пользователя просто запустить exec('/var/project/daemon', $output_1, $exitval);
    Ответ написан
    1 комментарий
  • Какой жанр игр самый сложный в создании?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Какой жанр игр самый сложный в создании?

    Немного переформулирую: какого цвета машины самые быстрые?

    Я спросил почему не выживач? Он ответил что выживачи говно

    Конструктивненько))

    Rogue-like или выживалка?

    Зависит от ТЗ. Вот пример: игра в крестики-нолики, казалось бы, что может быть проще? Но управление через Kinnect, а визуализация - через Oculus Rift, конечно же мультплеер, рейтинги, онлайн общение игроков и т.д. Ну что, простая игра получается?))

    И вообще какой жанр самый сложный по созданию и какой самый лёгкий?

    Все зависит от ТЗ.
    Ответ написан
    Комментировать
  • Насколько у меня правильный код ООП php?

    @D3lphi
    Здесь плохо всё, к сожалению.

    Начнем с того, что вы неверно наследуете классы. Почему у вас класс, отвечающий за подключение к базе данных является родителем класса, работающим с заказами? Наследование применяется, если можно сказать, что что-то является чем-то. Например, разработчик является работником; компьютер является устройством и тд. Здесь же у вас вообще близко такой логике не получится следовать. Вы должны передавать хотя бы объект для работы с бд через инъекцию, например, в конструктор. В идеале, нужно использовать паттерн репозиторий для работы с базой данных.

    Класс SearchOrder у вас не только выполняет запросы, но еще и работает с данными, хранит состояние этих самых данных, фильтрует данные (strip_tags()). Непорядок. Это все нужно разделять. У вас вообще получаются какие-то богообъекты, которые умеют во все.

    Вы каждый раз повторяете строки с подготовкой запроса, биндингом параметров, отправкой запроса и тд. Не думали, что неплохо бы было написать какую-нибудь обертку и выполнять запросы как-нибудь так:
    $result = $wrapper->select("SELECT * FROM `tablename` WHERE `id` = :id", ['id' => 5]);

    ?

    Вы вызываете connect() в методах. То есть, каждый вызов этого метода будет приводить к установке нового соединения с базой данных, даже если оно уже было установлено. Соединение с базой данных это достаточно дорогостоящая операция.

    Зачем вы используете свойства, если можно обойтись обычными локальными переменными:
    $this->orderID = (int) strip_tags($orderID);
    $this->column = (string) strip_tags($column);
    $this->value = (string) strip_tags($value);

    ?

    Почему вы стриппите тэги у идентификатора? вы настолько не уверены в том, что влетает в функцию:
    strip_tags($orderID);
    ?

    Если вы не используете php 7 и, как следствие, скалярный тайпхинтинг, то должны делать проверки на тип входящего аргумента. Если что-то не так с типом, бросаем исключение (А не приводим его к нужному)! Например:
    if (!is_string($arg)) {
        throw new InvalidArgumentTypeException('string', $arg);
    }

    Это в идеале. Вы не обязаны это делать, конечно же. Но вот такие проверки делают приложение безопаснее. Хотя, опять же, повторюсь, в 2017 нужно начинать новые проекты на php 7.1+.

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

    Кроме всего прочего, почитайте про стандарты оформления кода. Вы им не следуете.

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

    Желаю успехов!
    Ответ написан
    1 комментарий
  • Multipart/related/mixed/alternative когда какой Content-Type лучше вставлять в письмо?

    NeX
    @NeX
    habrahabr.ru/post/17531/
    mixed — используется, когда в рамках одного почтового сообщения имеется несколько независимых друг от друга, и равнозначных частей. Самый простой пример такого письма — сообщение с вложением.
    alternative — используется, когда в одном почтовом сообщении содержится несколько частей, содержащих одну и ту же информацию, предназначенную для отображения на различном клиентском ПО — например текстовая и HTML версия одного и того же письма.
    related — используется, когда в одном почтовом сообщении содержится несколько частей, формирующих один итоговый документ. Яркий пример — HTML письмо с картинками. Запомните, по стандарту только в этом случае должны работать ссылки на Contend-id элементов (вида ).
    Ответ написан
    1 комментарий
  • Тестирование верстки сайта в 4K без монитора 4K?

    DevMan
    @DevMan
    я не знаю ни одного человека, который бы пользовал 4к(и выше)-монитор в родном/полном разрешении, это же надо смотреть на монитор через телескоп.
    их пользуют в hidpi-режиме, в котором разрешение эквивалентно fullhd. почитайте только дополнительно про оптимизацию графики под hidpi.
    Ответ написан
    26 комментариев
  • На чём лучше прокачивать архитектурный навык разработки моделей предметной области и принципов DDD вообще?

    @xfg
    Любой фреймворк с инверсией зависимостей подойдет. На Symfony и Yii2 точно можно сделать. На русскоязычном форуме Yii по теме DDD очень много обсуждений. Но если не увидели единого согласия по DDD, то скорее всего не читали книгу Эванса или Вернона. Если так, то лучше начать с кого-нибудь из них.

    Многоуровневая архитектура рассказывает нам о слоях presentation, application, domain и infrastructure. С однонаправленным потоком данных. Нижестоящий слой, никогда не должен вызывать вышестоящий. Это значит, что к примеру можно выбросить presentation слой и не придется ничего изменять в оставшихся 3.

    Фактически выходит, что в любой момент можно выбросить фреймворк и заменить другим, так как это presentation layer в многоуровневой архитектуре. Можно даже сначала написать application/domain, проверить их юнит-тестами, а только потом уже задуматься о фреймворке. Application/domain слои никогда ни при каких обстоятельствах не должны вызывать методы фреймворка. Контроллеры фреймворка работают с доменной моделью, через вызовы методов application layer.

    Соответственно, при миграции на другой фреймворк, всё что потребуется, это переписать контроллеры (методы очень простые 1-5 строк) и реализации классов в infrastructure layer если вы завязывали их на фреймворк. Хотя лично я бы, не советовал этого делать. Лучше найти/написать отдельные библиотеки/компоненты под инфраструктурный слой, тем самым облегчив себе жизнь в будущем, когда фреймворк умрет или при очередном релизе мажорной версии.

    Symfony под DDD наилучший выбор, он компонентный, можно подтянуть только то, что нужно. С другой стороны Yii2, он монолитный и вы затяните Active Record и кучу всего еще, чем не будете пользоваться, но джуниор придет и обязательно понавызывает AR или чего-нибудь еще в application/domain слоях, чего вы явно не ожидаете. Поэтому в случае с Yii2 нужен будет тотальный контроль. :)

    Про Laravel не пишу ничего, так как не работал с ним. Но судя по беглому просмотру документации, никаких проблем сделать на нем DDD также нет.
    Ответ написан
    4 комментария
  • Как влиться в тренд нынешней веб-разработки?

    @SuperOleg39ru
    Front-end разработчик
    Добрый день!

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

    flexbox, grid layout
    - это css из современных стандартов. Что бы знать, когда применять - вы должны знать версии старых браузеров, которые необходимо поддерживать на вашем проекте, и соответствующую поддержку этих стилей. Например, формировать элементы на flexbox на порядок удобнее, чем на float, но в IE9 вы уже использовать flexbox не можете.
    Немного о новинках в css тут.
    Поддержка браузерами тут.

    gulp, webpack и пр.
    - это инструменты, которые созданы для облегчения рутинных задач.
    Для верстки очень удобно использовать gulp - вы описываете задачи, такие как создание локального сервера, мгновенная перезагрузка страницы при изменениях, минификация ваших файлов, и прочее.
    Посмотрите отличный скринкаст от Ильи Кантора!

    препроцессоры
    - представьте, что вам чего-либо не хватает в html и css.
    Например, вы хотите разбивать большие html файлы на множество мелких, или вам нужно вставить в html динамическое содержание - для этого созданы html шаблонизаторы. Вы используете в работе синтаксис конкретного шаблонизатора, затем тот же gulp автоматически собирает эти файлы в обычный html, который понимает браузер.
    Аналогичная ситуация с css, препроцессоры позволяют разбивать файлы на мелкие, и собирать в один, доступны переменные и функции, и многое другое.
    Популярный шаблонизатор Pug
    Один из css-препроцессоров Stylus

    пакетные менеджеры
    - это удобный способ скачать конкретные библиотеки, и переносить их из проекта в проект. Статья про npm тут

    Ну и конечно статьи и подкасты:
    https://habrahabr.ru/
    jsraccoon.ru

    https://soundcloud.com/web-standards
    https://radiojs.ru/

    Конкретные статьи и ресурсы для новичка:

    frontender.info/a-baseline-for-front-end-developers
    frontender.info/a-guide-to-flexbox
    css-live.ru/articles-css/pravilnye-kontrolnye-toch...
    https://medium.com/russian/%D0%BE%D1%82-%D0%BD%D1%...
    https://medium.com/russian/%D0%BE%D1%82-%D0%BD%D1%...
    https://habrahabr.ru/company/zfort/blog/321214/
    https://frontendmasters.gitbooks.io/front-end-hand...

    Дерзайте!
    Ответ написан
    6 комментариев
  • Как сделана защита от копирования, даже DevTools не открывается?

    DmitriyEntelis
    @DmitriyEntelis
    Думаю за деньги
    В хроме открываете
    view-source:http://openssource.biz/zima-na-openssource-pozdravlenie-s-nastupayushhimi-prazdnikami-ot-strimershi-kariny.html
    и все замечательно видно.

    Практически в начале документа
    document.onkeypress = function(event) {
        event = (event || window.event);
        if (event.keyCode === 123) {
            //alert('No F-12');
            return false;
        }
    };
    document.onmousedown = function(event) {
        event = (event || window.event);
        if (event.keyCode === 123) {
            //alert('No F-keys');
            return false;
        }
    };
    document.onkeydown = function(event) {
        event = (event || window.event);
        if (event.keyCode === 123) {
            //alert('No F-keys');
            return false;
        }
    };
    
    function contentprotector() {
        return false;
    }
    
    document.oncontextmenu = contentprotector;
    document.onmouseup = contentprotector;
    var isCtrl = false;
    window.onkeyup = function(e)
    {
        if (e.which === 17)
            isCtrl = false;
    }
    
    window.onkeydown = function(e)
    {
        if (e.which === 17)
            isCtrl = true;
        if (((e.which === 85) || (e.which === 65) || (e.which === 80) || (e.which === 88) || (e.which === 67) || (e.which === 83)) && isCtrl === true)
        {
            return false;
        }
    }
    isCtrl = false;
    document.ondragstart = contentprotector;


    Табличка keyCode https://www.cambiaresearch.com/articles/15/javascr... 123 это как раз F12
    Ответ написан
    2 комментария