пятница, 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)

четверг, 20 сентября 2012 г.

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



За время моего отсутствия накопилось много тем на которые хотелось бы порассуждать и опыта которым хочется поделиться. Ждать новых постов осталось не долго...

Ваш kosmoflyko.

четверг, 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; Пароль - его пароль. Далее выбираем необходимые вам переменные или их все (те что ИБП не поддерживает, просто не будут отображаться) и нажимаем ОК.