Проблема з capifony

Якщо в вас виникла схожа трабла

cap deploy
/home/stfalcon/.rvm/gems/ruby-2.1.1/gems/capistrano-2.15.5/lib/capistrano/configuration/loading.rb:191:in `find_file_in_load_path': no such file to load --  (LoadError)
	from /home/stfalcon/.rvm/gems/ruby-2.1.1/gems/capistrano-2.15.5/lib/capistrano/configuration/loading.rb:179:in `load_from_file'
	from /home/stfalcon/.rvm/gems/ruby-2.1.1/gems/capistrano-2.15.5/lib/capistrano/configuration/loading.rb:89:in `load'
	from /home/stfalcon/.rvm/gems/ruby-2.1.1/gems/capistrano-2.15.5/lib/capistrano/configuration/loading.rb:86:in `block in load'
	from /home/stfalcon/.rvm/gems/ruby-2.1.1/gems/capistrano-2.15.5/lib/capistrano/configuration/loading.rb:86:in `each'
	from /home/stfalcon/.rvm/gems/ruby-2.1.1/gems/capistrano-2.15.5/lib/capistrano/configuration/loading.rb:86:in `load'
	from Capfile:3:in `load'
	from /home/stfalcon/.rvm/gems/ruby-2.1.1/gems/capistrano-2.15.5/lib/capistrano/configuration/loading.rb:93:in `instance_eval'
	from /home/stfalcon/.rvm/gems/ruby-2.1.1/gems/capistrano-2.15.5/lib/capistrano/configuration/loading.rb:93:in `load'
	from /home/stfalcon/.rvm/gems/ruby-2.1.1/gems/capistrano-2.15.5/lib/capistrano/configuration/loading.rb:180:in `load_from_file'
	from /home/stfalcon/.rvm/gems/ruby-2.1.1/gems/capistrano-2.15.5/lib/capistrano/configuration/loading.rb:89:in `load'
	from /home/stfalcon/.rvm/gems/ruby-2.1.1/gems/capistrano-2.15.5/lib/capistrano/configuration/loading.rb:86:in `block in load'
	from /home/stfalcon/.rvm/gems/ruby-2.1.1/gems/capistrano-2.15.5/lib/capistrano/configuration/loading.rb:86:in `each'
	from /home/stfalcon/.rvm/gems/ruby-2.1.1/gems/capistrano-2.15.5/lib/capistrano/configuration/loading.rb:86:in `load'
	from /home/stfalcon/.rvm/gems/ruby-2.1.1/gems/capistrano-2.15.5/lib/capistrano/cli/execute.rb:65:in `block in load_recipes'
	from /home/stfalcon/.rvm/gems/ruby-2.1.1/gems/capistrano-2.15.5/lib/capistrano/cli/execute.rb:65:in `each'
	from /home/stfalcon/.rvm/gems/ruby-2.1.1/gems/capistrano-2.15.5/lib/capistrano/cli/execute.rb:65:in `load_recipes'
	from /home/stfalcon/.rvm/gems/ruby-2.1.1/gems/capistrano-2.15.5/lib/capistrano/cli/execute.rb:31:in `execute!'
	from /home/stfalcon/.rvm/gems/ruby-2.1.1/gems/capistrano-2.15.5/lib/capistrano/cli/execute.rb:14:in `execute'
	from /home/stfalcon/.rvm/gems/ruby-2.1.1/gems/capistrano-2.15.5/bin/cap:4:in `'
	from /home/stfalcon/.rvm/gems/ruby-2.1.1/bin/cap:23:in `load'
	from /home/stfalcon/.rvm/gems/ruby-2.1.1/bin/cap:23:in `

‘ from /home/stfalcon/.rvm/gems/ruby-2.1.1/bin/ruby_executable_hooks:15:in `eval’ from /home/stfalcon/.rvm/gems/ruby-2.1.1/bin/ruby_executable_hooks:15:in `
Тоді вам треба перегенерувати Capfile

$ rm ./Capfile 
$ capifony .

PS. Тепер буду вести цей блог виключно українською або англійською.

Заметка по VichUploaderBundle

Долго мы мудохались (по другому не скажу) с парой-тройкой багов, которые полезли в результате использования VichUploaderBundle. И главное мы к ним возвращались по 2-3 раза на разных проектах за последние полгода :).

Symfony’s form component cleanup

Наименее костыльное решение предложили здесь. Чтобы постоянно не прописывать data_class в формах я добавил его в DefaultOptions для FileType и отправил PR в Symfony2. Чуть позже доделаем тесты и думаю PR примут.

The file is not updated if there are not other changes in the entity

Это хитрый баг, который возникает когда в форме меняется только файл. Словили его когда решили обновить логотип для спонсора на http://fwdays.com. Сегодня я выделил время на дебаг и понял, что нормальным путем проблему не решить. Смотрите сами:

...
 
// биндим данные на форму
// - запускаем дата трансформеры
// - дергаем сеттеры сущности (setFile и др.)
$form->bind($request);
 
// валидируем форму
// в $file должен быть объект загружаемого файла (UploadableField), чтобы пройти валидацию
if ($form->isValid()) {
    $em = $this->getDoctrine()->getManager();
 
    // готовим сущность к сохранению в БД
    // вычисляется хеш объекта и определяется его состояние (новый, обновленный и т.д.)
    // здесь дергается хук preUpdate (обновление) или prePersist (новая сущность) и файл физически перемещается в место назначения, но 
    // !! если нужно просто обновить файл, то проблема т.к. имя файла (которое хранится в БД) ещё не изменилось, а preUpdate запускается только если в сущности есть изменения !!
    $em->persist($entity);
 
    // сохранение данных
    $em->flush();
 
...

Получается, что нужно зааплоадить новый файл и засетить его имя в сущность до того как отправить сущность в persist() менеджера сущностей. Иначе Doctrine не видит изменений в сущности, не дергает хук preUpdate и аплоад средствами VichUploaderBundle не происходит :(.

Спасает костыль от автора бандла, который предлагает делать в сущности поле updatetAt и обновлять его если в сеттер файла приходит что-то новенькое:

public function setFile($file)
{
    $this->file = $file;
 
    if ($file instanceof UploadedFile) {
        $this->setUpdatedAt(new \DateTime());
    }
}

Как-то так 🙂

Debian & “Transport endpoint is not connected”

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

Если работа системы была завершена некорректно, то в системе остается файл блокировки mongodb “/var/lib/mongodb/mongod.lock”.

Логично, что для возобновления нормальной работы его нужно удалять и заново стартовать монгу.

sudo rm /var/lib/mongodb/mongod.lock; sudo service mongodb start

Шпаргалка по PEAR

Примерно раз в полгода я запускаю в консоли pear и лезу в хелп или гуглю нужные команды (хорошо если натыкаюсь на http://pear.php.net/manual/en/guide.users.commandline.commands.php или на http://pear.php.net/manual/en/guide.users.commandline.channels.php)

Итак. На примере обновления PHPUnit до версии 3.6.0RC4.

1. Просмотр списка каналов
$ pear list-channels

2. Просмотр всех доступных пакетов с определенного канала
$ pear list-all -c pear.phpunit.de

3. Обновить все пакеты
$ sudo pear upgrade-all

4. Разрешаем установку бета версий
$ sudo pear config-set preferred_state beta

5. Обновиться до определенной версии пакета
$ sudo pear upgrade phpunit/PHPUnit-3.6.0RC4

6. Посмотреть список установленных пакетов
$ pear list -a

Пока все 🙂

PS. Разгребаю черновики записей в блоге

Конференция для веб-разработчиков «ZFConf 2012»

21 апреля в Москве пройдет очередная ежегодная конференция для веб-разработчиков ZFConf 2012, посвященная популярной платформе Zend Framework.

В этом году с докладом выступит гость из Италии — Enrico Zimuel из Zend Framework Core Team. А также Виктор Фараздаги, Александр Веремьев, Алексей Качаев и многие другие специалисты.

На сайте опубликован полный список докладов и открыта регистрация.

Доклады

Zend Framework 2, a quick start Enrico Zimuel (Zend Technologies, Zend Framework Core Team)

Code Generation и Scaffolding в Zend Framework 2 Виктор Фараздаги (Simple Square, Senior Developer)

Реализация доступа к СУБД IBM DB2 посредством встраиваемого SQL Александр Веремьев (Zend Framework contributor)

Распределенные сетевые приложения c Zend Framework 2 и ZeroMQ Алексей Качаев (Сogniance, Senior Software Engineer)

Dependency Management в PHP и Zend Framework 2 Кирилл Чебунин (Creara, Senior PHP Developer)

Кеш без промахов средствами Zend Framework 2 Никита Грибалев (Nival, Lead PHP Developer)

Проектирование архитектуры, внедрение и организация процесса разработки на примере собственного проекта на основе ZF Антон Великанов (Sand Sign, Founder&CEO)

Capistrano для деплоймента PHP-приложений Роман Лапин (Evercode Lab, Senior Developer)

PS. И небольшое промо видео 🙂

Ubuntu, KnpConsoleAutocompleteBundle и php 5.3.10

Есть такой клёвый бандл KnpConsoleAutocompleteBundle от KnpLabs, суть которого заключается в автоподстановке команд для скрипта консоли Symfony2.

Т.е. набираешь “./app/console doc” жмешь [Tab] и получаешь “./console doctrine:”. Жмешь [Tab] ещё два раза и получаешь все варианты комманд:

$ ./app/console doctrine:
doctrine:cache:clear-metadata        doctrine:generate:form
doctrine:cache:clear-query           doctrine:mapping:convert
doctrine:cache:clear-result          doctrine:mapping:import
doctrine:database:create             doctrine:mapping:info
doctrine:database:drop               doctrine:query:dql
doctrine:ensure-production-settings  doctrine:query:sql
doctrine:generate:crud               doctrine:schema:create
doctrine:generate:entities           doctrine:schema:drop
doctrine:generate:entity             doctrine:schema:update

Вобщем удобно очень :).

Одна проблема — не работает под Ubuntu )). Есть даже тикет соотвествующий от Люиса Кордовы “does not work on ubuntu debian“. В тексте issue он дает ссылку на translate моей темы “проблема с ConsoleAutocompleteBundle” с форума zf.ru.

Так к чему я это пишу? Прошел почти год с того момента как я столкнулся с этой проблемой. Ну, думаю, должны были за это время все разрулить и баг пофиксить. Разворачиваю тестовое приложение, настраиваю, ставлю бандл, настраиваю, пробую автокомплит и разочаровываюсь — проблема осталась (((.

Показал ссылку на обсуждение бага Жене (наш админ) и он посоветовал мне установить php 5.3.10 с ppa. И вот когда я его поставил, то все заработало! Ура 🙂

PS. На всякий случаю запишу, что ставил я его вот так:

$ sudo add-apt-repository ppa:nginx/php5.3
$ sudo aptitude update
$ sudo aptitude upgrade --full-resolver

Несколько шпаргалок по Symfony2

Нашел на задворках своего HDD несколько шпаргалок по Symfony2. Лучше выложу их сюда, а то когда нужно, то фиг найдешь. Думаю, что они будут многим полезны.

Путь HTTP запроса в Symfony2 (jpg)


Автор Benjamin Dulau

Как работают формы в Symfony2 (pdf)


Автор Andréia Bohner

Увлекся разработкой игр на JS и HTML5 (сanvas)

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

Игра #1

Первой моей игрушкой сделал стала “Swell Foop” (была такая игра в пакете Gnome Games). Рабочая версия насчитывала около 200 строчек кода, потом добавил несколько плюшек и кода стало больше. Игра написана на чистом JS — т.е. без использования готовых библиотек или фреймворков.

Игра #2

Потом я начал делать свои танчики (Battle City). Изначально делал опять же на чистом JS, но потом распробовал библиотеку libcanvas и atom.js (от украинского программиста Павла Пономаренка) и переделал уже с использованием этих либ (просчет столкновений, спрайты, повороты и т.д.).

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

Вобще мне очень понравилось эта тема — позволяет отвлечься от PHP и попробовать что-то новое. Да и к геймдеву я никогда не был равнодушен :).

Symfony2. На чем можно сэкономить время при разработке?

Слайды моей презентации с Symfony Camp.

В целом кемп удался. Правда в прошлом году мне было намного интересней т.к. с symfony я ещё вобще не работал и объем новой информации был просто огромный. Именно тогда я впервые услышал такие слова как haml, less, twig, capistrano, hudson.. А сейчас мы используем в своей работе больше половины из этих вещей :).

На сегодняшнем кемпе мне больше всего понравился доклад Кирилла Чебунина (Чебы) “Symfony2 Service Container: Inject me, my friend” — я не копался в DI контейнере Symfony2 настолько глубоко и услышал новые для себя вещи.

На втором месте, пожалуй, был доклад Миши Бондарчука (Даверта) “TestGuy – эмулируем вашего тестировщика на PHP” — о этой разработке знаю довольно давно и очень хотелось посмотреть как же оно выглядит в реале.

Доклады Игоря Бровченка и Саши Демченка, тоже были довольно интересны людям, которые не работали с twig и redis. Мои ребята говорили, что им понравилось.

Вобщем ещё раз спасибо Игорю и Саше за организацию. Ждем следующий Symfony Camp ;).

ps. Кстати у нас (Frameworks Days) есть мысль провести весной 2012 “Symfony2 Framework Day”. Ивент сделать платным и пригласить на него несколько зарубежных докладчиков. Костя Кудряшов порекомендовал Ryan Weaver. Саша Демченко говорил, что Fabien Potencier готов был приехать на Symfony Camp, если бы ему оплатили расходы. Что вы об этом думаете? Думаю было бы круто.

#4й дайджест материалов по Symfony2

Как-то затянулся у меня 4й дайджест материалов. Уже и релиз Symfony2 состоялся, а я все никак не могу к добраться к публикации :).

Блоги посвященные Symfony2

Рекомендую подписаться на RSS лету блога — http://www.craftitonline.com/. Льюис контрибютит Symfony2 и часто выкладывает новые материалы.

Буквально вот только что наткнулся на интересный блог @qpleple, на котором есть серия хороших статей:

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

На блоге http://webb-on-the-web.com/ Роджер Вебб написал всего пару статей, но обе на тему Symfony2. Итак:

Отдельные материалы на тему Symfony2

Symfony2: Checking Coding Standards — о том как проверять стандарты кодирования Symfony2 используя PHP_CodeSniffer. Сразу описана интеграция в Phing и Jenkins (Hudson).
И тут же в комментариях Кирилл Чебунин поделился линком на инфу о том, как это можно прикрутить к NetBeans — Coding Standards in NetBeans IDE with PHP CodeSniffer.

Symfony2 and DoctrineExtensions — о том как подключать Timestable, Sluggable, etc. Все довольно просто подключается и относительно хорошо работает.

Adding non-entity fields to your Symfony2 forms — название опять же говорит само за себя. К примеру, это можно использовать для форм в которых есть поле апдлоада.

Behat turns 2! Have fun and test what — Behat2 стал ещё лучше :). Либа довольно интересная и в хозяйстве полезная. Сейчас уже доступна версия 2.1.2.

Установка и настройка функционального тестирования в Symfony2 с помощью Behat и Mink — заметка на Хабре после которой я решил все таки попробовать Behat на живом проекте.

Использование Zend GData в Symfony2-проекте
— ещё одна заметка на Хабре, но уже на другую тему. Я с Gdata пока не работал. Вы работали? Для каких задач?

Symfony2\SecurityBundle — перевод «Symfony2 Blog Application Tutorial Part V: Intro to Security». Стоит прочитать.

Все

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

Кстати на Symfony Camp идете? 29го октября я буду выступать там с докладом “Symfony2. На чем можно сэкономить время при разработке?“. Прошлогодний кемп мне очень понравился.