пятница, 5 декабря 2014 г.

Node.js против носорога

Посвящается 30-ю JavaScript (4 декабря)!

Nashorn это JavaScript (JS) движок в Java 8 поверх JVM (Java Virtual Machine). Используя его можно писать на JS и при этом обращаться к Java объектам и библиотекам.


Но этого оказалось мало и Java сообщество решило замахнуться на Node.JS! Так родился проект Avatar.js - полная реализация Node.js на JVM.


Так, хватит теории... Давайте уже поиграемся с ними!
Мое рабочее окружение ОС Windows 8.1 с установленной JDK 8.0_25.
С сайта https://maven.java.net/content/repositories/public/com/oracle/ скачиваем:
avatar-js-0.10.32-20141204.073208-53.jar
и
libavatar-js-win-x64-0.10.32-20141126.224700-36.dll

Далее, создаем папку проекта, для примера HelloAvatar и переносим в нее наши файлы. Jar файл переименовываем в avatar-js.jar, а DLL переименовываем в avatar-js.dll.

Осталось собственно написать JS приложение, предлагаю пока воспользоваться стандартным примером по NodeJS и написать HTTP-сервер с одной страницей. Для этого создаем файл app.js  в папке проекта со следующим содержимым:

Все готово! 3-2-1-Запуск в командной консоли:

java -Djava.library.path=<полный путь к папке проекта>\HelloAvatar -jar avatar-js.jar app.js

После этого в браузере заходим по адресу: http://127.0.0.1:8000/

Все у нас NodeJS работает поверх JVM.

среда, 8 января 2014 г.

Возвращение Будулая и Магия Asterisk AGI часть 1 (обзор)



Привет мой дорогой читатель!

Сегодня в очередной раз воспользовавшись своей "цифровой памятью" в виде этого блога, очень удивился, что за прошедшие 2 года ты не забыл про меня. Да, я выпал на это долгое время из блогосферы.

За это время многое изменилось в моей жизни, кто-то ушел навсегда, кто-то появился. Теперь я отец прекрасной дочери. Еще за прошедшее время я успел сменить два места работы: небольшого провайдера, местный банк и снова вернуться в небольшую компанию. Накопилось много всего что хочется тебе рассказать, поэтому я попытаюсь найти время чтобы поделиться. Спасибо что есть!..

Магия Asterisk AGI.

Ну а начать хочется с такой интересной темы как интернет телефония. Так уж получилось, что последнее время я плотно работал VoIP-сервером Astrisk и его связке со сторонним ПО. Это не единственный, не самый производительный, но самый поддерживаемый и развитый сервер. Подробнее о нем можно прочитать тут: http://asterisk.ru/functionality.

Но нам всем всегда хочется чего-то большего, поэтому программисты придумали интерфейс управления сервером - AGI.

AGI - это встроенный в Asterisk метод выполнения внешних скриптов (по аналогии с CGI для http серверов), который может расширить функциональность asterisk при помощи других языков программирования. Таких, как: Java, .Net, Perl, PHP, C, Shell - все зависит от Вашего желания. Подробнее здесь: http://asterisk.ru/knowledgebase/Asterisk+AGI

Чтобы не быть голословным рассмотрим задачу:
- Создать систему голосового информирования пользователя о балансе на его счете.
- Информация должна предоставляться по паролю, введенному на клавиатуре телефона в тоновом режиме.
- Уже имеем развернутый сервер телефонии Asterisk
- Данные о балансе лежат в БД Oracle.

При проектировании сервиса было решено отделить приложение от "боевой базы", что-бы не плодить лишнюю нагрузку на серверах БД, поэтому в качестве кеша использовали локальный сервер-БД на основе MySQL. Выбор конечно спорный, но на тот момент это самая знакомая БД.

Сама логика выполнена в виде 2-х PHP-скриптов. Выбор аналогичен предыдущему, PHP наиболее изученный язык на тот момент. Первый это скрипт обновления данных в локальной БД из "боевой" вызываемый по крону, для связи с Oracle используем php-oci8. Второй собственно сам AGI-скрипт вызываемый Asterisk, для связи с Asterisk используем php-agi (http://phpagi.sourceforge.net/).

Важное замечание: Во время работы сервера Asterisk в режиме отладки AGI (команда: "agi set debug on" в консоли Asterisk), оказалось что сервер затрачивает значительное время общение с AGI-скриптом, в моем случае порядка минуты. При отключении отладки задержка пропадает.

Также нам понадобиться записать ряд голосовых файлов которые мы будет проигрывать абоненту. И подумать над структурой меню. На сегодня все :) продолжение следует...



Цикл статей Магия Asterisk:
Магия Asterisk AGI часть 1 (обзор)
Магия Asterisk AGI часть 2 (планируем IVR и пишем голос)
Магия Asterisk AGI часть 3 (пишем AGI-скрипты на PHP)

четверг, 13 октября 2011 г.

R.I.P. Dennis MacAlistair Ritchie

Сегодня только узнал, что навечно нас покинул еще один из великих людей.



По данным из Википедии  8 октября умер Денис Ритчи: один из разработчиков языка C и операционной системы UNIX.

Покойся с миром Денис, мы никогда не забудем твоих заслуг. Ты дал миру великие инструменты прорыва в ИТ-сфере... :.(

P.S. Статья на Википедии о нем.

воскресенье, 9 октября 2011 г.

Мысли о виртуализации десктопа

После очередной перестановки основной операционной системы передо мной снова стал вопрос  о быстром восстановлении пользовательского окружения (программы, настройки, данные), причем все это усложняется жизнью в двух параллельных мирах Windows и Linux.


Поэтому я принял решение держать путь на виртуализацию десктопа. Конечно сразу хотелось воспользоваться всеми благами человечества и использовать платформу KVM или XEN с поддержкой VT-d (проброс физического оборудования в виртуальную среду) и SPICE (протокол удаленного доступа с поддержкой передачи медиа-информации, например видео), но бюджет был ограничен и я выбрал следующую архитектуру:


В качестве виртуальной машины выбрана Oracle VirtualBox 4. Она бесплатна и решает все поставленные задачи. В качестве хост-системы работает компьютер с конфигурацией: 
Процессор: Core 2 Quad Q9300 (c VT-x)
Оперативная память: DDR3 5Gb
Операционная система: Ubuntu 11.04 Desktop или Windows 7 (в случае параллельного запуска специфичных медиа-задач параллельно с работой :)
Сама же деятельность спокойно проходит в виртуальной машине (ВМ №1) или реже в виртуальной машине (ВМ №2). Жесткие диски виртуальных машин храняться на отдельном жестком диске, что заставляет на упираться только в производительность интерфейса SATA-2.

В чем же плюс такой конфигурации? Он в том что при аварии/переустановке на хостовой системе вам нужно лишь поставить программу виртальных машин и вам снова доступно ваше настроенное окружение.

суббота, 24 сентября 2011 г.

Puutty + Linux

Да мой любознательный читатель, я наконец-то скомпилировал Putty под Ubuntu и теперь на еще одну зависимость от Windows стало меньше... :)


Вы возможно зададитесь вопросом, зачем нам Putty под линуксом ведь есть SSH? А за тем что есть закрытые ключи сгенерированные PuttyGen и подключитить их через SSH у меня их пока не получилось, из-за их специфического формата. Поэтому я решил собрать его под *nix.

Вообще компиляция под *nix штатная возможность, для этого достаточно скачать исходники с сайта производителя chiark.greenend.org.uk в tar.gz архиве. Мне был доступен релиз 0.61

Установим необходимое для компиляции ПО:
$ sudo apt-get install gcc build-essential libgtk2.0-dev halibut build-dep

После этого идем в папка загрузки и распаковываем архив:
$ tar xzvf putty-0.61.tar.gz

Переходим в папку:
$ cd putty-0.61/unix

Выполняем сборку:
$ make -f Makefile.gtk

Теперь компилируем и устанавливаем:
$ make -f Makefile.gtk install

Все готово! Вызываем набором команды "putty" в терминале. Если вы будете создавать пользовательскую кнопку запуска или прописывать в главное меню очевидно вам понадобиться оригинальная иконка, ее вы можете найти на сайте vlad.design.com.ua.

При компиляции под GTK очень помог источник:
http://jamesmcdonald.id.au/it-tips/open-source-apps/putty-gtk2 

воскресенье, 4 сентября 2011 г.

Ippon Back Power Pro 800 и Ubuntu Lininux

Я давно использую Linux в качестве основной системы на своем десктопе, а поскольку все *nix'ы очень не любят спонтанные отключения питания (в отличии от местных электриков), то с начала года в доме давно тихо мирно живет ИБП Ippon Back Power Pro 800.


Но прикрутить его к Linux так руки и не доходили. И вот на днях я все-таки решился. А чтобы не забыть в очередной раз алгоритм этой процедуры опишу тут.

Итак исходные данные:
ИБП Ippon Back Power Pro 800,
Ubuntu Linux 10.04 (да я сторонник LTS-версий).

Для начала пред подключением ИБП к компьютеру по средствам USB даем команду:

lsusb

потом подключаем ИБП и снова повторяем команду, чтобы выявить идентификаторы устройства. Например из строки "Bus 002 Device 005: ID 0665:5161 Cypress Semiconductor USB to Serial" можно узнать, что VendorID = 0665 ProductID = 5161 для моего ИБП.

1. Установка ===========================================

Далее установим NUT:

sudo apt-get install nut

2. Настройка правил UDEV ===============================

После этого создаем файл (в случае USB подключения ИБП) в /lib/udev/rules.d/52-nut-usbips.rules со следующим содержанием:

# Ippon Back Power Pro 800
ATTR{idVendor}=="Ваш_VendorID", ATTR{idProduct}=="Ваш_ProductID", MODE="664", GROUP="nut"

Если ваш ИБП использует для подключения RS232 (аля COM-порт), то создаем файл /lib/udev/rules.d/52_nut-serialups.rules содержащий:

# Ippon Back Power Pro 800
KERNEL=="ttyS0", GROUP="nut"

где ttyS0 - номер COM-порта к которому подключен ИБП (в данном случае COM1)

Далее для USB достаточно вынуть разъем из порта и снова воткнуть. А для COM-порта выполнить следующие команды или перезагрузить систему:

sudo udevadm control --reload_rules
sudo udevadm control trigger

3. Настройка NUT ======================================

NUT может управлять множеством ИБП в сети, но мы будем использовать простую конфигурацию для 1 компьютера. Для этого в файле /etc/nut/nut.conf выставим соответствующий режим:

MODE=standalone

В файле /etc/nut/ups.conf укажем параметры подключения к нашему ИБП:

[ippon-800]
driver = blazer_usb
port = auto
desc = "Ippon Back Power Pro 800"
default.battery.voltage.high = 13.60
default.battery.voltage.low = 10.60
offdelay = 6
ondelay = 7

где
[ippon-800] - имя нашего ИБП в системе NUT, оно может быть любым;
driver - имя драйвера для подключения к ИБП, смотрим его тут http://www.networkupstools.org/stable-hcl.html, для моего ИБП это blazer_usb и blazer_serial в зависимости от порта подключения;
port - имя файла порта, для USB можно просто "auto", для COM1-порта "/dev/ttyS0"
desc - комментарий;
default.battery.voltage.high - максимальное напряжение батареи при полном заряде, необходимо для расчета остаточного заряда батареи;

default.battery.voltage.low - минимальное напряжение батареи при полном разряде;
offdelay - команда ИБП перейти в режим ожидания через 6 минут

Далее в файле /etc/nut/upsd.conf мы пропишем контроль доступа:

ACL all 0.0.0.0/0
ACL localnet 192.168.1.0/24
ACL localhost 127.0.0.1/32
ACCEPT localhost localnet
REJECT all

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

Далее заводим пользователей, которые могут контролировать ИБП в файле /etc/upsd.users:

[имя_пользователя]
password = пароль_пользователя
allowfrom = localnet
upsmon master
actions = SET
instcmds = ALL

где
allowfrom - параметр определяющий источник подключения;
upsmon master - параметр дающий права на управление ИБП.

И последнее, осталось настроить службу мониторинга в файле /etc/nut/upsmon.conf пишем:

RUN_AS_USER nut
MONITOR имя_ибп@localhost 1 имя_пользователя пароль_пользователя master
MINSUPPLIES 1
POWERDOWNFLAG /etc/killpower
SHUTDOWNCMD "sbin/shutdown -Ph +0"
POLLFREQ 5
POLLFREQALERT 5
HOSTSYNC 15
DEADTIME 15
RBWARNTIME 43200
NOCOMMWARNTIME 300
FINALDELAY 5

где SHUTDOWNCMD "sbin/shutdown -Ph +0" - команда на завершение работы компьютера.

Все. Теперь включив систему NUT командой:

sudo service nut start

можно запросить статус ИБП командой:

upsc имя_ибп

в ответ вам система выдать примерно следующее:

battery.charge: 100
battery.voltage: 13.60
battery.voltage.high: 13.60
battery.voltage.low: 10.60
battery.voltage.nominal: 12.0
beeper.status: enabled
device.type: ups
driver.name: blazer_usb
driver.parameter.offdelay: 6
driver.parameter.ondelay: 7
driver.parameter.pollinterval: 2
driver.parameter.port: auto
input.current.nominal: 3.0
input.frequency: 49.9
input.frequency.nominal: 50
input.voltage: 246.0
input.voltage.fault: 246.0
input.voltage.nominal: 220
output.voltage: 209.5
ups.delay.shutdown: 6
ups.delay.start: 420
ups.load: 41
ups.productid: 5161
ups.status: OL TRIM
ups.temperature: 25.0
ups.type: offline / line interactive

Далее если хочется смотреть в графике можно установить knutclient:

sudo apt-get install knutclient

После установки knutclient надо сконфигурировать Setting->Configure KNutClient->UPS->Add. Здесь пишем Имя - понятное вам имя ИБП; UPS адрес - имя машины с ИБП (в данном случае localhost); UPS имя - название ИБП в системе NUT; Имя пользователя - пользователь в системе NUT; Пароль - его пароль. Далее выбираем необходимые вам переменные или их все (те что ИБП не поддерживает, просто не будут отображаться) и нажимаем ОК.