Zend Framework → Zend_Service_Twitter, небольшие изменения
Месяц назад обновил версию Zend Framework до 1.12.3 в движке этого блога, потестировал изменения локально, ничего страшного не обнаружил, залил на хостинг. Белый экран. Спустя пару минут вспомнил, что в девелоперском и тестовом окружениях у меня отключены последние сообщения из твиттера. А так же и то, что в последнем (первом) зенде были внесены изменения в Zend_Service_Twitter в связи с обновлением API до версии 1.1
Заметка, в принципе, и не стоит того, чтобы её писать, но по поисковым запросам вижу, что люди ищут, так что поделюсь решением, позволившим починить извлечение последних записей twitter-а.
PHP → Установка ImageMagick
Так уж вышло, что понадобилось для для одного проекта такое расширение, как ImageMagick. Ну а раз понадобилось, то надо устанавливать.
На рабочем макинтоше всяческие апачи и пэхэпэшки проинсталлированы у меня через MacPorts, потому и установка разрешилась поиском по интернету и парой команд, что ниже
1 2 | sudo port install ImageMagick
sudo port install php5-imagick
|
Минут 45 ожидания (и наблюдения за компьютерной жизнью в консоли) и готово. Так долго вышло потому, что порты давно не обновлялись, а с установкой расширения попутно пересобралось всё, что только можно.
Тестирование → Автоматизированное тестирование
Это вторая запись из серии, посвящённой тестам, первая находится тут. В ней будет описан процесс установки и настройки функционального тестирования в Symfony2 с использованием Behat и Mink
Для начала, наверное, стоит рассказать о том, что такое эти Behat и Mink, и с чем их едят. Первое - это библиотека, которая интерпретирует человеко-понятные сценарии и, собственно, выполняет их в виде тестов. Второе - это абстрактная библиотека эмулятора браузера, которая содержит множество готовых определений, используемых Behat-ом при разборе тестовых сценариев, характерных именно для общих задач браузера. Помимо этих специфических определений, Mink предоставляет объектно-ориентированных интерфейс, позволяющий общаться с браузером. Сложно, конечно, описать это в двух словах, нужно самому посмотреть и пощупать :)
Сперва создадим пустой проект или же будем считать, что он уже существует. Я не стал особо заморачивать себе голову и скачал с офсайта Symfony Standard 2.1.7 without vendors. Установкой всех необходимых библиотек будет заниматься composer, а запускается сей процесс (установки) буквально одним взмахом левой пятки.
1 | php composer.phar install
|
Ну а теперь займёмся настройкой проекта для тестирования. В первую очередь подправим файл composer.json, добавив в него следующие штуки:
Тестирование → Установка Sahi
Думаю написать пару записей про автоматическое тестирование в веб-разработке. Не потому, что информации по этой теме не хватает, а для того, чтобы у меня это было всегда под рукой :) Сразу всё в одной заметке не опишешь, конечно, так что буду по частям. Сегодняшняя часть будет про Sahi.
Если в двух словах, то это некий драйвер, который будет самостоятельно кликать по кнопкам и ссылкам, заполнять поля форм и выполнять прочие операции на сайте. Самостоятельно - это немного не то слово, будет происходить именно то и только то, что описано в тестовом сценарии. В отличии от других (но не всех, конечно) "эмуляторов" браузеров, Sahi умеет работать с динамическими веб-приложениями, т.е. AJAX и прочий javascript ему по зубам. Ладно, закончим с лирическим вступлением...
Идём на официальный сайт, перемещаемся в раздел с Open Source версией и кликаем на загрузку. Скачиваем. Скачается, скорее всего, jar-файл, но бояться его не стоит, всё отлично запустится и установится, если, конечно, Java JDK (или JRE) уже установлен.
Apache → как запаролить определённый URL средствами Apache
Иногда возникает такая ситуация, когда нужно запаролить опредённый URL средствами веб-сервера (Apache в данном случае). Выяснять почему и зачем не будем, так как надо всё-таки решать поставленную задачу.
Воспользуемся базовой аутентификацией. В отличии от закрытия директории или файла, воспользоваться файлом .htaccess не получится, т.к. необходимая директива в нём не разрешена, но это можно сделать в настройках сервера или виртуального хоста. Выглядеть это будет следующим образом
1 2 3 4 5 6 | <Location "/category/zhelezo">
AuthType Basic
AuthName "Only for administrator"
AuthUserFile "/path/to/.htpasswd"
require valid-user
</Location>
|
Видно, что закрывается URL http://example.org/category/zhelezo. Путь к файлу .htpasswd должен быть абсолютным, иначе работать не будет (проверял). Упоминать даже не буду, что этот файл не должен быть доступен через веб :)
PHP → Локальные проблемы PHP
Подключился на днях к новому проекту на Symfony 2 и начались проблемы :) Проблемы не с симфонией, конечно, а с php, точнее, с его настройками. Скачал проект, установил внешние библиотеки и буквально с первой команды наблюдаю такую красоту в терминале.
Apache → Передача GET-параметров при переадресации
Допустим, что два или более сайта обслуживаются одним веб-приложением, но различать их всё же надо. Предположим, что разделение это происходит в файле .htaccess, путём определения параметра city.
1 2 3 4 5 6 7 8 9 | RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{HTTP_HOST} ^pupersite\.kh\.ua$ [NC]
RewriteRule ^(.*)$ index.php?city=kharkov [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{HTTP_HOST} ^pupersite\.zp\.ua$ [NC]
RewriteRule ^(.*)$ index.php?city=zaporozhye [L]
|
Проблема здесь в том, что происходит замена GET-параметров в строке запроса, т.е. по ссылке вида pupersite.zp.ua/?param1=1¶m2=3 приложение параметров param1 и param2 не получит.
Zend Framework → Zend_Service_Twitter, последние записи twitter
Внимание, данная запись устарела. Описанное работоспособно для ZF 1.12.2 (и ниже) и twitter API 1.0, более актуальная запись находится тут → Zend_Service_Twitter, небольшие изменения
Обещался почти месяц назад описать внутренности кода, вытягивающего последние записи из твиттера, так что теперь придётся. Или забью и забуду.
Сложного ничего нет. Необходима лишь документация и гугл. Кроме того, нужно зарегистрировать своё веб-приложение на dev.twitter.com для того, чтобы получить consumer key и consumer secret. Там же вами для приложения будет указан callbackURL, который примет токен для авторизации.
Параметры для аутентификации поместим в application.ini
1 2 3 4 | twitter.callbackUrl = "http://yourhost.com/twitter/callback"
twitter.siteUrl = "http://twitter.com/oauth"
twitter.consumerKey = "dadd58b24026011e2ce361"
twitter.consumerSecret = "ljsvb3fEM28e8c5a4fbb4f38bc378pNRzL5I1CrfV5B"
|
Далее создаём контроллер для твиттера приблизительно такого вида.
SVN → Внешние зависимости SVN
Данной записью открываю тег заметки, по которому буду описывать некие элементарные (или базовые) вещи скорее для себя, так что многие тут ничего волшебного не увидят.
С системой управления версий SVN работаю уже года полтора и, честно говоря, уже не представляю, как программировал до этого, но вот на внешние зависимости в svn наткнулся недавно. Суть в том, что файлы в одном каталоге подтягиваются системой из другого каталога или вообще из другого репозитория.
В частности, можно таким образом заполнять папку library, содержащую внешние библиотеки. Ниже пример с зендом (ради ссылки, собственно, весь пост и городится)
1 2 | ~$ svn propedit svn:externals library
http://framework.zend.com/svn/framework/standard/tags/release-1.12.0/library/Zend Zend
|
Ранее я либо коммитил внешние библиотеки в репозиторий, либо выставлял игнорирование на всё содержимое папки библиотек, а для обновления библиотек делал всё, как в каменном веке, т.е. сносил одни папки, скачивал и распаковывал другие, отправлял их в хранилище по новой и т.п. Теперь достаточно отредактировать свойство svn:externals
Кроме всего прочего, можно явно указать номера ревизий для внешних зависимостей. Это позволит избежать сюрпризов со стороны внешних хранилищ, когда после очередного обновления проект ломается, ведь код на внешних хранилищах, как правило, вам не подконтролен. Делается это приблизительно так.
1 2 | ~$ svn propedit svn:externals library
http://framework.zend.com/svn/framework/standard/tags/release-1.12.0/library/Zend@4321 Zend
|
P.S. Есть, конечно, и более новомодные штуки, вроде composer, но и до него руки дойдут уже скоро :)
News → Symfony Camp 2012
Посетил сабжевую конференцию. Остался более чем доволен, как и год назад. Ожидания оправдались, было много интересного. По большему счёту, слово Symfony можно безболезненно выкинуть из половины докладов, суть не изменится.
На снимке Kirill Chebunin — Rich model and layered architecture in Symfony2 application