SVNВнешние зависимости SVN

Данной записью открываю тег заметки, по которому буду описывать некие элементарные (или базовые) вещи скорее для себя, так что многие тут ничего волшебного не увидят.

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

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

1
2
~$ svn propedit svn:externals library
http://framework.zend.com/svn/framework/standard/tags/release-1.12.0/library/Zend Zend

Ранее я либо коммитил внешние библиотеки в репозиторий, либо выставлял игнорирование на всё содержимое папки библиотек, а для обновления библиотек делал всё, как в каменном веке, т.е. сносил одни папки, скачивал и распаковывал другие, отправлял их в хранилище по новой и т.п. Теперь достаточно отредактировать свойство svn:externals

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

1
2
~$ svn propedit svn:externals library
http://framework.zend.com/svn/framework/standard/tags/release-1.12.0/library/Zend@4321 Zend

P.S. Есть, конечно, и более новомодные штуки, вроде composer, но и до него руки дойдут уже скоро :)

Zend FrameworkОтправка писем в спул

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

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

Вид который бы хотелось получить

ВёрсткаВёрстка для писем

Имеются в виду HTML-письма. Не думал, что могу наткнуться на какие-то специфические особенности данного дела, хотя на каких основаниях так считал - неизвестно.

Итак, постановка задачи: накалякать какое-нибудь простенькое HTML-письмо с минимальным оформлением, дабы выпендриться выделиться из общей массы текстовых писем. Наподобие того, что снизу

IDENetBeans + TortoiseSVN 1.7

Обновил недавно черепашку до версии 1.7 и стал регулярно получать сообщение об ошибке в среде разработки NetBeans, т.к. тамошний клиент для работы с Subversion пользуется метаданными рабочей копии по версии 1.6

Залез в гугл и отыскал решение этой проблемы. Необходимо в файле .../etc/netbeans.conf добавить параметр -J-DsvnClientAdapterFactory=commandline в опцию netbeans_default_options

В настройках IDE можно явно указать путь к клиенту Subversion. Делается это в Сервис → параметры → Разное → Управление версиями (Tools → Options → Miscellaneous → Subversion)

MySQLMySQL Query Cache

Оставляю себе в качестве шпаргалки.

Необходимые запросы к БД для проверки работоспособности и просмотра состояния дел.

1
2
3
SHOW variables LIKE 'have_query_cache';
SHOW variables LIKE 'query%';
SHOW status LIKE 'Qcache%';

jQueryAjax

Не прошло и полгода, как технология ajax проникла в мою деятельность :) Здесь, в частности, она применилась к отправке комментариев (не без участия jQuery).

Лучше, конечно, поменьше слов и побольше кода, но читать дальше не советую, так как вряд-ли кто-то увидит здесь что-нибудь новое

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
jQuery(document).ready(function() {
    jQuery('#submit').click(function() {
        var dataForm = jQuery('#CommentForm').serialize();
        jQuery.ajax({
            url: '/index/addcomment',
            data: dataForm,
            type: 'POST',
            success: function() {
                jQuery('#comments').load('/topic.php #comments > *');
            }
        });
        return false;
    });
});

JavaScriptHTML5 и IE8

Долго сражался с этим долбанным ребусом. Если вкратце, то внешний вид одного сайта нормально отображался в IE8 и IE7, однако одна единственная страница перекашивалась в указанных браузерах. Средство разработчика, встроенное в IE показало, что на этой злосчастной странице такие элементы HTML5, как <footer>, <article> или <header> самостоятельно "закрывались", т.е. превращались в элементы вида <footer/>, <article/> и т.п. Причём на остальных страницах подобного поведения не наблюдалось.

Гугление привело на страницу с решением, позволяющем включить новые элементы HTML5 в Internet Explorer. Приведу здесь необходимый фрагмент:

1
2
3
<!--[if lt IE 9]>
<script src="http://cdn.jsdelivr.net/html5shiv/3.7.2/html5shiv.min.js"></script>
<![endif]-->

Zend FrameworkАналог Url-хелпера из Zend_View

В своё время меня интересовал вопрос - как вызывать Url-хелпер из контроллера и внутри модели? И если в контроллере это можно было сделать просто, то внутри модели получал только фигу. Однако догадался заглянуть в код самого фреймворка (Zend Framework, если что) - там всё чёрным по белому написано.

Зачем мне вообще это понадобилось? А затем, что пути к страницам этого сайта определены через роуты и если мне завтра вздумается заменить адреса вида example.org/topic/xxx на example.org/shmopic/xxx, то придётся переписывать модели для получения RSS-фида и генерации sitemap.xml, что не есть хорошо.

Zend FrameworkИспользование Zend_Feed

Не претендую на лучшее решение, это скорее первый опыт общения с Zend_Feed вообще, но написать что-то надо. Хотя бы ради ссылки на спецификации RSS 2.0

Ну а теперь, собственно, реализация RSS-ленты. Поскольку я стараюсь придерживаться паттернов проектирования MVC, то запрос обрабатывается контроллером, а данные для ленты формируются в модели. Вид (View) нам не нужен, как таковой, потому в контроллере мы его выключаем.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
<?php

public function feedAction()
{
    //определяем тип ленты, RSS или Atom
    $feedType = $this->_getParam('feed');

    //выключаем View и Layout
    $this->_helper->layout->disableLayout();
    $this->_helper->viewRenderer->setNoRender(true);

    $topics = new Application_Model_DbTable_Topics();

    //запрашиваем данные ленты из модели
    $feedArray = $topics->getFeedData($feedType);

    //Импортируем ленту с помощью Zend_Feed и выводим её
    $feed = Zend_Feed::importArray($feedArray, $feedType);
    $feed->send();
}

Zend FrameworkПощупал Zend_Cache

Заинтересовался компонентами Zend Framework, пользоваться которыми ещё не приходилось. Решил попробовать Zend_Cache. Собственно попробовал кеш на этом самом блоге, который родился и продолжает развиваться из моего тестового задания для приёма на работу.

Выбрал 3 не самых ресурсоёмких запроса, которые происходят при каждом обращении к IndexController-у. Это выборка из БД названий непустых категорий и тегов, в которых уже имеются записи, а также имён пользователей блога (я тут пока один).