понедельник, 9 марта 2009 г.

Простой учет номера билда в MSVC++

0 коммент.
Казалось бы, такой удобный и наполненный фичам инструмент этот VS, а счетчика номера билда в нем нету. Есть для этого Add-in'ы, но они на Express-версию не ставятся. Задача -- сделать быстро и просто, и чтобы работало вне зависимости от версии MSVC. По аналогии можно потом прикрутить что-нибудь поинтереснее.
Итак, надо чтобы после каждого билда номер билда увеличивался на единицу. И этот номер пусть будет макросом BUILD_NUMBER в файле version.h. В настройках проекта, Build -> Post-build event пишется cscript incnum.js, а вот и сам incnum.js:

Здесь не используется более сложный подход (разбор содержимого в version.h и его перезапись) ради простоты и устойчивости к ошибкам. Потому что чуть что - и номер билда может быть потерян.

воскресенье, 25 января 2009 г.

Создание DVD из TS

0 коммент.
Записанные с спутника DVB-видео (формата TS), если их размер меньше, чем 720х576, можно легко преобразовать в DVD-совместимые MPG, и потом в DVD. Если в TS-файле нет никаких ошибок или пропусков, то можно его "перегнать напрямую", используя ffmpeg:
ffmpeg -i file.ts -acodec copy -vcodec copy file.vob
или MEncoder:
mencoder -oac copy -ovc copy -of mpeg -mpegopts \
format=dvd -o file.vob file.ts

Однако, если присутствуют ошибки в потоке, может произойти рассинхронизация, или еще что похуже. Для таких случаев существует ровно 3 инструмента:
VideoReDo [Win32]
Работает быстро и качественно. Имеет поддержку скриптования с помощью ActiveX. Платен.
replex
Работает быстро, но плохо. Режим Remux выдает DVD-совместимый MPEG, но при этом видео начинает как-то странно дергаться. Режим Demux выдает "битые" потоки. То есть либо звук, либо видео может кончиться на середине. Хорошо бы такие "битые" потоки как-то исправлять, т.е. находить, в каких местах поток кончается, и исправлять маркер конца на пустой кадр.
ProjectX
Очень странный инструмент, написанный на Java. Странный потому, что, во-первых, работает быстро, а во-вторых, может любой TS-файл разделить на видео и звук, попутно исправляя в них ошибки.
Чтобы получившиеся аудио- и видеопотоки свести вместе в один DVD-совместимый MPEG, лучше всего использовать mplex. И, чтобы не терять даром время, получившийся программный поток можно по конвейеру передавать dvdauthor:
mplex -f 8 -o - file.m2v file.m2a | dvdauthor -t - -o \
path_to_dvd

Только вот mplex не знает, что "-" - это stdout. Это легко исправить. Нужно в файле main.cpp (/mjpegtools-*/mplex) в функцию int FileOutputStream::Open() добавить:

Описанный выше вариант преобразования MPEG-TS в DVD - пока что единственный рабочий (с использованием фриварных и кроссплатформенных утилит).

четверг, 15 января 2009 г.

Массовый опрос сети

0 коммент.
Иногда бывает нужно найти все машины в сети, слушающие определенный порт TCP. Например, для того, чтобы запустить программу с MPICH (сам по себе MPICH не умеет находить машины). Все машины, на которых стоит и запущен MPICH, слушают один и тот же порт (8675 по умолчанию).
Для начала, нужно найти все машины в сети. Для этого рассылаются ICMP ECHO пакеты. Под *x это делается через сокеты, что требует прав рута. Одна из таких программ - fping. Она компилируется и под Win32 (cygwin, mingw), и тоже требует прав администратора.
Однако, под Win32 все намного проще. Есть специальный API для ICMP, не требующий особых прав. Можно написать что-то типа аналога fping. Вот кусок кода, взятый с АНТИЧАТ:


Вышеупомянутая утилита fping может принимать на вход список IP-адресов, и, сканируя их, выдавать только те, что доступны. Это удобно, и это стоит реализовать в нашем Win32-аналоге fping.
Кстати, Win32-вариант работает раз в 5 быстрее.

А теперь, когда есть список машин, можно к каждой пытаться соединиться на выбранный порт. Одновременно.


Данный скрипт под Win32 может выдать список адресов где-то за 5 секунд. И от ширины канала это особо не зависит.

Есть маленькое неудобство: адреса не сортированы. Если сортировать эти адреса как строки, то, например, адрес 192.168.1.11 будет идти раньше, чем 192.168.1.9. Чтобы не углубляться в преобразования адресов, можно просто сделать сортировку по числу после последней точки, то есть:


Очевидно, что если адреса будут отличаться на 2 разряда и больше, такой способ не пойдет.
 
Design by BloggerThemes | This template is brought to you by : allblogtools.com