• Под какие разрешения рисовать адаптивный дизайн?

    paulradzkov
    @paulradzkov
    Дизайнер, верстальщик, начальник отдела UI
    При рисовании любого дизайна встает техническая задача — уместить элементы сайта в указанную ширину. Уместить в заданную ширину тяжелее, чем растянуть до заданной ширины. Растянуть легко на этапе верстки. Поэтому нужно ориентироваться на минимальную ширину в классе.

    1. Мобильные телефоны — 320px. Ориентируемся на viewport айфона, т.к. он самый маленький. У современных андроидов вьюпорт больше, поэтому их игнорируем (растянется на верстке).

    2. Планшеты — 768px. Опять-таки ориентируемся на айпад в портретной ориентации , т.к. у андроид планшетов вьюпорты обычно имеют размер от 800×1200 или совпадают с айпадом. Планшеты с вьюпортом 600×1024px устарели. К тому же ничего страшного, если в вертикальной ориентации сайт на таком планшете будет выглядеть как на мобильнике, а в горизонтальной ориентации — как на десктопе.

    3. Десктоп и планшеты в ландшафтной ориентации — 1000px. Почему 1000, а не 1024: первое, в настольных браузерах полоса прокрутки съедает (обычно) 18px ширины; второе, от 1000px верстальщику удобнее расчитывать размеры в процентах, а до 1024 все равно растянется при верстке.

    В принципе, этого достаточно, чтобы верстальщик справился.

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

    В каком порядке рисовать? Смотря как поставлено тех.задание. Чаще всего в задании описан полный функционал для настольной версии. Тогда проще нарисовать дизайн под 1000px и перекомпоновать под 768 и 320, выбросив или упростив по пути менее значимые элементы сайта. Т.е. двигаться от сложного к простому.

    Верстать при этом удобнее от меньшего экрана к большему (от простого к сложному). При mobile first верстальщику приходится дописывать новые стили для бóльших экранов поверх базовой версии в 320px вместо того, чтобы обнулять написанные для настольных браузеров стили. В результате для мобильника css весит меньше и парсится быстрее.
    Ответ написан
    Комментировать
  • Как заставить Safari показывать ссылку при наведении?

    ManWithBear
    @ManWithBear
    Swift Adept, Prague
    Вид -> Показать меню статуса
    либо cmd+/
    Ответ написан
    3 комментария
  • Какие аргументы в пользу использования транзакций в бд?

    saboteur_kiev
    @saboteur_kiev
    software engineer
    "1) Добавить транзакцию - всего несколько строк кода.
    2) Как раз таки хотелось бы услышать, какие кейсы проблем здесь возможны"

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

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

    Искать ответ на тостере, где не знают ни про ваш проект, ни условий работы, ни того, насколько легко добавить подобную задачу в спринт - вряд ли вы получите правильный ответ, есть даже вероятность что вы получите несколько разных ответов, но за правильный примете только тот, который лично вам по душе, а не тот, который более адекватный.
    Ответ написан
    1 комментарий
  • Как обучиться созданию правильной архитектуры сайта?

    iiifx
    @iiifx
    PHP, OOP, SOLID, Yii2, Composer, PHPStorm
    Я хотел вам написать про использование чужого опыта, чтения множества скучных книг, изучения чужих архитектур и много-много пота. Но потом увидел вот эту строку:
    только не фрейворки, их разбирать самому сложно и не всегда хватит сил не полениться

    и понял, что не нужно ничего писать.
    Ответ написан
    3 комментария
  • Как сделать запуск PHP скриптов от владельца скрипта (а не от пользователя apache)?

    He11ion
    @He11ion
    PHP-monkey
    Не очень понимаю что мешает пойти в /etc/php-fpm.d/*.conf и поменять там значения user и group?
    Ответ написан
    1 комментарий
  • Позднее статическое связывание php: как это работает?

    MegaMufa
    @MegaMufa
    Смотрите. Есть такая простая иерархия классов:
    class A
    {
        public static $text = 'class A';
    
        public function selfTest()
        {
            echo self::$text;
        }
    
        public function staticTest()
        {
            echo static::$text;
        }
    }
    
    class B extends A
    {
        public static $text = 'class B';
    }


    Мы создаем экземпляк субкласа и вызываем методы, определенные в предке.
    $obj = new B();
    $obj->selfTest(); // выведет "class A"
    $obj->staticTest(); // выведет "class B"

    self всегда указывает на тот класс, в котором он написал. Здесь метод описан в классе A, и self указывает на класс A, хоть и вызывается из класса B.
    Значение static вычисляется при вызове. И static указывает на класс объекта в котором произошел вызов. В нашем случае он указывает на B, хотя сам код описан в классе A.

    Зачем это надо? Для того, что бы можно было переопределять статичные члены вашего класса в наследниках и вы могли обращаться к новым значениям из методов, описанных в предке.

    С обычными не статичными членами это и так работает, потому что они собираются, когда вы создаете объект класса. Что бы это работало для статичных методов, надо использовать static
    Ответ написан
    1 комментарий
  • Как бороться с 23:59:59 (date, gmdate) в php?

    benbor
    @benbor
    Помог ответ - не забудь лайкнуть
    А где казус? Это не казус, а попытка натянуть перчатку на ногу, со словами "говно нынче сапоги"....
    Пишите свои функции для отображения своих данных. А вообще отображат 48:00:02 вместо 2d 02:00:00 довольно странное желание... как по мне
    Ответ написан
    Комментировать
  • На что вы зря потратили время в изучении программирования и веб-разработки в целом?

    KorsaR-ZN
    @KorsaR-ZN
    на написания убийственных CMS и фреймворков :)
    Ответ написан
    Комментировать
  • Какой Javascript framework выбрать для новичка?

    aen
    @aen
    Keep calm and 'use strict';
    Вот до тех пор пока все будут учить фреймворки, а не принципы проектирования и то как работает браузер, у нас и будут появляться быдлокодеры. Это мысли в слух. Не в обиду автору.

    Фреймворк это просто инструмент. Он за вас решит ряд вопросов. Позволит какие-то фичи сделать быстрее за счет того, что они уже были решены ранее. Но любой фреймворк можно изучить и применять за приемлемое время при условии, что у вас будут достаточно прокачанные скиллы по js, по тому как работает браузер, по тому как передается информации между клиентов и сервером (сокеты, xhr, cors и прочие свистелки).

    Если вы новичок, то просто пишите код. Ставьте задачи. Смотрите как эти задачи решены были ранее в рамках любого фреймворка или библиотеки, прочитайте исходники.

    Фреймворки, к сожалению, весьма подвержены моде. Раньше был тренд на Backbone.js, затем под ореолом Гугла все подхватили Angular.js, сейчас начинается повальное увлечение React.js. Завтра появится, что то новое, все кинутся на него.

    Если вы хотите максимально быстро зарабатывать, то посмотрите требования в вакансиях. Рынок сам вам скажет, что ему нужно.

    Если вы хотите просто прокачаться, но посмотрите примеры решения типовой задачи TodoMVC на разных фреймворках. Выберите то, что вам будет понятнее всего.

    А человек, который на ваш вопрос "Что мне изучать?" быстро и легко назовет имя любого фреймворка, скорее всего сам еще недостаточно прокачался, потому как он видимо не понимает, что нет "серебряной пули". Нет идеального фреймворка, который бы решал все ваши задачи.
    Ответ написан
    Комментировать
  • Что представляет собой тестирование ?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Вообще вики можно для начала, а потом уже углубляться в литературу. Вот вам кратенькое описание, цель которого больше предоставить ключевые слова для поиска.

    Модульные, они же юнит тесты, предназначены для тестирования отдельных модулей/классов. Суть их в том, что мы тестируем поведение только одного класса за раз. Если класс ссылается на инстансы других классов - мы их мокаем. То есть подсовываем им фэйковый класс, который имеет тот же интерфейс, но внутри не реализациа методов, а проверка, вызывали ли метод, с каким аргументами, сколько раз вызывали и т.д. Так же методы мока могут возвращать стабы (заглушки), какие-то захардкоженные под какой-то кейс данные. То есть если мы пишем класс по работе с базой данных, сокет-сервер и т.д., нам стоит соединение с базой, сокеты и т.д. оборачивать в классы, что бы можно было потом подменить на моки это добро. Если у вас в юнит тестах идет реальная работа с файловой системой или что-либо в этом духе, то это уже попахивает интеграционными тестами. Подробнее можно почитать в документации к phpunit. Так же есть такая методология разработки как TDD, советую почитать "Экстримальное программирование" Кента Бэка в этом ключе.

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

    Интеграционное тестирование - тестирование нескольких модулей в связке. То есть мы тестируем наш компонент или его самодостаточный кусок в реальных условиях. Если этот компонент для работы с файлами - разрешаем ему доступ к файлам. Если база данных - то даем реальное соединение с базой. А можем что-то и замокать. Это как говорится, зависит от задачи. Скажем обращение к сторонним апишкам стоит мокать и стабить. Главная цель этих тестов, удостовериться что модули вместе работают хорошо. Особенно важно это когда модули пишут разные люди.

    Функциональное тестирование - это тестирования всего приложения в сборе. Если это REST API, то у нас через curl дергаются реальные методы, отправляются более менее реальные запросы и валидируются ответы. Если web-страничка, то это UI тесты с силениумом/phantom.js/zombi.js или, если нам не нужно еще и js тестить, просто curl + какой виртуальный браузер на том же php. Вообще по хорошему функциональные тесты не допускают никаких моков и т.д. но опять же если очень хочется то можно (опять же обращение к сторонним сервисам, контроля за которыми у нас нету).

    Но реалии таковы, что UI тестами покрывать проект не слишком удобно. Вопервых UI может меняться, а поддерживать их так же нужно. Во вторых это скучно. В третьих тесты могут просто падать... вот взяли и упали. И потом начинается, так, тесты опять упали... что там упало? А, не страшно, можно релизить. Так же на больших проектах UI тесты отрабатывают долго, очень долго, некоторых их просто ночью гоняют. Толку от тестов при таком подходе не слишком много, ибо разработчику стоит знать о том что что-то сломалось как можно быстрее. А так он приходит, видит что тесты опять красные, чинит эти красные тесты, и запускает... ждет... проходит пол часа к примеру, и где-то в другом месте отвалилось... Короче сами понимаете.

    Приемочное тестирование - по сути те же функциональные тесты, но подаются в контексте фича-спеков. Если вы работали когда-нибудь с QA отделом, то возможно слышали про такие штуки как acceptance criteria. То есть это тот чек лист, который должен проверить тестировщик что бы удостовериться что все хорошо. На основе этого чек листа можно написать функциональные тесты. Так же есть инструменты вроде Cucumber/Behat, которые позволяют писать спецификации в виде стэпов. В этом случае спецификации для этих инструментов могут писать QA а вы просто имплементите для них степы. То есть уменьшается прослойка между "acceptance criteria" и готовыми к выполнению тестов. Более того, стэпы можно реюзать, комбинировать, масса стэпов есть готовых, вам же необходимо только предоставить стэпы подготвалливающие систему (загрузка/генерация фикстур и т.д.). Короче лепота и удобно. Но медленнее интеграционных, зато не такие жесткие как функциональные, за счет этого их проще поддерживать. QA пишут спеку, реализуем тесты под эту спеку, пишем код под тесты, тесты зеленые - функционал готов.

    Ну и есть еще всякие термины типа пирамида тестов и т.д. Мол лучше много юнит тестов, чуть поменьше интеграционных и мало функциональных. Тогда тесты выполняются быстрее, а покрывать все и вся функциональными тестами обычно перебор.

    Ну и опять же, есть такая вещь как здравый смысл. Некоторые вещи скажем можно вообще забить и не покрывать тестами, некоторые стоит покрыть. Некоторые не полностью, некоторые с как можно большим покрытием.... Скажем тестить UI (именно как выглядит, где какой элемент) вообще бессмысленно. На это нужно куча ресурсов. Хотя может и есть проекты где это оправдано.

    Короче почитайте про TDD и ATDD (можно и BDD затронуть, но тут не только от программиста зависит, менеджеры, заказчик или продукт-оунер тоже должны быть вовлечены, по сути этот подход хорошо работает в рамках продукта какого-то, на фрилансе и в аутсорсе редко можно встретить) , Continious Integration и Continious Delivery.
    Ответ написан
    Комментировать