2008 Март | Кирилл Павлюков
Мар 24

В CakePHP RSS-каналы создаются не просто, а очень просто: нужно только отредактировать 2 файла и создать еще один.
Как это сделать – читайте ниже.
Если вы до сих пор не знаете, что такое RSS и для чего этот формат создан, прочитайте эту статью из Википедии.
А по этому адресу вы можете найти полную спецификацию формата RSS на русском языке.
Читать запись полностью »

Share

Автор: Кирилл Павлюков \\ Метки: ,

Мар 21

Когда я начал писать очередной проект, в качестве платформы выбрал фреймворк CakePHP 1.2. Но позже пришлось об этом несколько раз пожалеть. Проблема крылась в том, что новая версия, хоть и называется beta2, просто кошмарно документирована. Некоторые разделы в руководстве вообще не написаны, некоторые – написаны с ошибками.
Вот над одной из ошибок в документации мне пришлось потрясти больше часа бубном. Речь идет о хелпере HTML и его методе meta(). Судя по руководству, одна из функций этого метода – добавление тега <link> для RSS-каналов. Эта ссылка указывает всякого рода поисковикам и браузерам на то, что контент сайта доступен в альтернативном оформлении (в виде RSS-потока).
Вот пример из официальной документации по CakePHP версии 1.2, который вы можете найти здесь:

1
2
3
4
5
6
<?php
echo $html->meta(
    'Comments',
    '/comments/index.rss',
    array('type' => 'rss'));
?>

Но этот пример в реальности (в самом последнем snapshot CakePHP 1.2) работал совсем не так, как нужно.

Как я и говорил, пришлось потратить больше часа на танцы с бубном, но проблема не решалась. Пришлось лезть в исходный код фреймворка, чтобы понять, почему метод работает не так, как ожидается. После небольшого исследования, стало понятно, что в текущем коде метода meta() был абсолютно изменен порядок принимаемых методом аргументов.
Вот правильный пример использования этого метода:

1
2
3
4
5
6
<?php
echo $html->meta(
    'rss',
    '/comments/index.rss',
    array('title' => 'Comments'));
?>

ЗЫ: Если кто не в курсе, то этот код нужно вставлять в верстку (layout) внутри тега <head>

Share

Автор: Кирилл Павлюков \\ Метки: , ,

Мар 20

Вот зашел сегодня на свой любимый поисковик и прикололся.

На заглавной странице висит логотип с цветочками. Если навести на него, всплывает подсказка – «First Day of Spring» («Первый день весны»). Это при том, что на календаре 20 марта. Может, я пропустил тот момент, когда 20 число стали считать первым? Пробовал нажать «Обновить» – результат тот же. Это только у меня такой глюк? :-)

Вот собственно скриншот (для неверующих внизу специально поставил окошко календаря):

Гугл однозначно жжот!

Share

Автор: Кирилл Павлюков \\ Метки: ,

Мар 18

Вчера на сайте фреймворка Zend Framework был выложен для скачивания всежий релиз – 1.5. Ура, товарисчи :-)

Изменения? внесенные в этот релиз, по идее, должны быть уже известны всем. Но на всякий случай я повторюсь:

Новые возможности

  • Новый компонент Zend_Form с поддержкой AJAX-элементов.
  • Новые помощники действий и вида для автоматизации и урощения обработки AJAX-запросов и альтернативных форматов ответов.
  • Адаптеры аутентификации LDAP, Infocard и OpenID.
  • Поддержка комплексных запросов Lucene, включая fuzzy, date-range и запросов wildcard;
  • Поддержка формата файла индекса Lucene 2.1;
  • Помощники вида Partial, Placeholder, Action и Header для расширеного составление скриптов видов и рендеринга.
  • Ноый компонент Zend_Layout для автоматизации и урощения работы с версткой сайта.
  • Поддержка UTF-8 в PDF-документах.

Замечания при обновлении со старых версий

  • Если вы обновляете Zend Framework с выпуска 1.0 до 1.5 ZF, и используете в своих проектах Zend_Search_Lucene, вы должны знать, что теперь Zend_Search_Lucene работает исключительноно с форматом файла индекса Apache Lucene 2.1. Преобразование из старого формата (1.9) будет выполнено автоматически при первом обновлении индекса после установки Zend Framework 1.5. Это преобразование невозможно отменить. Сделайте резервную копию вашего индекса Lucene на случай если вы захотите вернуться к версии Zend Framework 1.0 и продолжить использовать этот индекс.

Ну, а кроме релиза, на сайте куча изменений. В первую очередь это каcается юзабилити и дизайна. Смотрится намного серьезней.

Share

Автор: Кирилл Павлюков \\ Метки: ,

Мар 17

В ноябре прошлого года я разрабатывал проект, использующий Zend Framework и Smarty.
Как я уже недавно писал, мой любимый визуальній редактор – Spaw Editor от компании Solmetra.
А вот пример того, как можно написать плагин для Smarty для быстрой вставки редактора в тело страницы. Думаю, что комментировать код нет необходимости – тут и так все понятно. Кроме того, модифицировав всего пару строк, можно исключить Zend Framework, если ваш проект не использует его.
И еще: этот плагин писался под конкретный проект, поэтому в нем реализовано лишь то, что было необходимо мне. Вполне вероятно, что вам окажется недостаточно такой функциональности.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
<?php
/**
* Smarty plugin
* @package Smarty
* @subpackage plugins
*/

/**
* Smarty {spaw} function plugin
*
* Type: function
* Name: spaw
* Date: Nov 11, 2007
* Purpose: automate creation Spaw Editor
* Input:
*     - name = name of textarea, default - 'Text'
*     - value = default value
*     - lang =
*     - toolbarset
*     - theme
*     - width
*     - height
*     - stylesheet
*     - page_caption
* Examples:
*     <pre>
*     {spaw}
*     {spaw name='Description' lang='en'}
*    
* @version 1.0
* @author Kirill Pavliukov <kirill></kirill>
* @param array
* @param Smarty
* @return string
* @todo Spaw Pages
*/

function smarty_function_spaw($params, &amp;$smarty)
{
    if (!defined('WWW_DIR')) define('WWW_DIR',$_SERVER['DOCUMENT_ROOT']);
    $name = ((isset($params['name'])) ? $params['name'] : null);
    $value = ((isset($params['name'])) ? $params['value'] : '');
    $lang = ((isset($params['lang'])) ? $params['lang'] : null);
    $toolbarset = ((isset($params['toolbarset'])) ? $params['toolbarset'] : '');
    $theme = ((isset($params['theme'])) ? $params['theme'] : '');
    $width = ((isset($params['width'])) ? $params['width'] : '');
    $height = ((isset($params['height'])) ? $params['height'] : '');
    $stylesheet = ((isset($params['stylesheet'])) ? $params['stylesheet'] : '');
    $page_caption= ((isset($params['page_caption'])) ? $params['page_caption'] : '');
    if ($name == null) $smarty-&gt;trigger_error('(SPAW) Parameter `Name` must be specified');
    if ($lang == null) {
        $front = Zend_Controller_Front::getInstance();
        $lang = $front->getRequest()->getParam('language');
    }

    $pages = ((isset($params['pages'])) ? $params['pages'] : null);
    if ($name == '') $name = 'Text';

    require_once(WWW_DIR . 'spaw2/spaw.inc.php');
    $spaw = new SpawEditor($name, $value, $lang, $toolbarset, $theme, $width, $height, $stylesheet, $page_caption);

    if ($pages) {
        $pages = split(';',$pages);
        foreach ($pages as &amp;$page) {
            $page = split('::',$page);
            if (!isset($page[0]) or empty($page[0])) $smarty->trigger_error('(SPAW) Page name myst be specified!');
            if (!isset($page[1]) or empty($page[1])) $smarty->trigger_error('(SPAW) Page caption myst be specified!');
            if (!isset($page[2])) $page[2] = '';
            if (!isset($page[3])) $page[3] = 'ltr';
            $spawPage = new SpawEditorPage($page[0],$page[1],$page[2],$page[3]);
            $spaw->addPage($spawPage);
        }
    }
    $spaw->show();
}

?>
Share

Автор: Кирилл Павлюков \\ Метки: , , , ,

Мар 17

В моем недавнем посте про Squid под FreeBSD. Я рассказывал о том, как произвести NCSA-авторизацию. Serge, попросил рассказать о том, как авторизировать пользователя в Active Directory. Я уж принялся было выполнять его просьбу, но природная лень заставила меня поискать статьи по этой теме в интернете.

И нужная статья была найдена по адресу http://www.sys-adm.org.ua/www/squid-ad.php

Считаю, что, как говорится, тема сисек раскрыта, и мне не зачем загаживать сеть лишними килобайтами.

Share

Автор: Кирилл Павлюков \\ Метки: , ,

Мар 17

Вот уж не думал, что придется столкнуться с дежавю 2004-2005 годов, когда мы делали свой первый сайт.

Если кто-нибудь забыл или просто не знал, напомню: в те времена во всем украинском информационном пространстве просто-таки свирепствовала цензура. Тогда регулярно на все радио- и телестудии администрацией президента Кучмы рассылались так называемые «темники». Даже руководство радио «Эра ФМ», входящая в холдинг «Киевский телеграф», и претендующая на звание «самой независимой и самой негосударственной», ежедневно «разъясняло» новостникам, как и о чем нужно говорить, а о чем молчать.

Во время оранжевой революции дышать журналистам стало намного легче. Это, пожалуй, и есть та единственная победа демократии. Тут, пожалуй, стоит оговориться, что «Эру ФМ» эта победа не коснулась – там просто сменили источник темников, и радиостанция стала банальным флигелем интересов г-на Деркача, который за последние года несколько раз кардинально сменил политическую ориентацию…

Что-то я отвлекся…

Итак, есть 2 факта:

  1. до 2005 года в информационном пространстве Украины свирепствовала цензура;
  2. начиная с 2006 года давление на СМИ уменьшилось в разы.

А теперь возможный третий факт. Киев, март 2008 года, цензура снова с нами.

Сегодня к нам обратились представители одного крупного украинского портала с просьбой «снять» опубликованный материал, который затрагивал интересы депутата из БЮТ Александра Шепелева. (Название я не привожу, потому что, ИМХО, просьба эта звучала не от имени портала, а, скорее, от имени отдельных его сотрудников.) К слову, это уже вторая просьба. Первая была где-то неделю назад, и касалась так же интересов БЮТа.

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

Но, если политики, которые сейчас находятся у государственного руля все-таки попытаются вернуть назад 2004 год, пусть 100 раз взвесят, как это может аукнуться.

Понимаете, Юлия Владимировна?

Share

Автор: Кирилл Павлюков \\ Метки: , , , , , ,

Мар 17

Похоже, конференция веб-разработчиков «UA WEB 2008″ таки состоится :-) Напомню, что изначально ее проведение планировалось на октябрь 2007 года, но потом организаторы перенесли ее на март 2008.

Итак, «UA WEB 2008″ состоится 27-28 марта в киевском Президент-отеле. По этому адресу вы можете ознакомиться с программой конференции. Среди докладчиков заявлены компании Microsoft, Яндекс, Sun. Также планируется участие представителей Рамблера, Укр.нет и Бигмир.

Говорить будут обо всем :-) : от дизайна, до репликации, от новинок до перспектив.

В целом, если все получится так, как заявлено, конференция будет весьма интересной и полезной.

Стоимость участия:

  • до 26 марта 200 вечнозеленых или 1000 хохлоденег;
  • непосредственно перед конференцией – 1100 грн.
Share

Автор: Кирилл Павлюков \\ Метки: , , , ,

Мар 13

Вот наткнулся в Википедии на статью о шаблонах проектирования. Рекомендую к прочтению.

Для тех кто не знаком с определение паттернов предлагаю цитату из Вики:

Шаблоны проектирования (паттерн, pattern) – это эффективные способы решения характерных задач проектирования, в частности проектирования компьютерных программ. Паттерн не является законченным образцом проекта, который может быть прямо преобразован в код, скорее это описание или образец для того, как решить задачу, таким образом, чтобы это можно было использовать в различных ситуациях. Объектно-ориентированные шаблоны зачастую показывают отношения и взаимодействия между классами или объектами, без определения того, какие конечные классы или объекты приложения будут использоваться. Алгоритмы не рассматриваются как шаблоны, так как они решают задачи вычисления, а не проектирования.

А если »многа букаф», тогда вот определение от меня:

Шаблоны проектирования – это способ сэкономить время разработчика на выдумывание «велосипедов». Паттерны являются своего рода описанием того, как можно решить типичные задачи при проектировании приложений.

Короче, штука не просто полезная, а необходимая. 

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

ЗЫ: Хотя описания шаблонов достаточно понятны более-менее опытному разработчику, новичкам, скорее всего, будет тяжело без конкретных примеров реализации. Я попробую отыскать примеры использования паттернов в PHP и буду выкладывать их на своем блоге.

Share

Автор: Кирилл Павлюков \\ Метки: ,

Мар 13

В одном из прошлых постов я написал, как установить и запустить прокси-сервер Squid под FreeBSD. В той заметке была указана лишь минимальная настройка, которая никак не затрагивала вопрос об авторизации. Пришло время «донастроить» прокси.

Итак, Squid предоставляет различные механизмы авторизации пользователей. Какой из них выбрать – зависит от ваших потребностей. Меня вполне устроила NCSA-авторизация, о ней и расскажу.

Для использования этого механизма, нужно добавить в конфиг-файл следующие строки:

1
2
3
4
auth_param basic program /usr/local/libexec/squid/ncsa_auth /usr/local/etc/squid/users<br/>
auth_param basic children 5<br/>
auth_param basic realm Squid proxy-caching web server<br/>
auth_param basic credentialsttl 2 hours

А также заменить строку

1
http_access allow all

на

1
2
3
acl users proxy_auth REQUIRED<br/>
http_access allow users<br/>
http_access deny all

Теперь нужно создать файл /usr/local/etc/squid/internet_users и добавить в него пользователей. Делается это с помощью утилиты htpasswd. Если файл с паролями еще не существует, выполните htpasswd с ключом :

1
2
3
4
s1# htpasswd -c /usr/local/etc/squid/users kirill<br/>
New password: *****<br/>
Re-type new password: *****<br/>
Adding password for user kirill

Если же вам нужно добавить пользователя в уже существующий файл, выполните

1
2
3
4
s1# htpasswd /usr/local/etc/squid/users kirill<br/>
New password: *****<br/>
Re-type new password: *****<br/>
Adding password for user kirill

Посмотрите теперь на файл паролей. В нем должна появиться строка, содержащая введенное вами имя ползователя и хэш его пароля, разделенные двоеточием.

1
2
s1# cat /usr/local/etc/squid/users<br/>
kirill:0Q2rNA.AEfZOk

В общем, настройка завершена. Осталось заставить Squid перечитать настройки, чтобы внесенные изменения вступили в силу.

1
squid -k reconfigure

Share

Автор: Кирилл Павлюков \\ Метки: , ,