Ник Шейли: «Криптовалюта Ripple – новая экономическая реальность»
Игорь Савчук
./rippled server_info
-----------------------------------------------------------------------------------------------------------------
Система Nagios. Комплексный мониторинг. Часть 2
Рашид Ачилов
define host{
use generic-host
host_name WinZ
alias Windows Server
address 10.54.1.2
parents Demo-switch
check_command check-host-alive
check_period 24x7
notification_period 24x7
notification_options d,u,r
contact_groups windows-admins
icon_image winserver2.png
statusmap_image winserver2.gd2
2d_coords 100,100
}
# giftogd2 imagefile.gif imagefile.gd2 0 1
#./giftogd2
define host{
name winimages-host
icon_image winserver2.png
statusmap_image winserver2.gd2
register 0
}
use generic-host,winimages-host
define command{
command_name check_nrpe_cmd
command_line $USER1$/check_nrpe2 -H $HOSTADDRESS$ -p 5666 -t 20 -c $ARG1$ -a $ARG2$ $ARG3$ $ARG4$ $ARG5$ $ARG6$
}
define service{
name generic-service
active_checks_enabled 1
passive_checks_enabled 1
parallelize_check 1
obsess_over_service 1
check_freshness 0
notifications_enabled 1
event_handler_enabled 1
flap_detection_enabled 1
process_perf_data 1
retain_status_information 1
retain_nonstatus_information 1
max_check_attempts 2
check_interval 5
retry_interval 1
notification_interval 120
register 0
}
define service{
name generic-nrpe-disk-usrfs
use generic-service
service_description Free space on /usr
is_volatile 0
check_period 24x7
notification_period 24x7
notification_options w,u,c,r
check_command check_nrpe_cmd!check_disk!20%!10%!/usr!!!
register 0
}
define command{
command_name check_apcupsd_timeleft
command_line $USER1$/check_apcupsd_ng -w $ARG1$ -c $ARG2$ timeleft
}
define service{
name generic-apcupsd-time-remaining
use generic-service
service_description APC UPS Time remaining
is_volatile 0
check_period 24x7
notification_period 24x7
notification_options c,r,w,u
check_command check_apcupsd_timeleft!10!5!!!!
register 0
}
define service{
name generic-nsclient-pagefile
use generic-service
service_description Current Pagefile
is_volatile 0
normal_check_interval 1
check_period 24x7
notification_period 24x7
notification_options c,r,w,u
check_command check_nrpe_cmd!CheckMEM!MaxWarn=80%!MaxCrit=90%!ShowAll!type=page!!!
register 0
}
define service{
use generic-far-ping
host_name WinZ
contact_groups windows-admins
}
define service{
use generic-windows-snmp-sysuptime
host_name WinZ
contact_groups windows-admins
}
define service{
use generic-nsclient-cpuload
host_name WinZ
contact_groups windows-admins
}
define service{
use generic-nrpe-disk-windows-c
host_name WinZ
contact_groups windows-admins
}
define service{
use generic-nsclient-pagefile
host_name WinZ
contact_groups windows-admins
}
define service{
use generic-service
host_name nagios
service_description Total Processes
is_volatile 0
check_period 24x7
contact_groups unix-admins
notification_period 24x7
notification_options w,u,c,r
check_command check_local_procs!150!200!RSZDT
}
-----------------------------------------------------------------------------------------------------------------
Управление виртуальной инфраструктурой VMware vSphere с iPhone и iPad
Сергей Барамба
RemoteDisplay.vnc.enabled = true
RemoteDisplay.vnc.port = TCP_port
RemoteDisplay.vnc.password = password
-----------------------------------------------------------------------------------------------------------------
Кластер виртуализации. Часть 1. Разворачиваем бюджетное отказоустойчивое решение
Сергей Урушкин
# yum update -y
# hostnamectl set-hostname vsrv1
# hostnamectl set-hostname vsrv2
# sed -i 's/^SELINUX=.*$/SELINUX=permissive/' /etc/selinux/config
setenforce 0
# systemctl disable NetworkManager
# systemctl stop NetworkManager
# systemctl disable firewalld
# systemctl stop firewalld
# systemctl disable avahi-daemon
# systemctl stop avahi-daemon
# echo 'NOZEROCONF=yes' >> /etc/sysconfig/network
# cat /etc/sysconfig/network-scripts/ifcfg-enp1s0f0
HWADDR=11:11:11:11:11:11
TYPE=Ethernet
BOOTPROTO=none
IPADDR=192.168.150.1
NETMASK=255.255.255.252
MTU=9126
ONBOOT=yes
# cat /etc/sysconfig/network-scripts/ifcfg-enp3s0
HWADDR=11:11:11:11:11:12
TYPE=Ethernet
BOOTPROTO=static
IPADDR=172.16.0.11
NETMASK=255.255.255.0
GATEWAY=172.16.0.1
ONBOOT=yes
# cat ifcfg-enp3s0.2
VLAN=yes
DEVICE=enp3s0.2
TYPE=Ethernet
BOOTPROTO=none
BRIDGE=br0
ONBOOT=yes
# cat /etc/sysconfig/network-scripts/ifcfg-br0
DEVICE=br0
TYPE=Bridge
BOOTPROTO=none
STP=on
DELAY=0
ONBOOT=yes
sw1(config)# vlan 2
sw1(config-vlan)# exit
sw1(config)# interface range gi0/1 - 2
sw1(config-if-range)# switchport mode trunk
sw1(config-if-range)# switchport trunk native vlan 1
192.168.150.1 vsrv1.example.com vsrv1
192.168.150.2 vsrv2.example.com vsrv2
# yum install -y openssh
# ssh-keygen
# cp /root/.ssh/id_rsa.pub /root/.ssh/authorized_keys
# ssh vsrv1
# ssh vsrv2
# scp /root/.ssh/* vsrv2:/root/.ssh
# yum install -y ntp
server vsrv2.example.com
# systemctl enable ntpd
# systemctl start ntpd
# systemctl enable ntpdate.service
# yum install -y mailx
mydomain = example.com
# systemctl restart postfix
newaliases
# echo | mail root
# yum install -y pacemaker pcs fence-agents-all
# systemctl start pcsd.service
# systemctl enable pcsd.service
# passwd hacluster
# pcs cluster auth vsrv1 vsrv2
# pcs cluster setup --name virtcluster vsrv1 vsrv2
# cat /etc/corosync/corosync.conf
totem {
version: 2
secauth: off
cluster_name: virtcluster
transport: udpu
}
nodelist {
node {
ring0_addr: vsrv1
nodeid: 1
}
node {
ring0_addr: vsrv2
nodeid: 2
}
}
quorum {
provider: corosync_votequorum
two_node: 1
}
logging {
to_syslog: yes
}
# systemctl enable corosync.service
# systemctl enable pacemaker.service
# systemctl start corosync.service
# systemctl start pacemaker.service
# pcs status
quorum {
provider: corosync_votequorum
two_node: 1
wait_for_all: 0
}
# systemctl stop pacemaker
# systemctl stop corosync
# systemctl start pacemaker
# pcs resource
# pcs constraint
# pcs resource show NAME
# pcs property set stonith-enabled=false
# crm_verify -L -V
-----------------------------------------------------------------------------------------------------------------
Настройка современной системы хранения. Часть 2. Добавляем поддержку дискового хранилища
Алексей Бережной
#su
#cd /etc/sysconfig/network-script/
#ls
#vi ifcg-eth0
DEVICE=eth0
HWADDR=90:2B:34:8D:B7:20
TYPE=Ethernet
UUID=2b000000-4e06-49c1-91fe-c0008000000c
ONBOOT=yes
NM_CONTROLLED=yes
BOOTPROTO=static
IPADDR=192.168.1.28
NETMASK=255.255.255.0
#vi /etc/sysconfig/network
NETWORKING=yes
HOSTNAME=server1
GATEWAY=192.168.1.254
#service network restart
#ifconfig eth0
eth0 Link encap:Ethernet HWaddr 90:2B:34:8D:B7:20
inet addr:192.168.1.27 Bcast:192.168.1.255 Mask:255.255.255.0
inet6 addr: fe80::922b:34ff:fe8d:b720/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
#route
# cat /etc/multipath.conf
defaults {
user_friendly_names yes
}
blacklist {
devnode "^(ram|raw|loop|fd|md|dm-|sr|scd|st)[0-9]*"
devnode "^hd[a-z]"
devnode "^dcssblk[0-9]*"
device {
vendor "DGC"
product "LUNZ"
}
....
device {
vendor "HPT"
}
wwid "36005076040a002561ac3990600996aa8"
device {
vendor IMM
product Virtual_CD
}
wwid "*"
}
blacklist_exceptions {
wwid "360080f6000325424000036f953d82634"
wwid "360080f6000325424000036f353d80a9d"
}
multipaths {
multipath {
uid 0
gid 0
wwid "360080f6000325424000036f953d82634"
mode 0600
}
multipath {
uid 0
gid 0
wwid "360080f6000325424000036f353d80a9d"
mode 0600
}
}
multipath {
uid 0
gid 0
wwid "360080f6000325424000036f353d80a9d"
mode 0600
alias lun2
}
# multipath -v2 –ll
#fdisk -l /dev/mapper/mpath*
parted /dev/mapper/mpathbс
(parted) print
(parted) mklabel gpt
(parted) mkpart xfs 0 29284393
(parted) print
(parted)quit
kpartx -a /dev/mapper/mpathbp1
# mkfs.xfs /dev/mapper/mpathcp1
# mkdir /mnt/storesas
# chmod 777 /mnt/storesas
# mount -t xfs /dev/mapper/mpathcp1 /mnt/storesas
# df /mnt/storesas
-----------------------------------------------------------------------------------------------------------------
Шифрование электронной почты с помощью CipherMail
Сергей Яремчук
$ sudo apt-get install postgresql postfix openjdk-7-jre openjdk-7-jre-headless tzdata-java ant ant-optional mktemp wget libsasl2-modules symlinks tomcat6
$ sudo dpkg -i ./djigzo_2.8.6-2_all.deb ./djigzo-web_2.8.6-2_all.deb
$ sudo apt-get -f install
$ cd /etc/postfix
$ sudo mv djigzo-main.cf main.cf
$ sudo mv djigzo-master.cf master.cf
$ sudo cp /etc/postfix/djigzo-main.cf /etc/postfix/main.cf
$ sudo cp /etc/postfix/djigzo-master.cf /etc/postfix/master.cf
$ sudo newaliases
$ sudo service postfix restart
$ cat /etc/postfix/main.cf
...
content_filter = djigzo:127.0.0.1:10025
$ sudo nano /etc/default/tomcat6
JAVA_OPTS="$JAVA_OPTS -Ddjigzo-web.home=/usr/share/djigzo-web"
JAVA_OPTS="$JAVA_OPTS -Djava.awt.headless=true -Xmx128M"
TOMCAT6_SECURITY=no
$ sudo chown tomcat6:djigzo /usr/share/djigzo-web/ssl/sslCertificate.p12
$ sudo cp /usr/share/djigzo-web/conf/tomcat/server-T6.xml /etc/tomcat6/server.xml
$ sudo nano /etc/tomcat6/Catalina/localhost/djigzo.xml
$ sudo service tomcat6 restart
-----------------------------------------------------------------------------------------------------------------
Инвентаризация Linux с помощью SCCM
Сергей Болдин
. / install -mp <имя сервера> - sitecode <название сайта> -fsp <имя сервера> <свойства #1> <свойства #2> <пакет установки клиента>
# chmod +x install
# ./install –mp test-sccm.ccc.corp –sitecode ES –fsp test-sccm.ccc.corp ccm-Universalx64.tar
Листинг 1. Пример конфигурационного файла scxcm.conf
FILE (
PATH: /var/opt/microsoft/scxcm.log
MODULE: ERROR
MODULE: scx.client ERROR
)
-----------------------------------------------------------------------------------------------------------------
Инструментарий Rex. Управление множеством Linux-систем для любителей Perl
Денис Силаков
# curl -L get.rexify.org | perl - --sudo -n Rex
# rex -H client1 -e "say run 'uptime'"
# rex -H client1 -e "say run 'systemctl status httpd'"
group clients => "client[1..10]";
task "uptime", group => "clients", sub {
say run "uptime";
};
# rex uptime
user "tester";
private_key "/path/to/your/private.key";
public_key "/path/to/your/public.key";
key_auth;
my $packages = case operating_system,
Debian => ["apache2", "libphp5-apache2"],
CentOS => ["httpd", "php5"],
pkg $packages, ensure => "present";
append_if_no_such_line "/etc/my.cnf",
"!includedir /etc/my.cnf.d",
on_change => sub { service mysqld => "restart"; };
Rex == Perl?
# mkdir -p /etc/rex
# wget http://goo.gl/r26Vrt -O /etc/rex/jobcontrol.conf
# rex_job_control jobcontrol setup
# rex_job_control jobcontrol systemd -c
# systemctl start rex-jobcontrol
# systemctl start rex-jobcontrol-minion
-----------------------------------------------------------------------------------------------------------------
Власть над конфигурацией. Etckeeper и Git
Александр Руденко
# wget http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
# rpm -Uvh epel-release-6-8.noarch.rpm
# yum install etckeeper
#VCS="hg"
VCS="git"
#VCS="bzr"
#VCS="darcs"
#AVOID_DAILY_AUTOCOMMITS=1
#AVOID_COMMIT_BEFORE_INSTALL=1
# etckeeper init
# etckeeper commit "initial commit"
# etckeeper vcs status
etckeeper init = git init /etc
etckeeper vcs status = git status
# git config --global user.name "Alex Rudenko"
# git config --global user.email a.rudenko@domain.com
# git config --global core.editor <имя_редактора>
# git config --global merge.tool <имя_утилиты>
# git status
...
# modified: hosts
# modified: sysconfig/network
# git diff
# git commit -av -m "Edit hostname and hosts"
# git add <имя_файла>
# yum -y install mc
# git log
# git log --pretty=oneline
# git log /etc/sysconfig/*
# git log --summary -1
# git reset –hard
# git reset --hard eb4cf1f
# git reflog
# git reset --hard 5d6d285
# git checkout /etc/hosts
# git checkout 206ba4a /etc/hosts
-----------------------------------------------------------------------------------------------------------------
Разработка мобильных приложенийна платформе «1С:Предприятие 8.3»
Игорь Антонов
Листинг 1. Код процедуры «ДобавитьЗадачу»
Процедура ДобавитьЗадачу(Задача) Экспорт
МенеджерЗаписи = СоздатьМенеджерЗаписи();
МенеджерЗаписи.Период = ТекущаяДата();
МенеджерЗаписи.Задача = Задача;
МенеджерЗаписи.Статус = Задача.Статус;
МенеджерЗаписи.Записать();
КонецПроцедуры
Листинг 2. Код функции «ПолучитьСписокНеЗакрытых Задач()»
Функция ПолучитьСписокНеЗакрытыхЗадач() Экспорт
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| СостояниеЗадачСрезПоследних.Задача КАК Задача,
| СостояниеЗадачСрезПоследних.Задача.ДатаИсполнения КАК ДатаИсполнения
|ИЗ
| РегистрСведений.СостояниеЗадач.СрезПоследних(&ТекущаяДата, Статус <> ЗНАЧЕНИЕ(Перечисление.СтатусыЗадач.Выполнена)) КАК СостояниеЗадачСрезПоследних
|
|УПОРЯДОЧИТЬ ПО
| ДатаИсполнения УБЫВ";
Запрос.УстановитьПараметр("ТекущаяДата", ТекущаяДата());
Возврат Запрос.Выполнить().Выгрузить();
КонецФункции
Листинг 3. Код процедуры «СоздатьНовуюЗадачу»
Процедура СоздатьНовуюЗадачу(Ссылка) Экспорт
Если Ссылка.ЭтоГруппа Тогда
Возврат;
КонецЕсли;
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| СостояниеЗадачСрезПоследних.Статус
|ИЗ
| РегистрСведений.СостояниеЗадач.СрезПоследних(&ТекущаяДата, Задача = &Задача) КАК СостояниеЗадачСрезПоследних";
Запрос.УстановитьПараметр("ТекущаяДата", ТекущаяДата());
Запрос.УстановитьПараметр("Задача", Ссылка);
Результат = Запрос.Выполнить().Выбрать();
Если Результат.Следующий() Тогда
Если Результат.Статус <> Ссылка.Статус Тогда
РегистрыСведений.СостояниеЗадач.ДобавитьЗадачу(Ссылка);
КонецЕсли;
Иначе
РегистрыСведений.СостояниеЗадач.ДобавитьЗадачу(Ссылка);
КонецЕсли;
КонецПроцедуры
РаботаСЗадачами.СоздатьНовуюЗадачу(ТекущийОбъект.Ссылка);
ОткрытыеЗадачи.Загрузить(РегистрыСведений.СостояниеЗадач.ПолучитьСписокНеЗакрытыхЗадач());
&НаКлиенте
Процедура ОбновитьСписокЗадач(Команда)
ОбновитьСписок();
КонецПроцедуры
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
ОткрытыеЗадачи.Загрузить(РегистрыСведений.СостояниеЗадач.ПолучитьСписокНеЗакрытыхЗадач());
КонецПроцедуры
adb.exe install –r 1cem-arm.apk
&НаКлиенте
Процедура ОтправитьSMSСообщение(Получатель, ТекстСообщения)
НовоеСообщение = Новый SMSСообщение();
НовоеСообщение.Текст = ТекстСообщения;
НовоеСообщение.Получатели.Добавить(Получатель);
СредстваТелефонии.ПослатьSMS(НовоеСообщение);
КонецПроцедуры
&НаКлиенте
Процедура ПодключитьОбработчикПолученияСообщений()
ПодпискаНаСообщения = Новый ОписаниеОповещения("ОбработкаНовыхСообщений", ЭтотОбъект);
СредстваТелефонии.ПодключитьОбработчикSMSСообщений(ПодпискаНаСообщения);
КонецПроцедуры
&НаКлиенте
Процедура ОбработкаНовыхСообщений(Сообщение, ДополнительныеПараметры)
//Обработка нового сообщения
//Сообщение.Отправитель, Сообщение.Текст;
КонецПроцедуры
НовоеСообщение= Новый SMSСообщение();
Вложение = Новый MMSВложение;
Вложение.Данные = Картинка;
Вложение.ТипСодержимого = "image/jpeg";
MMSСообщение.Вложения.Добавить(Вложение);
Если СредстваТелефонии.ПоддерживаетсяНаборНомера() Тогда
СредстваТелефонии.НабратьНомер(НомерТелефона, ВызватьСразу);
КонецЕсли;
ЖурналЗвонков = СредстваТелефонии.ПолучитьЖурналЗвонков();
Отбор = Новый ОтборКомпоновкиДанных;
ЭлементОтбора = Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ТипЗвонка");
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ЭлементОтбора.ПравоеЗначение = ТипЗвонкаЖурналаЗвонков.Пропущенный;
ЭлементОтбора.Использование = Истина;
СписокЗаписейЖурналаЗвонков = ЖурналЗвонков.НайтиЗаписи(Отбор);
//В СписокЗаписейЖурналаЗвонков будет коллекция записей
//Предоставим выбор провайдера платформе
ИдеальныйПровайдер = СредстваГеопозиционирования.ПолучитьСамогоТочногоПровайдера();
Координаты = СредстваГеопозиционирования.ПолучитьПоследнееМестоположение(ИдеальныйПровайдер);
//Если координаты получали давно, то обновляем
Если Координаты = Неопределено ИЛИ ТекущаяДата() – Координаты.Дата > 3600 Тогда
СредстваГеопозиционирования.ОбновитьМестоположение(ИдеальныйПровайдер, 60);
Координаты = СредстваГеопозиционирования.ПолучитьПоследнееМестоположение(ИдеальныйПровайдер);
КонецЕсли;
-----------------------------------------------------------------------------------------------------------------
JavaScript – есть будущее
Кирилл Сухов
"use strict";
function foo(){
"use strict"
................
}
"use strict";
foo = "bar";
$ node ecma.js
"use strict";
var foo = { bar: true, bar: false };
$ node ecma.js
var obj = JSON.parse('{"name":"John","surname":"Lennon" }');
console.log(obj.name );
$ node ecma.js
JSON.parse('{"name":"John","surname":"Lennon"}', function(key, value){
console.log( key +" – "+ value);
});
$ node ecma
var obj = {name:"John",surname:"Lennon"}
var str = JSON.stringify(obj);
console.log(str);
$ node ecma
var obj = {name:"John",surname:"Lennon",band:"Beatles"}
var list = ["band","surname"];
var str = JSON.stringify(obj, list);
console.log(str);
$ node ecma2
var obj = {name:"John",surname:"Lennon",band:"Beatles"}
var str = JSON.stringify(obj,function(key, value){
if(key == "band"){
return "The "+value;
}
return value;
});
console.log(str);
$ node ecma2
var band = { title: "The Beatles",
setTitle: function(title){
this.title = title;
console.log(this);
}
};
setTimeout( band.setTitle.bind(band, "The Rolling Stones"), 1000 );
console.log(band);
$ node ecma2
var myArray = ["Федя", "Петя", "Костя"];
myArray.forEach( function(element, index, array){
console.log("a[" + index + "] = " + element);
});
$ node ecma.js
var myArray = ["Федя", "Петя", "Костя"];
var upperArray = myArray.map( function(element){
return element.toLocaleUpperCase();
});
console.log(upperArray);
$ node ecma.js
var myArray = ["Федя", "Петя", "Костя"];
var result = myArray.reduce(function(x, y){
return x + y;
},' ');
console.log(result);
var result = myArray.reduceRight(function(x, y){
return x + y;
},' ');
console.log(result);
$ node ecma.js
var myArray = ["Федя", "Петя", "Костя"];
var addArray = myArray.filter(function(value){
return value.length < 5 ? true : false;
});
console.log(addArray);
$ node ecma.js
var myArray = ["Федя", "Петя", "Костя"];
var result = myArray.every(function(value){
return value.length < 5;
});
console.log(result);
var result = myArray.some(function(value){
return value.length == 5;
})
console.log(result);
$ node ecma.js
var obj = {};
obj.name = "John";
console.log( obj.name );
console.log( Object.isExtensible( obj ) );
Object.preventExtensions( obj );
obj.surname = "Smith";
console.log( obj.surname );
console.log( Object.isExtensible( obj ) );
$ node ecma2.js
var band = {};
Object.defineProperty(band, "title", {
value: "Kinks",
writable: false,
enumerable: true,
configurable: true
});
Object.defineProperty(band, "state", {
value: "uk",
writable: true,
enumerable: false,
configurable: false,
})
console.log(band);
band.state = "Sweden";
band.title = "ABBA";
console.log(band);
console.log(band.state);
Object.defineProperty(band, "title", {writable: true});
band.title = "ABBA";
console.log(band.title);
$ node ecma2
for (var prop in obj){
console.log(prop);
}
var band = {};
Object.defineProperties(band, {
"title", {
value: "Kinks",
writable: false,
enumerable: true,
configurable: true
},
"state", {
value: "uk",
writable: true,
enumerable: false,
configurable: false,
}
}); }
});
var band = {};
Object.defineProperty(band, "state", {
value: "uk",
writable: true,
enumerable: true,
configurable: true,
})
Object.defineProperty(band, "title", {
enumerable: true,
get: function(){
return title + " (" + band.state + ")";
},
set: function(value){
title = value;
console.log("Set value – " + value);
}
});
console.log(band);
band.title = "Kinks";
console.log(band.title);
$ node ecma2
var band = {};
Object.defineProperty(band, "state", {
value: "uk",
writable: true,
enumerable: false,
configurable: true,
})
console.log(Object.getOwnPropertyDescriptor(band, "state"));
$ node ecma2
var band = { name: "Kinks",
state: "uk",
getName: function(){
return this.name;
}};
console.log( Object.keys(band));
$ ecma1
"use strict";
var band = { name: "Kinks",
getName: function(){
return this.name;
}};
band.geanre = "rock";
Object.seal( band);
band.name = "Trogs";
console.log(band);
band.state = "uk";
console.log(band);
$ ecma
"use strict";
var band = { name: "Kinks",
getName: function(){
return this.name;
}};
band.geanre = "rock";
Object.freeze( band);
console.log(Object.isSealed(band));
console.log(Object.isFrozen(band));
band.name = "Trogs";
$ ecma
class Person {
constructor(name) {
this.name = name;
}
getname() {
return this.name;
}
}
var user = new Person("John");
console.log(user.getName()); // John
class User extends Person {
constructor(name, id) {
super.constructor(name);
this.id = id;
}
getName() {
return super.getName() + " " + this.id;
}
}
var user = new User("Paul", 211);
user.getName() // Paul 211
user instanceof Person; // true
class Point {
constructor(x, y) {
this.x = x;
this.y = y;
}
static zero() {
return new Point(0, 0);
}
}
module Math {
export function sum(x, y) {
return x + y;
}
export var pi = 3.141593;
// Не видна снаружи
function internal() {
...
}
}
import Math.{sum, pi};
alert("2π = " + sum(pi, pi));
import Math.*;
alert("2π = " + sum(pi, pi));
module Widgets {
module Button { ... }
module Alert { ... }
module TextArea { ... }
...
}
import Widgets.Alert.{messageBox, confirmDialog};
...
// web
module JSON = require('http://json.org/modules/json2.js');
import JSON.*;
module File = require('io/File'); // file system
import require("bar.js").y; // file system
let arr = [ "blue", "green" ];
arr.notAnIndex = 123;
Array.prototype.protoProp = 456;
for(var x in arr) {
// Напечатает blue, green, notAnIndex, protoProp
console.log(x);
}
for(var x of arr) {
console.log(x); // Напечатает только blue, green
}
function local() {
for(var i = 0;i<10;i++) {
...
}
console.log(i); // 10
}
local();
function local() {
if (let i=0;i<10;i++) {
….
}
console.log(i;); // ошибка!
}
local();
function square(arg = 1) {
return arg * arg;
}
square(2); // return 4
setLevel(); // return 1
function foo(id, {name, age}) {
...
}
foo(1, { name: 'John', age: 23 });
foo(253, { name: 'Kirill', age: 44 });
var arr = [ 1, 2, 3 ];
var double = arr.map(function (x) { return x * 2 });
var arr = [ 1, 2, 3 ];
let double = [ 1, 2, 3 ].map(x => x * 2);
var ref = function(value) { return value; }
var ref = value => value;
var binom = (x, y)=> (x + y) * (x + y);
// то же что и
// binom = function(x, y) {
// return (x + y) * (x + y);
// }
var sum = ()=> 1 + 2 + 3;
// то же что и
// sum = function() {
// return 1 + 2 + 3;
// }
var getID = {
ID: 315,
getLogin: function (users) {
users.forEach(function(user) {
console.log(user + this.ID);
});
}
}
getID.getLogin(['Peter', 'Paul', 'Mary']);
var getID = {
ID: 315,
getLogin: function (users) {
users.forEach(user => { console.log(user + this.ID); });
}
intersection: function() {
foo = […],
bar = […],
uff = [...],
return this.arr1.reduce( (sum, s1) =>
this.bar.reduce( (sum, s2) => {
this.uff.reduce( (sum, s2) => {
sum.push( this.concatenate( s1, s2,s3 ) )
return sum;
}
var p = Proxy.create({
get: function(proxy, name) {
return 'Hello, '+ name;
}
});
console.log(p.World);
console.log(p.Proxy);
$ node -harmony ecma6
var proxy = Proxy.create(handler, proto);
имя перехватчика: function(передаваемые переменные)-> {Тип возвращаемых данных}
var myHandler = {
get: function(proxy, name) {
return 'Hello, '+ name+ '!';
}
};
var fproxy = Proxy.createFunction(
myHandler,
function() { return arguments[0]; },
function() { return arguments[1]; }
);
console.log(fproxy(1,2));
var fp = new fproxy(1,2);
console.log(fp);
console.log(fproxy.Word);
$ node -harmony ecma6
var proxy = Proxy.createFunction(handler, callTrap, constructTrap);
function makeCallable(obj, call, construct) {
return Proxy.createFunction(
new ForwardingHandler(obj),
call,
construct || call);
}
const PI = 3.14;
PI = 8; // (в военное время)
console.log(PI);
$ node -harmony ecma1
function* generator() {
var a = 2;
while (true) {
yield a;
a *=a;
}
}
function run() {
var seq = generator();
console.log(seq.next().value);
console.log(seq.next().value);
console.log(seq.next().value);
console.log(seq.next().value);
console.log(seq.next().value);
console.log(seq.next().value);
}
run();
$ node -harmony ecma1
function* generator() {
var result = yield "x";
result += yield "y";
return result;
}
function run() {
var seq = generator();
console.log(seq.next().value);
console.log(seq.next(5).value);
console.log(seq.next(7).value);
}
run();
$ node -harmony ecma1
-----------------------------------------------------------------------------------------------------------------
Создание addon-модулей для Node.js
Александр Календарев
$ npm install -g node-gyp
$ apt-get install node-gyp
$ node-gyp configure
{
"targets": [
{
"target_name": "module_name",
"sources": [ "filename1.cc", "filename2.cc" ]
}
]
}
"targets": [
{
"target_name": "module_name",
"sources": [ "filename1.cc", "filename2.cc" ]
},
"conditions": [
['OS=="win"', {
. . .
}, {
'libraries': [
' // обязательные заголовочные файлы
#include
using namespace v8;
// объявление обработчика
Handle MethodTest(const Arguments& args) {
HandleScope scope; // объявление V8 контейнера
// возвращает строку hello Word
return scope.Close(String::New("Hello Word"));
}
void Init(Handle