Google play games services, сценарии взаимодействия

Это справочная статья с последовательным описанием вызова методов и того, что происходит при взаимодестивии с Google play games services.

Начальные условия

  • Для разработки используется Android SDK;
  • При меры кода можно посмотреть на (GitHub)[https://github.com/playgameservices/android-basic-samples];
  • Надеюсь, что ссылки будут устаревать дольше, чем статья будет актуальной.

Сценарии

Пошаговая стратегия

Начать матч

  • Пользователь кликает на кнопку для начала матча;
  • Открывается активити для выбора оппонентов (есть реализация по умолчанию);
  • В нашу активити возвращается результат с идентификаторами пользователей, которые приглашены на матч, и/или количество слотов для авто выбора;
  • Наша активити создает матч и вызывает метод АПИ для создания матча Games.TurnBasedMultiplayer.createMatch, также задается callback, который обработает ответ;
  • Callback передает ход одному из игроков через АПИ, и назначает метод, который обработает ответ.

Ход матча

  1. Через АПИ вызывается метод Games.TurnBasedMultiplayer.takeTurn, который передает ход одному из игроков. Назначается Callback для обработки ответа;
  2. Callback проверяет статус матча и должен показать активити для выполнения хода пользователем, если это ход текущего пользователя;
  3. После того, как пользователь сделал все действия, он нажимет кнопку «Конец хода»;
  4. Выбирается следующий игрок и всё повторяется сначала

Матч окончен

  1. Когда матч окончен, вызывается метод Games.TurnBasedMultiplayer.finishMatch;
  2. Другим пользователям приходит информация, что матч окончен;
  3. У матча статус TurnBasedMatch.MATCH_STATUS_COMPLETE, в зависимости от этого, пользователю можно показать нужную информацию.

Текущие матчи

Игрок может играть несколько матчей одновременно, поэтому есть механизм присоединения к текущим матчам.
— Пользователь кликает на кнопку для показа текущих матчей;
— Вызывается startActivityForResult(Games.TurnBasedMultiplayer.getInboxIntent(mGoogleApiClient), RC_LOOK_AT_MATCHES) для показа текущих матчей;
— В onActivityResult получается текущий матч и выполняется его обработка.

Описания таблиц для старой БД в doctrine2

Задача

Создать описание (mapping) сущностей Symfony для таблиц старой базы данных.
или
Если вы когда-то пробовали воспользоваться командой
app/console doctrine:mapping:import AcmeBundle yml
и получали ошибку:

[Doctrine\ORM\Mapping\MappingException]
Table old_table has no primary key. Doctrine does not support reverse engineering from tables that don’t have a primary key.
то читайте дальше.

Решение

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

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

Находим файл vendor/doctrine/orm/lib/Doctrine/ORM/Mapping/Driver/DatabaseDriver.php' и меняем метод\Doctrine\ORM\Mapping\Driver\DatabaseDriver::reverseEngineerMappingFromDatabase’.

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

Кроме этого, нужно изменить метод getTablePrimaryKeys. Например, так:

Попробуйте выполнить команду. Если появится ошибка, то поищите другие места, где вызывается метод getPrimaryKey() и сделайте аналогично с методом выше. Конкретные изменения зависят от версии doctrine.

Также по теме

Importing tables from external database in Symfony2 with doctrine

Как закрыть доступ к файлам на уровне nginx с помощью secure_link

Задача

Закрыть неавторизованый доступ к файлам на сервере средствами nginx и php.

Решение

nginx поставляется вместе с модулем, который позволяет закрывать доступ к файлам на сервере путем генерации дополнительного хеша. Хеш может зависеть от разных параметров, таких как путь к файлу, IP клиента и дата истечения ссылки. В ссылках ниже есть информация о том, как собрать nginx с нужными модулями и подробное описание модуля secure_link.

В конфиг файл виртуального хоста в nginx нужно добавить:

, где secure_link описывает get параметры, которые участвуют в генерации хеша, а secure_link_md5 описывает, как этот хеш формируется.

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

Например, как это может выглядеть как twig extension для symfony:

Также по теме

Php CodeSniffer в PhpStorm + fixer

Задача

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

Если вы все еще продолжаете читать, то очень скоро вы узнаете, как можно настроить некоторые фичи в PhpStorm, чтобы соблюдение стандартов стало легче легкого.

Решение

PHP CodeSniffer plugin в PhpStorm

CodeSniffer будет показывать вам, где выбранный вами стандарт не соблюдается.

Чтобы включить проверку с помощью CodeSniffer в настройках Inspections, действуем так:

  • Settings -> блок Project Settings -> Inspections
  • В дереве с типами проверок выбираем PHP -> Code Sniffer validation
  • Обновляем доступные стандарты с помощью кнопки обновления
  • В настроках задаём Coding Standard — PSR0 (или другой)

PHP Coding Standards fixer в PhpStorm

php-cs-fixer исправит большинство ошибок при использовании стандарта.

Включаем его так:

  1. Устанавливаем php-cs-fixer глобально любым удобным способом/
  2. Добавляем php-cs-fixer как внешняя утилита (external tool) в PhpStorm: Settings > External Tools и настраиваем новую утилиту
    Настройка php-cs-fixer в PhpStorm

Пример настроек:

Также по теме

Doctrine auto_mapping для нескольких Entity Manager

Предыстория

Уже несколько лет существует issue в доктрине, что хочется иметь возможность делать auto_mapping при наличии нескольких entity_manager’ов. Был создан pull request, который решает эту проблему. Его приняли относительно недавно и в symfony 2.6 это можно делать по умолчанию.

К сожалению, не все могут легко обновиться до symfony 2.6. В моем случае я привязан к symfony 2.3. Но было нужно сделать два менеджера, при этом количество бандлов достаточно большое, и оно (количество) увеличивается. Хотелось бы иметь возможность не добавлять их каждый раз в конфиг.

Задача

Допустим, есть несколько бандлов:

  • FirstBundle
  • SecondBundle
  • TenthBundle
  • JustAnotherBundle

Все бандлы, кроме JustAnotherBundle должны мапиться через entity_manager по умолчанию.

Решение

Пример app/config.yml

В …Extension.php любого бандла нужно добавить:

После этого все бандлы, которые не были явно добавлены в entity manager, будут добавлены в маппинг entity manager’a по умолчанию.

Также по теме

A way to enable auto_mapping with multipe Entity Manager
Added a way to enable auto_mapping option using multipe entity managers

Использование Git и GitHub c Subversion (SVN) как зеркало при разработке плагина для WordPress

Использование Git и GitHub c Subversion (SVN) как зеркало при разработке плагина для WordPress

Начнем

Предположим, что ваш плагин уже расположен в официальном WordPress Subversion репозитории, мы будем использовать Easy Digital Downloads плагин для примера.

  1. Для начала нам нужен номер ревизии первого коммита в репозитории WordPress Subversion, иначе git попытается пройти через 100500 коммитов, чтобы найти его.

    Это последний коммит, который вы увидите на экране.

    В нашем случе это r529177. Также вы можете использовать официальный WordPress Trac браузер чтобы определить номер последней ревизии.

  2. Теперь создайте локальный репозиторий Git и импортируйте первый коммить из SVN репозитория:

    это вернет следующее:

    Обратите внимание на флаг --no-minimize-url, который нужне, чтобы остановить git svn clone от перемещения из базовой директории удаленного SVN репозитория и проходить через все плагины (смотреть здесь git-svn docs). Мы также используем флаг -s, который устанавливает trunk, тэги и ветки как относительнце пути, что является поведением по умолчанию для Subversion (смотреть здесь git-svn docs).

  3. Теперь переходим в только что созданный Git репозиторий:

    и получаем остальные коммиты из SVN репозитория:

    Этот шаг займет длительное время (hours (!)), поэтому вы можете использовать GIT_TRACE переменную окружения перед командой, чтобы видеть допольнительную информацию:

    Для ускорения git svn fetch, особенно с большими SVN репозиториями, вы можете попробовать установить параметр --log-window-size, чтобы запрашивать больше коммитов за один SVN запрос (смотреть здесь Experiences of Using Git-Svn on a Large Project). Увеличение параметра до 10000 должно значительн уменьшить время получения коммитов:

    Когда процесс завершен, у вас будет полное дерево коммитов проекта в Git. Последний шаг — это перемешение SVN HEAD (файлы из SVN /trunk) в master ветку нашего Git, что можно сделать следующей командой:

    Теперь вы можете видеть все последние файлы вашего плагина в локальном репозитории.

    Список файлов плагина

Просмотр нового репозитория

Давайте посмотрим на все ветки, которые мы создали:

Который вернет список веток и тэгов:

В .git/config нашего Git репозитория:

мы видим, что Git автоматически выбрал trunk как цель для git svn dcommit, который пушит все ваши изменения в Git обратно в WordPress SVN репозиторий.

Добавляем удаленный Git репозиторий

Давайте создадим новый GitHub репозиторий, который мы будем использовать как основной при разработке плагина:

Новый репозиторий создан в GitHub

Когда вы создали репозиторий, просто добавьте его как remote origin вашему локальному Git репозиторию:

И запушьте все изменения из локального репозитория в GitHub:

Теперь ваш GitHub репозиторий должен содержать все файлы вашего плагина вместе с историей ревизий, которую вы импортировали из Subversion репозитория.

WordPress плагин, история ревизий на GitHub

Работа над плагином

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

Когда изменения сделаны, мы можем проверить статус изменений в локальном Git репозитории:

Сделаем коммит с изменениями в наш локальный репозиторий:

Пушим изменения в GitHub

Чтобы опубликовать изменения на GitHub, мы используем

Пушим измененив в WordPress Subversion репозиторий

Когда вы переключились на использование Git в качестве системы контроля версий, вы всегда должны использовать git svn dcommit для публикации изменений в SVN репозиторий. Иначе вы должны запускать

каждый раз до того, как будете пушить изменения в SVN, чтобы объединить (merge) изменения из SVN репозитория в ваш локальный Git репозиторий.

Если вы не используете trunk как ветку с релизами вашего плагина, вы можете спокойно пушить все ваши Git изменения в ваш WordPress репозиторий не волнуясь, что пользователи получат уведомление об обновлении:

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

Установка тэгов на релизы

Установка тэга на релиз в Git очень проста:

Также как и установка тэга в SVN:

Это создаст /tags/1.0.2 в удаленном SVN репозитории и скопирует все фалц из удаленного /trunk в тэг, поэтому убедитесь, что все последние изменения запушены в /trunk до создания SVN tag.

Обновление ассетов плагина

Папка с ассетами в WordPress SVN репозитории может быть использована для хранения баннеров и скриншотов. Убедитесь, что папка /assets существует и вашем SVN репозитории до того, как попытаетесь получить ее. Откройте эту ссылку в браузере:

где easy-digital-downloads это путь к вашему плагину, и вы увидите корневую папку вашего репозитория SVN:

Обратите внимание, что папка /assets существует.

Проверим, что папка отслеживается, как отдельная ветка assets в Git. Каждый раз, когда вы хотите обновить баннеры или скриншоты, вы просто получаете ветку, делаете изменения и публикуете ее в SVN, используя ту же команду git svn dcommit.

Добавьте новый SVN remote, который называется assets:

и установите связь ветки assets с удаленным SVN репозиторием:

Это добавит следующие строки к нашему .git/config:

что означает, что мы можем получить assets из текущей HEAD:

и переключиться на него используя:

Давайте создадим ветку, которая называется assets для следования удаленной:

Теперь вы можете изменять ассеты плагина, коммитит изменения и публиковать их в SVN, используя:

Рекомендуется прочитать

  • http://teleogistic.net/2011/05/revisiting-git-github-and-the-wordpress-org-plugin-repository/
  • http://eamann.com/tech/how-to-publish-a-wordpress-plugin-git/
  • http://ben.lobaugh.net/blog/90633/creating-a-synchronized-github-fork-of-a-wordpress-org-subversion-plugin-repository
  • http://en.hetarena.com/archives/232

Автор: Kaspars Dambis
kaspars.net / @konstruktors

Update: На данный момент автор использует другое решение, для достижения тех же целей набор bash скриптов вместо испоinstead of poluting the Git repository with git svn.

Ubuntu, Nano, ошибка /home/username/.nano_history: permission denied

Способ решения 1 — временный:

Вернет вам права на файл. Однако, при повторной потере прав, нужно будет выполнить еще раз.


Способ решения 2 — постоянный:
Нужно отредактировать конфигурацию nano в файле /etc/nanorc и удалить /home//.nano_history файл.

Сначала закомментируйте установку параметра historylog в nanorc. Можно использовать тот же nano для этого:



Это отключит ~/.nano_history, который используется для сохранения истории поиска /replace.

Не забудьте удалить .nano_history в вашей пользовательской директории:


Способ решения 3 — правильный:

Для редактирования файлов под sudo использовать не sudo nano /some_file, а:

ERROR 1018 (HY000): Can’t read dir of ‘.’ (errno: 24)

Встретился с такой ошибкой MySQL:

После поиска некоторых решений в google было определено, что эта ошибка значит «Слишком много открытых файлов».
Чтобы узнать, как много файлов открыл пользователь, выполните эту команду:

Отредактируйте файл /etc/security/limits.conf и добавьте к нему две следующие строки снизу:

#@user — maxlogins 4
mysql soft nofile 4096
mysql hard nofile 8192
# End of file

Возможно, вам понадобится перезагрузиться после этого изменения.

После того, как эти изменения сделаны, нужно кое-что поправить в mysql. Предположим, ваша конфигурация mysql хранится в /etc/mysql/my.cnf — отредактируйте или добавьте эти значения:

Про опцию table_cache можно подробнее узнать здесь. Значение по умолчанию 64, поэтому 512 должно быть достаточно, чтобы начать.

Вольный перевод этого поста.
Лично мне хватило изменений в my.cnf без перезагрузок.

WordPress plugin Favicon Links

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

Как результат, родился Favicon Links plugin.

Работает он очень просто:
— находит все ссылки в посте;
— выкидывает ссылки, в которых уже есть картинки (чтобы не портить верстку);
— добавляет ссылке картинку favicon через Google S2 Favicon service.

На данный момент я отправил плагин на рассмотрение в WordPress. Если нет желания ждать, то просто скачивайте с github.

Sonata Admin экспорт в pdf

По долгу службы по долгу работаю с sonata admin, дорабатываю некоторые функции, которые есть в базовой поставке sonata admin. В частности это экспорт. А конкретнее — экспорт в PDF.

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

За основу реализации взят подход описаный здесь. Сама реализация выполнена в виде двух трейтов, поэтому обновляйтесь до php 5.4, если вы еще этого не сделали.