среда, 21 мая 2014 г.

Запуск демонов на Linux при старте системы

Идите сюда, если Вам нужно запустить какую-то службу (демон) при старте системы на Linux.

Принимаем во внимание то, что upstart скрипт (скрипт, позволяющий управлять запуском службы командами start, stop, status) уже написан и находится в директории /etc/init.d. В данной статье рассказывается лишь то, как настроить запуск службы с помощью этого скрипта при запуске системы.

1. Для выполнения задачи нам понадобится утилита sysv-rc-conf. Вот ссылка на официальный сайт http://sysv-rc-conf.sourceforge.net/

Установка простая. Печатаем в консоли:

  • sudo apt-get install sysv-rc-conf

Я натыкался еще на одну утилиту - rcconf. Но она показалась мне менее гибкой и дружелюбной.

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

  • печатая нудные команды в командой строке;
  • набрав команду sudo sysv-rc-conf наслаждаться работой в текстовом интерфейсе.
Я расскажу про текстовый интерфейс, а с командами Вы можете собственноручно ознакомиться на официальном сайте.

3. Итак, после ввода команды sudo sysv-rc-conf вы увидите такое окно:
Интерфейс удобный и понятный. В строках Вы видите список всех upstart скриптов в вашей системе. Но вот названия столбцов (какие-то цифры) приводят в ступор.

Немного теории. В Линуксе есть 10 уровней запуска системы, 7 из которых используются. Пронумерованы они с 0 до 6. Далее описаны действия, выполняемые на соответствующих уровнях:

  • 0 — выполняются действия по выключению системы.
  • 1 — однопользовательский режим (single user mode). Предназначен для различных административных действий по восстановлению системы. По своему смыслу аналогичен Safe Mode Windows, но полностью его не повторяет. На этом уровне выполнения система полностью сконфигурирована, но не запущен ни один сервис, а из пользователей может работать только один root.
  • 2 — не используется, но сконфигурирован как уровень выполнения 3. В RedHat и SuSE Linux сконфигурирован как уровень выполнения 3, но без поддержки сетевых файловых систем. В Ubuntu и Debian используется как многопользовательский режим.
  • 3 — многопользовательский режим (multiuser mode). Нормальный режим работы сервера.
  • 4 — В Slackware Linux используется для графического входа в систему. В RedHat и SuSE Linux не сконфигурирован.
  • 5 — В RedHat и SuSE Linux используется для графического входа в систему. В Slackware Linux не сконфигурирован.
  • 6 — выполняются действия по перезагрузке системы.


4. Все что нам нужно сделать, поставить крестики на тех уровнях, на которых мы хотим запускать наш демон. Просто перемещаемся стрелками на строку с нашим скриптом и выставляем крестики на уровнях с помощью клавиши Пробел. Для выхода нажимаем клавишу q. Все готово! После перезапуска системы демон будет запущен.

Еще немного теории. В папке /etc есть несколько директорий с названиями rcN.d, где N, это уровень запуска системы. Для того, чтобы служба запускалась при старте системы, нужно создать симлинки на upstart скрипт в этих папках, а в имени файла указать приоритет запуска. Программа sysv-rc-conf просто напросто предоставляет удобный интерфейс для этого процесса. Вот и все!)

воскресенье, 23 февраля 2014 г.

Ruby On Rails. Установка под линукс

Выполняем последовательно команды:

sudo apt-get install git curl python-software-properties software-properties-common
sudo add-apt-repository ppa:chris-lea/node.js sudo apt-get update sudo apt-get install nodejs
sudo add-apt-repository -y -r ppa:chris-lea/node.js
sudo rm -f /etc/apt/sources.list.d/chris-lea-node_js-*.list
curl -L get.rvm.io | bash -s stable source ~/.rvm/scripts/rvm rvm requirements rvm install ruby-2.1.1 rvm use ruby-2.1.1 --default gem install rails gem install bundler

Затем редактируем файл ~/.bashrc, добавив в его конец строку:
[[ -s "$HOME/.rvm/scripts/rvm" ]] && source "$HOME/.rvm/scripts/rvm" # Load RVM into a shell session *as a function*

Выполняем:
source ~/.bashrc
type rvm | head -1

После выполнения команды выше вы должны получить такой вывод -
rvm is a function

Все готово!)

среда, 12 февраля 2014 г.

Ruby on Rails. RubyMine

IDE для разработки Ruby On Rails приложений RubyMine.

http://www.jetbrains.com/ruby/

30 дней триал период.

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

/*

Правда, автоматически рельсовое приложение не создавало файлик schema.rb.
Добавил в файл Rake следующие строчки:
Rake::Task["db:migrate"].enhance do
  puts "gary #{ActiveRecord::Base.schema_format.inspect}"
  if ActiveRecord::Base.schema_format == :sql
    Rake::Task["db:schema:dump"].invoke
  end
end
И все заработало!)))

*/

пятница, 31 января 2014 г.

Android. Декомпиляция apk. Apk to Java decompilation

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

Алгоритм следующий:
1. Достать байт-код Java из apk;
2. Преобразовать байт-код в код на языке Java.

Для этого нам понадобятся:
1. Конвертер dex и apk файлов в jar;
2. Декомпилятор jar файлов;
3. Везение и боевой настрой =)

Последнюю версию конвертера можно скачать отсюда:
А отсюда можно скачать версию 0.0.9.15, если ссылка выше не работает:

Из перепробованных мной декомпиляторов самым удачным мне показался fernflower.
Качаем с интернета, или по этой ссылке:

И так, начнем:

1. Распаковываем архив с dex2jar, закидываем apk файл в папку с файлом dex2jar.sh и в командной строке, находясь в этой же директории, печатаем:

    ./dex2jar.sh имя_вашего_apk.apk

Нажимаем Enter.

Будет много текста, но вскоре в папке появится файл с названием "имя_вашего_apk_dex2jar.jar".

2. В этом файле уже содержатся java классы, но в нечитаемом двоичном виде. Для этого нужно декомпилировать их. Для этого применим fernflower.jar. При условии, что появившийся на первом шаге файл и fernflower.jar находятся в одной директории, набираем в командной строке:

    java -jar fernflower.jar имя_вашего_apk_dex2jar.jar имя_директории

Нажимаем Enter. Создастся папка с названием "имя_директории", в которой будет лежать файл с таким же именем, как и исходный. Но в этот раз все java файлы будут иметь читаемый вид. 

Пам парам, все готово) Можете изучать полученный код или восстанавливать потерянный.

Проблемы:

Первая проблема в том, что все константы, прописанные в коде, заменяются на заданные им значения в момент компиляции. А следовательно, вместо них в полученном после декомпиляции коде будут значения, а не имена.

Вторая проблема - в полученном коде не будет комментариев. Причина такая же, как и в первой проблеме. Они удаляются при сборке apk.

Третья проблема, тоже не очень приятная. Код восстанавливается из бинарников с некоторой точностью, а не в первозданном виде. И эта точность зависит от декомпилятора. Fernflower самый точный, из проверенных мной. Например, один из декомпиляторов не умел восстанавливать switch, вместо него получался бесконечный цикл с кучей break и contunue.

воскресенье, 19 января 2014 г.

AngularJS + Turbolinks. Bootstrapping. Ручное подключение приложений.

AngularJS автоматически инициализирует и настраивает приложение, найденное с помощью директивы ng-app.

Бывают случаи, что автоматических подключения и настройки Angular приложения не хватает. Например, при использовании AngularJS совместно с Ruby On Rails Turbolinks при переходе на новую ссылку приложение необходимо перенастроить, что не происходит автоматически.

Для этого:

1) Уберите директиву ng-app из верстки вашего приложения:

<div ng-app="app"></div>

2)  Вместо ng-app обозначим наше приложение обыкновенным id:

<div id="app">Контент</div>

3) Инициализация приложения:
Инициализация приложения занимает всего одну строчку кода. Можно было бы сделать ее в $(document).ready(), но в случае с Turbolinks такой фокус не прокатит, так как событие ready срабатывает только при первом посещении приложения. Для этого предусмотрено специальное событие page:load:

    $(document).on('ready page:load', function()
    {
        angular.bootstrap(document.getElementById('app'), ['App']);
    });

4) Все готово. Можно обратиться к приложению в коде:

    var app = angular.module("App", []);

С наилучшими пожеланиями, Ваш покорный слуга, Петюнчик)

пятница, 1 ноября 2013 г.

JavaScript. AngularJS, или как облегчить жизнь

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

Отличное решение - AngularJS.
Ссылочка: http://angularjs.org/

Этот фреймворк позволит:
  • легко настроить поведение элементов страницы
  • организовать связь элементов с сущностями, данные о которых они отображают
  • динамически обновлять страницу при изменении сущностей, без ее перезагрузки
  • отделить верстку от реализации поведения элементов страницы
  • минимизировать разметку страницы, задав общий вид представления объектов сущности
  • и многое другое
Например, вы разрабатываете сайт для жилищного агенства. С AngularJs, чтобы отобразить данные о множестве квартир на одной странице, вам нужно будет лишь написать шаблон на HTML для отображения данных одной квартиры, занести данные о множестве квартир в контейнер, и сказать HTML тегу - повторись для всех квартир в этом контейнере! И что самое главное, изменения данных в контейнере моментально отобразятся и на HTML страничке, а точнее в связанном с моделью теге.

Очень удобная штука. Сам я только начал с ней разбираться, в ней еще очень много интересного)

воскресенье, 6 октября 2013 г.

JavaScript. Dates. Даты. setMonth();

    Был у меня один случай. Необходимо было пробежать по значениям дат, начиная от n-го года, заканчивая k-м, с шагом в один месяц. В один прекрасный момент, задав начальный год тысяча-девятьсот-шестьдесят-какой-то все нафиг повисло.
    Реализовано это было следующим образом:

var startDate = new Date('1960-01-01');
var endDate   = new Date('2010-01-01');
for(var i = startDate; i < endDate; i = new Date(i.getFullYear(), i.getMonth() + 1, 0))
{
// Что-то происходит
}


    Оказалось, что в прекрасный промежуток годов от 1982 до 1986 (кажется, но суть не важна), конструктор new Date(year, month, day) устанавливал месяц, равный month - 1, если подавалась цифра 2! И так, в цикле бесконечно устанавливался месяц, равный 1.
Решил проблему используя метод setMonth();

for(var i = startDate; i < endDate; i.setMonth(i.getMonth() + 1))
{
// Что-то происходит
}