Zend Framework: включение профайлера для FirePHP

Задача: включить профилирование всех запросов к БД.

Решение: в основном файле загрузчика приложения (типа «/application/Bootstrap.php»)  добавить следующий код:


    /**
     * FirePHP profiler enable
     */
    protected function _initProfiler() {
    	$this->bootstrap('db');
        $db = $this->getPluginResource('db');
    	$profiler = new Zend_Db_Profiler_Firebug('All DB Queries');
		$profiler->setEnabled(true);
		$db->getDbAdapter()->setProfiler($profiler);
    }

Ссылки по теме

  • FirePHP – дополнение к FireBug, которое позволяет писать в консоль FireBug.

PS: по секрету скажу, что скоро будет добрая статья про один из самых удобнейших способов работы с БД с помощью Zend_Db. Приглашенные звезды: паттерны data mapper и model, класс Zend_Form. Мы разберемся, как делать запросы типа $row->getAuthorsByPaper()  в действительном отсутствии такого метода!)

Метки:

Мой диплом о разработке и вводе в эксплуатацию веб-приложения

Буквально месяц назад в славном Московском Техническом Университете Связи и Информатики я защищал диплом «Разработка и ввод в эксплуатацию веб-приложения „Сурдосервер“».

Веб-приложение я начинал разрабатывать еще с августа 2009 года в рамках своей работы в лаборатории вместе со своими коллегами, за мной была инженерная часть и проектирование взаимодействия. Самые интересные моменты в плане разработки я апериодически выкладывал в этом блоге. Настала пора опубликовать и сам диплом. Самим приложением можно воспользоваться на сайте http://surdoserver.ru/.

Самые нетерпеливые могут сразу перейти к разделу со ссылками для скачивания всего этого добра.

О дипломе

Что внутри: в дипломе описан весь цикл разработки современного веб-приложения. Что он включает в себя:

  1. Исследование вопроса;
  2. Определение целей, достигать которые поможет веб-приложение;
  3. Экономический расчет;
  4. Проектирование пользовательского взаимодействия (проектирование интерфейса);
  5. Проектирование БД;
  6. Проектирование программной архитектуры;
  7. Разработка;
  8. Тестирование (в том числе нагрузочное тестирование);
  9. Ввод в эксплуатацию.

В этом дипломе в силу правил составления, расчет экономического эффекта (или т.н. технико-экономического обоснования) находится практически в самом конце, и, откровенно говоря, советую особо не вчитываться в полученные цифры, т.к. сделаны довольно… оптимистичные прогнозы =). Также отсутствует описание процесса тестирования кода, однако есть нагрузочное тестирование.

Что использовалось при разработке и какие результаты:

  • Создано полноценное приложение, которое содержит в себе свыше 400 страниц программного кода;
  • Использовались технологий: PHP, Zend Framework, JavaScript, HTML, Adobe Flex, ActionScript 3;
  • Приобретен и настроен «с нуля» удаленный сервер на основе «облачных» вычислений для обеспечения бесперебойной работы приложения в сети Интернет;
  • Приложение размещено на сервере, получены первые положительные отзывы пользователей на форуме глухих, в социальной группе глухих в сети «вКонтакте», а также посредством встроенной системы обратной связи;
  • В период с 1 февраля по 1 июня 2010 года сайт посетило более 4 100 уникальных пользователей, которые совершили более 88 000 переходов по сайту.

Содержание дипломной работы

  • ВВЕДЕНИЕ
  • Глава 1 Проектирование приложения
    • 1.1 Исследование предметной области
      • 1.1.1  Язык жестов
      • 1.1.2  Современные методы обучения языку жестов
      • 1.1.3  Актуальность проблемы интерактивного веб-приложения для изучения русского языка жестов
    • 1.2   Назначение и основные возможности проектируемого приложения
    • 1.3   Общая архитектура приложения
    • 1.4  Проектирование серверной части
    • 1.5    Проектирование базы данных
      • 1.5.1  Системный анализ предметной области
      • 1.5.2  Инфологическое проектирование
      • 1.5.3  Даталогическое проектирование
      • 1.5.4  Физическое проектирование
    • 1.6  Проектирование клиентской части
  • Глава 2 Технологическая платформа приложения
    • 2.1  Требования к серверной части приложения
      • 2.1.1  Операционная система
        • 2.1.1.1  Обзор современных сетевых ОС
        • 2.1.1.2  Выбор ОС в соответствии с предъявленными требованиями
      • 2.1.2  Система управления базами данных
        • 2.1.2.1 Обзор современных СУБД
        • 2.1.2.2 Выбор СУБД в соответствии с предъявленными   требованиями
      • 2.1.3  Языки программирования
      • 2.1.4  Веб-сервер
        • 2.1.4.1  Обзор современных веб-серверов
        • 2.1.4.2 Выбор веб-сервера в соответствии с предъявленными  требованиями
    • 2.2  Требования к клиентской части приложения
  • Глава 3 Техническая платформа
    • 3.1 Серверное аппаратное оснащение
    • 3.2 Клиентское аппаратное оснащение
  • Глава 4 Описание разработанных компонентов
    • 4.1  Архитектура приложения
      • 4.1.1  Теория
      • 4.1.2  Используемая архитектура
      • 4.1.3  Файловая структура
    • 4.2  Разработанные модули
      • 4.2.1  Сурдо
      • 4.2.2  Дактильная азбука
      • 4.2.3  Страницы
      • 4.2.4  Обратная связь
      • 4.2.5  Поиск
      • 4.2.6  Административная панель
  • Глава 5 Введение приложения в эксплуатацию
    • 5.1  Размещение в сети Интернет
      • 5.1.1 Обзор и выбор способов размещения приложения в сети Интернет
      • 5.1.2  Настройка серверов, подключение доменов
      • 5.2.2  Размещение приложения
      • 5.1.4  Настройка резервного копирования
    • 5.2  Нагрузочное тестирование
      • 5.2.1  Методология тестирования
      • 5.2.2  Результаты тестирования
        • 5.2.1.1  Loadimpact.com
        • 5.2.2.2  Apache JMeter
  • Глава 6 Разработка вопросов по экологии и безопасности жизнедеятельности
    • 6.1  Характеристика условий труда программиста
    • 6.2 Анализ опасных вредных факторов и возможных чрезвычайных ситуаций, возникающих во время работы программиста
      • 6.2.1  Уровень шума на рабочем месте
      • 6.2.2  Электромагнитное и ионизирующее излучения
      • 6.2.3  Статические нагрузки и монотонность труда
      • 6.2.4  Недостаточная освещенность
    • 6.3  Разработка мер безопасности
      • 6.3.1  Снижение уровня шума
        • 6.3.1.1  Теория
        • 6.3.1.1  Расчетная часть
      • 6.3.2  Приобретение оборудования, отвечающего стандартам  безопасности
      • 6.3.3  Устранение статических нагрузок и монотонности труда
      • 6.3.4  Расчет освещенности рабочего места программиста
    • 6.4  Выводы
  • Глава 7 Технико-экономического обоснование проекта
    • 7.1  Постановка задачи
    • 7.2  Стоимость разработки приложения
      • 7.2.1  Определение реальных сроков и количества участников разработки и внедрения приложения
      • 7.2.2  Расчет заработной платы персонала
      • 7.2.3  Расчет затрат на приобретение необходимых аппаратных и программных средств для разработки приложения
      • 7.2.4  Расчет затрат на размещение сайта в сети Интернет
      • 7.2.5 Расчет всех затрат
    • 7.3  Оценка эффективности от внедрения приложения
      • 7.3.1  Косвенная экономия средств
      • 7.3.2  Доход от работы сервиса
  • ЗАКЛЮЧЕНИЕ
  • СПИСОК ЛИТЕРАТУРЫ
  • Приложение А Программные листинги
  • Приложение Б Графические интерфейсы

Файлы диплома

  1. Диплом в pdf-формате (3.1 Мб)
  2. Плакаты (по клику оригинальный размер)

  3. Плакаты архивом (7.2 Мб)

Социальности

Progg it

Метки:

PHP: Пример использования Imagick

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

Из большого в маленькое с эффектами

Из большого в маленькое с эффектами

Решение: использование расширения ImageMagick (Imagick).

Imagick — это программа для Linux для работы с изображениями. Она имеет множество интерфейсов для огромного числа языков программирования, в т.ч. и для php. Для debian-based (типа Ubuntu) систем легко ставится из консоли командой

apt-get install php5-imagick

Я использую обработку и загрузку изображения в рамках обработки полученных данных от Zend_From, поэтому в коде $form — это экземпляр Zend_Form.

// if preview image is uploaded
if($form->preview AND $form->preview->isUploaded()) {
	$form->preview->receive();
	$imgPath4Db = '/media/news/previews/' . $id . '.png';
	// Make neccery folders if needed
	@mkdir ($this->mediaPath . '/media/news/previews/', 0755, true);
	$imgPath = $this->mediaPath . $imgPath4Db;
	$imgPath = realpath($imgPath);

	// Size of thumbnail
	$width = 102;
	$height = 63;

	// Make thumbnail and upload image to neccery folder
	$thumb = new Imagick($form->preview->getFileName());
	$thumb->cropThumbnailImage($width, $height);
	$thumb->roundCorners(1, 1);

	// Create round corners via new image
	$borders = new Imagick();
	$borders->newImage($width+2, $height+2, new ImagickPixel('#999999'), 'png');
	$borders->roundCorners(1, 1);

	// Get the image geometry
	$geometry = $thumb->getImageGeometry();
	// The overlay x and y coordinates
	$x = ( $width - $geometry['width'] ) / 2;
	$y = ( $height - $geometry['height'] ) / 2;

	// Create and add over white bg
	$bg = new Imagick();
	$bg->newImage($width, $height, new ImagickPixel('#ffffff'), 'png');
	$bg->roundCorners(1, 1);
	$borders->compositeImage($bg, Imagick::COMPOSITE_OVER, 1, 1);

	// Add image itself
	$borders->compositeImage($thumb, Imagick::COMPOSITE_OVER, $x, $y+1);

	// Clone preview for making shadow
	$shadow = $borders->clone();
	// Shadow color
	$shadow->setImageBackgroundColor(new ImagickPixel("#333333"));
	// Making shadow
	$shadow->shadowImage(55, 2.5, 0, 0);
	// Overlay image with borders to shadow image
	$shadow->compositeImage($borders, Imagick::COMPOSITE_OVER, 5, 5);
	try {
		$shadow->writeImage($imgPath);
	} catch (Exception $e) {
		echo $e->getMessage();
	}
	// Clean up!
	$borders->destroy();
	$shadow->destroy();
	$thumb->destroy();

	// Update record in DB
	$data = array('preview' => $imgPath4Db);
	$this->update($data, 'id = "'.$id.'"');
}

Как это работает

  1. Создаем объект Imagick, при этом в конструкторе даем саму картинку, полученную из посланной формы;
  2. По-умному (то есть пытаемся уместить картинку так, чтобы сохранились пропорции) обрезаем до нужных размеров и округляем углы;
  3. Создаем новую картинку больше оригинала по 2 пикселя по ширине и высоте — прямоугольник залитый серым цветом — основа для границ изображения, и округляем его границы;
  4. Объединяем серый прямоугольник с обрезанным изображением;
  5. Создаем новую картинку — клон объединенных границ с превью. Добавляем к ней эффект тени;
  6. Объединяем полученную тень с превью-изображением;
  7. Сохраняем полученное творчество на сервер в формате PNG.

Ссылки в записи

  1. Мануал по ImageMagick
  2. Пакет php5-imagick для установки Imagick в Ubuntu
  3. Хороший блог об использовании Imagick в php с примерами

Метки:

Заметки на полях 2

Включение code hinting с ASDoc для OSMF

Задача: включить в Flash Builder подсказки с кодом с включенными в них описанием классов и их свойств для работы с Open-Source Media Framework (OSMF).

Решение:

  1. Скачиваем исходники OSMF
  2. Разархивируем их на компьютер
  3. В Flash Builder выбираем Import > Existing projects into workspace
  4. Щелкаем «Browse» и находим место, куда распаковали архив с OSMF (например, «C:\osmf_source_v1-0\framework\OSMF»)
  5. Теперь создаем или выбираем существующий проект, в котором нужна поддержка OSMF. Выбираем его свойства (Properties).
  6. Находим вкладку «Library path» (для чисто AS проектов вкладка будет в пункте «ActionScript Build Path»)
  7. Щелкаем «Add project…»
  8. Выбираем «OSMF»

That’s all, folks.)

Сервис по сборке Zend Framework в один файл

Когда неудобно таскать с собой оригинальный Zend Framework с его тысячами файлов, то лучшим решением будет использовать версию ZF, размещенную в одном файле. Для этой цели существует сервис по сборке ZF в один файл — ZF Packer.

Советую полностью исключать из сборки Zend_Test, т.к. он будет требовать установленный PHPUnit.

Еще говорят, что использование такой сборки поднимает производительность, т.к. весь файл перетечет в ОЗУ, но у меня на боевом сервере наблюдался обратный эффект: время отклика увеличилось в два раза.

Метки: ,

Zend Framework: объединение кнопок в форме в одну линию в Zend_Form

Задача: объединить, сгенерированные Zend_Form, кнопки «Обновить» и «Удалить», так чтобы они располагались на одной линии.

Решение: использование декораторов и DisplayGroup.

		$this->addElement (new Zend_Form_Element_Submit('submit', array(
            	'label'	=> 'Обновить',
        		'class'	=>	'ui-state-default ui-corner-all ui-button',
				'decorators'	=>	array('ViewHelper')
		  	))
		);

        $this->addElement (new Zend_Form_Element_Button('delete', array(
            	'label'	=> 'Удалить',
        		'id'	=>	'delete-button',
        		'class'	=>	'ui-state-default ui-corner-all ui-button',
        		'decorators'	=>	array('ViewHelper')
        	))
        );

       $this->addDisplayGroup(array('submit', 'delete'), 'submitButtons', array(
	        'decorators' => array(
	            'FormElements',
	            array('HtmlTag', array('tag' => 'div', 'class' => 'form-buttons')),
	        ),
	   ));

Здесь $this — это потомок класса Zend_Form, т.е. class Application_Model_Form_User extends Zend_Form.
Получится что-то типа такого:

Пример интерфейса с кнопками в одну линию в Zend_Form

Пример интерфейса с кнопками в одну линию в Zend_Form

Как это работает

В объявлении каждого элемента мы оставляем только один декоратор, который выводит только сам элемент. Эти элементы без декораторов мы добавляем в одну визуальную группу на основе div и для возможности стилизации в CSS добавляем группе класс «form-buttons».

Метки: ,

Zend Framework: пример помощников вида для интеграции ElRTE и ElFinder

Задача: унифицировать и упростить задачу инициализации текстового редактора ElRTE и файлового менеджера ElFinder.

Решение: использование специально для этого придуманных помощников вида (view helpers) в ZF.

Я использую ElRTE и ElFinder в административной панели сайта. Это наиболее удобные инструменты для визуального редактирования html-контента, а также для работы с файлами на серверами. Посему пример будет для модуля admin. Впрочем, сменив название модуля на Application, пример прекрасно подойдет для модуля по умолчанию (тот который в основной папке «/application/»).

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

  1. Создаем модульное приложение на ZF с модулем «admin». Подробнее об этом можете прочитать в одной из предыдущих моих записях.
  2. Скачиваем и сохраняем в «/public/js/» ElRTE и ElFinder
  3. Настраиваем коннектор для ElFinder
  4. Создаем файл «/application/modules/admin/view/helpers/EnableElRTE.php» со следующим содержимым:
    <?php
    /**
     * Class inserts neccery code for initialize rich text editor ElRTE
     */
    class Admin_View_Helper_EnableElRTE extends Zend_View_Helper_Abstract{
    
    	public function enableElRTE() {
    		$elrte_base_uri = "/js/back-end/elrte-1.0rc4/";
    
    		$this->view->headLink()->appendStylesheet("{$elrte_base_uri}css/elrte.full.css");
    		$this->view->headScript()->appendFile("{$elrte_base_uri}js/elrte.min.js");
    		$this->view->headScript()->appendFile("{$elrte_base_uri}js/i18n/elrte.ru.js");
       	}
    }
    
  5. Создаем файл «/application/modules/admin/view/helpers/EnableElFinder.php»:
    <?php
    /**
     * Class inserts neccery code for initialize file manager ElFinder
     *
     * @author Dimitry Dushkin
     *
     */
    class Admin_View_Helper_EnableElFinder extends Zend_View_Helper_Abstract{
    
    	public function enableElFinder() {
    		$elfinder_base_uri = "/js/back-end/elfinder-1.1/";
    
    		$this->view->headLink()->appendStylesheet("{$elfinder_base_uri}css/elfinder.css");
    		$this->view->headScript()->appendFile("{$elfinder_base_uri}js/elfinder.min.js");
    
    		$this->view->headScript()->captureStart() ?>
    			var opts = {
    				lang : 'ru',
    				styleWithCss : false,
    				width	: 800,
    				height  : 200,
    				toolbar : 'normal',
    				fmAllow  : true,
    				fmOpen   : function(callback) {
    					$('<div id="myelfinder" />').elfinder({
    					   	url : '<? echo $elfinder_base_uri?>connectors/php/connector.php',
    						lang : 'ru',
    						dialog : { width : 900, modal : true, title : 'Файлы' }, // открываем в диалоговом окне
    						closeOnEditorCallback : true, // закрываем после выбора файла
    						editorCallback : callback
    		            })
    	       		}
    	        };
           	<?php $this->view->headScript()->captureEnd();
       	}
    }
    
  6. В представлении IndexAction IndexController’a модуля admin (по умолчанию такие штуки располагаются в «/application/modules/admin/view/scripts/index/index.phtml») пишем следующее:
    
    <? echo $this->enableElRTE();?>
    <? echo $this->enableElFinder();?>
    
    <script type="text/javascript">
         $().ready(function() {
              // создаем редактор
              $('.rte_textarea').elrte(opts);
         });
    </script>
    <form method="get">
         <textarea name="content" id="content" class="rte_textarea" rows="5" cols="45"></textarea>
    </form>
    
  7. В основном шаблоне («/application/layouts/scripts/index.phtml») при этом должно быть что-то типа такого (стандартный код для шаблонов ZF):
    <?php echo $this->doctype() ?>
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    	<?php echo $this->headTitle() ?>
    	<?php echo $this->headMeta() ?>
    	<?php echo $this->headLink() ?>
    	<?php echo $this->headScript() ?>
    </head>
    <body>
             <?php echo $this->layout()->content ?>
    </body>
    </html>
    
  8. Удостоверяемся, что все работает как надо, пройдя по ссылке типа http://localhost/admin/index/index

Получим что-то типа такого

семейное фото ElRTE и ElFinder

семейное фото ElRTE и ElFinder

Как это работает

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

В каждом помощнике мы обращаемся к стандартным помощникам вида (HeadScript Helper для добавления js-файлов и js-кода и HeadStyle Helper для добавления файлов стиля) через глобальный объект Zend_View.

Ссылки в записи

Социальности

Progg it

Метки: , ,