Интерфейс командной строки (CLI) в PHP. Часть 1

Долго игрался с биржами биткойнов, делюсь накопленным материалом. Про трейдерские инструменты и симуляцию API бирж позже, начать хотелось бы с консоли. Да-да, именно там с помощью PHP можно делать очень удобные инструменты, рисовать графики и не тратить время на лишние HTTP соединения.
Интерфейс командной строки (CLI) позволяет не только выводить произвольные символы на экран, но и разукрашивать их в системные цвета, перемещать курсор по экрану. А заранее зная размер экрана – творить можно практически все. Практически старый добрый DOS.
Итак, для начала константы и несколько базовых операций:

Комбинируя эти атрибуты получаем полный контроль над экраном терминала.

И маленький пример:

Конфигурирование Yii

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

Дерево директорий выглядит примерно так:
Неиспользуемые ветви можно удалить.

Пример index.php:

Пример project1.ww.php:

Yii и PhpStorm. Включаем автодополнение

Я думаю никто не будет спорить о необходимости автодополнения кода в больших проектах. Мало кто может помнить методы всех компонент и поля сотни моделей. Расскажу, как настроить автодополнение для удобной разработки в Yii.

Сначала настраиваем среду согласно документации

Далее немножко магии в коде index.php

Если используете консольные возможности Yii – потребуется переписать /protected/yiic.php
и вынести класс Yii в отдельный файл, чтобы PhpStorm не задумывался откуда брать подсказки

Хорошей идеей будет убрать объявление WebApplication и ConsoleApplication внутрь файлов конфига. Тогда, подключая новый компонент, вы можете сразу прописать ему подсказку.

Печать документов c помощью JavaScript

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

Google Chrome notranslate

Когда пользователи жалуются на фантастические вещи – приходится глубоко копать.
Симптомы: не отрабатывает JavaScript на странице, пропадает часть текста, в Url появляются русские слова.

Это привет от встроенного в Google Chrome автоматического переводчика. Разработчики его себе отключают в опциях и бед не ведают. А вот отключить его принудительно пользователю помогает строка в <head>:

WordPress, Nginx и HTTP Авторизация

В связи с многочисленными попытками забрутфорсить пароль на админку вордпресса – решил закрыть её дополнительной HTTP авторизацией. Вроде простое действие, но большинство примеров в интернете с моей конфигурацией Nginx не заработает. Пришлось импровизировать.

Шаг 1. Создаем файл с паролями
Файл .htpasswd создаем рядом с главным конфигом Nginx.
Формат файла – пары логин:пароль, где пароль зашифрован через crypt(3).
Можно генерировать их через онлайн сервисы, например, тут.
Каждый пользователь должен быть на новой строке:

Шаг 2. Закрываем админку WordPress
Сразу даю кусок конфига.

Теперь при авторизации nginx проверит новый пароль, и только потом пропустит вас к скрипту авторизации. Экономим ресурсы сервера и спим спокойнее.

p.s. Меня давно терзает мысль заменить wordpress на самописный движок с правильным кешированием. Возможно даже на Yii. Найти бы на это время. Подробнее в следующих сериях.

CSS: стилизация кнопки под iPhone

Самый надежный способ донести до пользователя задуманный дизайн – это использовать картинки. Но что делать если критична скорость загрузки, да и элемент управления часто встречается в шаблонах? Верстальщики пытаются использовать мощь CSS. Самый популярный рецепт – повернуть квадрат на 45 градусов для имитации стрелки.
jeffbatterton.com
css3wizardry.com
Но ведь этого мало. Если присмотреться – iOS кнопка имеет угол более 95 градусов плюс скругление. Да и семантически эти решения оставляют желать лучшего. Предлагаемое решение (для webkit, opera, mozilla):

Семантика в HTML:

Demo

Yii: двухстороннее преобразование массивов

Пытаюсь оптимизировать код одного проекта на Yii. Очень часто мешают простыни кода ради достаточно тривиальной задачи – разбор данных формы на объекты и наоборот. При том что поля объектов и поля формы называются по-разному.
На коленке набросал небольшой класс для выноса этой конвертации. Да, eval это плохо и опасно, но ничего лучше ночью в голову не пришло.

Update:
В безопасном виде это будет выглядеть так:

Unit of Work

Категория: Enterprise

Проблема: при работе с большим количеством объектов из базы данных и частом их изменении в рамках одного сценария зачастую выполняются лишние операции – сохранение промежуточных результатов, сохранение не изменившихся объектов. Шаблон Unit of Work реализует идею промежуточного буфера для данных. Одновременно уменьшается число обращений к базе данных и появляется возможность эмулировать транзакции на любых хранилищах.

В примере не будет операций с базой данных, это лишь упрощенный образец с комментариями:

Объект для демонстрации происходящего:

Тестируем.

Результат:

Flyweight (приспособленец)

Категория: структурные шаблоны

Задача: оптимизация работы с памятью путем выделения общих сущностей. Эффективен при работе с большим количеством однотипных объектов. Обычно применяется вместе с шаблонами Factory method или Composite.

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

И простенький пример: