войти зарегистрироваться

Блог компании BadooНаписание системных утилит на PHP CLI

Для большинства специалистов PHP не является языком, который бы всерьёз использовался для написания консольных утилит, и для этого есть много причин. PHP изначально разрабатывался как язык для создания веб-сайтов, но, начиная с PHP 4.3, в 2002-ом году появилась официальная поддержка режима CLI, поэтому он уже давно перестал быть таковым. Разработчики Badoo на протяжении нескольких лет вполне успешно используют множество интерактивных CLI-утилит на PHP.

В данной статье нам хотелось бы поделиться своим опытом работы с CLI-режимом в PHP и дать несколько рекомендаций тем, кто собирается писать скрипты на PHP, при условии, что они будут запускаться в *nix-системе (впрочем, почти всё верно и для Windows).

CiscoCisco 1812 как домашний роутер из песочницы

Решил я найти замену своему D-Link DIR-300, т.к. держать качественное соединение с моим новым провайдером по L2TP он упорно отказывался, да и вообще железка морально устарела. Перечитав кучу обзоров домашних маршрутизаторов я понял, что, в принципе, они все одинаковые: с одинаковыми возможностями и скучным web-интерфейсом. А всякие плюшки, вроде внешних накопителей и торрент клиентов, мне и даром не надо. Квартира у меня маленькая, поэтому вариант установки отдельного компа по типу hp micro server не подходит, да и денег жалко.

.NETИспользование SCM для управления драйверами в C# реализованной с помощью dll на C++/cli из песочницы

Service Control Manager (SCM)


SCM — это сервер, реализованный в Windows, для удаленного управления сервисами (вызовом процедур).

Для того, чтобы запустить драйвер в Windows, ему в соответствие ставится сервис, который обеспечивает управление этим драйвером. Не путать с устройством, которое создает драйвер в системе, через которое происходит обмен сообщениями с драйвером. Это устройство создается уже после старта драйвера, а вот SCM обеспечивает само внесение драйвера в систему. С помощью SCM можно: добавлять, удалять, запускать или останавливать службы.

Постановка задачи


Написать буферный класс позволяющий упростить работу SCM в C#.
Сам внешний вид этого класса можно обознать очень просто:

    public ref class ServiceControlManager : public IDisposable
	{
	public:
		ServiceControlManager(void);
		void AddDriver(String^ ServiceName, String^ BinaryPathName);
		void DeleteDriver(String^ ServiceName);
		void StartDriver(String^ ServiceName);
		void StopDriver(String^ ServiceName);
	protected:
		~ServiceControlManager();
        !ServiceControlManager();
	private:
		SC_HANDLE SCMHandle;
	};

Конструктор, деструктор, финализатор, основные методы, из атрибутов только HANDLE объекта SCM. Из этого следует, что экземпляр объекта этого класса будет содержать в себе созданный объект SCM, а методы упрощают с ним работу. Класс является буферным, и поскольку он реализован в C++/cli он будет автоматически масштабируем для работы в среде .NET, соответственно и в C#.

PHPCThread — многопоточность для PHP с блэкджеком

В сети гуляет довольно много решений для эмуляции многопоточности в php. Чаще всего они основываются на форках, но есть и вариации на тему с использованием curl, proc_open и т.п.

Все встреченные варианты по тем или иным причинам меня не устроили и пришлось написать свое решение.
Набор требований у меня был следующий:
  • Использование форков;
  • Синхронный режим с сохранением интерфейса при отсутствии необходимых расширений;
  • Многократное использование дочерних процессов;
  • Полноценный обмен данными между процессами. Т.е. запуск с аргументами и получение результата по завершении;
  • Возможность обмена событиями между дочерним процессом-«потоком» и основным процессом во время работы;
  • Работа с пулом потоков с сохранением многократного использования, передачи аргументов и получения результатов;
  • Обработка ошибок выполнения;
  • Таймауты на выполнение работы, ожидание работы потоком, инициализацию;
  • Максимум производительности;

В результате получилась библиотека CThread.

JAVACLI на стероидах: Google Guice и JCommander из песочницы

В этой статье я хочу рассказать об одном из способов построения CLI-приложений на Java.
Собственно сама потребность в таких приложениях никуда не делась — так, например, в моем случае это было приложение для проведения функционального и нагрузочного тестирования серверной части. Конечно же были варианты в проведении необходимых тестов при помощи набора JUnit-ов, но мы были сильно ограничены во времени и хотелось получить решение, не требующее программирования со стороны отдела тестирования. Тем более, что бинарный протокол по которому взаимодействовали клиент и сервер был четко специфицирован.

Идея


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

На Хабре не так давно была статья о commons-cli. Сам commons-cli мне не понравился своим 'деревянным' API, однако из комментариев к самой статье я узнал про несколько альтернатив в числе которых был JCommander.

Привлек внимание именно он, поскольку:
  • Естественная поддержка паттерна Команда;
  • Удобный способ определения параметров вызова, основанный на аннотациях;
  • Автоматическое формирование помощи по доступным командам;
  • Неплохая документация;
  • Бесплатно.


РазработкаGUI vs. CLI — последняя битва

Настоящими программистами считается, что ничего лучше интерфейса командной строки пока не придумали и никогда не придумают, потому что лучше уже некуда. Естественно, хочется поспорить.

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


Рис. 1. Абстрактный интерфейс в вакууме.

PHPПараллельные вычисления, класс-обёртка для pcntl_fork()

Хочу показать свой базовый класс, который я использую для PHP скриптов.
Приемущество его в том, что легко можно «распараллелить» работу.
Используется pcntl_fork() со всеми «вытекающими».

(тестировалось только на линукс)

PythonБесплатная отправка SMS от своего мегафоновского номера с помощью python-скрипта из песочницы

Для чего это нужно?


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

Обычное применение

Итак, наверняка многие сталкивались с ситуацией, когда необходимо написать относительно длинное смс-сообщение:
  • скопипастить кому-нибудь нужную информацию
  • подробно описать какие-нибудь детали встречи, когда у вашего собеседника поговорить нет возможности
  • ну или банально написать что-то в духе тех самых проиндесированных смс-ок :3

Необычное применение

Здесь варианты использования ограничены только вашей фантазией и умениями парсить нужные информационные потоки, например:
  • прогноз погоды
  • заголовки rss-ленты
  • твиттер-лента
  • данные по нагрузке вашего сервера
  • ?????
  • PROFIT!

JAVAРабота с commons-cli 1.2 из песочницы

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

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

Как оказалось примеров не так уж много и покрывают они только базовые потребности разработчика. Попробую заполнить этот пробел своими пояснениями.

ИнтерфейсыМедвежий балет и искусственный интеллект

«Массивный, громоздкий зверь неуклюже переступает с лапы на лапу. Танцует медведь просто ужасно, но чудо не в том, что он танцует хорошо, а в том, что вообще танцует».
Алан Купер об интерфейсах, «Психбольница в руках пациентов»


Графический интерфейс и командную строку часто противопоставляют другу другу. Причем то, что поклонники GUI считают достоинствами, в глазах любителей CLI — недостаток. И наоборот. «GUI — самодокументированный интерфейс. — говорят первые, — Мне не нужно читать инструкцию, чтобы разобраться в грамотно спроектированном GUI, я просто смотрю на него, открываю меню, другое, третье, и через несколько минут (или секунд) делаю, что мне надо». «А как насчет десятого или сотого раза? — возражают вторые. — Всё это изобилие кнопочек и значков превращается в раздражающий визуальный шум и мешает работать. А скорость? Разве может сравниться хождение по многоуровневым менюшкам со стремительностью клавиатурных команд?» «Стремительность, говорите? — отвечают первые, — А изучать руководство на сотни страниц мелким шрифтом, чтобы выйти из вашего Vim-а, это тоже стремительно?»

Этот спор можно растянуть еще на несколько абзацев, но лучше подумать вот о чем: так ли уж необходимо терпеть недостатки каждого из интерфейсов? Нельзя ли быстро запрягать и так же быстро ехать? Ведь сторонники GUI на самом деле любят не кнопочки и разноцветные значки, они любят легкость обучения. Шедевры графического интерфейсостроения всегда легки и лаконичны, в них не встретишь буйства красок и россыпей кнопок. А любители командной строки привязаны не к монохромному аскетизму, а к скорости, ненавязчивости и предсказуемости консоли. Достаточно взглянуть на обилие цветовых схем подсветки синтаксиса того же Vim, чтобы убедиться в том, что суровые консольщики тоже любят, чтобы было красиво.

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