четверг, 21 марта 2013 г.

Зависания при загрузке последовательных портов


Однажды понадобилось проверить мультипортовую плату на компьютере. Ее установка потребовала ручную настройку последовательных портов с помощью команды setserial. Плата была проверена, удалена из компьютера и благополучно забыта. Однако после этого система стала зависать при старте, а именно при инициализации устройств ttyS1 и ttyS2 где-то на минуту. После долгих поисков выяснилось, что настройки инициализации могут находиться в одном из следующих мест:
Первого и третьего файла не оказалось на месте, зато присутствовал второй со следующими параметрами портов:
Таким образом, были отличия во втором и третьем порту. Стандартная настройка выглядит следующим образом:

 

Про использование команды setserial можно почитать здесь http://www.opennet.ru/man.shtml?topic=setserial&category=8&russian=0 (на русском)

суббота, 9 марта 2013 г.

Массовое обновление записей в Ruby on Rails

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

пятница, 18 января 2013 г.

Создание хешей с помощью Hash.new


Сначала о различиях синтаксиса в руби версии 1.8 и 1.9

Создание пустого хеша
Проблема с Hash.new в том, что нельзя хеш сразу заполнить значениями, как при первом способе. Для чего же тогда используется этот синтаксис? Ответ состоит в том, что с помощью Hash.new можно установить значение по умолчанию для несуществующих ключей.
Сравните это со следующим

Таким образом, хеши, созданные с помощью фигурных скобок, имеют значение по умолчанию nil.
В каких случаях удобно использовать Hash.new? Например, для возврата кодов HTTP
Теперь вместо nil возвращается :undefined, что выглядит более ясно.

понедельник, 14 января 2013 г.

Расширенный поиск в Sublime Text (поиск и замена табов, переводов строки и других спец символов)

Для поиска специальных символов в Sublime Text 2 предусмотрены регулярные выражения. Например, чтобы найти все символы табуляции в документе, достаточно нажать CTRL + F, затем следовать инструкции:


1 - Включаем поиск по регулярным выражениям
2 - Записываем регулярное выражение \t, под которое попадают все табы
3 - Нажимаем "Найти" или "Найти все" для выделения всего найденного.

Чтобы найти все перводы строк достаточно вбить \n в поиск по регулярным выражениям:

суббота, 12 января 2013 г.

Паттерны Ruby. Наблюдатель (Observer)

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

понедельник, 7 января 2013 г.

Паттерны Ruby. Паттерн стратегия.


Паттерн Шаблонный метод основан на наследовании, что не дает нам быть настолько гибкими, насколько мы хотим. Решением недостатков Шаблонного метода является паттерн стратегия (Strategy).
Почему бы вместо постоянного создания подклассов не изолировать только изменяющиеся кусочки кода в своих отдельных классах.


Диаграмма классов шаблона Стратегия

среда, 2 января 2013 г.

Паттерны Ruby. Шаблонный метод

Предполагается несколько статей, написанных на основе книги Design Patterns in Ruby. Первая из них будет о паттерне с названием Template Method (Шаблонный метод).
Шаблонный метод представляет собой один из простейших паттернов, описанных GoF (Gang of Four - Банда Четырех) в своей книге  Design Patterns: Elements of Reusable Object-Oriented Software.
Основная идея метода состоит в создании абстрактного класса, содержащего метод - "каркас" (или "шаблон"), который управляет поведением объекта, вызывая различные абстрактные методы. При этом ему не известно, что будут делать эти методы, т. е. локальное управление передается уже конкретным реализациям данного класса.
Диаграмма классов паттерна Шаблонный метод

суббота, 22 декабря 2012 г.

Развертывание Rails приложения на VPS (виртуальный частный сервер) Часть 1 - подготовка сервера


В первой части описывается подготовка сервера перед развертыванием Rails приложения.

Пример приведен с использованием Debian 7, в качестве СУБД использован PostgreSQL, в качестве сервера - Nginx.

Использовался хостинг clodo, в его VPS уже были установлены sudo, ssh сервер, vnc сервер и прочие мелочи, которые необходимо учитывать, если приложение выкатывается на голые железки.


Список команд:
- создание пользователя и добавление его в группы sudo и wheel
# adduser deployer
# usermod deployer -a -G wheel,sudo
- создание ключей для рута и пользователя
# ssh-keygen
$ ssh-keygen
- изменение /etc/apt/sources.list
deb http://cdn.debian.net/debian/ testing main contrib non-free
deb http://security.debian.org/ testing/updates main contrib non-free
- добавление скрипта add-apt-repository для добавления репозиториев необходимых программ:
# mv add-apt-repository.sh.txt /usr/sbin/add-apt-repository
# chmod o+x /usr/sbin/add-apt-repository
- добавления репозитория с Nginx, PostgreSQL и NodeJS
# add-apt-repository ppa:nginx/stable
# add-apt-repository ppa:pitti/postgresql
# add-apt-repository ppa:chris-lea/node.js
- обновление и установка nginx,  PostgreSQL, libpq-dev (для гема pg) и NodeJS
# aptitude update
# aptitude install nginx postgresql libpq-dev nodejs
- установка необходимых для rvm и руби пакетов
# apt-get install build-essential openssl libreadline6 libreadline6-dev curl git-core zlib1g zlib1g-dev libssl-dev libyaml-dev libsqlite3-dev sqlite3 libxml2-dev libxslt-dev autoconf libc6-dev ncurses-dev automake libtool bison subversion pkg-config
- установка rvm и руби для пользователя
$ \curl -L https://get.rvm.io | bash -s stable
$ source .bashrc
$ rvm install 1.9.3-head
- настройка PostgreSQL
# su postgres

postgres@177581-10001:/home/deployer$ psql  запускаем psql
postgres=# \password                        устанавливаем пароль на польователя postgres
Enter new password:                         пароль
Enter it again:                             подтверждение
postgres=# create user <имя пользователя бд> with password '<пароль>'; создаем пользователя для приложения, например, create user deployer with password 'secret';
CREATE ROLE 

среда, 19 декабря 2012 г.

Проблемы с запуском rabbitmq

После установки пакета rabbitmq (система сообщений), сервер отказался запускаться:

ERROR: epmd error for host "rs-mbp": address (unable to establish tcp connection)

Помогла запись в файле /etc/hosts:

arsen@arsen-pc:~$ cat /etc/hosts
127.0.0.1       localhost arsen-pc
192.168.0.63    arsen-pc

Т. е. присвоение имени машины адреса localhost

вторник, 18 декабря 2012 г.

Настройка Sublime Text 2


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

"copy_with_empty_selection": true| false нужно ли копировать пустое выделение (если честно, не знаю, кому это может пригодиться)
"ensure_newline_at_eof_on_save": true | false при сохранении вставлять в конец файла пустую строку (может быть полезно в программировании)
"font_face": "<fontname>" название шрифта, который будет использоваться  в редакторе. Если шрифта нет, то он будет сброшен на шрифт по умолчанию (в Windows будет Consolas, в Linux - Droid Sans). Для программирования советую использовать моноширные шрифты (с фиксированной шириной).  В последнее время появилось множество красивых и качественных моноширных шрифтов - Consolas (коммерческий, доступен бесплатно для Visual Studio), Droid Sans Mono (бесплатен), Ubuntu Mono (бесплатен), Inconsolata (бесплатен, не поддерживает кириллицу).


"highlight_line": true | false - выделение линии, на которой находится курсор
"margin": 0 - отступ области редактирования от номеров линий в пикселях
"overlay_scroll_bars": "system" | "enabled" | "disabled"   настройка полос прокрутки - использовать системные полосы, включить прозрачность и автоскрытие, отключить прозрачность и автоскрытие
"save_on_focus_lost": true | false включение или выключение автосохранения вкладок, потерявших фокус
"trim_trailing_white_space_on_save": true | false включить или выключить удаление лишних пробелов при сохранении
"translate_tabs_to_spaces": true | false преобразование символов табуляции в пробелы

Пример рабочей конфигурации, появляющийся по нажатию Preferences -> Settings - User

понедельник, 17 декабря 2012 г.

Установка гема RMagick

Gem Magick требует кучу дополнительных пакетов. Для его установки необходимо удовлетворить зависимости в виде:


После установки данных пакетов гем должен собраться без ошибок

суббота, 15 декабря 2012 г.

Java плагин для Firefox/Iceweasel

Для работы java апплетов в Iceweasel достаточно установить пакет icedtea
В Debian/Ubuntu достаточно выполнить команду
Все! Теперь у вас должны заработать java приложения на web страницах.

четверг, 13 декабря 2012 г.

Установка браузера по умолчанию из командной строки Debian/Ubuntu

Если есть необходимость сменить браузер по умолчанию из командной строки, можно поступить следующим образом:

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

суббота, 1 декабря 2012 г.

Автоформатирование html в Sublime Text 2

Допустим, мы скопировали кусок html из Firebug или просто просто открыли неформатированный html файл в Sublime Text. Привести html в презентабельный вид нам поможет пакет Tag (об установке менеджера пакетов можно почитать тут).
Достаточно вызывать меню команд (CTRL+SHIFT+P) и выбрать команду Tag: Auto-Format Tags On Document. После этого html будет аккуратно отформатирован в соответствии с настройками идентации.
Пример до и после:



пятница, 30 ноября 2012 г.

Установка плагинов (пакетов) в Sublime Text 2


Sublime Text 2 поддерживает установку плагинов (пакетов), значительно расширяющих функциональность редактора. Например, существуют плагины для подсветки и удаления лишних пробелов или изменения внешнего вида программы. Однако их установка сопряжена с трудностями в виде скачивания с github.com, распаковки в необходимую директорию и т. д.
Хорошую помощь в этом деле оказывает плагин Package Control, позволяющий автоматически устанавливать, обновлять и удалять пакеты:


Установка плагина очень проста:
 - Откройте консоль редактора, нажав CTRL + `
 - Вставьте туда следующую строку:

 - Перезагрузите редактор
 Теперь в меню команд (CTRL + SHIFT + P) вы найдете пункты Package control, с помощью которых можно управлять пакетами.
Основные команды:

суббота, 22 сентября 2012 г.

Низкая скорость записи на USB при использовании halevt

На системе не был установлен KDE (только иксы и awesome), поэтому возникала проблема монтрования USB флеш карт. Это было решено с помощью halevt - программы для автомонтирования флешек.
Но скорость записи при этом была мизерной (меньше мегабайта в секунду). Видимо, это происходило от того, что halevt все время синхронизирует записанные данные. Это можно отключить, исправив в конфиге /etc/halevt/halevt.xml строку:
 <halevt:Insertion exec="halevt-mount -u $hal.udi$ -o sync -m 002 -o gid=plugdev"/>

На ту же самую, только без опции sync:
<halevt:Insertion exec="halevt-mount -u $hal.udi$ -m 002 -o gid=plugdev"/>

пятница, 8 июня 2012 г.

Толкнуть локальную ветку в гит

Как толкнуть новую локальную ветку гита на удаленный репозиторий

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

git push origin plugin

Эта команда говорит гиту толкнуть изменения в репозиторий origin. Если в нем нет ветки plugin, она создается на лету.
Теперь допустим, что ваш друг Боб хочет получить доступ к новой фиче, которая находится в ветке plugin на удаленном репозитории. Все, что необходимо сделать Бобу - обновить его локальный репозиторий со всеми изменениями на удаленном и создать новую ветку, в которой он может поиграть с кодом:
git fetch origin
git checkout --track origin/plugin

Первая команда обновит репозиторий боба изменениями на удаленном репозитории. Вторая команда создаст локальную ветку с именем plugin, которая будет соответствовать ветке origin/plugin и дает возможность Бобу легко получать и отправлять изменения на GitHub.

Источник

пятница, 11 мая 2012 г.

Журнал Ruby on Rails

Серверный лог, отображающийся в development среде содержит много мусора - get запросы для assets файлов, предупреждения о неизвестной длине ответа и т. д.
Чтобы избавиться от журналирования запросов к assets достаточно добавить в Gemfile
gem 'quiet_assets', group: :development
и выполнить команду bundle

Предупреждения о неизвестной длине ответа приходят от WEBRick сервера. Таким образом, использовав, например, сервер thin в development среде, можно повысить читаемость логов:
gem 'thin', group: :development

понедельник, 7 мая 2012 г.

Установка словарей PostgreSql для русского полнотекстового поиска.

PostgreSQL имеет собственный полнотекстовый поиск, но в нем нет стемминга для русского языка.
Словари для русского можно достать здесь:
http://ftp5.gwdg.de/pub/openoffice/contrib/dictionaries/ru_RU-pack.zip
Внутри будет архив ru_RU.zip, из которого необходимо извлечь файлы ru_RU.dic и ru_RU.aff.
Словари в кодировке koi8, поэтому их следует преобразовать в UTF-8:


Теперь в консоли постгреса создадим конфигурацию для полнотекстового поиска:
Далее, если нужно чтобы эта конфигурация работала по умолчанию в postgres.conf следует написать
Проверим словари:

понедельник, 30 апреля 2012 г.

Ruby on Rails Cron

В рельсы достаточно просто встроить выполнение задач по расписанию.
С помощью whenever достаточно выполнить команду wheneverize, после чего в корень проекта добавится файл schedule.rb, в который уже следует вносить расписание. Синтаксис довольно простой, он описан на странице гема.
После установки и настройки гема возникла проблема - задачи в кроне исправно выполнялись, но баш не видел окружения rvm, поэтому ничего не выполнялось.
Решение проблемы было в том, чтобы добавить к опциям баша флаг -i - interactive, без него rvm не загружался и задачи завершались ошибкой.

четверг, 12 апреля 2012 г.

Использовать методы хэлперов в Cucumber

Чтобы использловать в определении шагов Cucucmber методы хелперов, достаточно добавить следующую строчку в любой из файлов директории feature/support:

Word({имя модуля})

Имя модуля может быть названием любого хелпера в приложении.