Профессиональная разработка интернет приложений

Программирование на Java, PHP, Flash…

Flex. Должен ли ItemRenderer знать тип модели?

Начать нужно с того, нравится ли вам разрабатывать на строго типизированном языке программирования или на не типизированном. В последнем случае, вам не имеет смысла читать статью дальше. Если вам, как и мне, по душе строгая типизация, давайте поразмышляем…

Как известно, для отображения данных, в ItemRenderer присутствует переменная data. Проблема заключается в том, что тип этой переменной – Object. И это не приемлимо, если все модели в проекте типизированны.

Я считаю, что переменная data, в ItemRenderer должна иметь тип обрабатываемого объекта. Это позволит избежать досадных ошибок при рефакторинге – о них вы узнаете еще до запуска программы, на этапе компиляции. А это, как вы понимаете, не малого стоит.

Поэтому я предлагаю во всех ItemRender-ах использовать типизированные переменные отображаемых данных. Например, я поступаю так:

<fx:Declarations>
  <my:MyClass id="myVar">
    {data}
  </my:MyClass>
</fx:Declarations>

Profiler во Flash Builder. Проблема запуска

Разрабатывая программы, я люблю пользоваться профайлером. Очень уж мне хочется, чтобы мои творения работали быстро и приносили максимальное удовольствие пользователям. Разработка на Flex – не исключение.

Однако, меняя рабочие места, очень часто я сталкивался с проблемой, что на некоторых машинах профайлер отказывается запускаться. Долгое время мне не удавалось вычислить причину данной проблемы. Вроде бы и дистрибутив один и тот же устанавливается, система такая же – а не работает.

И вот, свершилось! Когда в очередной раз профайлер не запустился, я заметил, что workspaсe создал в папке, путь к которой содержит пробел. А не из-за него ли это, подумал я. Оказалось, что я попал в точку. Вот и решение – в пути к рабочему пространству проекта не должно быть пробелов!

Список докладов и финальная регистрация ZFConf 2011 — второй российской конференции по Zend Framework

Основные подготовительные работы по конференции закончены. Доклады сформированы. Среди спикеров представители KnpLabs, Magento, JetBrains, Sphinx и других известных компаний.

Открыта финальная регистрация!

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

Пожалуйста, обратите внимание на то, что изменилось место проведения! Мероприятие будет проходить на прошлогодней площадке — в актовом зале ЛГТЦ (Ленгипротранс-Центр), по адресу: Московский пр., 143, ст. м. «Электросила». Кофе-брейки и обсуждения на флипчартах будут проходить в фойе.

Cписок докладов:

Гибкая архитектура Zend Framework приложений с использованием Dependency Injection
Алексей Качаев (Сogniance, Senior PHP Developer)

Воюем за ресурсы: Повышение производительности Zend Framework приложения с помощью phpDaemon, Varnish и ESI
Алексей Качаев (Сogniance, Senior PHP Developer)

Behavior Driven Development в PHP и Zend Framework
Константин Кудряшов (KnpLabs, Senior Web Developer)

Разделение труда: Организация многозадачной, распределенной системы в Zend Framework с помощью Job Queue
Александр Готгельф (Magento, PHP-разработчик)

Как может помочь среда разработки при написании приложения на Zend Framework?
Николай Матвеев (JetBrains, разработчик)

Создание REST-API для сторонних разработчиков и мобильных устройств с авторизацией по протоколу OAuth 1.0
Дмитрий Чижевский (Дзен-мани, разработчик)

Толстая модель: История разработки собственного ORM
Михаил Шамин (Геометрия, ведущий разработчик)

Что такое Sphinx, зачем он вообще нужен и как его использовать с PHP (от простого индекса до поискового кластера)
Владимир Федорков (Sphinx, Director of Professional Services)

Стоимость участия в мероприятии составит 1500 руб. В данную сумму входит: участие в самой конференции, кофе-брейки (от внешней кейтеринг-компании), пакет материалов участника и доступ к профессиональным видеозаписям докладов (после мероприятия). Доступно множество способов оплаты.

Торопитесь, количество мест ограничено!

Обязательно следите за последними новостями:
RSS-канал: feeds.feedburner.com/zfconf
Twitter: @zfconf
Группа ВКонтакте: vkontakte.ru/club14951507

Организатор: компания Wizartech
Партнеры: сообщество zendframework.ru и конференция ZFConf Ukraine

Установка BlaseDS

Для работы BlaseDS, на вашем компьютере должна быть установлена среда выполнения Java. Скачать ее можно тут: http://www.oracle.com/technetwork/java/javase/downloads/index.html. После ее установки, можно приступать к экспериментам с BlaseDS.

Для начала скачаем последнюю версию сервера BlaseDS. Сделать это можно на странице http://opensource.adobe.com/wiki/display/blazeds/Downloads . Для загрузки потребуется регистрация. На странице загрузки вам будет предложено 3 варианта дистрибутива:

  • Turnkey – сервер, полностью готовый к работе. Для начала скачаем именно его
  • Binary distribution – war архив для установки в сервер приложений
  • Source – исходные коды сервера

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

После запуска базы данных можно запустить tomcat. Для этого перейдите в папку tomcat\bin и запустите скрипт strartup. После старта сервера, перейдите в браузере на адрес http://localhost:8400/ , и вы увидите главную страницу BlaseDS

С этой страницы вы можете перейти в панель управления сервером или на страницу с ознакомительными приложениями. Все они уже готовы к работе.

PHP и FileReference во Flex

В любом RIA приложении необходима авторизация. Благо сделать ее не составляет труда. Чаще всего авторизация проводится на серверной части и ее результаты записываются в параметры сессии. Это позволяет запрашивать данные авторизации пользователя только один раз, за весь сеанс его работы с приложением.

В связке Flex и PHP такая схема работает без проблем. Все запросы к серверной части можно защитить проверкой данных авторизации в сессии PHP. Но если вы попробуете проверить авторизацию в обработчике POST запроса загрузки файла из FileReference, у вас ничего не выйдет. Сессия в обработчике этого запроса будет пустая.

Сессия PHP связывается с сессией браузера посредством идентификатора, хранящегося в cookie браузера. Проблема же заключается в том, что при запросе через FileReference cookie не передаются. В результате PHP открывает новую сессию.

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

public function browse():void
{
	fileReference = new FileReference();
	fileReference.addEventListener(Event.SELECT, onDocumentSelected);
	fileReference.browse();
}

private function onDocumentSelected(event:Event):void
{
	getSession();
}

private function sessionRecieved(sessionId:String):void
{
	var url:String = "http://example.com?PHPSESSID=" + sessionId;
	var urlRequest:URLRequest = new URLRequest(url);
	fileReference.upload(urlRequest);
}

В примере, в обработчике выбора документа вызывается метод getSession(), запрашивающий у PHP части идентификатор сессии. Когда этот идентификатор получен, вызывается метод sessionRecieved, помещающий идентификаторы сессии в строку запроса и инициирующий загрузку файла. Идентификатор сессии помещается в параметр PHPSESSID.

Так же идентификатор PHP cессии можно запросить через JavaScript. Но мне этот вариант не нравится.

public function execute():void
{
fileReference = new FileReference();
fileReference.addEventListener(Event.SELECT, onDocumentSelected);
fileReference.addEventListener(Event.OPEN, openHandler);
fileReference.addEventListener(IOErrorEvent.IO_ERROR, ioErrorUpload);
fileReference.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityError);
fileReference.addEventListener(Event.CANCEL, cancelUpload);
fileReference.addEventListener(DataEvent.UPLOAD_COMPLETE_DATA, uploadCopmpleteDataHandler);
fileReference.browse([FileUpload.DOCUMENTS_FILTER, FileUpload.IMAGES_FILTER]);
}

private function uploadCopmpleteDataHandler( event:DataEvent ) :void {
logger.debug(«responseHandler::event.data = » +(event.data as String));
var data:Object = JSON.decode(event.data as String);
if (data.result != «ok»){
model.sharedFiles.state = SharedFiles.UNPENDING_STATE;
AlertDefault.show(ResourceManager.getInstance().getString(‘ui_res’, ‘file_uppload_fail’), ResourceManager.getInstance().getString(‘ui_res’, ‘ufc_alrt_00′));
}else{
new UploadFileCheckFileConvCom().execute();
}
}

private function onDocumentSelected(event:Event):void
{
if((event.currentTarget as FileReference).size > 15728640){
//check that file size < 15728640
AlertDefault.show(ResourceManager.getInstance().getString(‘ui_res’, ‘upload_file_size_limit_message’));
}
else{
if(model.guiState.isAllowedLoadDocuments || model.conference.iam.privileges.hasBroadcast){
model.sharedFiles.state = SharedFiles.PENDING_STATE;
new GetSession(sessionRecieved, getSessionError).call();
}else{
AlertDefault.show(ResourceManager.getInstance().getString(‘ui_res’, ‘deny_upload_document_message’));
}
}
}

private function getSessionError():void{
model.sharedFiles.state = SharedFiles.UNPENDING_STATE;
}

private function sessionRecieved(sessionId:String):void
{
var url:String = ConferenceManagerModel.httpBaseUrl + «?act=upload»;

url += («&conf_url=» + model.conference.urlConf);
url +=  (!(ConferenceManagerModel.isOwner || ConferenceManagerModel.isRegistered) ? «&author_reg=0″ : «&author_reg=1″);
url += «&author=» + (!(ConferenceManagerModel.isOwner || ConferenceManagerModel.isRegistered) ? model.conference.iam.name : ConferenceManagerModel.uid) ;
url += «&PHPSESSID=» + sessionId;
logger.info(«Attempt of upploading file to url: » + url);
var urlRequest:URLRequest = new URLRequest(url);
fileReference.upload(urlRequest);
}

Что такое BlazeDS

Разрабатывая RIA приложение на Flex, для обработки данных необходимо использовать http сервер. Для этих целей подойдет и обычный сервер Apache, с установленным на него PHP. Общение серверной и клиентской части будет происходить посредством HTTP запросов, в которых будут передаваться данные в формате XML или JSON.

У технологии Flash есть родной формат передачи данных – AMF3. Описанную выше конфигурацию можно доработать для поддержки этого формата, установив на Apache библиотеку AMFPHP.

Проблема заключается в том, что для небольших приложений языка PHP вполне хватает. Но если планируется создать крупную систему, нужно подумать о переходе на более пригодный для нее язык – например Java. Кроме того, для осуществления взаимодействия программ на этом языке с Flex клиентами есть замечательный сервер – BlazeDS.

BlazeDS – это веб приложение, запускаемое в контейнере сервлетов или сервере приложений Java. BlazeDS представляет собой набор сервисов, управление которыми осуществляется посредством JMX агентов.  Его возможности:

  • Выполняет удаленные Java методы по запросу Flex приложения
  • Транслирует Java объекты в объекты AS3 при возвращении результата выполнения удаленного Java метода
  • Транслирует AS3 объекты в объекты Java при вызове уделенного Java метода из Flex приложения
  • Обслуживает соединения между Flex приложением и Java приложением
  • Доставляет данные на клиент без запроса

В скором времени на блоге появятся статьи, подробно описывающие создание RIA приложений с использованием BlazeDS.

Недостаток конструкции WITH

Вот что написано про конструкцию «with» в документации по ActionScript:

Establishes a default object to be used for the execution of a statement or statements, potentially reducing the amount of code that needs to be written.

То есть конструкция «with» должна обеспечивать уменьшение объема кода. Но кроме красивого кода, приложение должно отличаться еще и надежностью. А как раз с этой точки зрения данная конструкция показывает себя с негативной стороны. Дело в том, что компилятор Flex не может обнаружить отсутствующие переменные в объекте, переданном в «with».

Например, если у нас есть класс Foo, а мы с помощью «with» попробуем вызвать несуществующий метод «bar» объекта этого класса, компилятор будет молчать:

var foo:Foo = new Foo();
with (foo)
{
    bar();
}
Establishes a default object to be used for the execution of a statement or statements, potentially reducing the amount of code that needs to be written.

Flex 4. При наведении мерцают кнопки

Разрабатывая на Flex 4 видеоплеер, элементы управления которого скрываются, когда мышь выходит за его пределы и появляются, когда мышь оказывается над ним, я использовал события объекта класса Application mouseOut и mouseOver. В обработчике первого события устанавливался флаг, что мышь за пределами приложения, в обработчике второго, данный флаг переводился в значение, сигнализирующее наличие указателя мыши над приложением. Свойство visible, всех элементов управления было привязано к этому флагу.

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

Решением данной проблемы является использование событий rollOver и rollOut, вместо mouseOver и mouseOut. В подробности я не вдавался, т.к. и без этого потратил достаточно времени на решение такой простой и в то же время очевидной проблемы.

ZFconf Ukraine

image27го ноября в в Киеве пройдет бесплатная, международная, совместная конференция ZFConf UkraineMageConf. Цель конференции – объединить лучших специалистов PHP и Zend Framework Украины, России и других стран СНГ.

ZFConf Ukraine – первая в Украине конференция по Zend Framework, проводится в партнерстве с ZFConf Russia и сообществом zendframework.ru. ZFConf Russia была первой конференцией по Zend Framework и прошла в марте этого года в Санкт-Петербурге, Россия, собрав более 200 участников из России, Беларуси, Украины, Литвы и других стран СНГ

Конференция MageConf впервые прошла в мае 2010 года в Киеве. Это была первая конференция из серии PHP and Zend Framework в Украине. Ее посетили более 150 специалистов.

Конференция пройдет 27 ноября, в Киеве
Титульный спонсор конференции – компания Magento
Место: КиевЭкспоПлаза, ул. Салютная 2б, 3 павильон
Время: 27 ноября 2010 г. (с 11:00 до 19:00)
Длительность: 1 полный день
Формат: доклады в три потока и обсуждения на флипчарте (в перерывах)
Язык докладов: русский
Стоимость участия: бесплатно
Потоки: Zend Framework, PHP, Magento.

Аудитория: Разработчики ПО и специалисты по Project Management с Украины, России и близлежащих стран СНГ. Ожидаемое количество участников – 500 человек.

Доклады

1. Встречайте Zend Framework 2.0
Александр Веремьев / Zend Framework Core команда (Zend Technologies)

2. Эволюция ZF: архитектура, шаблоны, рефакторинг
Виктор Фараздаги / Component Maintainer и Contributor ZF 2.0 (4C)

3. Юнит тестирование в Zend Framework 2.0
Ростислав Михайлив / Chief Developer / Software Architect (Gadu-Gadu)

4. Хранение, обработка и отдача статики с использованием \Zend \File. Опыт социальной сети starlook.ru
Кирилл Мокевнин / Senior developer (undev)

5. Чуть сложнее чем Singleton: аннотации, IOC, АОП
Кирилл Чебунин / Senior PHP Developer (Альпари)

6. Doctrine 2
Валерий Рабиевский / Team leader (stfalcon.com)

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

Регистрация
Регистрируясь на одну конференцию, вы автоматически получаете доступ и на другую.

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

Регистрируйтесь и следите за обновлениями на http://zfconf.org.ua

Парное программирование. Подходы.

Думаю большинство разработчиков программного обеспечения согласится со мной, что парное программирование намного эффективнее программирования в одиночку. Но исследование литературы по методологиям разработки программного обеспечения привело меня к выводу, что понятие парного программирования немного неоднозначное. В литературе выделяют как минимум 2 подхода:

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

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

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

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