Оцифровка старых VHS кассет

Время идет и когда то привычные форматы хранения записей сейчас кажутся архаичными. Так и произошло когда собравшись выбросить свой старый VHS-магнитофон я обнаружил небольшой архив личных видео записей на VHS-C кассетах. Засунув их в видео камеру я с удивлением обнаружил, что видео камера за 10 лет простоя уже отказывается воспроизводить звук, а само качество видео становится все хуже.

Собравшись силами и терпением я решил оцифровать всю немногочисленную коллекцию VHS-C кассет. Чтобы все сделать в домашних условиях я воспользовался самым популярным решением, которое можно найти на прилавках китайских магазинов, а именно - EasyCap. А также адаптером c VHS-C на VHS кассеты.

EasyCap

Говоря о EasyCap, главное на что стоит обратить внимание при его выборе и покупке - это чип, на основе которого он сделан, мой оказался на китайском чипе Fushicai usbtv007 (EasyCap DC60++), что неприятно отразилось невозможностью использования программы захвата EasyCapViewer под OSX. Уже после покупки прочитав про разнообразие начинки данного класса устройств, самым оптимальным вариантом для покупки стало бы что-то на чипе Syntek или Somagic. В устройствах на этих чипах используется отдельный процессор для обработки звука, в отличии от usbtv007.

Захват с VHS

В случае с usbtv007 пришлось прибегнуть к компьютеру с Windows. Для захвата видео я использовал VirtualDub и кодек huffyuv. Про установку huffyuv под Windows 8 скажу сразу, что испробовал массу методов, а единственным удачным решением стал запуск командной строки от администратора и установив кодек используя команду:

%WINDIR%\syswow64\rundll32.exe setupapi.dll,InstallHinfSection DefaultInstall 0 c:\<путь_к_кодеку>\huffyuv.inf​

Для оцифровки я использовал один из многочисленных мануалов по захвату видео, а потому просто перечислю список плагинов VirtualDub которые были наложены на видео, для того чтобы VHS картина выглядела прилично:

Потратив не мало вечеров на захват видео в котором бы не было рассинхронизации видео и звука, на выходе у меня получился набор файлов размером от 10 до 20 GB каждый, в зависимости от времени кассеты.

Сжатие x264

Имея на каждую видеокассету по видеофайлу я воспользовался инструкцией по обработке и пересжатию видео. Используя программу MeGUI и кодек x264, после сжатия получились файлы приемлемых 700мб, на каждую кассету при разрешении 640х480.

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

Raspberry Pi - BMO

Уже около года я являюсь счастливым обладателем нескольких Raspberry Pi, а написать о том как я их использую в домашней обстановке все руки не доходили. Решил восполнить этот пробел и писать по одной заметке на каждую малину из тех, что есть у меня.

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

Raspberry Pi

Для своей будущей консоли я использовал:

  • Raspberry Pi Model B с корпусом Pibow
  • WiFi свисток Edimax EW-7811UN
  • Джойстик Classic USB Super Nintendo Controller for PC
  • SanDisk Ultra 8GB SDHC Class 10
  • Кабель AmazonBasics High-Speed HDMI Cable
  • Кабель miniUsb-USB
  • А также зарядник USB на 2А

Не вдаваясь в подробности первичной настройки упомяну лишь, что для своей игровой консоли я использовал классический дистрибутив Raspbian, и назвал ее сетевым именем BMO-Pi. Каждый из своих Raspberry Pi я называю героями из сериала Adventure Time.

Поискав подходящие платформы для эмуляции, я наткнулся на прекрасный набор RetroPie, представляющий собой коллекцию эмуляторов разнообразных классических консолей и игровых автоматов, таких как Atari, Game Boy, MAME, Sega Megadrive, NES и SNES.

Установка не вызывает никаких осложнений и подробная описана. Стоит лишь отметить, что установить данную коллекцию можно двумя различными способами. Первый заключается в полной компиляции, всех эмуляторов входящих в состав из исходных текстов, а второй использовать перекомпилированные версии.

Первый раз когда я делал эксперимент, я использовал полную компиляцию и был несколько шокирован тем, что полная компиляция на моем Raspberry Pi заняла чуть более 6 часов, когда же второй раз я использовал уже перекомпилированные версии, то установка заняла немногим более получаса. В завершении установки стоит отметить опцию позволяющую автоматически запускать RetroPie при загрузке системы, тем самым избежав необходимости использовать клавиатуру для запуска в случае перезагрузки. Все действия внутри RetroPie можно производить классическим джойстиком.

Raspberry Pi

Немного об играх и как они попадают на мою приставку. Самым очевидным было бы использование сетевого ресурса, но эту идею я отбросил так как нашел куда более изящный способ. Для этих целей я использовал программу BitTorrent Sync, представляющую собой прекрасное средство для синхронизации файлов между компьютерами. Использую инструкцию с сайта Хабрахабр я настроил на синхронизацию директорию в которой RetroPie ищет rom‘ы c играми.

Далее я установил BitTorrent Sync на своем основном компьютере и теперь для закидывания игр в свою игровую консоль мне достаточно просто закинуть их у себя в папку локально, а она уже автоматически синхронизируется с директорией на моей малине. Время поиграть =)

Настройка DKIM в Exim

DKIM (расшифровывается как DomainKeys Identified Mail) — метод идентификации письма по доменным ключам. DKIM настраивается на почтовом сервере для того, чтобы подписывать исходящие письма цифровой подписью.

Наличие такой подписи в заголовке отправленного письма сообщает серверу-получателю, что оно действительно было отправлено с указанного домена.

Устанавливаем необходимые пакеты в Ubuntu/Debian:

apt-get install opendkim-tools

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

mkdir /etc/exim4/dkim

Генерируем открытый и закрытый ключи для домена example.com.

opendkim-genkey -D /etc/exim4/dkim/ -d example.com -s mail

Эта команда создаст файлы etc/exim4/dkim/mail.private и /etc/exim4/dkim/mail.txt, с секретным и публичным ключами соответственно. Публичный ключ нужно добавить в соответствующую TXT запись домена example.com. Проверить что запись добавлена можно командой:

dig txt mail._domainkey.example.com

Переименовываем закрытый ключ, чтобы Exim мог его найти:

cd /etc/exim4/dkim/
mv mail.private example.com.key

Проставляем права на чтение файлов ключей:

chown -R Debian-exim:Debian-exim /etc/exim4/dkim/
chmod 640 /etc/exim4/dkim/*

В конфиг Exim /etc/exim4/exim4.conf.template или если он разделен, то /etc/exim4/conf.d/transport/30_exim4-config_remote_smtp пишем в л:

DKIM_DOMAIN = ${lc:${domain:$h_from:}}
DKIM_KEY_FILE = /etc/exim4/dkim/DKIM_DOMAIN.key
DKIM_PRIVATE_KEY = ${if exists{DKIM_KEY_FILE}{DKIM_KEY_FILE}{0}}
DKIM_SELECTOR = mail

Узнать какой тип конфига используется и перегенерить его можно командой:

/usr/sbin/update-exim4.conf -v

Все готово, осталось перезапустить.

/etc/init.d/exim4 restart

PSR-0/1/2. Русская версия

PSR – это аббревиатура от Proposing a Standards Recommendation (предлагаемые рекомендации стандартов), которые были разработаны группой PHP Framework Interoperability Group, известная как PHP-FIG. В число участников поддерживающих стандарты входят такие известные проекты как : phpBB, PEAR, Doctrine, Composer, Propel, CakePHP, Symfony, phpDocumentor, Zend и т.д.

На данный момент принято четыре стандарта, три из которых я решил перевести на русский язык:

  • PSR-0 Обязательные требования, которые должны соблюдаться в автозагрузчике.
  • PSR-1 Основной стандарт написания кода.
  • PSR-2 Руководство Оформления Кода.

Перевод еще местами сыроват, поэтому буду рад любым правкам, исправлениям и дополнениям.

Использование нескольких конфигураций Sphinx

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

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

Для универсального комбинатора конфигурационных файлов использую типичную *nix структуру директорий:

/etc/sphinx/
    conf.d/
        100-example-domain.ru
        200-example-domain-2.ru
        999-searchd
    sphinx-config.bash

Где conf.d - директория с симлинками на конфигурационные файлы для индексов, а содержимое файла sphinx-config.bash

#!/bin/bash

WORKDIR=`dirname $0`
CONFDIR="$WORKDIR/conf.d/"

LINE=$(seq -s "#" 70 | sed 's/[0-9]//g')

if [ ! -d "$CONFDIR" ]; then
  echo "# Path '$CONFDIR' is incorrect."
  exit 1
fi

for file in "${CONFDIR%?}"/*
do
  if [[ -f $file ]]; then
    FILENAME=$(basename "$file")

    echo -e "${LINE}\n# Include file ${FILENAME}\n${LINE}\n"
    cat "$file"
  fi
done

Далее просто запускаю демона Sphinx, используя в качестве конфигурационного файла sphinx-config.bash.

/usr/local/sphinx/bin/searchd --config /etc/sphinx/sphinx-config.bash

Готовую реализация залил на GitHub sphinx-config-combinator.