«Java Script» и «Zabbix»: разница между страницами

Материал из support.qbpro.ru
(Различия между страницами)
imported>Supportadmin
 
imported>Vix
 
Строка 1: Строка 1:
==Как бы учебник==
[[Файл:Zabbix2.png]]
*[[Операторы JavaScript]]
<hr>
*[[Массивы JavaScript]]
== Установка и настройка ==
*[[Объекты JavaScript]]
'''''- Система Debian Jessie (8)'''''
*[[Особенности функций в JavaScript]]
**[[Возвратные функции]]
*<span style="color:darkgred; background:yellow">[[Базовые Namespace паттерны JavaScript]]</span>
*<span style="color:darkgred; background:yellow">[[Шаблоны проектирования JavaScript]]</span>
*[[ООП JavaScript - наследование]]
*[[Область видимости переменной в Javascript]]
*[[Клиентский (браузерный) JavaScript]]
**[[Javascript синхронный и асинхронный запрос]]
*[[JavaScript Strict Mode]]


----
* '''устанавливаем postgresql''', читать тут [[PostgreSQL]]
*[[Масштабируемые JavaScript приложения]]
*[[10 несуразностей и секретов JavaScript]]
*[[Используем console на полную]]
----
*[[Java Script модули]]


==Крайне полезная информация==
* '''устанавливаем необходимые пакеты:'''
echo "deb-src http://repo.zabbix.com/zabbix/3.4/debian stretch main" > /etc/apt/sources.list.d/zabbix.list
wget -O - "http://repo.zabbix.com/zabbix-official-repo.key" | apt-key add -
wget -O - "https://repo.zabbix.com/RPM-GPG-KEY-ZABBIX-79EA5ED4" | apt-key add -
wget -O - "https://repo.zabbix.com/RPM-GPG-KEY-ZABBIX-A14FE591" | apt-key add -
wget -O - "https://repo.zabbix.com/RPM-GPG-KEY-ZABBIX-A14FE591-EL5" | apt-key add -


Это надо обработать
apt-get update
*[http://jsperf.com/array-prototype-push-apply-vs-concat/20 Тесты производительности циклов, работы с массивами и т.д.]
  apt-get install zabbix-agent zabbix-frontend-php zabbix-proxy-pgsql zabbix-server-pgsql php-fpm nginx
*'''[http://bonsaiden.github.com/JavaScript-Garden/ru/ JavaScript Гарден]'''
*[http://habrahabr.ru/post/117069/ Модульный подход в JavaScript]
*[http://canegor.urc.ac.ru/gui_for_script/articles/random_sort.htm Случайное перемешивание массива]
*[http://habrahabr.ru/post/131714/ Javascript наследование для чайников]
*[http://javascript.ru/basic/operators Операторы, их особенности в JS]
*[http://www.w3schools.com/js/js_comparisons.asp JavaScript Comparison and Logical Operators]
*'''[http://habrahabr.ru/post/138773/ Путь асинхронного самурая]'''
*[http://habrahabr.ru/post/137818/ «Лапша» из callback-ов — будьте проще]
*[http://habrahabr.ru/post/97042/ Как избавиться от пристрастия к синхронности]
*[http://habrahabr.ru/post/137778/ Спагетти в последовательном вызове асинхронных функций. Теория и практика]
*'''[http://hashcode.ru/questions/87809/javascript-xmlhttprequest-%D0%B2-%D1%86%D0%B8%D0%BA%D0%BB%D0%B5 javascript - XMLHttpRequest в цикле]'''
*[[javascript - XMLHttpRequest подробный анализ примера]]
*[http://javascript.ru/blog/tenshi/mnogopotochnyi-yavaskript Многопоточный яваскрипт]
* [http://javascript.ru/tutorial/object/inheritance работаем с объектами в примерах]
* '''[http://javascript.ru/unsorted/top-10-functions 10 лучших функций на JavaScript]''' - в комментах тьма полезностей
* [http://webo.in/articles/habrahabr/28-chain-javascript-calls-optimization/ ОПТИМИЗИРУЕМ JS]
* http://pyramidin.narod.ru/clientref13/ -очень хорошо описаны функции, их стандартные методы, свойства и использование
* [http://wiki.dieg.info/doku.php/pobitovye_ili_porazrjadnye_operacii Побитовые или поразрядные операции] в конце для js
* [http://ruseller.com/lessons.php?rub=28&id=1445 Прототипы в JavaScript]
* [http://habrahabr.ru/post/49245/ Стыкуем компоненты в JavaScript]
* [http://webo.in/articles/habrahabr/77-coupling-async-scripts/ Стыкуем асинхронные скрипты]
* [http://learn.javascript.ru/gcc-closure-library GCC: интеграция с Google Closure Library]
* [http://creativejs.com/resources/requestanimationframe/ 3d -javascipt]
* [http://stepansuvorov.com/blog/2012/07/%D0%BF%D0%B8%D1%88%D0%B5%D0%BC-%D1%81%D0%B2%D0%BE%D0%B9-uploader-%D1%81-%D0%BD%D1%83%D0%BB%D1%8F-%D0%BD%D0%B0-javascript-%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D1%83%D1%8F-fileapi-%D1%87%D0%B0-3/ свой Uploader с нуля]
* [http://alljs.ru/articles/document-write document-write]
* [http://www.jaguar-developers.com/category/articles/javascript_dom/ создаем элементы DOM]
* [http://www.jstoolbox.com/skripty/rabota-s-massivami/zapolnenie-massiva-odinakovymi-znacheniyami/ Заполнение массива одинаковыми значениями]
* [http://webo.in/articles/habrahabr/78-javascript-constructions-performance/ Производительность простых и сложных конструкций в JavaScript]


==обработка событий в примерах==
* '''создаем администратора базы zabbix'''
*[http://on-line-teaching.com/js/js.events.keyboard.htm События клавиатуры и мыши]
  CREATE USER zabbixadmin WITH PASSWORD 'mypassword';
*[http://javascript.ru/tutorial/events/properties Свойства объекта событие]
*[http://www.tigir.com/javascript.htm разные примеры...]
*[https://developer.mozilla.org/ru/docs/JavaScript/Guide/Regular_Expressions регулярные выражения - шаблоны]
==Контекст==
*[http://habrahabr.ru/post/149516/ Ключевое слово this в javascript — учимся определять контекст на практике]
*[http://habrahabr.ru/post/149581/ Привязка контекста (this) к функции в javascript и частичное применение функций]
*[http://habrahabr.ru/post/103760/ Правильный захват контекста в Javascript]
*[http://habrahabr.ru/qa/5846/ JavaScript: что делает Function.call.apply(…)?]
*[http://ru.wikipedia.org/wiki/%D0%A1%D1%82%D1%80%D0%B0%D1%82%D0%B5%D0%B3%D0%B8%D1%8F_(%D1%88%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD_%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F) Стратегия (шаблон проектирования)]
[http://javascript.ru/ecma/part10 Контексты исполнения]
*[http://habrahabr.ru/post/112069/ предсказание элемента формы]


==Библиотеки==
* '''создаем базу данных для zabbix'''
*[http://qooxdoo.org/ JavaScript-фреймворк qooxdoo 1.6] - новое слово в вебинтерфейсах
CREATE DATABASE "zabbix"
:*[http://www.opennet.ru/opennews/art.shtml?num=32573 Новость про qooxdoo 1.6]
  WITH OWNER "zabbixadmin"
*[http://www.leemon.com/crypto/BigInt.js JS библиотека для работы с большими числами][http://www.leemon.com/crypto/BigInt.html Демо]
  ENCODING 'UTF8'
  LC_COLLATE = 'ru_RU.UTF-8'
  LC_CTYPE = 'ru_RU.UTF-8';


* '''даем права на базу администратору'''
GRANT ALL PRIVILEGES ON DATABASE "zabbix" to zabbixadmin;


*[http://learn.javascript.ru/lib Мини-библиотека функций]
* '''теперь необходимо в эту базу загрузить шаблоны и схему (для postgresql)'''
===Несколько интересных проектов с помощью которых можно динамически создавать векторные рисунки.===
zcat /usr/share/zabbix-server-pgsql/{schema,images,data}.sql.gz|psql -h 127.0.0.1 zabbix zabbixadmin
* [http://y3x.ru/2010/12/artisanjs/ Статья - Пробуем ремесло рисования с помощью ArtisanJS]
'''{!}''' - для версии 3.4:
* [http://artisanjs.com/ Страница разработчика ArtisanJS]
  zcat /usr/share/doc/zabbix-server-pgsql/create.sql.gz|psql -h 127.0.0.1 zabbix zabbixadmin
* [http://jcscript.com/ Высокопроизводительная библиотека динамического рисования Html5 - полностью самодостаточная]
* [http://raphaeljs.com Кросс-браузерное решение]
* [http://kangax.github.com/fabric.js/kitchensink/ Поддерживается как свободное рисование так и работа с векторными формами]
 
==Полезные трюки==
http://habrahabr.ru/post/155093/
 
==Как работает Array.prototype.slice.call==
Для того, чтобы из аргументов JavaScript функции "отрезать" первые Х значений, используется метод:
 
Array.prototype.slice.call(arguments, X);
 
Например такая функция вернет "3,4":
 
<nowiki>(function(){
  var args = Array.prototype.slice.call(arguments, 2);
  alert(args); // Returns: 3,4
})(1, 2, 3, 4);</nowiki>
 
 
Таким образом, такой подход используется когда нужно срезать входящие параметры функции JavaScript.
==Array.prototype.concat.apply==
Для объединения более двух массивов используется concat().
 
<nowiki>var a = [1, 2], b = ["x", "y"], c = [true, false];
var d = a.concat(b, c);
console.log(d); // [1, 2, "x", "y", true, false];</nowiki>
 
For concatenating just two arrays, using push.apply() can be used instead for the case of adding elements from one array to the end of another without producing a new array. With slice() it can also be used instead of concat() but there appears to be no performance advantage from doing this.
 
<nowiki>var a = [1, 2], b = ["x", "y"];
a.push.apply(a, b);
console.log(a); // [1, 2, "x", "y"];</nowiki>
 
==Современный метод bind==
 
В современном JavaScript для привязки функций есть метод bind. Он поддерживается большинством современных браузеров, за исключением IE<9, но легко эмулируется.
 
Этот метод позволяет привязать функцию к нужному контексту, и даже к аргументам.
 
Синтаксис bind:
 
<nowiki>var wrapper = func.bind(context[, arg1, arg2...])</nowiki>
*'''func''' Произвольная функция
*'''wrapper''' Функция-обёртка, которую возвращает вызов bind. Она вызывает func, фиксируя контекст и, если указаны, первые аргументы.
*'''context''' Обертка wrapper будет вызывать функцию с контекстом this = context.
*'''arg1, arg2, …''' Если указаны аргументы arg1, arg2... — они будут прибавлены к каждому вызову новой функции, причем встанут перед теми, которые указаны при вызове.
 
Простейший пример, фиксируем только this:
 
<nowiki>function f() {
  alert(this.name);
}
 
var user = { name: "Вася" };
 
var f2 = f.bind(user);
 
f2(); // выполнит f с this = user
</nowiki>
Использование для привязки метода sayHi к новому объекту User:
  <nowiki>
function User() {
  this.id = 1;
  this.sayHi = function() {
    alert(this.id);
  }.bind(this);
}
var user = new User();
setTimeout(user.sayHi, 1000); // выведет "1"</nowiki>
 
==Object.defineProperty или как сделать код капельку лучше==
[http://habrahabr.ru/post/150571/ оригинал статьи] [http://msdn.microsoft.com/ru-ru/library/ie/dd548687(v=vs.94).aspx тоже ребята старались]
 
Этот краткий пост-заметку или температурный бред (в Одессе похолодало, да) хочу посвятить такой прекрасной функции, как Object.defineProperty (и Object.defineProperties). Активно использую её уже около двух месяцев, так как поддержка старых браузеров (в том числе и IE8) в проекте, который я сейчас реализую, не требуется (завидуйте).
 
Как положено статье на хабре, приведу краткое описание того, что она делает. Object.defineProperty добавляет новое свойство, обладающее неким нестандартным для обычного свойства поведением, и принимает три аргумента:
*Объект, который мы модифицируем, добавляя новое свойство
*Свойство (строка), которое, собственно, хотим добавить
*Дескриптор: объект, содержащий «настройки» нового свойства, например аццессоры (геттер, сеттер)
 
Дескриптор может содержать следующие свойства:
*value (любое значение: строка, функция...) — значение, которое получит определяемое свойство объекта (геттер и сеттер в данном случае определить нельзя)
*writable (true/false) — можно ли перезаписать значение свойства (аццессоры тоже не доступны)
*get (функция) — геттер (value и writable определить нельзя)
*set (функция) — сеттер (value и writable определить нельзя)
*configurable (true/false) — можно ли переопределить дескриптор (использовать Object.defineProperty над тем же свойством)
*enumerable (true/false) — будет ли свойство перечисляться через for..in и доступно в Object.keys (плохая формулировка)
<nowiki>var o = {};
Object.defineProperty(o, "a", {value : 37,
                              writable : true,
                              enumerable : true,
                              configurable : true});


* '''настраиваем php-fpm'''
cat /etc/php5/fpm/pool.d/www.conf
....
;listen = /var/run/php5-fpm.sock
listen = 127.0.0.1:9000
   
   
var bValue;
  ....
Object.defineProperty(o, "b", {get : function(){ return bValue; },
                              set : function(newValue){ bValue = newValue; },
                              enumerable : true,
                              configurable : true});</nowiki>
 
Лучше меня объяснит MDN [https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Object/defineProperty Object/defineProperty]. Благо, даже английский знать не надо, и так всё понятно.
 
Если нужно определить сразу несколько свойств, можно использовать Object.defineProperties, который принимает два аргумента: объект, требующий изменений и объект с определяемыми ключами.
MDN: [https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Object/defineProperties Object/defineProperties].
 
<nowiki>
// Код сперт с MDN
Object.defineProperties(obj, {
  "property1": {
    value: true,
    writable: true
  },
  "property2": {
    value: "Hello",
    writable: false
  }
  // etc. etc.
});</nowiki>
 
 
 
Теперь соль. Чего я вообще решил это запостить?
 
Так как в упомянутом выше проекте мне приходится использовать defineProperty не просто активно, а очень активно, код стал, мягко говоря, некрасивым. Пришла в голову простейшая идея (как я до этого раньше-то не додумался?), расширить прототип Object, сделав код сильно компактнее. Плохой тон, скажете вы, засерать прототип Object новыми методами.
 
Откуда вообще взялось это мнение? Потому что все объекты унаследуют это свойство, которое, при обычной модификации прототипа, становится перечисляемым в for..in. На душе становится тепло, когда вспоминаешь о том, что я описал выше, а именно, о свойстве дескриптора enumerable. Действительно, расширив прототип таким образом:
 
<nowiki>Object.defineProperty( Object.prototype, 'logOk' {
    value: function() { console.log('ok') },
    enumerable: false
});</nowiki>
 
все объекты получат этот метод, но, при этом, он будет неперечисляемым (не нужно каждый раз использовать hasOwnProperty для проверки, есть ли такое свойство):
 
<nowiki>var o = {a: 1, b: 2}
for( var i in o ) console.log( i, o[ i ] );
> a 1
> b 2
o.logOk();
> ok</nowiki>
 
 
Собственно то, ради чего я тут графоманю.
 
Во-первых определим метод define, чтоб каждый раз не вызывать перегруженную, на мой взгляд, конструкцию. Во-вторых определим метод extendNotEnum, который расширяет объект неперечисляемыми свойствами.
 
<nowiki>Object.defineProperties( Object.prototype, {
    define: {
        value: function( key, descriptor ) {
            if( descriptor ) {
                Object.defineProperty( this, key, descriptor );
            } else {
                Object.defineProperties( this, key );
            }
            return this;
        },
        enumerable: false
    },
    extendNotEnum: {
        value: function( key, property ) {
            if( property ) {
                this.define( key, {
                    value: property,
                    enumerable: false,
                    configurable: true
                });
            } else {
                for( var prop in key ) if( key.hasOwnProperty( prop ) ){
                    this.extendNotEnum( prop, key[ prop ] );
                }
            }
        },
        enumerable: false
    }
});
</nowiki>
 
Использование:
<nowiki>var o = { a: 1 };
o.define( 'randomInt', {
    get: function() {
        return 42;
    }
});
 
o.extendNotEnum({
    b: 2;
});
 
for( var i in o ) console.log( i, o[ i ] );
> a 1
> randomInt 42
 
console.log( o.b );
> 2
</nowiki>
 
И пошла… Еще два удобных метода:
 
<nowiki>Object.prototype.extendNotEnum({
    extend: function() {
        var args = Array.prototype.slice.call( arguments );
        args.unshift( this );
        return $.extend.apply( null, args ); // если jQuery надоест, можно просто переписать под себя
    },
   
    each: function( callback ) {
        return $.each( this, callback ); // аналогично
    }
});
 
 
o.extend({c: 3}); // тупо добавляет новые свойства в объект
o.each(function( key, value ) {
    // просто повторяет механизм $.each, перебирая все ключи и свойства
});</nowiki>
 
 
Добавлять новые свойства можно до бесконечности, никто вам за это руку не откусит.
 
Вывод
 
Играйте в Денди, пишите на Javascript, который становится всё лучше и лучше.
 
комментарии
 
 
Еще один финт ушами для тех, кто определяет свойства прототипа только однажды, после определения функции-конструктора:
<nowiki>// запускается в консоли
Object.defineProperty( Object.prototype, 'awesomeprototype', {
    set: function( object ) {
        for( var prop in object ) {
            Object.defineProperty( this.prototype, prop, {
                value: object[ prop ],
                enumerable: false
            });
        }
    }
});
 
var X = function() {}
X.awesomeprototype = {
    method: function() { alert( 'ok' ) }
};
 
var x = new X
 
x.method()
</nowiki>
 
'''Стоит отметить что в литералах объектов свойства можно задавать через геттер и сеттер:'''
  <nowiki>var o = {
    __someProperty : 42,
    get someProperty() { return this.__someProperty; },
    set someProperty(v) { this.__someProperty = v; }
};
 
o.someProperty; // 42
o.someProperty = 56;
o.someProperty; // 56
</nowiki>
 
Ну это так, к слову :)
 
==deferred==
*[http://habrahabr.ru/post/175947/ Асинхронные API и объект Deferred в деталях][https://github.com/StreetStrider/utils/tree/master/doc GitHub]
*[http://javascript.ru/unsorted/async/deferred Объект Deferred.]
*[http://www.smira.ru/2009/02/10/deferred-async-programming/ Асинхронное программирование: концепция Deferred]
*[http://www.smira.ru/2009/02/24/more-about-deferred/ Deferred: все подробности]
==Шаблонизация в JavaScript==
*[http://learn.javascript.ru/templates Шаблонизация в JavaScript]
==DOM==
===dom2json===
http://coderepos.org/share/browser/lang/javascript/dom2json/dom2json.js?rev=30780
skips empty attributes that IE implicitly adds
<nowiki>/*
* $Id: dom2json.js,v 0.2 2008/06/15 07:04:10 dankogai Exp dankogai $
*/
(function(){
 
dom2json = function(dom){
    var type = dom.nodeType;
    if (type == 3) return dom.nodeValue;
    if (type == 1){
        var json = [];
        json.push(dom.nodeName);
        var attrs = dom.attributes;
        if (attrs.length){
            var attr = {};
            for (var i = 0, l = attrs.length; i < l; i++){
                attr[attrs[i].name] = attrs[i].value;
            }
            if (0 /*@cc_on +1@*/){
                attr['style'] = dom.style;
            }
            json.push(attr);
        }
        if (! dom.hasChildNodes()) return json;
        var kids = dom.childNodes;
        for (var i = 0, l = kids.length; i < l; i++){
            var kjson = arguments.callee(kids[i]);
            if (kjson) json.push(kjson);
        }
        return json;
    }
};
json2dom = function(json){
    var i = 0;
    var tag = json[i++]
    var dom = document.createElement(tag);
    if (json[i].constructor == Object){
        var attr = json[i++];
        for (var name in attr){
            dom.setAttribute(name, attr[name]);
        }
    }
    for (var l = json.length; i < l; i++){
        dom.appendChild(
            json[i].constructor == Array
                ? arguments.callee(json[i])
                : document.createTextNode(json[i])
            );           
    }
    return dom;
}
})();</nowiki>
===обход дерева DOM===
  <nowiki>/**
* Рекурсивное перечисление дочерних элементов
*
* @param DomNode node
* Родительский элемент, чьи дочерние узлы нужно перечислять.
*
* @return void
*/
function enumChildNodes(node) {
    // если нам передали элемент
    if (node && 1 == node.nodeType) {
        // берем его первый дочерний узел
        var child = node.firstChild;
        // пока узлы не закончились
        while (child) {
            // если этот узел является элементом
            if (1 == child.nodeType) {
                // что-то делаем с найденным элементом
                alert('элемент ' + child.tagName);
                // рекурсивно перечисляем дочерние узлы
                enumChildNodes(child);
            };
            // переходим к следующему узлу
            child = child.nextSibling;
        };
    };
};
   
   
// перечисляем содержимое body
cat /etc/php5/fpm/php.ini
enumChildNodes(document.body);</nowiki>
....
 
disable_functions = pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wexitstatus,<br>pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,<br>pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,
===Обход child nodes (потомков) определнного элемента в Javascript===
  ....
JavaScript на заметку Комментировать
  date.timezone = Europe/Moscow
Речь о том как корректно обойти элементы потомки DOM для данного элемента,
  ....
простите за тафтологию
max_execution_time = 300
 
....
  var object = document.getElementById('el');
post_max_size = 16M
for (var childItem in object.childNodes) {
  ....
  if (object.childNodes[childItem].nodeType == 1)
  always_populate_raw_post_data = -1
  object.childNodes[childItem].style.color = '#FF0000';
  ....
 
В данном примере мы берем некоторый элемент с id = 'el' и проходим по массиву
его потомков (childNodes), при этом проверяем nodeType потомка, чтобы он был
элементом страницы и если так, то окрашиваем его в КРАСНЫЙ цвет.
 
В принципе на базе этой конструкции можно организовать рекурсивный обход дерева
всех потомков заданного элемента, если конечно возникнет такая необходимость, но
пока я представляю только упрощенный вариант.
 
Здесь следует обратить внимание на проверку свойства nodeType == 1, дело в том
что без этой проверки в обработку попадут и разрывы строк, т.е. символы "\n",
которые тоже воспинимаются как ноды. Т.е. например конструкция вида:
 
так быстрее и меньше кода
  var object = document.getElementById(‘el’).getElementsByTagName(‘*’);
  for(var i=0;object[i];i++){
  object[i].style.color = ‘#FF0000′;
 


Sun, getElementsByTagName не поддерживает ИЕ, смысл его использовать?
* '''(!)''' - возможно '''zabbix''' при первом запуске еще что-то попросит, измените как будет указано.


К сожалению заметил, что данная конструкция в Opera выполняется некорректно
* '''nginx''' - пример наcтройки для '''zabbix''':
(цикл for проходится два раза), никто с таким не встречался? Где-то всё же
закралась моя ошибка или это ошибка браузера (проверял в 9.20, 9.50, 10.20),
замечу, что в остальных браузерах всё выполняется верно.


var object = document.getElementById(‘el’);
  server {
for (var childItem in object.childNodes) {
    listen      10.0.1.40:88;
    server_name zabbix;
    root /home/www/zabbix;
    location / {
        index  index.html index.php;
    }
   
   
}
    location ~* \.(gif|jpg|png)$ {
        expires 30d;
    }
   
   
var object=document.getElementById(‘el’);
    location ~ \.php$ {
  for(var i=0;i<object.childNodes.length;i++) {
        fastcgi_pass localhost:9000;
if (object.childNodes[i].nodeType == 1) {
        fastcgi_param SCRIPT_FILENAME
// тут что-либо делаем
                      $document_root$fastcgi_script_name;
        include      fastcgi_params;
    }
  }
  }
}
==Functional JavaScript==
[http://functionaljavascript.blogspot.ru/2013/07/functors.html Источник]
Each post will cover a specific aspect of functional programming in JavaScript.
Tuesday, July 16, 2013
Functors
Consider the function below.
function plus1(value) { 
    return value + 1 
It is just a function that takes an integer and adds one to it. Similarly we could could have another function plus2. We will use these functions later.
function plus2(value) { 
    return value + 2 
And we could write a generalised function to use any of these functions as and when required.
function F(value, fn) { 
    return fn(value) 
}
F(1, plus1) ==>> 2
This function will work fine as long as the value passed is an integer. Try an array.
F([1, 2, 3], plus1)  ==>> '1,2,31'
Ouch. We took an array of integers, added an integer and got back a string! Not only did it do the wrong thing, we ended up with a string having started with an array. In other words our program also trashed the structure of the input. We want F to do the "right thing". The right thing is to "maintain structure" through out the operation.
So what do we mean by "maintain structure"? Our function must "unwrap" the given array and get its elements. Then call the given function with every element. Then wrap the returned values in a new Array and return it. Fortunately JavaScript just has that function. Its called map.
[1, 2, 3].map(plus1)  ==>> [2, 3, 4]
And map is a functor!
A functor is a function, given a value and a function, does the right thing.
To be more specific.
A functor is a function, given a value and a function, unwraps the values to get to its inner value(s), calls the given function with the inner value(s), wraps the returned values in a new structure, and returns the new structure.
Thing to note here is that depending on the "Type" of the value, the unwrapping may lead to a value or a set of values.
Also the returned structure need not be of the same type as the original value. In the case of map both the value and the returned value have the same structure (Array). The returned structure can be any type as long as you can get to the individual elements. So if you had a function that takes and Array and returns value of type Object with all the array indexes as keys, and corresponding values, that will also be a functor.
In the case of JavaScript, filter is a functor because it returns an Array, however forEach is not a functor because it returns undefined. ie. forEach does not maintain structure.
Functors come from category theory in mathematics, where functors are defined as "homomorphisms between categories". Let's draw some meaning out of those words.
homo = same
morphisms = functions that maintain structure
category = type
According to the theory, function F is a functor when for two composable ordinary functions f and g
F(f . g) = F(f) . F(g)
where . indicates composition. ie. functors must preserve composition.
So given this equation we can prove wether a given function is indeed a functor or not.
Array Functor
We saw that map is a functor that acts on type Array. Let us prove that the JavaScript Array.map function is a functor.
function compose(f, g) {
    return function(x) {return f(g(x))}
}
Composing functions is about calling a set of functions, by calling the next function, with results of the previous function. Note that our compose function above works from right to left. g is called first then f.
[1, 2, 3].map(compose(plus1, plus2))  ==>> [ 4, 5, 6 ]
[1, 2, 3].map(plus2).map(plus1)        ==>> [ 4, 5, 6 ]
Yes! map is indeed a functor.
Lets try some functors. You can write functors for values of any type, as long as you can unwrap the value and return a structure.
String Functor
So can we write a functor for type string? Can you unwrap a string? Actually you can, if you think of a string as an array of chars. So it is really about how you look at the value. We also know that chars have char codes which are integers. So we run plus1 on every char charcode, wrap them back to a string and return it.
function stringFunctor(value, fn) { 
    var chars = value.split("") 
    return chars.map(function(char) { 
        return String.fromCharCode(fn(char.charCodeAt(0))) 
    }).join("") 
}
stringFunctor("ABCD", plus1) ==>> "BCDE" 
You can begin to see how awesome functors are. You can actually write a parser using the string functor as the basis.
Function Functor
In JavaScript functions are first class citizens. That means you can treat functions like any other value. So can we write a functor for value of type function? We should be able to! But how do we unwrap a function? You can unwrap a function by calling it and getting its return value. But we straight away run into a problem. To call the function we need its arguments. Remember that the functor only has the function that came in as the value. We can solve this by having the functor return a new function. This function is called with the arguments, and we will in turn call the value function with the argument, and call the original functors function with the value returned!
function functionFunctor(value, fn) { 
    return function(initial) { 
        return function() { 
            return fn(value(initial)) 
        } 
    } 
}
var init = functionFunctor(function(x) {return x * x}, plus1) 
var final = init(2) 
final() ==> 5
Our function functor really does nothing much, to say the least. But there a couple things of note here. Nothing happens until you call final. Every thing is in a state of suspended animation until you call final. The function functor forms the basis for more awesome functional stuff like maintaining state, continuation calling and even promises. You can write your own function functors to do these things!
MayBe Functor
function mayBe(value, fn) {
    return value === null || value === undefined ? value : fn(value)
}
Yes, this is a valid functor.
mayBe(undefined, compose(plus1, plus2))    ==>> undefined
mayBe(mayBe(undefined, plus2), plus1)      ==>> undefined
mayBe(1, compose(plus1, plus2))            ==>> 4
mayBe(mayBe(1, plus2), plus1)              ==>> 4
So mayBe passes our functor test. There is no need for unrapping or wrapping here. It just returns nothing for nothing. Maybe is useful as a short circuiting function, which you can use as a substitute for code like
if (result === null) {
    return null
} else {
    doSomething(result)
}
Identity Function
function id(x) {
    return x
}
The function above is known as the identity function. It is just a function that returns the value passed to it. It is called so, because it is the identity in composition of functions in mathematics.
We learned earlier that functors must preserve composition. However something I did not mention then, is that functors must also preserve identity. ie.
F(value, id) = value
Lets try this for map.


[1, 2, 3].map(id)   ==>> [ 1, 2, 3 ]
=='''Полезные советы'''==
Type Signature
* '''Проблема:''' Триггер с элементом vm.memory.size
The type signature of a function is the type of its argument and return value. So the type signature of our plus1 function is
Пытаюсь мониторить переполнение RAM (если меньше 10% свободной RAM в течении 5 минут) и создаю триггер:
  {hostname:vm.memory.size[available].last(5m)}<10
Однако ничего не происходит.


f: int -> int
* '''Решение:'''
The type signature of the functor map depends on the type signature of the function argument. So if map is called with plus1 then its type signature is
Вам для вашей задачи лучше использовать функцию max()
{hostname:vm.memory.size[pavailable].max(5m)}<10
* [https://www.zabbix.com/forum/in-russian/46020-%D0%A2%D1%80%D0%B8%D0%B3%D0%B3%D0%B5%D1%80-%D1%81-%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%BE%D0%BC-vm-memory-size источник]
  '''Пример:''' {Zabbix server:vm.memory.size[available].max(5m)}<10
<hr>


map: [int] -> [int]
* '''Проблема:'''  Если постоянно выскакивает предупреждение на триггер Disk I/O is overloaded on
However the type signature of the given function need not be the same as above. We could have a function like
{Zabbix server:system.cpu.util[,iowait].last(0)}>20
Получается, что ожидает операции ввода.вывода более 20 сек ?


f: int -> string
* '''Решение:''' Cоветую увеличить интервал и также путем увелечинеия памяти!
in which the type signature of map would be
[https://www.zabbix.com/forum/zabbix-help/36397-disk-i-o-is-overloaded-on-zabbix-server/page2?t=44382&highlight=Disk+I/O+overloaded&page=2 Вот здесь совет]
Пример: {Zabbix server:system.cpu.util[,iowait].avg(5m)}>30
<hr>


map: [int] -> [string]
* '''Проблема:''' Zabbix discoverer processes more than 75% busy
The only restriction being that the type change does not affect the composability of the functor. So in general a functor's type signature can
 
* '''Решение:''' Этот процесс используется при обнаружении устройств в сети.
Проверьте и в случае необходимости, подправьте настройки правил обнаружения или увеличьте количество процессов которые
занимаются обнаружением новых устройств (параметр StartDiscoverers в конфиг файле zabbix сервера).
К пингу этот процесс и триггер отношения не имеют.
Если не нужен, то и не запускайте обнаружения. Если нужен, то поставьте 2. Посмотрите на графике динамику изменения.
Если всё равно нагрузка будет большая, поставьте 3. Ну и так далее.
<hr>


F: A -> B
* Проблема: zabbix win 7  cannot make counterpath for "\\": [0xC0000BBD] Обязательный аргумент пропущен или указан неправильно.
In other words map can take an array of integers and return an array of strings and would still be a functor.
* Решение:
cmd
lodctr /r
* взято [https://serveradmin.ru/zabbix-init_cpu_collector-cannot-make-counterpath/ тут]


Monads are a special case of Functors whos type signature is


M: A -> A
<hr>
'''ИСТОЧНИКИ:'''
<hr>
* [https://serveradmin.ru/ustanovka-i-nastroyka-zabbix-3-4-na-debian-9/#_Zabbix_34_Debian_9 Установка сервера Zabbix 3.4 на Debian 9]
* [https://blog.vpsville.ru/blog/pro/61.html Установка службы Zabbix - агент на Windows сервер.]
* [http://jakondo.ru/ustanovka-i-nastrojka-zabbix-agentov-na-os-windows-i-linux-ubuntu-debian/ Установка и настройка Zabbix агентов на ОС Windows и Linux (Ubuntu, Debian)]
* [http://www.ekzorchik.ru/2015/01/install-zabbix-agent-on-windows-7/ Установить Zabbix агент на Windows 7]
* [http://www.ekzorchik.ru/2015/01/how-to-install-zabbix-agent-on-windows-xp/ Как установить Zabbix агент на Windows XP]
* [http://www.suiviperf.com/zabbix/ '''ZABBIX AGENT installers''']
* [https://www.zabbix.com/documentation/3.0/ru/manual/quickstart/notification Получение оповещения о проблеме]
* [https://serveradmin.ru/nastroyka-email-opoveshheniy-v-zabbix/ Отправка email уведомлений в zabbix 2.4]
* [https://habrahabr.ru/company/zabbix/blog/193472/ Zabbix тюнинг]
* [http://blog.files.dp.ua/zabbix-trigger Решение проблем с триггерами processes more than 75% busy]
* [http://linux-notes.org/optimizatsiya-nastroek-zabbix/ Оптимизация настроек Zabbix]

Версия от 05:12, 17 сентября 2018

Zabbix2.png


Установка и настройка

- Система Debian Jessie (8)

  • устанавливаем postgresql, читать тут PostgreSQL
  • устанавливаем необходимые пакеты:
echo "deb-src http://repo.zabbix.com/zabbix/3.4/debian stretch main" > /etc/apt/sources.list.d/zabbix.list
wget -O - "http://repo.zabbix.com/zabbix-official-repo.key" | apt-key add -
wget -O - "https://repo.zabbix.com/RPM-GPG-KEY-ZABBIX-79EA5ED4" | apt-key add -
wget -O - "https://repo.zabbix.com/RPM-GPG-KEY-ZABBIX-A14FE591" | apt-key add -
wget -O - "https://repo.zabbix.com/RPM-GPG-KEY-ZABBIX-A14FE591-EL5" | apt-key add -
apt-get update
apt-get install zabbix-agent zabbix-frontend-php zabbix-proxy-pgsql zabbix-server-pgsql php-fpm nginx
  • создаем администратора базы zabbix
CREATE USER zabbixadmin WITH PASSWORD 'mypassword';
  • создаем базу данных для zabbix
CREATE DATABASE "zabbix"
 WITH OWNER "zabbixadmin"
 ENCODING 'UTF8'
 LC_COLLATE = 'ru_RU.UTF-8'
 LC_CTYPE = 'ru_RU.UTF-8';
  • даем права на базу администратору
GRANT ALL PRIVILEGES ON DATABASE "zabbix" to zabbixadmin;
  • теперь необходимо в эту базу загрузить шаблоны и схему (для postgresql)
zcat /usr/share/zabbix-server-pgsql/{schema,images,data}.sql.gz|psql -h 127.0.0.1 zabbix zabbixadmin

{!} - для версии 3.4:

zcat /usr/share/doc/zabbix-server-pgsql/create.sql.gz|psql -h 127.0.0.1 zabbix zabbixadmin
  • настраиваем php-fpm
cat /etc/php5/fpm/pool.d/www.conf
....
;listen = /var/run/php5-fpm.sock
listen = 127.0.0.1:9000

....

cat /etc/php5/fpm/php.ini
....
disable_functions = pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wexitstatus,
pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,
pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority, .... date.timezone = Europe/Moscow .... max_execution_time = 300 .... post_max_size = 16M .... always_populate_raw_post_data = -1 ....
  • (!) - возможно zabbix при первом запуске еще что-то попросит, измените как будет указано.
  • nginx - пример наcтройки для zabbix:
 server {
    listen      10.0.1.40:88;
    server_name zabbix;
    root /home/www/zabbix;
    location / {
        index   index.html index.php;
    }

    location ~* \.(gif|jpg|png)$ {
        expires 30d;
    }

    location ~ \.php$ {
        fastcgi_pass  localhost:9000;
        fastcgi_param SCRIPT_FILENAME
                      $document_root$fastcgi_script_name;
        include       fastcgi_params;
    } 
}

Полезные советы

  • Проблема: Триггер с элементом vm.memory.size
Пытаюсь мониторить переполнение RAM (если меньше 10% свободной RAM в течении 5 минут) и создаю триггер:
{hostname:vm.memory.size[available].last(5m)}<10
Однако ничего не происходит.
  • Решение:
Вам для вашей задачи лучше использовать функцию max()
{hostname:vm.memory.size[pavailable].max(5m)}<10
 Пример: {Zabbix server:vm.memory.size[available].max(5m)}<10

  • Проблема: Если постоянно выскакивает предупреждение на триггер Disk I/O is overloaded on
{Zabbix server:system.cpu.util[,iowait].last(0)}>20
Получается, что ожидает операции ввода.вывода более 20 сек ?
  • Решение: Cоветую увеличить интервал и также путем увелечинеия памяти!
Вот здесь совет
Пример: {Zabbix server:system.cpu.util[,iowait].avg(5m)}>30

  • Проблема: Zabbix discoverer processes more than 75% busy
  • Решение: Этот процесс используется при обнаружении устройств в сети.
Проверьте и в случае необходимости, подправьте настройки правил обнаружения или увеличьте количество процессов которые
занимаются обнаружением новых устройств (параметр StartDiscoverers в конфиг файле zabbix сервера).
К пингу этот процесс и триггер отношения не имеют.
Если не нужен, то и не запускайте обнаружения. Если нужен, то поставьте 2. Посмотрите на графике динамику изменения.
Если всё равно нагрузка будет большая, поставьте 3. Ну и так далее.

  • Проблема: zabbix win 7 cannot make counterpath for "\\": [0xC0000BBD] Обязательный аргумент пропущен или указан неправильно.
  • Решение:
cmd
lodctr /r



ИСТОЧНИКИ: