Установка сервера приложений Myna

Myna — это серверный javascript. Детальнее можно узнать здесь.
Установка возможна двумя способами:
1. как обычный сервлет на любом Java сервере (Tomcat, JBoss, Glassfish, WebSphere, etc)
2. как отдельное приложение (в данном случае Tomcat уже включен в поставку).
На момент написания статьи последним выпущенными релизом была версия myna-1.0_beta_9. Пусть вас не пугает приставка beta — авторы заявляют, что приложение очень стабильно и успешно работает на многих серверах в боевом режиме.

Для себя я выбрал установку как standalone приложение. Для этого скачал архивчик myna-1.0_beta_9.war.
.
Установка происходит следующим образом:

java -jar /path/to/myna-1.0_beta_9.war -m install

и далее идет ряд дополнительных параметров, узнать о которых вы можете выполнив команду

java -jar /path/to/myna-1.0_beta_9.war --help

но! При запуске этой команды под своим пользователем unix (если вы не root) вы получите такие сообщения:

Installing/upgrading Myna in '/var/www/myna'...
Done unpacking.
Install mode must be run as root.

Не знаю почему, но мне не помогло то, что я добавил sudo в начало команды. Успеха я не добился.
Весь секрет оказался оказался в том, что нужно явно запускать установку из-под пользователя root.
И, да, помимо этого я указал полный путь к war-файлу myna. Далее установка прошла без проблем.
Видимо, всё дело в том, что установщик пытается прописать скрипт запуска для myna в директорию /etc/init.d/

После установки сервер запускается автоматически и вы можете увидеть результат по адресу
http://localhost:8180/ (8180 — порт для myna по-умолчанию).
Когда вы настроили и запустили сервер, можете углубиться в документацию, чтобы узнать как писать серверные приложения с помощью Myna и чистого JavaScript.
Удачи!

Для PHP-5.4 Debian — нет suhosin, xcache, xdebug расширений

Сегодня проапгрейдил свою Debian OS 6.0 (настроено apt-pinning).
Среди прочих апдейтов при выполнении dist-upgrade привалили и обновления для ряда установленных модулей php5.  Обновился и сам PHP, собственно до версии 5.4.0-2. Но… тут начались непонятные проблемы — ни один локальный сайт не работал! В логах были непонятные ошибки, скажем, для сайта, основанного на фреймворке  YII было сообщение:

[Sun Mar 25 13:32:51 2012] [error] [client 127.0.0.1] PHP Fatal error:  Call to undefined function (null)() in /home/web/ccc/frontend/index.php on line 4

А на той строке 4 ничего не было особенного, окромя dirname(__FILE__)!
Порыскав-поискав в интернете похожие ошибки, не нашел ничего. Запостил баг на php.net.
Но дело-то неприятное! Ничегошеньки ведь не работает…
Начал копаться дальше. Попробовал запустить скрипты php из консоли, дабы проверить — неужто dirname() убрали? 🙂 И обнаружил еще ряд замечательных уведомлений warnings:

rodush@rdushko:/var/www$ php test.php
Failed loading /usr/lib/php5/20090626+lfs/xdebug.so: /usr/lib/php5/20090626+lfs/xdebug.so: cannot open shared object file: No such file or directory
PHP Warning: PHP Startup: Unable to load dynamic library ‘/usr/lib/php5/20100525+lfs/suhosin.so’ — /usr/lib/php5/20100525+lfs/suhosin.so: cannot open shared object file: No such file or directory in Unknown on line 0
PHP Warning: PHP Startup: Unable to load dynamic library ‘/usr/lib/php5/20100525+lfs/xhprof.so’ — /usr/lib/php5/20100525+lfs/xhprof.so: cannot open shared object file: No such file or directory in Unknown on line 0

А дальше директива dirname() отработала и подключился файл, который я подключал.
Заглянув в директорию, указанную в сообщении, я обнаружил, что таких библиотек действительно нету!
Пока решил не морочить голову: допишут — обновлюсь; решил убрать конфиги php для данных библиотек.
Они расположены в директории /etc/php5/conf.d/
просто переименовал все конфиги, на которые не пришли обновления файлы с суффиксом «old» (на будущее пригодятся :), думаю)

suhosin.ini.old xdebug.ini.old xcache.ini.old xhprof.ini.old

Попробовал вызов из консоли — не ругается php. Попробовал зайти на сайты в броузере и — о чудо! — всё работает!!
Вот такие вот причуды могут быть, если php ругается на невозможность подключить дополнительные модули-библиотеки.

Отменить git push

Бывает такое, что вы сделали случайный коммит и запушили в общий репозиторий то, что не хотелось бы, скажем — какие-то важные данные (пароль к какому-нибудь сервису и т.п.)
Конечно, пока никто не заметил, всё еще можно отменить!
Для этого необходимо использовать команду

git push -f {remote_name} HEAD^:{branchName}

Таким образом можно откатиться не только на один шаг (^), но на любое количество: HEAD^^ (HEAD~2, HEAD~n).
Повторно можно «залить» уже изменения с учетом необходимых исправлений. Таким образом вы перепишете историю!

Показать / скрыть оффлайн контакты в Linux Skype

Есть у Skype даже тикет по данному поводу, что люди не могут найти в интерфейсе кнопочки для управления отображением оффлайн контактов в линуксовой версии Skype.
Как оказалось, есть даже проще решение (как по мне, то оно и единственное) — «горячие клавиши» Ctrl + U. Быстро и эффективно!

Генерация CSR файла

CSR файл можно сгенерировать с помощью утилиты OpenSSL.

openssl req -newkey rsa:2048 -keyout private_key.pem -out server.csr

Здесь req команда управления сертификатами x.509,
-newkey — нам нужен новый ключ
rsa — алгорит шифрования, 2048 — длина ключа. Для подписи сертификатов после 2010 года требуется такая длина! До 2010 года разрешено использовать 1024 битный ключ.
-keyout — путь к файлу ключа, который будет храниться на сервере
-out — путь к файлу запроса сертификата (csr)

как остановить CruiseControl

Чтобы остановить сервер непрерывной интеграции CruiseControl, в веб-браузере перейдите по адресу:

http://localhost:8000/invoke?operation=halt&objectname=CruiseControl+Manager%3Aid%3Dunique

PHPMyAdmin session timeout

По-умолчанию время жизни сессии в новой инсталляции PhpMyAdmin и способе авторизации ‘cookie’ составляет 1440 секунд (24 минуты). Т.е. после 24 минут бездействия следующее обращение приведёт пользователя на страницу авторизации. Чтобы увеличить время жизни сессии, необходимо установить значение переменной

$cfg['LoginCookieValidity'] = 1440 * 60; // 86400 means one day (24-hours)

, скажем в 60 раз, что составит сутки.

Отслеживание ошибок и уведомлений PHP

Иногда бывает необходимо отследить некритические ошибки, возникающие в работе РНР скрипта (E_WARNING, E_NOTICE, etc.) и куда-то их грамотно собрать.
К примеру, мы хотим сделать валидацию XML файла с помощью XMLReader (кстати, об этом, думаю, можно рассказать в отдельной публикации). В случае, если XML невалидный, то выбросить исключение, прекратив дальнейшую работу.
Все ошибки валидации выдаются через WARNING-сообщения.
Для того, чтобы получить такое сообщение можно поступить следующим образом:

// Track the errors (to be able to store the PHP error message)
$oldConfigValue = ini_set('track_errors', '1');
while ($xmlReader->read()) {} // полностью читаем XML
if (!$xmlReader->isValid())
{
  throw new Exception('XML does not conform to schema. ' . $php_errormsg);
}
// Set back track_errors setting:
ini_set('track_errors', $oldConfigValue);

Здесь мы сначала устанавливаем директиву РНР 'track_errors' (Отслеживать ошибки) в TRUE (1). А далее — magic! 🙂
Есть, оказывается, такая чудесная встроенная переменная $php_errormsg, которая и содержит в себе сообщения об ошибках (warnign, notice, и пр.)
Когда данная штуковина нам уже не нужна, мы можем вернуть прежнюю директиву на место, т.к. сохранили её предыдущее значение в переменной $oldConfigValue
Т.о. мы имеем осмысленное сообщение о том, почему же наш XML не прошел валидацию по нашей же схеме.

PHP strtotime — проблема с датами со слешем (slash)

Есть одна особенность у РНР функции strtotime: она не умеет распознавать даты, которые записаны через слеш «/». Если мы применим даную функцию к дате, записаной в виде, скажем «21/01/2010», то на выходе получим:

$date = strtotime("21/10/2010");
echo date("d.m.Y", $date);

Вызов данного скрипта выведет такое:

01.01.1970

Virtual box — как увеличить размер диска

В своей практике использую Virtual box для изучения Linux ОС под основной системой Windows.
Несколько раз сталкивался с ситуацией, когда на виртуальном жестком диске Virtual box’a заканчивалось место. Создавать новый диск большего размера и начинать работу с чистого листа как-то не привлекает. Для решения такой проблемы сейчас я лично знаю 2 метода. Начну с более (очень) простого, о котором узнал совсем недавно и был приятно обрадован, насколько легко решается задача.
Далее речь пойдет о том, как сделать это в Windows.
Суть метода по увеличению размера виртуального диска для Virtual box состоит в том, что мы создаем новый виртуальный диск большего размера, затем заходим в консоль CMD (WinKey + R > cmd), переходим в директорию, в которую установлена виртуальная машина, набираем команду:

VBoxManage.exe clonehd --existing [OLD_DISK.vdi] [NEW_DISK.vdi] 

(в квадратных скобках вам нужно указать полный путь к своим старому и новому виртуальным жестким дискам)

Жмем ENTER и ждем, когда утилита сделает нам из нового диска клон старого. Утилита в процессе клонирования образа диска выводит процент завершения кратный 10, что удобно — можно видеть, когда процесс закончится.
Теперь подлючаем новый жесткий диск Virtual box’y и продолжаем…
Необходимо загрузиться на виртуальной машине каким-либо LiveCD. В моем случае я использовал gparted live cd. Загружаться с liveCD необходимо для того, чтобы иметь возможность изменить размер нового диска с учетом добавленного места (т.к. место это — неразмеченная область). На моей виртуальной машине установлена Kubuntu 10.04, и соответственно диск не должен быть «примонтирован». После увеличения размера диска перезагружаемся уже непосредственно с нового виртуального жесткого диска большего размера и наслаждаемся появившимся пространством! 🙂

Чуть позже я опишу более сложный процесс, когда копирование данных с одного диска на другой делалось из-под самой KUbuntu.
[TODO]