27 окт. 2011 г.

Перенос сайта на новый хостинг

Многие обладатели интернет сайтов, от малых - до великих, сталкивались с проблемой переноса своего детища с одного хостинга на другой по различным причинам. В данной статье я опишу пару способов переноса всего сайта с одного хостинга на другой.
Дано:
домен:
test.сom
старый сервер:
ip: OLD_IP
document_root:OLD_DR
user:OLD_USER
pass:OLD_PASS
БД user:OLD_DB_USER
БД pass:OLD_DB_PASS
БД имя:OLD_DB_NAME
новый сервер:
ip: NEW_IP
user:NEW_USER
pass:NEW_PASS
document_root:NEW_DR
БД user:NEW_DB_USER
БД pass:NEW_DB_PASS
БД имя:NEW_DB_NAME
Суть переноса сайта с одного хостинга на другой - копирование всей информации(файлов и БД) со старого сервера на новый.

1-ый способ - самый простой.
В большинстве случаев, на каждом хостинге присутствует доступ к серверу по протоколу FTP и доступ к БД с помощью PhpMyAdmin. Первым делом - необходимо скачать все содержимое домашнего каталога со старого хостинга на рабочий компьютер, поправить конфигурационные файлы под нужды нового хостинга, такие как учетная запись для доступа к БД, имя БД, полный путь к домашнему каталогу на новом хостинге и др., и перенести все файлы на новый сервер. Перенос БД заключается в экспорте данных при помощи PMA на старом сервере и импорту оных на новом сервере( для успешной операции желательно использовать сжатие данных при экспорте, потому как на многих хостингах максимальный размер файла для импорта в PMA ограничивается размером в 8 Мб, если же все данные все равно не влазят в ограниченный объем - можно переносить таблицы БД по частям).

2-ый способ.
При наличии удлаенного доступа к старому серверу и новому по протоколу ssh можно поступить следующим образом:
подключится к старому серверу;
сделать дамп базы данных на старом сервере при помощи утилиты mysqldump:
>mysqldump OLD_DB_NAME –uOLD_DB_USER -p > dump.sql
и положить дамп в корень сайта;
создать архив корня сайта со всеми файлами и положить данный архив в корень сайта
>tar -cvzf site.tar.gz *
;
подключится к новому серверу;
при помощи утилиты wget скачать архив сайта минуя рабочий компьютер;
>wget http://test.com/site.tar.gz
;
распаковать архив в корень сайта
>tar xvzf site.tar.gz
;
восстановить БД при помощи команды:
>mysql NEW_DB_NAME –uNEW_DB_USER -p < dump.sql
3-ий способ - самый оптимальный
При наличии удаленного доступа к старому и новому серверам по протоколу ssh и наличия на обоих серверах утилиты rsync:
создаем дамп БД:
>mysqldump OLD_DB_NAME –uOLD_DB_USER -p > dump.sql
выполняем копирование файлов на новый сервер при помощи rsync:
>rsync --progress -zvarle ssh OLD_DR NEW_USER@NEW_IP:NEW_DR && touch OLD_DOCUMENT_ROOT/.done
восстанавливаем БД
>mysql NEW_DB_NAME –uNEW_DB_USER -p < dump.sql

PS:
при работе с серверами по протоколу ssh хорошим тоном является использование утилиты screen(особенно при копировании больших объймов данных), которая позволяет продолжитьь выполнение команды на удаленном сервере при обрыве ssh соединения.
для тестирования успешного переноса сайта на новый сервер необходимо прописать в файле hosts строку вида
NEW_IP test.com
и попробовать зайти на сайт test.com, при полной уверенности, что сайт перенесен нормально - необходимо изменить DNS записи, с перенаправлением трайика test.com на новый сервер.




6 авг. 2011 г.

Вывод звука через HDMI на железяке с чипсетом Nvidia

Данная статья описывает один из вариантов возможной настройки вывода многоканального звука через интерфейс HDMI вместе с видео для железяки c чипсетом Nvidia ION2 под управлением opensuse 11.4 с оболочкой XBMC на борту.
Изначально необходимо обновить до последней версии alsa, pulseaudio, проприетарный Nvidia driver, перезагрузить компьютер
После обновления необходимо выполнить следующие комманды:
>sudo /usr/bin/amixer -q -c 0 sset 'Master',0 unmute && /usr/bin/amixer -q -c 0 sset 'Master',0 100
>sudo /usr/bin/amixer -q -c 0 sset 'IEC958 Default PCM',0 unmute
>sudo /usr/bin/amixer -q -c 0 sset 'IEC958',0 unmute && /usr/bin/amixer -q -c 0 sset 'IEC958',1 unmute
>sudo alsactl store 0
Если в процессе выполнения комманд появляются ошибки — значит скорее всего проблемма кроется в pulseaudio, который необходимо установить из исходних кодов вручную.
Далее ищем устройство, которое обладает возможностью вывода звука через HDMI:
>grep eld_valid /proc/asound/NVidia/eld*
В результате должнен быть следующий вывод:
/proc/asound/NVidia/eld#0.0:eld_valid 0
/proc/asound/NVidia/eld#1.0:eld_valid 1
/proc/asound/NVidia/eld#2.0:eld_valid 0
/proc/asound/NVidia/eld#3.0:eld_valid 0
сопостовление устройств и значений параметра eld_valid
eld#0.0=device 3
eld#1.0=device 7
eld#2.0=device 8
eld#3.0=device 9
(Можно так же попробовать вывести все аудиоустройства при помощи
>aplay -l
, вывод будет следующий:
**** List of PLAYBACK Hardware Devices ****
card 0: Intel [HDA Intel], device 0: ALC887 Analog [ALC887 Analog]
Subdevices: 1/1
Subdevice #0: subdevice #0
card 0: Intel [HDA Intel], device 1: ALC887 Digital [ALC887 Digital]
Subdevices: 1/1
Subdevice #0: subdevice #0
card 1: NVidia [HDA NVidia], device 3: HDMI 0 [HDMI 0]
Subdevices: 1/1
Subdevice #0: subdevice #0
card 1: NVidia [HDA NVidia], device 7: HDMI 0 [HDMI 0]
Subdevices: 0/1
Subdevice #0: subdevice #0
card 1: NVidia [HDA NVidia], device 8: HDMI 0 [HDMI 0]
Subdevices: 1/1
Subdevice #0: subdevice #0
card 1: NVidia [HDA NVidia], device 9: HDMI 0 [HDMI 0]
Subdevices: 1/1
Subdevice #0: subdevice #0
).
И первый и второй результат говорит нам о том, что необходимо использовать device 7, карты Nvidia(либо card 1). (Если первый результат не даёт нужного результата, то можно найти нужное устройство методом перебора при помощи последовательного воспроизведения аудио-файла через все видимые устройства:
>aplay -D plughw:NVidia,X /usr/share/sounds/alsa/Front_Center.wav(где X — номер устройства).
Далее необходимо прописать в файле /etc/modprobe.d/50-sound.conf (если оного не существует, то необходимо его создать)
options snd-hda-intel enable_msi=0,probe_mask=0xXXX
соответствие probe_mask для каждого из устройств:
device 3: probe_mask=0x101
device 7: probe_mask=0x102
device 8: probe_mask=0x104
device 9: probe_mask=0x108
Далее необходимо отредактировать файл /etc/pulse/default.pa и заменить
#load-module module-alsa-sink
на
load-module module-alsa-sink device=plughw:1,7
(если не работает — то необходимо заменить plughw на hw)
В конце необходимо удалить временные файлы и текщие файлы при помощи
>rm -r ~/.pulse ~/.asound* ~/.pulse-cookie
и перезагрузить компьтер.
В для вывода звука в XBMC в настройках «вывод звука» нужно прописать следующее:
Формат аудиовыхода: Цифровой
Устройство вывода звука: особый(plughw:1,7)
Другое устройство прямого вывода звука:особый(plughw:1,7)
В результате всех выше перечисленных манипуляций система должна выводить звук через HDMI.
PS: для опредения правильного расположения колонок, можно воспользоваться тестированием при помощи команды:
>speaker-test -c количество_колонок -D plughw:1,7
Сия статья не претендует на оригинальность и уникальность, а наоборот является сборкой большинства советов из следующих статей:
(XBMC)вывод звука через HDMI на базе чипсета nForce
(XBMC)вывод звука через HDMI на базе чипсета GT2XX
(Opensuse) Pulseaudio
(Ubuntu) вывод звука через HDMI для чипсета Nvidia
(Ubuntu) вывод звука через HDMI для чипсета Nvidia ION-2
(ЖЖ) снос pulseaudio на примере ubuntu 

8 июн. 2011 г.

сортированные массивы/JSON в JavaScript

Недавно мной был обнаружен баг при создании простой страницы: в различных браузерах проход по отсортированному массиву производится по разному( к слову - в FF проход идет нормальный, в Opera и Chrome - все идет не по плану).
Суть заключается в следующем:
на стороне сервера создается массив, сортируется по значениям в алфавитном порядке и передается во view:
$data = array();
 ....
asort($data, SORT_STRING);
$this->view->data = Zend_Json_Encoder::encode($data); // передаем во view наш массив, закодированный в json.

Во view обработка следующая (происходит заполнение тэга select при помощи js):
var data = data ?>;
for(t in data)
{
   el = $("");
   el.attr('label', data[t]);
   el.attr('value', t);
   $('#object_id').append(el);
}

В данном случае, не смотря на то, что массив JS заполнен отсортированными по значениям - не ключам - данными, браузеры проходят по массиву как хотят. Решением данной проблемы стал следующий костыль:
при заполнении массива на стороне сервера необходимо выравнивать длину ключей( в моем случае ключи были целочисленными) при помощи функции vsprintf, в результате чего происходит заполнение недостоющих символов пробелами( при обработке POST запроса - лишние пробелы собственоручно удаляются) :

$data = array();
 ....
asort($data, SORT_STRING);
$result = array();
foreach($data as $k => &$v)
{
$result[vsprintf("%10s", $k)] = $v;
 }
$data = $result;
$this->view->data = Zend_Json_Encoder::encode($data);
В качестве альтернативы ф-ции vsprintf можно использовать ф-цию str_pad.



20 мая 2011 г.

Переключение раскладки клавиатуры в Linux под X window

На своем HTPC возникла проблема с переключением раскладки клавиатуры после того как был отключен оконный менеджер(LXDE) и происходил запуск непосредственно XBMC. Решением дааной проблеммы стала правка файла /etc/X11/xorg.conf и добавлением в секцию Section "InputDevice"(в которой описывается клавиатура) следующих строк:
  Option "XkbRules" "xorg"  
  Option "XkbLayout" "us,ru"  #необходимые языки
  Option "XkbVariant" ",winkeys"  #необходимая вариация раскладки для каждого языка(для us - стандартная, для ru - winkeys
  Option "XkbOptions" "grp:ctrl_shift_toggle" # переключение раскладки при помощи нажатия ctrl+shift

После рестарта X-ов раскладка все равно не переключалась а лог фал показал следующее:
.........
[ 141.694] (==) Using config file: "/etc/X11/xorg.conf"
[ 141.694] (==) Using config directory: "/etc/X11/xorg.conf.d"
..........
[ 141.697] (WW) AllowEmptyInput is on, devices using drivers 'kbd', 'mouse' or 'vmmouse' will be disabled.
...........
[ 150.835] (II) config/udev: Adding input device AT Translated Set 2 keyboard (/dev/input/event2)
[ 150.835] (**) AT Translated Set 2 keyboard: Applying InputClass "evdev keyboard catchall"
[ 150.835] (**) AT Translated Set 2 keyboard: Applying InputClass "LocalKeyboard"
[ 150.835] (**) AT Translated Set 2 keyboard: always reports core events
[ 150.835] (**) AT Translated Set 2 keyboard: Device: "/dev/input/event2"
[ 150.853] (II) AT Translated Set 2 keyboard: Found keys
[ 150.853] (II) AT Translated Set 2 keyboard: Configuring as keyboard
[ 150.853] (II) XINPUT: Adding extended input device "AT Translated Set 2 keyboard" (type: KEYBOARD)
[ 150.853] (**) Option "xkb_rules" "evdev"
[ 150.854] (**) Option "xkb_model" "evdev"
[ 150.854] (**) Option "xkb_layout" "us"
[ 151.018] (II) XKB: reuse xkmfile /tmp/server-A9ACCDF38EB1446AC7992CE0B930842F0AD908B1.xkm
.............
Данный лог навел на мыслль, что правила для клавиатуры не загружаются из xorg.conf, а беруться из других конфигурационных файлов в папке /etc/X11/xorg.conf.d . Просмотрев  данную папку был найден файл 90-keytable.conf , куда и были продублированы необходимые настройки клавиатуры из xorg.conf, в результате чего он обрел следующий вид:
Section "InputClass"
Identifier "LocalKeyboard"
MatchIsKeyboard "on"
Option "XkbLayout" "us,ru"
Option "XkbVariant" ",winkeys"
Option "XkbOptions" "grp:ctrl_shift_toggle"
EndSection

Всевозможные варианты layout, variant, option для клавиатуры можно посмотреть в файле /usr/share/X11/xkb/rules/base.lst

7 мая 2011 г.

Google chrome следит за вами

Разбираясь как то раз с гляками в работе проекта наткнулся в логах apache на записи гугл бота к закрытой части сайта(без аутентификации туда никого не пускает) - на что был дан ответ 302 :
crawl-66-249-71-46.googlebot.com - - [04/May/2011:12:58:33 +0700] "GET /xxxxx HTTP/1.1" 302 20 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
Поиск по логам показал - за день до этого был доступ к данной странице из chrome:
inetIP - - [03/May/2011:09:28:37 +0700] "GET /admin/xxxxx HTTP/1.1" 302 20 "http://blabla.ru/admin/yyyyyy" "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.204 Safari/534.16"
Соответственно гугл может получить любую информацию о вас при серфинге по закрытым страницам интернета(соотв может в том же вконтакте снять инфу, которая закрыта от других, прочитать инфу на странице интернет-банкинга ну и т.д.) если вы получаете доступ к ним при помощи google chrome. Будте бдительны!!!!

Удаление файлов по маске в linux

Как то раз пришлось отчистить рабочий проект от файлов subversion(.svn). Результат был подсмотрен в чьем-то ЖЖ: данное действие можно сделать при помощи команд find и rm
>find . -name '.svn' -exec rm -R -f '{}' \;
в результате были удалены все найденные .svn

26 апр. 2011 г.

Единый конфигурационный файл для рабочего и тестового сервера проекта ZF на базе Zend_Config и mod_rewrite

Для корректной работы любого проекта необходимо 2 конфигурационных файла: тестовый(для отладки на тестовом сервере) и рабочий(который необходим для работы на рабочем сайте). Zend Framework предоставляет 2 возможных варианта хранения настроек: в формате XML и в формате Ini. В обоих случаях указано, что можно в настройках использовать наследование: [staging : production] - для Zend_Config_Ini и - для Zend_Config_Xml. Данным подходом можно воспользоваться для хранения настроек для тестового и рабочего серверов в одном файле. Для примера возьмем порстой файл с настройками, в котором лежит только конфиг для подклчения к БД:
[production]
db.adapter = "PDO_MYSQL"
db.host = "localhost"
db.port = "3306"
db.username = "user"
db.password = "pass"
db.dbname = "project"

[testing : production]
db.password = "pass1"

 Из данного файла конфигурации следует, что БД на тестовом и рабочем сервере идентичны, кроме пароля для подулючения к оной. Теперь соответственно необходимо сделать так, что б на рабочем сервере происходило подключение к одной БД, а на тестовом - к другой без правки кода подключения к БД. В данном случае нам на помощь приходит модуль сервера Apache - mod_rewrite.
В папке с проектом в файле .htaccess пишем следующее:

##ниже можно перечислислить стандартный наобр переменных, необходимых для инициализации проекта
RewriteRule (.*) - [E=ZF[config]:production, E=ZF[usedb]:1]
## ниже переопределяются переменные, исходя из названия сервера, на котором находится проект
RewriteCond %{HTTP_HOST} ^(.*)project\.test$
RewriteRule (.*) - [E=ZF[config]:testing, E=ZF[usedb]:1]

Исходя из данного конфигурационного файла видно, что если проект не находится на хосте project.test - то будет использован стандартный набор переменных, к которым можно получить доступ через $_SERVER['ZF']. Соответственно в проекте загружать файл конфигурации необходимо следующим образом:

$config = Zend_Config_Ini('/path/to/configs/config.ini', $_SERVER['ZF']['config'], true);

В результате для различных проектов будут загружены различные данные.







21 мар. 2011 г.

Исправления после обновления до opensuse 11.4

После обновления opensuse до версии 11.4 возникло несколько проблем:
отказ работы сетевых устройств и микрофона, но обо всем по порядку.
В один прекрасный день, включив компьютер, полез на свои любимые сайты в поисках новостей, однако, после загрузки одной страницы, резко отвалилось сетевое подключение по Wi-fi(работало все под управлением NetworkManager). Немного почесав затылок, полез в закрома искать кусок сетевого шнура - необходимо было все таки вылезть в интернет. Недолгие поиски заветного куска кабеля увенчались успехом и, подключившись напрямую к роутеру через сетевую карту, подключил таки сеть. Но после недлогих танцев с бубном и перезагрузки машины отвалилось даже подключение через кабель, причем апплет kNetworkManager в наглую отказался работать с сетевым картой а только безрезультатно пытался подключиться к Wi-Fi, требуя у меня пароль(что не является нормальным функционированием данного аплета). Просмотр логов дал зацепку - мол не могу подключится т.к. аутентификация не проходит и мол долго нету ответа от точки доступа(/var/log/NetworkManager). После перезугрузки в безопасном режиме - появилось таки соединение по кабелю - но поиски по просторам интернета не дали положительного результата. Вспомнился анонс выпуска 11.4 на хабре, где было сказано, что аплет kNetworkManager был заменен на плазмоид networkmanagement - было решено сносить аплет и ставить плазмоид( при попытке поставить плазмоид - zypper автоматически предлагает снести аплет). После перезагрузки в нормальном режиме - сеть заработала как и прежде(причем запустился как Wi-Fi, так и соединение через кабель).
При попытке позвонить в skype был обнаружен изъян - микрофон не работал. Танцы с бубном вокруг alsamixer и pavucontrol не дали результата и как результат(после длительного чтения форумов) было решено удалить pulseaudio и иже с ним, kmix.
# zypper rm -u pulseaudio alsa-plugins-pulse-32bit libpulse0 kmix
Скачав с сайта pulseaudio исходные коы последней доступной версии было сделано следующее:
#  ./bootstrap.sh && ./configure --disable-lirc --enable-udev --disable-per-user-esound-socket CFLAGS="-march=core2" && make && make install
После решения проблем с зависимостями и сборки pulseaudio был установлен kmix и перезагружена машина. После загрузки все заработало как надо - можно было продожать чесать языком в skype.

13 мар. 2011 г.

Обновление opensuse 11.3 до 11.4

Обновление opensuse сводиться нескольким шагам - скачивание DVD образа с новой версией, смена репозитория со старого образа на новый и выполнение команды dup для zypper. Обо всем по порядку.
Скачиванием DVD образ openSUSE-11.4-DVD-x86_64.iso, заменяем в репозиториях старый образ на новый.
Предварительно ставим блокировку на liblzma в zypper:
# zypper addlock liblzma0
Можно сразу же поменять все репозитории с версии 11.3 на 11.4.
Выполняем обновление с DVD:
# zypper dup -r DVD
Вуаля - система обновилась. (естественно отвалился Wi-Fi и VMWare).Если все таки предварительно не была установлена на liblzma, то выход из сложившейся ситуации с "error while loading shared libraries: liblzma.so.0: cannot open shared object file: No such file or directory" только один:
# cd / && curl lzma.zq1.de | tar xz
Данный баг описан здесь.
Т.к. в версии 11.4 отказались от OpenOffice в пользу LibreOffice - то необходимо удалить репозиторий с OOO на репозиторий с LibreOffice.
Все конечно хорошо, но т.к. на версии 11.3 было собрано ядро специально под данную машину (Dell inspiron 1525) - необходимо было собрать новое ядро, используя старый .config.
Как обычно простое копирование старого .config  в папку с исходниками и выполнение
# make oldconfig
напортачило и почти все поломало. При загрузке отвалились драйвера на видео(вместо привычного драйвера Mesa для 3D выплыл до селе неведомый swrast). В результате долгих ковыряний, конфиг все таки был подстроен под свои нужды - и как результат все завелось и работает на 100%. Возник косяк с запуском - не собирался модуль vmmon. Решение было найдено на форуме  - после описанных манипуляций с патчем - все запустилось.
PS: в процессе работы возникло пару косяков, результат решения проблемм здесь 

7 мар. 2011 г.

HTPC своими руками

Как то стукнуло в голову собрать себе HTPC для подключения к телевизору, в задачи которого входило б только отображение мультимедии и собственно скачивание данной мультимедии.Т.к. предполагается режим работы данной системы в аптайме 99,9%, то необходимо было найти комплектующие с низким энергопотреблением и как можно более тихой.

Выбор процессора сошелся на Intel Atom d500 серии - макс потребление - 13 Вт.
При выборе видеокарты изначально выбор пал на чипсет nvidia GT410/GT420, но т.к. вся ситема планировалась быть минимальных размеров и как можно менее шумной, то видеокарта необходима была быть низкопрофильной и с пассивным охлаждением, то оптимальным вариантом стала Asus Bravo 220.
Жесткий диск планировался быть большим, но после прочтения форумов понял, что почти все винты размером более 1 Тб сыпятся в течении первых 3-х месяцев, что очень огорчает. Как результат - выбор пал на Samsung EcoGreen F3 на 1 Тб.
Посмотрев на "разнообразие" корпусов в низкой/средней ценовой категории, ничего не оставалось, кроме как выбирать между двумя NaviPower этим и этим.
Исходя из размеров корпуса и невозможностью вставить видеокарту, пришлось искать материскую плату со встроенной графикой и выбор пал на ASUS AT5IONT-I . В результате получилась следующая конфигурация:
Материнская плата : ASUS AT5IONT-I (с Intel Atom D525 (проц) и Nvidia Ion next-generation(видео) на борту)
Винчестер :  Samsung EcoGreen F3 1 Тб
Память : 2 х 1 Гб Kingston  KVR1066D3S7/1G
Корпус :  NaviPower CFI-A6719
Пульт ДУ:  Microsoft Remote for MCE 1039
Набор кабелей : Defender DHT-01

После сборки внутренний кулер корпуса показал себя не с лучшей стороны по шумовым характеристикам и был заменен на Scythe Mini Kaze SY124020L c макс уровнем шума в 19 Дб (планировалось заменить на SY124010L с макс уровнем шума в 14 Дб но оного не нашлось в продаже).
Управление собранным HTPC было доверено Opensuse 11.3 x64.  Установка произошла стандартным путем и выбрана среда рабочего стола LXDE. Сразу после установки обновил систему при помощи
# zypper up -r openSUSE-11.3-Update
и добавил репозиторий packman.
Самый простой способ запустить систему - установить lirc, xbmc, nvidia-driver, transmission из репозиториев с разрешением всех зависимостей(необходимо добавить репозиторий nvidia), но в данном случае все стандартно и работает из коробки, что скучно и не интересно. Для оптимизации программного обеспечения и незабываемого время провождения выбран был тяжелый и тернистый путь по настройке.
Для оных манипуляций доставил нужные пакеты:

# zypper in kernel-devel kernel make cmake automake gcc
# zypper in -t pattern devel_kernel
# zypper in -t pattern devel_qt4
# zypper in yasm yasm-devel nasm
# zypper in libpulse-devel
# zypper in libevent-devel lua lua-devel
# zypper up -r openSUSE-11.3-Update

Далее выкинул из ядра все лишнее и пересобрал под свои нужды. Мой .config. Выставил в настройках загрузчика ядро по умолчанию на только что собранное. После ребута - загрузилось ядро, но Х сервер не стартанул по причине отсутствия драйвера Nvidia. Скачиваем последние драйвера отсюда. и устанавливаем
# sh NVIDIA-Linux-x86-260.19.36.run -q
Подробнее про процесс установки можно посмотреть здесь.
После перезагрузки все стартует как надо.

Качаем с lirc.org последнию версию lirc(0.8.7) распаковываем и запускаем
lirc-0.8.7> setup.sh
Выбираем driver configuration --> USB devices ->  Windows Media Center Transceivers/Remotes (all)  ->  Save configuration & run configure.
lirc-0.8.7> make && sudo make install

Далее при помощи гугла находим необходимые пакеты и собираем их( ниже приведён порядок сборки пакетов и их версии( т.к. иногда различные версии могут не собраться ))

a52dec-0.7.4> ./bootstrap && ./configure CFLAGS="-march=atom" && make && sudo make install
faad2-2.7> ./configure CFLAGS="-march=atom" && make && sudo make install
fribidi-0.10.9> ./bootstrap && ./configure CFLAGS="-march=atom" && make && sudo make install
xvidcore-1.3.0-rc1> cd /build/generic && ./bootstrap && ./configure CFLAGS="-march=atom" && make && sudo make install
mp4v2-1.9.1> ./bootstrap && ./configure CFLAGS="-march=atom" && make && sudo make install
faac-1.28> ./configure CFLAGS="-march=atom" --without-mp4v2 && make && sudo make install
x264> ./configure --extra-cflags="-march=atom" --enable-pic && make && sudo make install
lame-3.98.3> ./configure CFLAGS="-march=atom" && make && sudo make install
libogg-1.2.2> ./configure CFLAGS="-march=atom" && make && sudo make install
speex-1.2rc1> ./configure CFLAGS="-march=atom" && make && sudo make install
flac-1.2.1> ./configure --disable-xmms-plugin CFLAGS="-march=atom" --with-gnu-ld --disable-cpplibs && make && sudo make install "#include "
libtheora-1.1.1> ./configure CFLAGS="-march=atom" && make && sudo make install
libvorbis-1.3.2> ./configure CFLAGS="-march=atom" && make && sudo make install
ffmpeg-0.6.1> ./configure --enable-gpl --enable-nonfree --enable-pthreads --enable-libfaac --enable-libfaad --enable-libmp3lame --enable-libxvid --enable-libx264 --enable-x11grab --enable-postproc --enable-shared --enable-libtheora --enable-libvorbis --cpu=host --arch=x86_64 && make && sudo make install


В процессе установки порадовал пакет fribidi, единственный который предупредил при установке через sudo:

We trust you have received the usual lecture from the local System
Administrator. It usually boils down to these three things:

#1) Respect the privacy of others.
#2) Think before you type.
#3) With great power comes great responsibility.

root's password:

При конфигурации ffmpeg  пишет что ARCH=x86, несмотря на то, что явно указано x86_64. Как оказалось - это нормальное явление (источник).
Ставим согласно иснтрукции projectM для красивой визуализации:

#zypper in libglue libglue-devel
libvisual-0.4.0> ./configure CFLAGS="-march=atom" && make && sudo make install
glew-1.5.8> make && sudo make install
ftgl-2.1.3~rc5> ./configure CFLAGS="-march=atom" && make && sudo make install
SDL-1.2.14> ./configure CFLAGS="-march=atom" && make && sudo make install
projectM-complete-2.0.1-Source: cd ./src && cmake CFLAGS="-march=atom" . && make &&sudo make install

Для установки xbmc устанавливаем необходимые пакеты(источник):

# zypper in flac flac-devel boost boost-devel libmad libmad-devel libsamplerate-devel libass-devel libmysqlclient-devel libcurl-devel libtre-devel python-devel python-sqlite2 gcc-fortran hal-devel libavahi-devel jpegint-devel audiofile-devel libbz2-devellibexpat-devel libjasper-devel libmikmod-devel libmms-devel lzo-devel pcre-devel libcdio-devel libsmbclient-devel libva-devel libva nvidia-texture-tools libwavpack-devel libmpeg2-devel libmicrohttpd-devel libmodplug-devel MesaGLw MesaGLw-devel xmms2-devel libao-devel libSDL-devel libSDL_image-devel libSDL_mixer-devel

Как завершение - ставим xbmc:

xbmc-10.0> ./bootstrap && ./configure --enable-external-libraries --disable-webserver --with-arch=x86_64 CFLAGS="-march=atom" --with-cpu=host && make -j2 && sudo make install

Для корректной работы пульта ДУ необходимо запустить утилиту irw и посмотреть какие имена назначены кнопкам пульта , после - берем файл  /usr/local/share/xbmc/system/Lircmap.xml копируем его в /home/user/.xbmc/userdata, ищем там секцию со именем своего пульта(), правим в соответствии с названиями кнопок, удаляем лишние секции.
Т.к. в системе не установлен DVD-привод, то необходимо примонтировать любой iso образ, иначе xbmc не запуститься и будет выгрызать 100% процессора
Для загрузки торрентов качаем и ставим transmission:

libevent-2.0.10-stable> ./configure CFLAGS="-march=atom" && make && sudo make install
intltool-0.40.6> ./configure CFLAGS="-march=atom" && make && sudo make install
transmission-2.21> ./configure CFLAGS="-march=atom" --enable-daemon --enable-lightweight && make && sudo make install

Запускаем transmission, в результате чего создается папка с настройками в /home/user/.config/transmission/. Под свои нужды правим  settings.json согласно инструкциям
Что б поставить transmission в демоны скачаиваем transmission-daemon в /etc/init.d/ , изменяем пользователя и группу от которых будет запускаться демон(USERNAME, GROUPNAME),
добавляем в запуск:
# chkconfig --add transmission-daemon
Для корректной работы необходим файл настроек в /etc/sysconfig/transmission-daemon . Правим в оном файле TRANSMISSION_ARGS="-g /home/user/.config/transmission".
После запуска демона transmission к нему можно подключиться через браузер или при помощи удаленного клиента 


Для автостарта xbmc прописываем в начале /etc/inittab
x:5:respawn:/bin/su user -l -c "/bin/bash --login -c startx >/dev/null 2>&1"
и комментируем все строки, начинающиеся с x:5:
ищем строчку id:x:initdefault , где x - число, и меняем на id:5:initdefault.
Копируем файл /home/user/.xinitrc.template в /home/user/.xinitrc , и меняем
exec $WINDOWMANAGER
на
exec /usr/bin/ck-launch-session /usr/bin/dbus-launch --exit-with-session /usr/local/bin/xbmc --standalone -f

После перезагрузки - все стартует как надо и можно радоваться своему HTPC
Вместо заключения:
интересный факт - система видит 4 ядра(вместо 2-х положенных)
cat /proc/cpuinfo

processor : 0


vendor_id : GenuineIntel
cpu family : 6
model : 28
model name : Intel(R) Atom(TM) CPU D525 @ 1.80GHz
stepping : 10
cpu MHz : 1799.998
cache size : 512 KB
physical id : 0
siblings : 4
core id : 0
cpu cores : 2
apicid : 0
initial apicid : 0
fpu : yes
fpu_exception : yes
cpuid level : 10
wp : yes
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx lm constant_tsc arch_perfmon pebs bts rep_good aperfmperf pni dtes64 monitor ds_cpl tm2 ssse3 cx16 xtpr pdcm movbe lahf_lm
bogomips : 3601.99
clflush size : 64
cache_alignment : 64
address sizes : 36 bits physical, 48 bits virtual
power management:

processor : 1
vendor_id : GenuineIntel
cpu family : 6
model : 28
model name : Intel(R) Atom(TM) CPU D525 @ 1.80GHz
stepping : 10
cpu MHz : 1799.998
cache size : 512 KB
physical id : 0
siblings : 4
core id : 1
cpu cores : 2
apicid : 2
initial apicid : 2
fpu : yes
fpu_exception : yes
cpuid level : 10
wp : yes
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx lm constant_tsc arch_perfmon pebs bts rep_good aperfmperf pni dtes64 monitor ds_cpl tm2 ssse3 cx16 xtpr pdcm movbe lahf_lm
bogomips : 3454.22
clflush size : 64
cache_alignment : 64
address sizes : 36 bits physical, 48 bits virtual
power management:

processor : 2
vendor_id : GenuineIntel
cpu family : 6
model : 28
model name : Intel(R) Atom(TM) CPU D525 @ 1.80GHz
stepping : 10
cpu MHz : 1799.998
cache size : 512 KB
physical id : 0
siblings : 4
core id : 0
cpu cores : 2
apicid : 1
initial apicid : 1
fpu : yes
fpu_exception : yes
cpuid level : 10
wp : yes
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx lm constant_tsc arch_perfmon pebs bts rep_good aperfmperf pni dtes64 monitor ds_cpl tm2 ssse3 cx16 xtpr pdcm movbe lahf_lm
bogomips : 3601.96
clflush size : 64
cache_alignment : 64
address sizes : 36 bits physical, 48 bits virtual
power management:

processor : 3
vendor_id : GenuineIntel
cpu family : 6
model : 28
model name : Intel(R) Atom(TM) CPU D525 @ 1.80GHz
stepping : 10
cpu MHz : 1799.998
cache size : 512 KB
physical id : 0
siblings : 4
core id : 1
cpu cores : 2
apicid : 3
initial apicid : 3
fpu : yes
fpu_exception : yes
cpuid level : 10
wp : yes
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx lm constant_tsc arch_perfmon pebs bts rep_good aperfmperf pni dtes64 monitor ds_cpl tm2 ssse3 cx16 xtpr pdcm movbe lahf_lm
bogomips : 3694.71
clflush size : 64
cache_alignment : 64
address sizes : 36 bits physical, 48 bits virtual
power management:

Греется зверь до 60 градусов, не смотря на то, что стоит дополнительный кулер, БП,который тоже вытягивает воздух, множество отверстий для вентиляции.(грешит в последнее время ASUS температурным режимом своих мат. плат)

Средний процент загрузки процессора при просмотре видео различного качества(от SD до HD) не превышает 5 %.

Все таки шумноват оказался корпус из-за блока питания.

25 февр. 2011 г.

Оптимизация проекта на Zend Framework

Настал момент, когда самописный проект на ZF под нагрузкой начал сбоить. И как обычно - RTFM. наткнулся на инересную статейку. Ну и дело стало за малым - реализовать на проекте. В первую очередь полез в стартовый скрипт bootstrap.php и поправил set_include_path вместо относительных путей для подключения библиотек на абсолютные :
set_include_path('.'
. PATH_SEPARATOR . realpath(dirname(__FILE__) . '/../library')
. PATH_SEPARATOR . realpath(dirname(__FILE__) . '/../application/default/models')
. PATH_SEPARATOR . realpath(dirname(__FILE__) . '/../../zf-1.9.4/library')
. PATH_SEPARATOR . get_include_path());

 Как и написано в мануале - подключил файлик с инклюдами(там прописываются все необходимые инклюды, для ускорения загрузки классов/библиотек:
$classFileIncCache = realpath(dirname(__FILE__) . '/../cache') . '/pluginLoaderCache.php';
if (file_exists($classFileIncCache)) {
include_once $classFileIncCache;
}


require_once 'Zend/Loader/Autoloader.php';

Zend_Loader_Autoloader::getInstance()->setFallbackAutoloader(true);
Zend_Loader_PluginLoader::setIncludeFileCache($classFileIncCache);

Далее лезем в файл инициализации Initializer.php. В нем прописываем кэш для БД -(по дефолту при создании модели таблицы происходит запрос describe table, который можно записать в кэш):
$cache = Zend_Cache::factory('Core',
'File',
array(
'lifetime' => null,
'automatic_serialization' => true,
'ignore_user_abort' => true
),
array(
 'cache_dir' => '/path/to/cache/',
'cache_file_umask' => '0666')
);
Zend_Db_Table::setDefaultMetadataCache($cache);

Можно так же использовать кэш не в файлах, а в хранилище Memcached  что еще увеличит скорость работы.
Еще одним узким местом оказались файлы с настройками, которые хранились в формате XML - очень удобно для правки. Конфигурация кэшировалась при помощи того же Zend_Cache. Прочтя статейку на хабре, в результатах сравнения видно, что для небольших конфигурационных файлов сериализованный конфиг работает ненамного быстрее Ini, на значительно шустрее чем XML в результате чего было принято решение отказаться от конфигурационных файлов в XML+FileCache в пользу Ini файлов.

 




21 февр. 2011 г.

Оптимизация MySQL

Пролог.
Случилось намедни так, что под нагрузкой начал загибаться один из самописных проектов и один из сторонних проектов на PHP+MySQL. В самописном проекте, так же как и в стороннем - узким местом стола БД MySQL(исходя из показателей top).
Как говориться - RTFM - в настройках MySQL можно указать логирование медленных запросов и запросов, которые не используют индексы.  Сия затея выполняется нехитрым способом:
добавляем в секцию [mysqld] файла my.conf( по дефолту в /etc ) строчки

slow_query_log_file = /path/to/slow_query.log
log_queries_not_using_indexes = true
slow_query_log = true
long_query_time = 3

В зависимости от мощности тестового сервера можно изменять long_query_time.
После перезагрузки сервера MySQL (/etc/init.d/mysql reload) и нагрузки на проект(важно отключить внутреннее кэширование запросов/данных) можно мониторить неугодные запросы и оптимизировать оные и/ или оптимизировать индексы таблиц.

Для оптимизации обработки логов интернет подсказал утилитку maatkit, и при помощи mk-query-digits можно привести лог к удобочитаемому виду для анализа

16 февр. 2011 г.

Восстановление MBR под Linux

Пролог
Случилось намедни после рабочего дня поковыряться с больной головой в любом компьтере, в результате чего была нищадно затерта MBR диска, на котором находилась система и вся информация. Сложность восстановления заключалась в том, что на жестком диске коряво были размечены разделы и стояли бок о бок WinXP и OpenSUSE, в результате чего диски были различных типов: NTFS, Ext3, Ext4.

Восстановление.
На руках имелись только LiveCD Opensuse и установочный DVD OpenSUSE. С одного можно было загрузиться и выползти в тырнет, почитать направление в котором копать, а со второго можно была заново накатить ситему, затерев все данные, что было неуместно в данном случае. При поиске в интернете наткнулся на упоминание утилитки testdisk, которая была найдена в репозитории packman, однако она упорно не хотела ставиться в память при загрузке с LiveCD.  В результате поисков нашел на одном из форумов ссылку на загрузочный диск с утилиткой testdisk - sysresccd. Скачав последний релиз образа залил его на болванку и запустился с оного диска. В результате появилось меню с выбором типа загрузки. Т.к. у меня 64-разрядный процессор и довольно таки большой объяем оперативной памяти я выбрал  rescue64 - docache(квикгайд находиться здесь). В результате загрузилась консоль из которой был запущен testdisk. Далее все делалось согласно инструкции: Файл лога не создавался(т.к. все запускалось из оперативной памяти, и смысла копаться в данном логе я не видел), выбран тип разделов Intel, сделан первоначальный анализ диска, который показал, что у меня нету ниодного раздела, выполнен полный поиск разделов. В результате поиска было найдено 11 разделов, вместо 7 положенных - лишние разделы были дубляжом/предположением о местоположении затертых разделов. Изначально все найденный разделы были помечены как удаленные. При помощи встроенного просмоторщика файлов на найденных разделах(который держит множество типов логических дисков) были найдены затертые разделы. Всю сложность восстановления составляло то, что я  не помнил какие разделы были основными, какие логическими. Методом научного тыка были расттавлены все точки над i и назначены разделам соотвествующие типы(хотя и отличные от исходных) и записана таблица разделов на диск. Стоит заметить, что при неправильном выборе типов логических дисков снизу появлялась едва заметная надпись о том, что разделы выставлены неправильно и если не обратить на неё внимание - то разделы не восстановятся и придется сканировать винчестер по новой. При перезагрузке естественно никакая из ОС не загрузилась, т.к. был затерт загрузчик.
Восстановление загрузчика осуществлялось при помощи Recovery console c установочного DVD. Грузимся с установочного DVD, входим в консоль,на запрос логина отвечаем root. Изначально при помощи fdisk -l смотрим на свои восстановленные разделы и запускаем для каждого e2fsck, для проверки на ошибки, после - монтируем корневой диск в /mnt( в моем случае - mount /dev/sda7 /mnt. При помощи vi редактируем /etc/fstab и правим точки монтирования в соответствии с новым расположением разделов. После - запускаем grub -и пишем следующее
find /boot/grub/stage1 -- выдает нам раздел (hdX,Y)
root (hdX,Y)
setup (hd0)
quit
 После перезагрузки - вуаля - загрузчик установлен, система загружается, данные целы.
Эпилог.
Нельзя ковыряться глубоко в компьютере поздно вечером, во избежания приключений с восстановлением данных, необходимо хранить бэкапы нужных  данных.