Бывает так, что исходники проекта в utf8, а данные в базе хранятся в cp1251. Чтобы MySQL сам занимался переводом в другую кодировку, но после коннекта выполнить команды:
1 2 | |
Бывает так, что исходники проекта в utf8, а данные в базе хранятся в cp1251. Чтобы MySQL сам занимался переводом в другую кодировку, но после коннекта выполнить команды:
1 2 | |
Сидя за компом забываешь кое-что сделать, например, выключить плиту. В линуксе это можно реализовать так:
1
| |
Примеры: Сказать голосом через 10 минут, что нужно выключить плиту:
1
| |
Пора выходить:
1
| |
Весело получается ;)
Хочу показать насколько просто настраивать 3G интернет в Ubuntu. Имеется huawei E1550 от МТС и Ubuntu 10.10. Хочу обратить внимание, что это всё работает “из коробки”.

Всё, интернет подключен ;)
Продолжаем осваивать плагинописание для браузеров на основе chromium и ,соответственно, для google chrome. Текущая тема: научиться использовать local database storage. Local database storage – это база данных, использумая из javascript. Представляет она собой SQLite внутри. Синтаксис привычный для SQL баз. Я буду использовать базу для запоминания всех полученных цитат. Логически все действия можно разделить на 4 операции:
Открытие базы и получение коннекта
1 2 3 4 | |
где quotes – название базы данных 1.0 – версия БД (не изменять) A list of quotes – комментарий 210241024 – максимальный размер базы данных в байтах
Создание таблицы
1 2 3 | |
Запись в таблицу
1 2 3 | |
Чтение из таблицы
1 2 3 4 5 6 7 | |
rowid – “скрытое” поле, с типом autoinc
Ссылки по теме:
В связи с последними тенденциями в вебе (в том числе и недавний запуск webstore), возникла идея попрактиковаться в написании плагина под Google Chrome. Решил написать плагин, который бы показывал цитаты с сайта Forismatic.com, после прочтения статьи о написании аналогичного апплета для gnome.
Всем начинающим рекомендую сначала прочитать отличный мануал от самого google. В нём всё подробно описано, также есть примеры. Вообще можно увидеть исходники любого приложения: достаточно зайти в папку ~/.config/chromium/Default/Extensions (используется Chromium на Ubuntu).
Весь исходный код моего расширения доступен на гитхабе.
Получать цитаты будем с помощью api forismatic.com в формате json.
Вот такой GET-запрос должен получится: http://api.forismatic.com/api/1.0/?method=getQuote&format=json&key=123456lang=ru
Меняем lang на выбранный язык, а параметр key произвольно.
Теперь перейдём непосредственно к созданию приложения Необходимо создать такую структуру:
Сначала создаём файлы переводы.
_locales/en/messages.json
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | |
_locales/ru/messages.json
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | |
Теперь можно описать расширение в манифесте
manifest.json
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | |
Параметр default_locale определяет стандартную локаль.
Параметр name описывает имя расширения. Мы его задаём в зависимости от языка, используя ранее описанную переменную в файлах локализации extName, предварительно обернув её: MSG_extName Также поступим и с параметром description. Кстати, при отображении расширения на https://chrome.google.com/extensions/ или на https://chrome.google.com/webstore будет тоже подставляться значение в зависимости от выбранного языка.
В значении version указываем версию плагина (причём при заливке новых версий, она должна быть больше предыдущей, что логично). Chrome будет раз в несколько часов и при загрузке проверять обновление плагина и автоматически обновлять его.
Параметры background_page и options_page указывают на страницу, выполняющуюся в фоне, и страницу настроек. В параметре permissions передаем массив, в котором описываем, что может делать расширение. Мы включили доступ к уведомлениям (notifications) и доступ к сайту api (http://api.forismatic.com/*).
С параметром icons всё понятно.
Библиотека функций для javascript
functions.js
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 | |
Файл, который выполняется при запуске плагина.
background.html
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | |
Настройки плагина
options.html
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 | |
Cкрипт, который помогает упаковывать расширение:
zip.sh
1 2 | |
Теперь можно запустить плагин в браузере: Tools » Расширения » Загрузить распакованное расширение Должно появиться всплывающее окно с цитатой. Можно зайти в настройки, сменить язык. При сохранении, должная появиться цитата на другом языке.
После создания и тестирования необходимо выложить плагин. Заходим на страницу: https://chrome.google.com/extensions/developer/dashboard?hl=ru, загружаем архив с плагином, указываем нужные параметры (скриншоты, разделы) и нажимаем Publish changes и наше приложение уже на странице плагинов и на webstore.
После прочтения книги Agile Web Application Development with Yii 1.1 and PHP5 захотелось рассказать о настройке NetBeans для работы с yii, включая поддержку unit-тестов + тесты через selenium.
Selenium позволяет проводить тесты, почти полностью эмулируя действия через браузер: кликать по ссылкам, вводить текст.
Это очень мощно! Имеются: – Сервер (ip: 192.168.0.3) Debian или другой linux-сервер с настроенным nginx, php5-fpm, xdebug – Компьютер разработчика (ip: 192.168.0.2) Ubuntu 10.10 с установленным NetBeans 7.0m2
Сайт будет располагаться в /var/www/yii/www, а yii в /var/www/yii-lib/yii
Действия на сервере Создаём папку, где будет располагаться сайт.
1 2 3 | |
Создаём конфиг для php5-fpm. Файл: /etc/php5/fpm/pool.d/yii.conf
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | |
Конфигурация сайта для nginx. Файл: /etc/nginx/sites-available/yii
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 | |
Включаем сайт, путём линкования в папку sites-enabled.
Скачивание yii
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | |
Устанавливаем php5-xdebug
1
| |
Настраиваем xdebug для работы отладки /etc/php5/fpm/conf.d/xdebug.ini
1 2 3 4 5 6 7 8 9 10 11 | |
Рестартим fpm и apache:
1 2 | |
Настройка компьютера разработчика Я монтирую всю папку /var/www к себе. Это очень удобно, т.к. не нужно скачивать все файлы с сайта. Нужен пакет sshfs.
1 2 3 | |
Прописываем в /etc/hosts
1
| |
Устанавливаем

Скачиваем Selenium RC. Распаковываем и запускаем:
1
| |
Устанавливаем NetBeans (в моём случае это NetBeans 7.0m2). Ставим плагин Selenium Module for PHP (Tools → Plugins → Available Plugins).
Немного настраиваем (Tools → Options):
Php → General Ставим порт 9009 для xdebug и снимаем галку с опции Stop at First Line.

Php → Unit Testing Указываем путь до phpunit: /usr/bin/phpunit

Miscellaneous → Files Исключаем файл yiilite.php, чтобы при автокомплите подсказки не дублировались ^(yiilite.php|CVS|

Создаём новый проект:

Указываем пути, название проект. Meta-файлы сохраняем в другой директории.

Указываем url проекта: http://yii.local/

Теперь вызываем настройки проекта.
Указываем директорию тестов (File → Project properties → Sources → Test Folder)

Задаём маппинг пути (File → Project properties → Run configuration → Advanced). Тут не видно, но указано, что /var/www доступно в /mnt/www.

Указываем директорию с yii: /mnt/www/yii-lib/yii (File → Project properties → PHP Include Path)

Папки, которые будут игнорироваться: /mnt/www/yii/www/protected/runtime (File → Project properties → Ignored Folders → Add Folder).

Настройка phpunit (File → Project properties → PhpUnit).

Открываем файлы index.php, index-test.php, protected/tests/bootstrap.php и заменяем /yii-1.1.4.r2429/ на /yii/
Удалить из protected/tests/phpunit.xml тест под IE
1
| |
Меняем константу TEST_BASE_URL в файле protected/tests/WebTestCase.php:
1
| |
Правим тест protected/tests/functional/SiteTest.php (баг):
Заменяем $this->clickAndWait(‘link=Logout’); на $this->clickAndWait(‘link=Logout (demo)’);
Теперь можно запустить тест Selenium

Появиться окошко выбора папки с этими тестами, указываем: /mnt/www/yii/www/protected/tests/functional

Будут всплывать окошки с firefox’ом и в конце концов появиться результат:

Можно запускать phpunit тесты прямо с сервера или с рабочего компьютера, но придётся установить php и все используемые библиотеки (php5-pgsql, php5-mysql, etc). Рассмотрим 2-ой вариант. На компьютере разработчика установить phpunit и php5: Для phpunit теста можно установить свои параметры для yii в protected/config/test.php поверх стандартных (например, коннект к базе). Напишем простейший тест для проверки авторизации. Файл protected/tests/unit/AuthTest.php:
1 2 3 4 5 6 7 8 9 10 11 | |
Для выполнения теста в Netbeans нажимаем Alt+F6. При этом выполняться все тесты: и phpunit и selenium.

Можно выбрать AuthTest.php и нажать Shift+F6, тогда тестирование выполниться только из этого файла. Также можно выполнять phpunit тесты прямо с сервера (aptitude install phpunit):
1 2 3 4 5 6 7 8 9 | |
Также можно написать тесты, не использую базу данных, подменив некоторые таблицы fixtures – ассоциативным массивом, имитирующим записи в таблице.
Дебагинг кода Тесты написаны, теперь можно дебажить код. Открываем index.php, на любой строке добавляем breakpoint (Ctrl+F8). Запускаем дебагинг (Ctrl+F5). Теперь можно “пройтись” по коду клавишами F7 (Step Into) и F8 (Step Over). Это очень помогает понять как же работает сам yii, а так же “качественно” дебажить код, видя текущие переменные, watches, Call stack.
Советую всем прочитать книгу Agile Web Application Development with Yii1.1 and PHP5 всем, кто работает с yii. Книга поднимет уровень и в правильном написании кода для yii, и английского языка.
Обнаружил очень простой способ выполнения MySQL запросов в Debian. Причём без указания логина и пароля. В Debian’е создаётся системный пользователь debian-sys-maint, от которого и будут идти запросы. Например выборка:
1
| |
Можно мониторить нагрузку:
1
| |
Есть несколько “виртуальных” релизов у debian: stable – на текущий момент это 5 версия (lenny), testing – squeeze (когда он будет выпущен, то перейдёт в релиз stable). Unstable и experimental – экспериментальные релизы, не для продакшена!. Пакет проходит путь из experimental => unstable => testing => stable. Иногда бывают ситуации, когда нужно установить пакеты поновее. Можно, конечно, скачать отдельно deb-пакет и установить его, но в этом случае одни минусы: возможно требуются удовлетворения зависимостей и лишаемся обновлений. А можно рулить приоритетами пакетов в зависимости от релиза (stable, testing, unstable, experimental).
Создаём файлы в /etc/apt/sources.list.d
testing.list
1 2 3 4 | |
unstable.list
1 2 | |
experimental.list
1 2 | |
Теперь настраиваем приоритеты в файле /etc/apt/preferences:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | |
Этот конфиг означает, что пакеты будут искаться в такой последовательности: testing => stable => unstable => experimental. Вместо Package: * можно указать конкретные пакеты, но, к сожалению, нельзя указать маску пакетов.
Установка пакета и попытка решить зависимости из unstable:
1
| |
Установка пакета и попытка решить зависимости из релиза с наивысшим приоритетом:
1
| |
Ссылки по теме: http://www.debian.org/doc/manuals/apt-howto/ch-apt-get.ru.html
Очень нужная тулза для ленивых админов. Может работать автодополнением для разных консольных программ: aptitude, git, invoke-rc.d, ssh и других.
Список поддерживающих программ находиться в директории /etc/bash_completion.d
По желанию можно самому расширить этот список. Не забудьте прислать ваши труды мейнтейнеру пакета.
1
| |
Добавляем в ~/.bashrc
1 2 3 4 | |
У меня работает связка nginx –> apache2 + mysql + postgresql. Поставим memcached, APC (кэшер для php), и несколько модулей для php5.
Для того, чтобы nginx проксировал через локальный адрес (192.168.1.254, например), необходимо добавить в bind наш домен. Это ещё пригодиться для доступа из локальной сети, чтобы запросы не шли через «внешку», а также для однозначной идентификации того, что заходят из «доверенной» сети. Добавляем в файл /etc/bind/named.conf.local наш домен:
1 2 3 4 | |
Создаём файл /etc/bind/db.zagirov.name:
1 2 3 4 5 6 7 8 9 10 11 | |
Я использую Debian testing (squeeze). Устанавливаем пакеты:
1
| |
Структура папок сайта: logs – логи tmp – папка для временных файлов и файлов сессии www – содержимое сайта
Создадим «эталонную» папку для сайта, которая будет структурой для будущих сайтов
1 2 3 | |
Открываем в mc папку /var/www/, выбираем папку etalon, нажимает shift+F5, вводим название сайта(zagirov.name). Появилась папка для будущего сайта: /var/www/zagirov.name/ Чтобы логи архивировались, создаём правило для logrotate в файле /etc/logrotate.d/sites:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | |
Теперь настраиваем nginx. Удаляем все символические ссылки из папки /etc/nginx/sites-enabled Создаём конфигурацию для неописанных доменов: /etc/nginx/sites-available/default_http В случае, когда сайт не описан nginx просто разорвёт соединение, ничего не выдав.
1 2 3 4 5 6 7 | |
Открываем mc. В левой панели /etc/nginx/sites-enabled, в правой – /etc/nginx/sites-available Выбираем файл default_http и нажимаем комбинацию Ctrl+X, а затем S – это создаст символическую ссылку выбранного файла в папке другой панели. Теперь создадим файл для сайта /etc/nginx/sites-available/zagirov.name:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | |
Опять включаем сайт созданием символической ссылки.
Теперь настраиваем apache. Удаляем включённые по дефолту сайты из папки /etc/apache2/sites-enabled Меняем порт с 80 на 81 в файле /etc/apache2/ports.conf:
1 2 | |
Создаём конфигурацию для неописанных доменов: /etc/apache2/sites-available/default_http
1 2 3 | |
Создадим настройки для сайта в файле /etc/apache2/sites-available/zagirov.name:
1 2 3 4 5 6 7 8 9 10 11 12 | |
Включаем сайт:
1
| |
Перезапускаем apache и nginx.
1 2 | |
Установка рутового пароля для пользователя postgres для PostgreSQL:
1 2 3 | |