Ник Шейли: «Криптовалюта 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 target) { // функция регистрации // устанавливает обработчик target->Set(String::NewSymbol("test"), // MethodTest на метод test FunctionTemplate::New(MethodTest)-> GetFunction()); } // объявление модуля hello и задание функции инициации NODE_MODULE(hello, Init) void Init(Handle target); void Init(Handle target, Hande module); Set(<доступное имя в JS-коде>, <ссылка на действие>); target->Set(String::New("version"), String::New("0.1")); target->Set(String::New("PI"), Number::New(3.1415926)); enum { OPT_CONNECTED = 0, OPT_NON_BLOCKED, OPT_SYNC } OPT; NODE_DEFINE_CONSTANT(target, OPT_CONNECTED); NODE_DEFINE_CONSTANT(target, OPT_NON_BLOCKED); NODE_DEFINE_CONSTANT(target, OPT_SYNC); target->Set(String::NewSymbol("test"), FunctionTemplate::New(MethodTest)-> GetFunction()); NODE_SET_METHOD(target, "test", MethodTest); NODE_SET_METHOD(target, "connect", MethodConnect); $ node > var addon = require('./build/Release/test'); > console.log(addon); addon.test("Hello Word"); NODE_SET_METHOD(target, "test", MethodTest); Handle MethodTest(const Arguments& args) Handle MethodTest(const Arguments& args) { HandleScope scope; // возвращаем объект типа String return scope.Close(String::New(args[0]->ToString())); } addon.test("Hello World"); // возвращаем объект типа String return scope.Close(String::New("Word Hello!")); NODE_SET_METHOD(target, "inc", MethodInc); Handle MethodInc(const Arguments& args) { HandleScope scope; if (!args[0]->IsNumber()) { // проверка типа Number ThrowException(Exception::TypeError(String::New("Wrong arguments"))); } // иначе генерим Excetpion Local num = Number::New(args[0]->NumberValue() ++); return scope.Close( num ); // возвращаем объект типа Number } $ node-gyp rebuild { "targets": [ { "target_name": "hello_cb", "sources": [ "hello_cb.cc" ] } ] } Handle RunCallback(const Arguments& args) { HandleScope scope; // объявление V8 контейнера // объявление функции cb Local cb = Local::Cast(args[0]); const unsigned argc = 1; Local argv[argc] = { Local::New(String::New("Hello")) }; // вызов cb с передачей вх аргументов cb->Call(Context::GetCurrent()->Global(), argc, argv); // возврат неопределенного результата return scope.Close(Undefined()); } void Init(Handle target, Handle module) { module->Set(String::NewSymbol("target"), FunctionTemplate::New(RunCallback)->GetFunction()); } NODE_MODULE(hello_cb, Init) $ node-gyp configure $ node-gyp build $ node-gyp configure build // подключаем модуль hello_cb var addon = require('./build/Release/hello_cb'); var helloWord = function(msg){ // пишем callback-функцию var word = ' Word'; console.log(msg + word); } addon(helloWord); // вызываем наш callback из модуля // подключаем модуль hello_cb var addon = require('./build/Release/hello_cb'); addon(function(msg){ var word = ' Word'; console.log(msg + word); }); Handle CreateObject(const Arguments& args) { HandleScope scope; Local obj = Object::New(); // объявление объекта // получение первого аргумента args[0] Local str = args[0]->ToString(); // связывание свойства msg с данными obj->Set(String::NewSymbol("msg"), str ); // получение второго аргумента args[1] str = args[1]->ToString(); // связывание свойства msg2 с данными obj->Set(String::NewSymbol("msg2"), str ); return scope.Close(obj); // возвращение объекта } void Init(Handle target, Handle module) { module->Set(String::NewSymbol("target"), FunctionTemplate::New(CreateObject)->GetFunction()); } var obj1 = addon('hello', 'world'); var obj2 = addon('world', 'hello'); console.log(obj1.msg+' '+obj2.msg); console.log(obj2.msg1+' '+obj1.msg1); // описание тела функции Handle MyFunction(const Arguments& args) { HandleScope scope; return scope.Close(String::New("hello world")); } // обработчик создания функции Handle CreateFunction(const Arguments& args) { HandleScope scope; Local tpl = FunctionTemplate::New(MyFunction); Local fn = tpl->GetFunction(); // omit this to make it anonymous fn->SetName(String::NewSymbol("theFunction")); return scope.Close(fn); } void Init(Handle target, Handle module) { module->Set(String::NewSymbol("target"), FunctionTemplate::New(CreateFunction)->GetFunction()); } -----------------------------------------------------------------------------------------------------------------