2014-05-23

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

Появилась задача - обеспечить каждому сотруднику возможность посмотреть проходящую видеоконференцию. Так как количество сотрудников однозначно превышало количество лицензий Codian на подключение - пришлось собрать на коленке рестримилку.

Рестрим

В качестве софта был взят vlc под linux, экспериментальным путем запущенный вот с такими параметрами:

vlc -vvv rtsp://codian_server/conf_h264_g711u_256000__Supaconf \
 --sout "#transcode{\
threads=6,\
vcodec=h264,\
vb=1024,\
scale=0,\
acodec=mp4a,\
ab=64,\
channels=2,\
samplerate=44100,\
venc=x264{preset=ultrafast,aud,profile=baseline,level=30,keyint=30,ref=1}\
}:http{mux=flv,dst=:8080/stream}" --sout-keep

Данный вариант запускает на рестрим, доступный по адресу: http://рестримилка:8080/stream. Стрим вещается с кодеками h264/aac в контейнере flv и понимается онлайн-плеером Video.js (http://www.videojs.com/), который можно поставить прямо на рестримящий сервер. Для воспроизведения потребуется IE не менее 9го или любой другой современный браузер. Ну или можно использовать тот же самый VLC на клиентских компах, а лучше - портабельный (полностью распакованный) vlc на сетевой шаре с ярлыком, в котором прописан путь к рестриму.

Такой вариант рестримилки в моем случае при шести ядрах тянул  300 подключений не напрягаясь - загрузка процессора не превышала 20%. Однако трафик, поэтому...

Балансировка нагрузки

Еще более наколеночное и тупое решение - поднять пару серверов, которые будут захватывать стрим с основного рестримящего сервера и отдавать его без перекодировки. 

!#/bin/sh
while true; do 
/usr/bin/vlc --play-and-exit  \
-vvv http://restream-root-server:8080/stream \
--sout "#standard{access=http,mux=flv,dst=:8080/stream}" 
sleep 2
done

Этот скрипт будет пытаться достучаться до рестримящего сервера и подхватить поток. Когда поток подхватится - vlc начнет его рестрим (тот же адрес - :8080/stream) В случае прерывания потока vlc схлопнется и продолжатся попытки нащупать поток.

Подняв 2 или сколько потребуется серверов, добавляем все их в DNS с одним именем, получив примитивную Round Robin балансировку. Также для каждой такой DNS-записи следует указать небольшое время кэширования на клиентах - TTL (в Windows для этого нужно включить Advanced-режим отображения: View - Advanced).

После этого настраиваем клиентский плеер на адрес http://общий_адрес:8080/stream 

2014-05-19

Нарезка PDF-файла по координатам на куски в Linux

Занялся переносом карточной игры "Cards Against Humanity" в симулятор настольных игр.  Сеты карт для этой игры распространяются бесплатно в PDF-формате, в том числе существует и неофициальный перевод карт на русский. В обычной жизни предполагается возможность распечатать и нарезать колоду, мне же стало необходимо получить индивидуальные картинки карт.

Как можно видеть, исходный файл достаточно ровно сверстан, поэтому логично было бы попробовать автоматизировать его нарезку.


Для начала нам потребуется утилита cpdf, взять ее можно тут: https://github.com/coherentgraphics/cpdf-binaries

Вырезка кусочка PDF по его координатам осуществляется командой:
cpdf -crop "Xнач Yнач Xкон Yкон" input.pdf -o output.pdf, где:
Xнач и Yнач - начальная точка квадрата выделения (левая-нижняя)
Xкон Yкон - смещение до конечной точки квадрата выделения (правой-верхней)
при этом счет координат ведется от нижнего-левого угла листа.

Эта команда составит нам пдфник, каждая страница которого будет вырезкой из страницы оригинального файла.

Разумеется я подсчитал смещения по оси X и настрогал пдфников такой очень ленивой строчкой:
for i in {0..3}; do let "x=(14+($i*144))" ;  cpdf -crop "`echo $x` 29 134 134  " ~qiwichupa/Gotovaya_versia.pdf -o out_1_$i.pdf ; done;

В результате я получил 4 файла с картами с последней строки оригинала:
раз, два, три, четыре.

Тут лень взяла верх, и я повторил этот  однострочник еще 4 раза, вручную поменяв стартовую координату Y, примерно так:
for i in {0..3}; do let "x=(14+($i*144))" ;  cpdf -crop "`echo $x` 188 134 134  " ~qiwichupa/Gotovaya_versia.pdf -o out_2_$i.pdf ; done;

В итоге я получил 4*5=20 файлов, каждый из которых имел 1 карту на одной странице. Вагон ручной работы по нарезке избегнут! Дальше марафет.

Режу файлы на страницы, складывая их в отдельную папку: 
for i in ./*.pdf; do  cpdf -split $i -o ./pdf/$i-%%.pdf ; done;

Удаляю обрезки от первых двух и последней страниц:
rm ./pdf/*-0[12].pdf
rm ./pdf/*-30.pdf

Тут выяснилось что 100%-ный размер получившихся карточек маловат для конвертации в графику, поэтому пришлось увеличить его в 5 раз:
for i in ./pdf/*.pdf ; do cpdf -scale-page "5 5" $i -o $i.pdf; done ;

В результате получились такие прекрасные карточки. Осталось их сконвертировать в растр (png):
for i in ./pdf/*.pdf ; do convert $i  -flatten   -trim -sharpen 1x1.0 $i.png ; done ;

Вуаля - результат!

2014-05-08

Регулярное обслуживание сервера WSUS

Пару лет назад, при настройке сервера обновлений я столкнулся с постепенным распуханием баз данных сервера и связанным с этим падением производительности. В результате были разысканы скрипты, вычищающие устаревшие обновления (замененные микрософтом более актуальными версиями) и оптимизирующие базу данных. Теперь мне не нужно задаваться вопросом "как почистить базу WSUS?" - в планировщике задач висят два батника: WsusDBMaintenance.bat отрабатывает в ночь на каждое первое число, wsuscleanup.bat - в ночь на второе число.

Несколько замечаний:

  1. Все файлы из нижеприложенного архива должны лежать в папке C:\bin\, или придется поменять путь в батниках на актуальный.
  2. Задачи планировщика должны выполняться от администраторской учетки.
  3. В скрипте используется утилита sqlcmd из Microsoft® Command Line Utilities (в моем случае это были sqlncli2008R2_x64).
  4. Проверено на WSUS 3.2


bin.7z - Скачать

2014-05-06

SSH под Windows

Захотел поиметь в винде ssh.exe для понятных нужд. В сети на  скорую руку выгугливается только одно решение, поэтому позволю себе репостнуть:

"Чтобы запустить консольный OpenSSH клиент в Винде нужно поставить Cygwin, а так же пакеты zlib и openssh. Cygwin позволяет запускать линуксовые приложения под виндой. Я всегда довольно подозрительно отношусь к софту, который меняет поведение системы, поэтому собирал ssh не запуская инсталлятор Cygwin. (Для тех, кому не терпится — в конце есть все готовое, чтобы скачать.)

Для начала я сделал папку SSH в Program Files. На одном из этих сайтов я скачал пакеты cygwin, zlib, openssh, openssl и minires. Из них нужно в нашу папку SSH положить файлы: cygwin1.dll из пакета cygwin, cygz.dll из zlib, ssh.exe и ssh-keygen.exe из ssh, cygcrypto-0.9.8.dll из openssl, и cygminires.dll из minires. Дальше идем в настройки переменных окружения, в PATH прописываем путь к папке SSH, а так же создаем переменную HOME и так же прописываем путь к папке SSH. Хочу, однако, отметить, что HOME можно не указывать, тогда ищите папку .ssh в папке вашего юзера. Например C:/Users/CharnaD/.ssh. Все!"

(с) http://www.charnad.com/blog/ssh-pod-windows/


Для ленивых автор выложил готовый архив:  ssh_for_win.zip