рубрика Рецепты

Моделирование иерархических данных в MySQL

12.03.2013г. // Рубрики: web, Рецепты
Почитывал сегодня после обеда Хабра-трёп на тему "SQL vs NoSQL" и увидел ссылку на любопытную англоязычную статью про моделирование деревьев в рамках MySQL. Хотя сейчас подобные вещи предпочитаю делать на MongoDB, сама статья мне показалась любопытной и достойной попадания в личные закладки: http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/. Как я бегло глянул - там речь идет о Adjacency List Model и Nested Set.

Подружить Magento и X-Cache

28.02.2013г. // Рубрики: web, Рецепты, cms
Как-то сделал товарищу магазин на Magento, ну и там пока то да сё - пустил его пожить на своём VDS-е. Мне было не в тягость, пока этот магазин не начал периодически отжирать ресурсы не слабо. Сегодня я решил задуматься о разных php-шных заморочках и вспомнил, что у меня к одному форуму на сервере уже прикручен X-Cache, вот его решил использовать и для магенты.
Быстро поискал в интернете и нашел нужные настройки, в файле app/etc/local.xml, в секции <global> необходимо сделать вставку:
<cache>
    <backend>xcache</backend>
    <prefix>MAGENTO_</prefix>
</cache>
здесь prefix - это всего лишь только префикс, и больше ничего, нужен, чтобы разделять кеши от разных проектов, можно придумать любое имя.
Всё бы ничего, да только после этого Magento сдох (или Магента сдохла?) Короче, полез в var/report и полюбовался на:
a:4:{i:0;s:78:"fast_backend must implement the Zend_Cache_Backend_ExtendedInterface interface";i:1;s:1258:"#0 lib/Zend/Cache/Backend/TwoLevels.php(153): Zend_Cache::throwException('fast_backend mu...')
#1 lib/Zend/Cache.php(153): Zend_Cache_Backend_TwoLevels->__construct(Array)
#2 lib/Zend/Cache.php(94): Zend_Cache::_makeBackend('TwoLevels', Array, true, true)
#3 app/code/core/Mage/Core/Model/Cache.php(124): Zend_Cache::factory('Varien_Cache_Co...', 'TwoLevels', Array, Array, true, true, true)
#4 app/code/core/Mage/Core/Model/Config.php(1350): Mage_Core_Model_Cache->__construct(Array)
#5 app/Mage.php(432): Mage_Core_Model_Config->getModelInstance('core/cache', Array)
#6 app/code/core/Mage/Core/Model/App.php(396): Mage::getModel('core/cache', Array)
#7 app/code/core/Mage/Core/Model/App.php(290): Mage_Core_Model_App->_initCache(Array)
#8 app/code/core/Mage/Core/Model/App.php(332): Mage_Core_Model_App->baseInit(Array)
#9 app/Mage.php(640): Mage_Core_Model_App->run(Array)
#10 index.php(80): Mage::run('', 'store')
#11 {main}";s:3:"url";s:1:"/";s:11:"script_name";s:10:"/index.php";}
Пришлось вновь залезать в Интернет и разбираться.
Итак, лекарство:
  1. ищем файлик app/code/core/Mage/Core/Model/Cache.php и открываем его редактором
  2. находим там строчку, начинающуюся с case 'xcache':
  3. комментируем пониже выражение $enable2levels = true;
В общем, у меня получилось так:
case 'xcache':
    if (extension_loaded('xcache')) {
        /*$enable2levels = true;*/
        $backendType = 'Xcache';
    }
    break;
После этого магазин шустренько зажил, так что можно сказать, что я доволен.
На всякий случай решил записать этот рецептик, возможно ещё пригодится при каком-нибудь апгрейде.

Class::Singleton - траблы в mod_perl

26.02.2013г. // Рубрики: Рецепты, Perl
Во время отладки сайта под mod_perl2, столкнулся с воистину мистичным глюком. Мне там потребовались небольшие проверки текущей timezone, ну и манипуляции по-необходимости, использовался пакет DateTime. Сообщение в логе загнало меня в ступор
Invalid version format (non-numeric data) at /usr/local/share/perl/5.10.1/DateTime/TimeZone/Europe/Moscow
BEGIN failed--compilation aborted at /usr/local/share/perl/5.10.1/DateTime/TimeZone/Europe/Moscow.pm line 17.
....
Attempt to reload DateTime/TimeZone/Europe/Moscow.pm aborted.
Справедливости ради, это сообщение не только для Moscow.pm выскакивало. В общем, потребовались глубокие разборки и внимательный просмотр исходных текстов модуля DateTime. Здесь опущу описание душевных мук, в процессе расследования подозрение пало на Class::Singleton (версия 1.4 от 28 Sep 2007).
Итак, сухой остаток: открывая исходник, видим в первых рядах следующую строку:
our $VERSION = 1.4;Ищем на своем компе, где модуль прописался (у меня, к примеру, /usr/local/share/perl/5.10.1/Class/Singleton.pm), открываем его в текстовом редакторе, и аналогичную строку заменяем на
our $VERSION = '1.4';т.е. просто заключаем в одинарные кавычки. И (о, чудо!) - глюк немедленно пропал.
Самое забавное во всей истории - из трех различных серверов, ошибка возникала лишь на одном (который Debian 6 под Xen, если интересно). Вероятно, вследствие набора случайных факторов.
Из этой занимательной истории возникает полезный вывод: всегда заключайте версию модуля в кавычки. Подальше от греха..

Очистка ссылок на найденный текст в регулярных выражениях

08.02.2013г. // Рубрики: Рецепты, Perl
Не все программисты (например, я) непрерывно помнят, что при использовании регулярных выражений, в случае несоответствия шаблона переменной, в конечном итоге в $1 и прочих $2 может оказаться всё, что угодно. И совсем не обязательно это самое "все, что угодно" является undef. Если код большой, то там скорее всего будет находится результат от предыдущего регэкспа. Поэтому, хотелось бы периодически опустошать эти специальные переменные - ссылки на найденный текст.
Вообще говоря, сама идея сомнительна - правильнее проверять возвращаемое значение от сравнения:
if ($str =~ /pattern/ ) {
    ....
}
Тем не менее, изредка бывают ситуации, когда хочется ставить условие по $1, $2, или даже по $&. Конструкция
undef $1;не сработает - ибо "Modification of a read-only value attempted". Существует простой выход - перед вашей регуляркой сделать
'' =~ m/()()()()/;Пустую строку сравниваем с пустым шаблоном и получаем пустые значения в специальных переменных, в этом примере вплоть до $4.
Не буду дискутировать, насколько приведённый приём отвечает "хорошему стилю", но кому-нибудь может оказаться полезен.

Неожиданная проблема с Apache2::Request под убунтой

14.02.2011г. // Рубрики: web, Рецепты, Perl
Вчера случился трах с модулем Apache2::Request совершенно на ровном месте. Апач под mod_perl2 тихо умирал при попытке сделать
my $req = Apache2::Request->new($r);Сидел и тупо смотрел на 502 ошибку nginx-а, пока не сообразил заглянуть в самый главный апачевский error_log.
Короче, сухой остаток: после того, как под убунтой поставите
sudo apt-get install libapreq2необходимо ручками создать символическую ссылку на библиотеку apreq
ln -s /etc/apache2/mods-available/apreq.load apreq.loadНеобъяснимая недоработка авторов пакета, и времени убил.. (((

Поиск и замена по группе файлов с помощью Perl

30.08.2009г. // Рубрики: Рецепты, Perl
Периодически вспоминаю, а затем также периодически забываю  нужное заклинание командной строки для того, чтобы в каталоге поменять в каждом файле одно значение на другое. Одно время даже его написал на бумажке и прилепил к монитору.. потом поменял работу и заклинание опять потерялось. Начинаешь искать в поисковиках - все дружно выдают разную белиберду, вместо нужного.
Короче, вчера опять восстановил, воспользовался и решил сделать запись в блоге - чтобы в следующий раз проще было отыскать :D
Итак, в куче html-шаблонов потребовалось удалить некоторые стили, строка выглядит так:
perl -i.bak -pe "s/\s+class=\"post\-entry\"//ig" *.tplРазумеется, все это без заморочек работает только под юниксами - винда не понимает *.tpl, ей нужно указывать каждый файл по-отдельности. Впрочем, там существуют bat-файлы..
   »

Рубрики