Оцифровка старых 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.

Как записать ISO на USB из терминала OSX

Перед записью .iso или .img через консоль на USB лучше всего поставить pv, для отображения прогресс бара записи. При наличии Homebrew это просто сделать командой brew install pv. Приступаем к записи:

  1. Вставить USB флешку;

  2. Через терминал вывести список доступных дисков, выполнив команду:

     diskutil list
    
  3. Найти в списке USB флешку, обычно что-то вроде /dev/disk1;

  4. Отмонтировать все разделы на ней, выполнив команду:

     diskutil unmountDisk /dev/disk1
    
  5. Теперь время прожечь .iso или .img используя dd и pv, для этого к названию диска, из предыдущего шага, прибавляем в начале букву r (например disk1 → rdisk1) и выполняем команду:

     pv -ptre /path/to/image.iso | sudo dd bs=1m of=/dev/rdisk1
    
  6. После завершения необходимо извлечь USB флешку используя команду:

     diskutil eject /dev/disk1
    

Конвертация таблиц MySQL из MyISAM в InnoDB

Вот простой трюк для перевода всех MySQL MyISAM таблиц в таблицы InnoDB.

Сперва необходимо подготовить файл содержащий список SQL запросов на конвертацию каждой таблицы в отдельности. Это просто сделать выполнив следующий запрос (заменив your_database_name на имя базы):

/usr/bin/mysql --defaults-extra-file=/etc/mysql/debian.cnf --batch --skip-column-names -e "SELECT CONCAT('ALTER TABLE ',table_schema,'.',table_name,' engine=InnoDB;') FROM information_schema.tables WHERE TABLE_SCHEMA='your_database_name' AND ENGINE = 'MyISAM';" > myisam.txt

Получив таким образом список SQL запросов в файле myisam.txt, необходимо его выполнить используя команду:

/usr/bin/mysql --defaults-extra-file=/etc/mysql/debian.cnf your_database_name < myisam.txt

Как я готовлю Sublime Text 2 на OSX

Поводом к написанию этой статьи послужила вынужденная переустановка операционный системы с последующей ее настройкой. Все настройки моего любимого редактора Sublime Text 2 были потеряны безвозвратно.

Я уже пару раз писал об этом редакторе и предыдущие посты можно найти по тегу sublime. Не буду описывать плюсы и минусы этого редактора, статья не об этом, а потому без лишних слов начнем готовку.

Dev Build

Тут все просто. Первым делом стоит забыть про стабильную версию этого редактора и перейти на версию из dev канала. Изменения в этом канале появляются значительно чаще чем в стабильной версии, а значит и новый функционал можно посмотреть за пару недель до стабильного релиза. Для отчаянных экспериментаторов есть nightly build, который обновляется практически каждые несколько дней.

OS X Command Line

Не один редактор не может быть полноценным без cli. Для использования Sublime Text 2 из консоли на официальном сайте есть небольшая инструкция. У меня стоит Homebrew и поэтому не надо создавать лишнюю папку, а достаточно изменить симлинк путь ~/bin/subl на /usr/local/bin/subl полностью команда:

ln -s "/Applications/Sublime Text 2.app/Contents/SharedSupport/bin/subl" /usr/local/bin/subl

Теперь можно наслаждаться всеми прелестями cli, посмотреть список поддерживаемых команд можно набрав subl --help.

Replacement Icon

Для эстетов типа меня, которым не нравится стандартная иконка приложения, можно установить альтернативный вариант который мне приглянулся намного больше.

https://github.com/dmatarazzo/Sublime-Text-2-Icon

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

#!/bin/bash

# The direction this script is running in
THIS_DIR="$( cd -P "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"

cp "$THIS_DIR/Sublime Text 2.icns" "/Applications/Sublime Text 2.app/Contents/Resources/"
cp $THIS_DIR/Document\ Icons/*.icns "/Applications/Sublime Text 2.app/Contents/Resources/"

# Trickery to force icon replace
sudo find /private/var/folders/ -name com.apple.dock.iconcache -exec rm {} \; 2>/dev/null
killall -KILL Finder
killall -KILL Dock

Soda Theme

В дополнение к предыдущему пункту, я бы порекомендовал использовать альтернативную тему оформления окна - Soda Theme, она поставляется как в светлом так и в темном варианте. Все инструкции по установке можно найти в репозитории на Github.

https://github.com/buymeasoda/soda-theme

Plugins

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

Для установки большинства плагинов можно воспользоваться прекрасным плагином Sublime Package Control. Который позволяет автоматически устанавливать плагины и поддерживать их в актуальном состоянии.

Кроме того на Github можно обратить внимание на организацию Sublime Text Packages включающую в себя обширны список репозиториев с плагинами и сниппетами.

Spell check

По-умолчанию в редакторе присутствует поддержка англоязычной орфографии, а для добавления других языков можно воспользоваться соответствующей инструкцией. Если углубиться чуть более подробно, то Sublime не поддерживает словари в кодировках отличных от UTF-8, поэтому будем готовить свой словарь.

  1. Скачиваем словарь для русского языка c сайта OpenOffice
  2. Меняем расширение с .oxt на .zip и распаковываем полученный архив. Нас интересуют только 2 файла, для русского словаря это ru_RU.dic и ru_RU.aff
  3. В меню Sublime Text нажимаем Preferences → Browse Packages, создаем там папку Language - Russian и копируем файлы словарей в нее.
  4. Теперь словари необходимо сконвертировать в UTF-8. Открываем файл c расширением .aff и смотрим на первую строку, там будет что-то вроде SET KOI8-R. Значит словарь в кодировке KOI8-R, конвертируем любым удобным способом, я воспользовался утилитой iconv. После конвертирования необходимо открыть файл ru_RU.aff и заменить строку с кодировкой на SET UTF-8.
  5. Готовую UTF-8 версию русского словаря можно скачать по ссылке и просто установить.
  6. После всех этих манипуляций проверка русской орфографии появится соответствующим пунктов в меню View → Dictonary → Language - Russian.

Preferences.sublime-settings

Не секрет что Sublime Text 2 имеет много предустановленных настроек которые можно посмотреть в меню Preferences → Settings - Default, редактировать данный файл не рекомендуется в связи с тем что он будет перезаписан при следующем обновлении. Все свои настройки необходимо вынести в отдельный файл, Preferences → Settings - User. Напоследок я решил выложить свои настройки которые установлены у меня в этом файле.

{
    "tab_size": 4,
    "translate_tabs_to_spaces": true,
    "detect_indentation": false,
    "trim_trailing_white_space_on_save": true,
    "highlight_line": true,
    "ensure_newline_at_eof_on_save": true,
    "fallback_encoding": "Cyrillic (Windows 1251)",
    "highlight_modified_tabs": true,
    "open_files_in_new_window": false,
    "theme": "Soda Dark.sublime-theme"
}

Ребилд плеера AudioJS для Радио-Т

Некоторое время назад я делал форк плеера audio.js для проигрывания .gsm файлов. А теперь вот решил сделать еще один форк этого плеера но уже для сайта, популярного подкаста, Радио-Т.

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

audio.js Radio-T build

Скрипт уже работает на сайте подкаста Радио-Т, а исходный код и все инструкции по установке можно посмотреть и скачать на GitHub.

Отдача статики POST'ом в Nginx

Все знают о том что в Facebook’e есть iframe страницы, но не все знают что Facebook эти страницы запрашивает через POST, а не через GET, как делают все остальные. Поэтому все fb:iframe приложения запрашивая у Nginx’а страницы в ответ будут получать ошибку:

405 "Method Not Allowed"

Это легко игнорировать когда Nginx используется как прокси-сервер, но когда за ним ничего нет, то приходится извращаться и единственным решением оказалось проксирование запросов Nginx в Nginx но на другой порт. Сильно урезанный кусок конфига того как это можно реализовать для отдачи статического контента через POST.

upstream fb_static {
    server localhost:8001;
}

server {
    listen       443;
    server_name  _;

    error_page 405 =200 @405;

    location @405 {
        proxy_method GET;
        proxy_pass http://fb_static;
    }
}

server {
    listen 8001;
    server_name _;

    location / {
        root "/var/www/fb";
    }
}

После всех этих извращений страницы будут прекрасно отображаться в Facebook’е через fb:iframe. Но этот вариант то что называется overthinking, поэтому не без помощи Rpsl удалось найти намного более компактный вариант без необходимости проксирования запросов.

server {
    listen       443;
    server_name  _;

    error_page 405 = $uri;

    location / {
        root "/var/www/fb";
        try_files $uri $uri/index.html /404.html =404;
    }
}