Архив

Архив раздела ‘Программирование’

Использование NeroAAC для кодирования под Linux

26 февраля 2012 Нет комментариев

Те, кто сталкивался с кодированием видео для он-лайна на своих серверах под Linux наверняка в курсе, что средства FFMPEG для кодирования звука в AAC, а именно библиотека libfaac дает ужасное качество на низких битрейтах. Работа над ней была заброшена несколько лет назад и она не поддерживает профиль HE. Ища выход из сложившейся ситуации оказалось, что все не так плохо и для этих целей можно использовать neroAAC (само собой только для личных целей, читайте лицензию ^_^), который дает потрясающие результаты даже для битрейтов вроде 32кбпс.

1) Качаем последнюю версию отсюда: http://www.nero.com/eng/release-notes-nerodigital-nero-aac-codec.html
2) Находим в архиве linux/neroAacEnc и копируем на сервер
3) Устанавливаем: install –D –m755 linux/neroAacEnc /usr/bin/

Предположим раньше мы кодировали так:
/usr/bin/ffmpeg -i "input.mp4" -pass 1 -vcodec libx264 –vpre hq -f mp4 -b 400k -bt 400k -an "tmp.mp4"
/usr/bin/ffmpeg -i "input.mp4" -pass 2 -vcodec libx264 –vpre hq -f mp4 -b 400k -bt 400k -acodec libfaac -ab 128k -ac 2 -async 1 "tmp2.mp4"
/usr/bin/qt-faststart "tmp2.mp4" "out.mp4"

Теперь это будет выглядеть так:
/usr/bin/ffmpeg -i "input.mp4" -pass 1 -vcodec libx264 –vpre hq -f mp4 -b 400k -bt 400k -an "tmp.mp4"
/usr/bin/ffmpeg -i "input.mp4" -pass 2 -vcodec libx264 –vpre hq -f mp4 -b 400k -bt 400k -an "tmp2.mp4"
/usr/bin/ffmpeg -i "input.mp4" -acodec pcm_s16le -vn "audio1.wav"
/usr/bin/neroAacEnc -br 65536 -2pass -if "audio1.wav" -of "audio1.aac"
/usr/bin/ffmpeg -i "input.mp4" -i "audio1.aac" -acodec copy -vcodec copy -f mp4 "tmp3.mp4"
/usr/bin/qt-faststart "tmp3.mp4" "out.mp4"

Пояснения построчно:
1) Первый проход кодирования видео (без звука)

2) Второй проход кодирования видео (без звука)

3) Вытаскиваем звуковую дорожку из видео в несжатом виде

4) Кодируем звуковую дорожку в AAC-формат

5) Собираем звук и видео в единый файл без перекодирования

6) Переносим метаданные в начало файла

Profit!

Решение проблемы в MediaWiki с большими категориями (Large Categories)

15 февраля 2011 Нет комментариев

На одном из проектов используется движок MediaWiki. В некоторых особенно больших категориях находится до 40000 статей. После обновления до версии 1.16 было обнаружено, что при заходе на страничку с листингом категории. SQL запрос выполняется более 30 секунд (на не самом медленном сервере).

Пришлось искать решение, но в открытых источниках оно так и не было найдено, так что я посмотрел, как это было сделано в старых версиях движка. Итак, критическое место:
Читать далее…

Оптимизация форума PHPBB2 под большую нагрузку (Highload)

6 января 2011 4 комментария

Достался на поруки большой форум, построенный на базе PHPBB2. Я в курсе, что двигло старое и надо бы заменить, но предыдущий админ предупредил, что они уже пытались переехать на phpBB3 и это привело к диким тормозам и им пришлось съехать обратно. В довесок на самом форуме навешано много всяких МОДов, часть функционала которых отсутствует в 3 версии. Поэтому пока сидим на старом движке. И поскольку он больше не поддерживается и обновлений не предвидится, то я ручками ковыряюсь в исходниках.

Итак, форум, посещаемость около 30000 хостов в день и около 200К просмотров в день. В базе данных около 5 миллионов записей. БД весит около 3.5 Гбайт. Самая большая таблица с записями 3 Гбайта (не в последнюю очередь из-за индекса). В он-лайне постоянно от 300 до 700 человек. На форуме уже был установлен МОД Extreme Styles (и насколько я понял он серьезно снижает нагрузку), который кэширует шаблоны. Дополнительно на сервере были установлены ускорители eAccelerator и ZEND для PHP. Все эти действия привели к тому, что сам PHP и Apache не съедают много ресурсов. В данный момент главное узкое место – жесткие диски (обычные SATA), часть операций из-за размера БД неизбежно выполняется с использованием винчестера. В данный момент рассматриваем возможность переезда на другой сервер с SAS дисками. Текущий выделенный сервер, в общем, справляется с нагрузкой, но иногда в моменты пиковых нагрузок таблицы переходят в состояние «locked» и другие пользователи вынуждены подолгу ждать своей очереди, а то и вовсе получают сообщение об ошибке. Форум постоянно растет (за пол года +10К хостов в день) и вопрос переезда становится все актуальнее. А пока было время, я занимался оптимизацией.

Читать далее…

Ошибка с комментарием к другому посту в WordPress

12 апреля 2010 Нет комментариев

Словил забавный баг в WordPress. При комментировании любого поста, коммент оставлялся к рандомному посту на сайте. Исследование пациента показало, что код для генерации комментариев содержит использование глобальной переменной $id. Естественно во время правки кода шаблонов и не зная, об этой особенности, я неоднократно использовал переменную с таким же именем.

Кому пришло в голову использовать в качестве глобальной, такую часто встречаемую переменную ума не приложу. =)

Автоматическое создание Torrent’ов для раздачи файлов на вебсервере Apache + MySQL + PHP

1 марта 2010 32 комментария

Столкнулся с тем, что на одном из моих сайтов трафик по файлам серьезно вырос с ростом посещаемости ресурса. Файлов достаточно много, средний размер около 80 мб. После отключения файлового сервера за нагрузку и вынужденный переезд стал думать в сторону торрентов, что бы снизить прямую нагрузку на файловый сервер и даже иметь возможность какое-то время обходится без него в случае поломок и.т.д.

Одновременно с этим не хотелось зависеть от сторонних трекеров, которые иногда закрывают и при этом раздачу хотелось максимально автоматизировать. Для этих целей занялся поиском готовых исходников. Особенно долго искать не пришлось. Раздача состоит из трех компонент:

1) Трекер. Для моих целей не нужна регистрация пользователей и не нужен рейтинг, поэтому была взята простейшая его реализация, что бы можно было встроить в свой код. Вуаля трекер всего несколько килобайт веса с минимальным количеством кода, с которым легко разобраться и всего с одной таблицей в БД: OpenTracker. Правда пришлось его слегка переделать и сменить mysql_pconnect на mysql_connect. Что бы коннекты долго не оставались висячими и не достигался лимит подключений БД. Рекомендую ставить трекер на отдельную БД, в случае если нагрузка будет большой. Если вы установили OpenTracker В папку torrent на сервере, то ваш Announce URL для создания торрентов будет: http://yoursite.ru/torrent/announce.php

2) Когда у вас есть трекер хорошо бы автоматизировать создание торрент файлов. Мне удалось встроить это в админку с использованием свободного класса «Torrent RW». Использование класса не просто, а очень просто. Например, для создания торрента для заданного файла требуется 4 строчки:

$torrent = new Torrent( ‘./path-to-file-or-folder’, ‘ http://yoursite.ru/torrent/announce.php’ );
if ( ! $error = $torrent->error() ) // error method return the last error message
$torrent->save(‘test.torrent’); // save to disk
else
echo ‘DEBUG: ‘,$error;

3) Третий компонент это сидер который раздает первую копию файла. Третьим компонентом можете быть вы сами с домашнего компьютера. Если же хочется что бы и раздачу делал сервер, то для этого можно использовать PHP программу TorrentFlux. Ставится в несколько кликов на Web-сервер и управляется через браузер. Добавляете через веб-интерфейс торрент указываете файл и сервер сам раздает файлик. К сожалению мне не удалось сходу автоматизировать раздачу после создания торрента. Приходится делать это руками. Если вдруг кому удастся дайте знать. =)

Как работает поиск Яндекса?

27 сентября 2009 9 комментариев

После участия в конкурсе от Яндекса (Интернет математика) мне стал понятен алгоритм работы и ответы на всякие мелкие вопросы, вроде, почему апдейты проходили раз в несколько дней. Все очень просто.

У Яндекса есть группа асессоров – так называемых оценщиков релевантности документов. Они составляют список вида: страница – запрос – релевантность. В этом списке сотни тысяч страниц. Релевантность варьируется от значений совсем не релевантно (0), до полностью релевантно (5). Одновременно с этим у Яндекса для каждой страницы в интернете есть набор параметров (ВИЦ, и.т.д) и часть параметров которые можно рассчитать в процессе запроса (количество слов в запросе, частота запрошенных слов на странице). Всего таких параметров на конкурсе было 245 штук, что, скорее всего, недалеко от реального числа используемого Яндексом. По списку асессоров и набору параметров для каждой страницы из списка строится модель по «Методу опорных векторов». Построение модели довольно трудоемкий процесс. Например, во время конкурса, модель на сложных алгоритмах у меня дома строилась порядка суток и больше.

Читать далее…

Смена NS-Серверов в RU-CENTER

Как меня бесит следующее письмо от РУ-Центра:

Тестирование DNS-серверов для домена ‘………’ успешно
завершено. Новый список DNS-серверов для домена ‘………..’:
n1.sdfsdf.ru.
n2.sdfsdf.ru.

Изменения вступят в силу после очередного обновления информации в зоне RU.
Зона обновляется 4 раза в сутки: в 2, 10, 14, 19 часов.

В итоге переезд сайта занимает несколько часов, потомучто проходит нехилое время
от изменения до тестирования и ещё более не хилое время до одной из этих дат. Для
посещаемого сайта это немалая потеря информации.

Как-то менял NS-сервера для COM домена зарегенного на Godaddy. Весь процесс переезда
занял 3 минуты.

Доколе? =)

Для программистов, любящих задачки:

http://company.yandex.ru/grant/2009/datasets

Ещё про Google

30 июля 2008 2 комментария

Интересная статистика.

Прошло квалификацию всего 6773 человека. Больше всего из Индии (1019), США (950) и Китая (857), Россия (373) на четвертом.

Закончился первый раунд. Во второй прошло чуть больше 2500 человек. Распределение прошедших по странам можно посмотреть здесь. Больше всего осталось в строю участников из Китая (440), США (301) и России (227). Индусов осталось 180, как и предполагалось. =))

Google CodeJam

Прошел в следующий тур с первой попытки, но, что называется со скрипом, аж с 500 места. Двух часов мне без тренировки не хватает, идея по решению приходит быстро, но пока её закодишь уже время начинает поджимать. Единственное утешает, что судя по всему Round1B был самым сложным.

Code Jam 2008

18 июля 2008 4 комментария

Прошел в следующий тур Google Code Jam. Задачки были довольно простые. Решил две задачи из трех, хотя хватило бы и одной полностью решенной. Вторую решал для подстраховки. Третья задача хоть и была полностью понятной, могла взорвать мозг своей геометрической составляющей, так что на неё я забил. =) Кстати для неё можно было просто формулу придумать или всё-таки без циклов не обойтись?

Администрирование MySQL

Вопрос возможно дурацкий, но поиск в интернете не дал нужного результата. Есть MySQL БД в ней много пользователей и таблиц. У меня есть админский доступ к консоли через mysql и mysqladmin. Как можно посмотреть или сгенерировать срез (к примеру за час) кто из пользователей БД создает максимальную нагрузку? Ну и дополнительно какая таблица и какой тип запросов наиболее критичны?

Буду признателен за помощь.

Маленькое местное соревнование

25 апреля 2008 6 комментариев

Ходил на турнир по программированию (давал анонс о нем в профильных комьюнити) и выиграл. Проводилось всё по стандартной ACM’овской системе. Последнюю, четвертую задачу сдал на 39 минуте и сорвал интригу конкурса. Организаторы хотели объявить победителей на церемонии награждения. Что ж второе и третье место на момент моего ухода были свободны. Главная проблема отсутствия конкуренции, малое количество участников и слишком легкие задачи, без финального гроба. Если бы там был хоть кто-нибудь из реальных участников ACM, то соревнование превратилось бы в соревнование на скорость кодинга. Из плюсов мне дадут приз и грамоту, из минусов надо будет ехать на московский тур.

ZCon 2008. Заметки

28 марта 2008 6 комментариев

На соревновании по программированию собрались просто монстры. =) Ломают вот эту капчу:

http://zcontest.ru/2008.02/crimage/create.php

с более чем 70%-ной вероятностью…

Турнир этого года

Новость специально для программистов среди моих френдов.

15 марта в 2 часа ночи по МСК стартует турнир ZCon 2008. Задачи совместно с fdo_eq я готовил долго и тщательно, так что должно быть интересно. На данный момент доступна тестовая задача, что бы потренироваться: http://www.spoj.pl/ZEL08/problems/ZTEST/