29 Авг

Использование Sox

Просто заметка для себя, чтобы не забыть.

Необходимо было массово склеить пару тысяч звуковых файлов попарно. Делается это при помощи Sox достаточно просто.

Чтобы их склеить последовательно, то есть чтобы звуковые дорожки шли одна за другой пишем вот примерно так:

sox.exe filename1.wav filename2.wav result_filename.wav

Чтобы файлы замиксовать, то есть чтоб они проигрывались одновременно с самого начала, пишем так:

sox.exe -M filename1.wav filename2.wav result_filename.wav

Такие дела.

25 Авг

Формат даты OLE

В БД одной из программ, с которой мне довелось столкнуться, дата записывалась числом в следующем формате 42004.9492447917.
Сначала я немного не понял, потом поискал в интернете и всё понял.
В общем, это запись даты в формате OLE (так называемый OLE Automation Date или дата с плавающей точкой).

Логика переформатирования в обычную дату следующая:
число до запятой — количество дней, прошедших с полуночи 30 декабря 1899 года
число после запятой  — часть дня, которая прошла с его начала. То есть если в сутках у нас 86400 секунд, то полдень будет выражен числом 0.5, как-то так.

То есть, если нам нужно перекодировать число 42004.9492447917 в обычную дату, считаем, то получаем следующее:
42004 — это 42004-й день с 30 декабря 1899 года, то есть 01 января 2015 года
0.9492447917 — это количество секунд, которое прошло с 00:00 этого же дня, разделенное на общее количество секунд в сутках, то есть 0.9492447917*86400 = 82014 секунды, то есть 22 часа 46 минут 54 секунды.
В итоге получаем дату: 01.01.2015 22:46:54

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

Из OLE в стандартный формат:

def convert_time(t)
 puts Time.at((time.to_f - 25569) * 86400).utc
end

utc в конце необходим для того, чтобы вам выдалось время без поправки на вашу таймзону.
time.to_f — конвертируем входные данные в float
(time.to_f - 25569) — делаем началом отсчета 1 января 1970 года
((time.to_f - 25569) * 86400) — конвертируем дату в Unix time

Из стандартной даты в OLE:

def to_ole(t)
 Time.parse(t).to_f/86400 + 25569
end

Здесь изначально дата должна быть в любом подходящем формате и обязательно с указанием UTC, иначе скрипт будет прибавлять или отнимать к нужному времени количество часов для подгонки под локальное время.
Собственно всё.

08 Авг

Ошибка при установке Passenger

Каждый раз сталкиваюсь с этой проблемой и каждый раз забываю, в чём причина.
После установки Passenger и попытке запуска passenger-install-apache2-module выскакивает примерно следующая ошибка:
`method_missing': undefined method `this' for #<Gem::Specification:0x4db6d12 … бла-бла-бла
Код ошибки может отличаться и ситуация может быть другой.
Решение следующее:
достаточно выполнить следующую команду
gem update --system 2.4.8 --no-ri --no-rdoc

Этой командой мы апдейтим апдейтер до нужной нам версии.
Такие дела.