Странный глюк в PHP
Не знаю, сталкивался ли кто или это мне повезло, но вчера поймал загадочный баг, похоже, что в движке PHP, хотя, пока до конца не уверен.
Предыстория такая - работаю над проектом, над которым потрудились индийские программисты. Сам проект сделан на движке Symphony - добротный такой движок, вполне приятный. В качестве библиотеки работы с базой данных используется Creole - тоже довольно приятная штука. В качестве ORM используется Propel — штука громоздкая, но тем не менее тоже весьма мощная и простая. Вообще Symphony показался мне весьма неплохим движком, весьма простым и удобным. Наверно, потому, что он почти один в один копирует Ruby on Rails - те же хелперы, тот же yml в конфигах, такой же подход к MVC - в общем очень похоже.
Так вот, доблестные индийские программисты, вместо того, чтобы использовать оснастку из Symphony навставляли везде mysql_connect и mysql_query. И все бы ничего, но mysql_connect у них вставляется ВЕЗДЕ перед mysql_query — в одном скрипте может быть создано несколько десятков соединений, а каждый mysql_query дополняется проверкой "or die(mysql_error())", поэтому любая ошибка в sql ведет к скоропостижной кончине всего скрипта.
Чтобы хоть как то исправить это безобразие я сначала удалил все mysql_connect. Затем, все mysql_query поиском и заменой заменил на собственную функцию, использующую оснастку creole, поместил её в глобально видимый класс myTools::query():
static function query($sql){
$connection = Propel::getConnection();
$r = $connection->executeQuery($sql);
return $r->getResource();
}
Странное дело код ведь тривиальный, но ресурс возвращаемый этой функцией оказался невалидным! Причем внутри функции ресурс еще остаётся рабочим а возвращённый во вне оказывается сломанным. Тот же код ВНЕ функции идеально работает, но как только выношу его в функцию — перестаёт работать.
Что это — глюк самого PHP или глюк Simphony я так и не понял, пришлось немного модифицировать класс MySQLConnection и добавить туда метод возвращающий MySQL ресурс непосредственно, минуя всякие PHP обёртки, но осадочек все же остался...
Сагра
Молодцы, дали отпор бандитам, так держать! Хотя, если подумать, мужикам сильно повезло, что бандиты попались отмороженные - если бы те вели себя потише на подступах к деревне, может быть на колонну из пятнадцати машин никто бы ночью не обратил внимания и ситуация могла обернуться не так удачно.
Как пережать видео из MiniDV
Друг скинул видео с камеры MiniDV на жесткий диск - всего оказалось несколько файлов в формате AVI общим объемом около пятидесяти гигабайт - встала задача собрать это все в один файл и пережать до более вменяемого размера.
Сначала собираем несколько файлов в один:
> mencoder -oac copy -ovc copy -o output.avi Видео1.avi Видео2.avi Видео3.avi
Пережимаем получившийся файл:
> ffmpeg -i output.avi -vcodec mpeg4 -acodec libmp3lame -b 700K -deinterlace video.avi
Битрейт, указанный в параметре -b подбирается эмпирическим путём, он определяет размер финального файла - чем больше битрейт тем лучше качество но больше размер файла, соответственно - чем меньше тем хуже качество и меньше размер.
Какая гадость этот ваш WordPress!
Не спорю, штука прикольная, но уж больно архитектура у него специфическая:
- нет OOP: несмотря на то, что в системе вроде бы присутствуют классы - основная функциональнасть реализована на функциях;
- плохие привычки программирования: широко используются глобальные переменные;
- JavaScript ад: бардак со скриптами - доходит до того что каждый плагин тянет за собой собственный jquery или prototype;
- тем полно, но все кривые: темы сделаны по-идиотски - нет единого соглашения для создания тем, нет четкого разделения навигации и шаблонов - по сути вся навигация и функционал заложены в теме - а это половина движка;
- нет MVC: собственно нет шаблонов вообще - логика перемешана с HTML так не кодируют уже давно;
- SQL: движёк для работы с базой данных неплох - но он негибкий, заточен только под WP и только под MySQL;
- CMS: виджеты можно настраивать для всех страниц сразу, выборочно никак нельзя;
- низкое быстродействие: из-за навороченной системы фильтров и хуков в финале система получается тормозная и прожорливая;
- разработчики не подозревали о существовании других временных зонах кроме UTC: в коде жёстко прописано date_default_timezone_set('UTC');





