20 Янв

Паттерны в Ruby. Шаблонный паттерн (Template)

Краткая вводная часть

Начал читать книгу «Design Patterns in Ruby» Russ’a Olsen’a по паттернам проектирования. Книга интересная, информация, несмотря на год выпуска книги, очень актуальная (что сказать, сами паттерны были выработаны еще в 1995 году и тоже актуальны).
В общем, решил сделать статью, а. скорее всего, даже цикл статей с пометками в основном для себя, что за паттерны такие, как их готовить и с чем их едят.
Насчет примеров кода — буду местами использовать примеры из книги, местами стараться писать свои примеры, если придумаю более наглядный и более понятный. Но как получится, на самом деле

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

Паттерн «Шаблон» (или Шаблонный паттерн)

«Шаблон» применяется в тех случаях, если нужны несколько разновидностей одной и той же сущности, к примеру, несколько видов отчетов (HTML, Plain Text, XML и т. д.). Либо, в качестве альтернативного примера, если вам нужно несколько разных отчетов с разной структурой в деталях, но глобальная структура, опять же, у них будет общая. Например вам необходимо два отчета с разным количеством столбцов, но глобальная структура этих отчетов все равно будет похожа: название отчета, вывод заголовков столбцов, вывод самих данных отчета, вывод итоговой/суммарной информации.

Читать далее
29 Дек

Настройка автоматического запуска puma при перезагрузке сервера

Для своих Rails-приложений я в последнее время использую связку puma+nginx. И достаточно продолжительное время я ленился настроить функционал автоматического старта приложений при ребуте сервера. Ну, типа, раз в месяц если он перезапустится, то и фиг с ним, вручную стартану. Благо, что особо критичных к простою проектов у меня нет (на самом деле есть, но там очень быстро мне сообщают о проблеме и я её очень быстро решал). Но надо что-то менять и я решил, что пришло то самое время.

Читать далее
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

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

05 Мар

Ruby-скрипт в cron

Для работы понадобилось как-то написать небольшой скриптик по парсингу XML-ки и поставить его на выполнение в крон каждый вечер. Сам скрипт написать не проблема. «Да и в крон поставить нефиг делать», — подумал я. Но не совсем.

Поставил в крон. Проверяю в назначенное время — не работает.

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

Не работает.

Смотрю логи — теперь не может загрузить Nokogiri. Мудился-мудился, искал варианты, витоге всё-таки нашел, в чем магия. Оказывается нужно было в крон прописать всякие системные переменные для рубей. Либо вручную, либо при помощи команды rvm cron setup.
Попробовал — наконец-то заработало!
Такие дела.