Конспект з конференції ЛОБ 2019 (перший день)

Відвідализ Ігорем на вихідних конференцію ЛОБ 2019. Пошкодував, що не взяли з собою маркетологів, бо контент більшою частиною був про маркетинг. Тому оцифровую конспект, щоб зашарити його одразу усім. Continue reading

Проблема з 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. Тепер буду вести цей блог виключно українською або англійською.

Программисты не любят KISS?

Картинку взял из статьи “Будьте проще (и к вам потянутся люди)“. Статью можно почитать.

Вот один из свежих примеров

На одном из проектов сделали доску объявлений и там есть фича “Пожаловаться на объявление” (вдруг в тексте что-то противозаконное и т.д.). Фича работает через ajax — т.е. нажав на ссылку “Пожаловаться” пользователь видит всплывашку аля “Спасибо! Мы рассмотрим вашу жалобу.”.

Continue reading

Заметка по 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. Разгребаю черновики записей в блоге

Простые правила сильного текста

Беседовали о том, какие у нас херовые плохие тексты в портфолио. И Олег скинул ссылку на вот это видео:

Меня зацепило и решил попробовал изменить описания категорий.

Вот такое было описание для категории “Веб-разработка”:

Специализируемся на разработке больших и средних сайтов/порталов с нестандартным функционалом. Умеем справляться с большими нагрузками и с радостью беремся за решение сложных задач. В работе используем PHP (Symfony2, Zend Framework, Doctrine2), JavaScript (jQuery, YUI, MooTools), SQL (MySQL, PgSQL), HTML5, багтрекер Redmine и системы контроля версий (SVN, Git).

А вот такое стало:

Делаем стартапы. Справляемся с большими нагрузками и решаем сложные задачи. Используем современные инструменты и практики разработки.

Что скажете?

UPD. Для “Дизайн сайтов” тоже текст укоротили.

Было:

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

Стало:

Создаем удобный и функциональный дизайн

Конференция для веб-разработчиков «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