自分が以前ブログで書いていたことが、最近になって
言われるようになっている。
人工知能としての機械学習など、結局、センサーが生身の人間の体においつくのはまだ
まだ大変だということが、以下のサイトに出ている。
https://www.businessinsider.jp/post-827
2017年5月20日土曜日
2017年5月12日金曜日
ZabbixでL2スイッチの監視(覚書)
Ubuntuにzabbixを入れて、L2スイッチを監視する設定にしてみた。
・最初テンプレートなどから、いろいろ試してみたが
うまくいかなかった。機種によって微妙な違いがあるのかとも思い、
Ubuntuに、snmpのツールを入れて、コマンド操作でスイッチから
OIDのリストを取得し、その情報をもとに、ネットで検索したら
なんとか、送受信のパケットやら、破棄パケット、ブロードキャスト等のOIDがわかってきた。
・データはあくまで蓄積値ということに気づく、zabbixの中で差分を求める設定にできることを知る。なんとか、通信状況の推移を表示するところまでこぎつけた。
<インストール方法>
apt-get install fonts-vlgothic
wget
http://repo.zabbix.com/zabbix/3.0/ubuntu/pool/main/z/zabbix-release/zabbix-r
elease_3.0-1+trusty_all.deb
apt-get update
dpkg -i zabbix-release_3.0-1+trusty_all.deb
apt-get install zabbix-agent zabbix-server-mysql zabbix-frontend-php apt-get install snmp
$ mysql -uroot -p
Enter password:
mysql> create database zabbix;
mysql> grant all privileges on zabbix.* to zabbix@localhost identified
mysql> by
'password' ;
mysql> exit
以下の操作も必要なようです
$ mysql -uroot -p<password>
mysql> create database zabbix character set utf8 collate utf8_bin; quit;
Zabbixの設定ファイル/etc/zabbix/zabbix_server.confのデータベースの接続情報を
修正します。
/etc/zabbix/zabbix_server.conf
DBHost=localhost
DBName=zabbix
DBUser=zabbix
DBPassword=password
DBHostは、設定ファイルのコメントに「 If set to localhost, socket is used for
MySQL.」とあるのでMySQLの場合は必須です。
$ zcat /usr/share/doc/zabbix-server-mysql/create.sql.gz | mysql -uroot zabbix -p Enter password:
$ sudo vi /etc/zabbix/zabbix_server.conf
設定内容は以下の通りです。
DBPassword=password
$ sudo vi /etc/apache2/conf-enabled/zabbix.conf
設定箇所は以下の部分です。
php_value date.timezone Asia/Tokyo
$ sudo service zabbix-agent start
$ sudo service zabbix-server start
$ sudo service apache2 restart
うまくいかないときは、一度PCの再起動が必要
※WEB画面http://ホスト/zabbix/で表示させると 以下のエラー出ることあり、以下
のように対処
「PHP Timezone」に「NG」が表示され、インストールが進まない。php.iniを修正し
ないといけない
pico /etc/php5/apache2/php.ini (php.iniの場所はインストールの仕方によって変
わる)
で、timezoneで検索。コメントアウトされているので、タイムゾーンを設定。
;date.timezone =
date.timezone = Asia/Tokyo
php.iniを保存後、apacheを再起動。その後、zabbixのインストール画面で「Retry」
ホタンを押したら「OK」表示に変わり、インストールを続行できた。
Phpでmysqlが使えない状態ならば
apt-get install libapache2-mod-php5 php5-mysql
apt-get install libapache2-mod-auth-mysql
も必要
ID:Admin pw:zabbixでログインします
右上の人の形のアイコンを選択して、LanguageでJapaneseを選択します。日本語は、
デフォルトでインストールされているので選択するだけです。
自動起動設定
sudo sysv-rc-conf zabbix-agent on
sysv-rc-conf zabbix-server on
○***************************スイッチの監視設定
※うまくzabbix-serverが起動しないとき
mkdir /var/log/zabbix-server/
chmod 777 /var/log/zabbix-server/
とする
/usr/sbin/zabbix_server
で起動できる
/ect/init.d/zabbixserverというファイルに
/usr/sbin/zabbix_server -c /etc/zabbix/zabbix_server.conf
というスクリプト作成し chmod +x /ect/init.d/zabbixserver
/etc/rc.localというファイルに
/ect/init.d/zabbixserverを追加した
<Zabbixの設定について>
・参考資料
http://www.oidview.com/mibs/712/LANART-AGENT.html
にOIDのリストがあるので、参考にできる
また、スイッチから、telnetやsshで、OIDのリストを取得して
それをもとにsnmp OIDをきめた(snmpのインストールが必要)
・基本的な操作
http://ホスト名/zabbix/index.php
Username:Admin Password:zabbix
①設定>ホストで
ホスト名、グループ(Discovered hosts Network Templatesなど、このへんの詳
細は不明)を選択
SNMP
インターフェースに対象のL2スイッチのIPアドレス指定 ポートが161
bulkリクエストを使用は チェックはずす
・ホストを再度クリック
変更したいホストのところのアイテムをクリック>アイテムの作成>
名前を任意で入力 タイプはsnmp v2エージェント キーも英数字で任意
SNMP OIDに調べたい項目を上記資料をもとに入力
ポート1の受信パケット数をみたいならiso.3.6.1.2.1.2.2.1.10.1
SNMPコミュニティはL2スイッチにあわせてpublic
保存時の計算は「差分/時間」とします。こうしないと、累積のパケットが表示さ
れてしまいます。
最後に更新
・再度ホスト一覧にもどる
グラフをクリック>グラフの作成>名前は任意
アイテム>追加>表示たいアイテムを選択>選択>追加
・表示をみるには
監視データ>グラフ>ホスト(スイッチ)を選択>表示したグラフをコンボボックス
から選択
・最初テンプレートなどから、いろいろ試してみたが
うまくいかなかった。機種によって微妙な違いがあるのかとも思い、
Ubuntuに、snmpのツールを入れて、コマンド操作でスイッチから
OIDのリストを取得し、その情報をもとに、ネットで検索したら
なんとか、送受信のパケットやら、破棄パケット、ブロードキャスト等のOIDがわかってきた。
・データはあくまで蓄積値ということに気づく、zabbixの中で差分を求める設定にできることを知る。なんとか、通信状況の推移を表示するところまでこぎつけた。
<インストール方法>
apt-get install fonts-vlgothic
wget
http://repo.zabbix.com/zabbix/3.0/ubuntu/pool/main/z/zabbix-release/zabbix-r
elease_3.0-1+trusty_all.deb
apt-get update
dpkg -i zabbix-release_3.0-1+trusty_all.deb
apt-get install zabbix-agent zabbix-server-mysql zabbix-frontend-php apt-get install snmp
$ mysql -uroot -p
Enter password:
mysql> create database zabbix;
mysql> grant all privileges on zabbix.* to zabbix@localhost identified
mysql> by
'password' ;
mysql> exit
以下の操作も必要なようです
$ mysql -uroot -p<password>
mysql> create database zabbix character set utf8 collate utf8_bin; quit;
Zabbixの設定ファイル/etc/zabbix/zabbix_server.confのデータベースの接続情報を
修正します。
/etc/zabbix/zabbix_server.conf
DBHost=localhost
DBName=zabbix
DBUser=zabbix
DBPassword=password
DBHostは、設定ファイルのコメントに「 If set to localhost, socket is used for
MySQL.」とあるのでMySQLの場合は必須です。
$ zcat /usr/share/doc/zabbix-server-mysql/create.sql.gz | mysql -uroot zabbix -p Enter password:
$ sudo vi /etc/zabbix/zabbix_server.conf
設定内容は以下の通りです。
DBPassword=password
$ sudo vi /etc/apache2/conf-enabled/zabbix.conf
設定箇所は以下の部分です。
php_value date.timezone Asia/Tokyo
$ sudo service zabbix-agent start
$ sudo service zabbix-server start
$ sudo service apache2 restart
うまくいかないときは、一度PCの再起動が必要
※WEB画面http://ホスト/zabbix/で表示させると 以下のエラー出ることあり、以下
のように対処
「PHP Timezone」に「NG」が表示され、インストールが進まない。php.iniを修正し
ないといけない
pico /etc/php5/apache2/php.ini (php.iniの場所はインストールの仕方によって変
わる)
で、timezoneで検索。コメントアウトされているので、タイムゾーンを設定。
;date.timezone =
date.timezone = Asia/Tokyo
php.iniを保存後、apacheを再起動。その後、zabbixのインストール画面で「Retry」
ホタンを押したら「OK」表示に変わり、インストールを続行できた。
Phpでmysqlが使えない状態ならば
apt-get install libapache2-mod-php5 php5-mysql
apt-get install libapache2-mod-auth-mysql
も必要
ID:Admin pw:zabbixでログインします
右上の人の形のアイコンを選択して、LanguageでJapaneseを選択します。日本語は、
デフォルトでインストールされているので選択するだけです。
自動起動設定
sudo sysv-rc-conf zabbix-agent on
sysv-rc-conf zabbix-server on
○***************************スイッチの監視設定
※うまくzabbix-serverが起動しないとき
mkdir /var/log/zabbix-server/
chmod 777 /var/log/zabbix-server/
とする
/usr/sbin/zabbix_server
で起動できる
/ect/init.d/zabbixserverというファイルに
/usr/sbin/zabbix_server -c /etc/zabbix/zabbix_server.conf
というスクリプト作成し chmod +x /ect/init.d/zabbixserver
/etc/rc.localというファイルに
/ect/init.d/zabbixserverを追加した
<Zabbixの設定について>
・参考資料
http://www.oidview.com/mibs/712/LANART-AGENT.html
にOIDのリストがあるので、参考にできる
また、スイッチから、telnetやsshで、OIDのリストを取得して
それをもとにsnmp OIDをきめた(snmpのインストールが必要)
・基本的な操作
http://ホスト名/zabbix/index.php
Username:Admin Password:zabbix
①設定>ホストで
ホスト名、グループ(Discovered hosts Network Templatesなど、このへんの詳
細は不明)を選択
SNMP
インターフェースに対象のL2スイッチのIPアドレス指定 ポートが161
bulkリクエストを使用は チェックはずす
・ホストを再度クリック
変更したいホストのところのアイテムをクリック>アイテムの作成>
名前を任意で入力 タイプはsnmp v2エージェント キーも英数字で任意
SNMP OIDに調べたい項目を上記資料をもとに入力
ポート1の受信パケット数をみたいならiso.3.6.1.2.1.2.2.1.10.1
SNMPコミュニティはL2スイッチにあわせてpublic
保存時の計算は「差分/時間」とします。こうしないと、累積のパケットが表示さ
れてしまいます。
最後に更新
・再度ホスト一覧にもどる
グラフをクリック>グラフの作成>名前は任意
アイテム>追加>表示たいアイテムを選択>選択>追加
・表示をみるには
監視データ>グラフ>ホスト(スイッチ)を選択>表示したグラフをコンボボックス
から選択
2017年5月5日金曜日
関数型プログラミングの基礎 IOモナド
IOモナドは関数の形であり、FUN[WORLD=>PAIR[T,WORLD]]であることに注意が必要、その分ややこしくなっている。
したがってunit:: T => IO[T] のIO[T]の部分が上記の関数の形になっていることが
下記のスクリプトで確かめられる。
anyがT、 (world) => return pair.cons(any, world);がFUN[WORLD=>PAIR[T,WORLD]]ということ。
また、flatMap:::: IO[T] => FUN[T => IO[U]] => IO[U]としてみると
instancdAが IO[T]、actionABがFUN[T => IO[U]] 、 return (world) => 以降が IO[U]ということになる。
actionABはT からIO[U]を作る関数で、TはIO[T]つまりnewPair = instanceA(world)のnewPair (value, newWorld) からvalue(ここではT)をmatchを使って取り出してる。
確かに、actionAB(value)(newWorld)はFUN[T => IO[U]] つまりFUN[T =>FUN[WORLD=>PAIR[U,WORLD]] ] (∵IO[U]=FUN[WORLD=>PAIR[U,WORLD]])となっていることが確認できる。
var IO = {
unit: (any) => {
return (world) => { return pair.cons(any, world); };
},
flatMap: (instanceA) => {
return (actionAB) => {
return (world) => {
var newPair = instanceA(world); // 現在の外界で instanceA実行
return pair.match(newPair,{
cons: (value, newWorld) => {
return actionAB(value)(newWorld); // 新しい外界で、actionAB(value)で作られたIOアクションを実行
}
});
};
};
},
したがってunit:: T => IO[T] のIO[T]の部分が上記の関数の形になっていることが
下記のスクリプトで確かめられる。
anyがT、 (world) => return pair.cons(any, world);がFUN[WORLD=>PAIR[T,WORLD]]ということ。
また、flatMap:::: IO[T] => FUN[T => IO[U]] => IO[U]としてみると
instancdAが IO[T]、actionABがFUN[T => IO[U]] 、 return (world) => 以降が IO[U]ということになる。
actionABはT からIO[U]を作る関数で、TはIO[T]つまりnewPair = instanceA(world)のnewPair (value, newWorld) からvalue(ここではT)をmatchを使って取り出してる。
確かに、actionAB(value)(newWorld)はFUN[T => IO[U]] つまりFUN[T =>FUN[WORLD=>PAIR[U,WORLD]] ] (∵IO[U]=FUN[WORLD=>PAIR[U,WORLD]])となっていることが確認できる。
var IO = {
unit: (any) => {
return (world) => { return pair.cons(any, world); };
},
flatMap: (instanceA) => {
return (actionAB) => {
return (world) => {
var newPair = instanceA(world); // 現在の外界で instanceA実行
return pair.match(newPair,{
cons: (value, newWorld) => {
return actionAB(value)(newWorld); // 新しい外界で、actionAB(value)で作られたIOアクションを実行
}
});
};
};
},
2017年5月4日木曜日
関数型プログラミングの基礎 継続を使った非決定計算機
継続について書いてあるが、かなりこみ入っている。
とりあえず、以下のようにしたら、動作させることはできた。
おおまかな流れを把握するので精一杯だった。
式の評価とか、なんらかの構造をもつものについてのアルゴリズムは、複雑になりやすいので、こういった方法で少しでも、整理してプログラミングをしていくということなのでしょう。。。
①add(amb(リスト1),amb(リスト2))がdirverの中のcalculateの第1引数へ
②calculateの中のmatchにより、add:(x,y)にマッチ
③その中で再帰でcalculateの第1引数へ amb(リスト)の形なので
④amb:(choice)にmatch また再帰でcalculateの第1引数へ headであるnum()の形で
⑤最終的には num:(n)にmatch return contiuesOnSuccess(n,contiunesOnFailure);
に到達する。 contiuesOnSuccessは第1引数anyvalue(今の場合n)をそのまま返している。suspendedComputationにはfailureのほうにある残りのリストが保持されることになるらしい。
代数的データ構造のパターンマッチについては、以前でてきた方法
var exp = {
match : (anExp, pattern) => {
return anExp.call(exp, pattern);
},
amb : (alist) => {
return (pattern) => {
return pattern.amb(alist);
};
},
num : (n) => {
return (pattern) => {
return pattern.num(n);
};
},
add : (exp1, exp2) => {
return (pattern) => {
return pattern.add(exp1, exp2);
};
}
};
評価関数
var calculate = (anExp, continuesOnSuccess, continuesOnFailure) => {
return exp.match(anExp, {
※数値の場合 num: (n) => {
return continuesOnSuccess(n, continuesOnFailure);
},
※足し算の場合 add: (x, y) => {
return calculate(x, (resultX, continuesOnFailureX) => {
return calculate(y, (resultY, continuesOnFailureY) => {
引数xとyがともに成功すれば、両者の値で足し算を計算
return continuesOnSuccess(resultX + resultY, continuesOnFailureY);
}, continuesOnFailureX);
y の計算に失敗すれば、xの失敗継続を渡す
}, continuesOnFailure);
x の計算に失敗すれば、おおもとの失敗継続を渡す
},
※amb式の場合 amb: (choices) => {
var calculateAmb = (choices) => {
return list.match(choices, {
empty: () => {
return continuesOnFailure();
},
cons: (head, tail) => {
return calculate(head, continuesOnSuccess, (_) => {
失敗継続で後尾を計算
return calculateAmb(tail);
});
}
});
};
return calculateAmb(choices);
}
});
};
非決定計算機の駆動関数
var driver = (expression) =>{
var suspendedComputation = null;//中断された計算を継続として保存する変数
成功継続
var continuesOnSuccess = (anyValue,
continuesOnFailure) => {//再開に備えて、失敗継続を保存
suspendedComputation = continuesOnFailure;
return anyValue;
};
失敗継続
var continuesOnFailure = () => {
return null;
};
内部に可変な状態suspendedComputationを持つクロージャーを返す
return () => { //中断された継続がなければ、最初から計算
if(suspendedComputation === null) {
return calculate(expression, continuesOnSuccess, continuesOnFailure);
} else { //中断された継続があれば、その継続を実行
return suspendedComputation();
}
};
};
リストモジュールも必要
// expect(array).to.an('array');はコメントアウトしないとだめだった。
テスト
var ambExp = exp.add(
exp.amb(list.fromArray([exp.num(1),exp.num(2)])),
exp.amb(list.fromArray([exp.num(3),exp.num(4)])));
var calculator = driver(ambExp);
calculator() ;
calculator() ;
calculator() ;
calculator() ;
とりあえず、以下のようにしたら、動作させることはできた。
おおまかな流れを把握するので精一杯だった。
式の評価とか、なんらかの構造をもつものについてのアルゴリズムは、複雑になりやすいので、こういった方法で少しでも、整理してプログラミングをしていくということなのでしょう。。。
①add(amb(リスト1),amb(リスト2))がdirverの中のcalculateの第1引数へ
②calculateの中のmatchにより、add:(x,y)にマッチ
③その中で再帰でcalculateの第1引数へ amb(リスト)の形なので
④amb:(choice)にmatch また再帰でcalculateの第1引数へ headであるnum()の形で
⑤最終的には num:(n)にmatch return contiuesOnSuccess(n,contiunesOnFailure);
に到達する。 contiuesOnSuccessは第1引数anyvalue(今の場合n)をそのまま返している。suspendedComputationにはfailureのほうにある残りのリストが保持されることになるらしい。
代数的データ構造のパターンマッチについては、以前でてきた方法
var exp = {
match : (anExp, pattern) => {
return anExp.call(exp, pattern);
},
amb : (alist) => {
return (pattern) => {
return pattern.amb(alist);
};
},
num : (n) => {
return (pattern) => {
return pattern.num(n);
};
},
add : (exp1, exp2) => {
return (pattern) => {
return pattern.add(exp1, exp2);
};
}
};
評価関数
var calculate = (anExp, continuesOnSuccess, continuesOnFailure) => {
return exp.match(anExp, {
※数値の場合 num: (n) => {
return continuesOnSuccess(n, continuesOnFailure);
},
※足し算の場合 add: (x, y) => {
return calculate(x, (resultX, continuesOnFailureX) => {
return calculate(y, (resultY, continuesOnFailureY) => {
引数xとyがともに成功すれば、両者の値で足し算を計算
return continuesOnSuccess(resultX + resultY, continuesOnFailureY);
}, continuesOnFailureX);
y の計算に失敗すれば、xの失敗継続を渡す
}, continuesOnFailure);
x の計算に失敗すれば、おおもとの失敗継続を渡す
},
※amb式の場合 amb: (choices) => {
var calculateAmb = (choices) => {
return list.match(choices, {
empty: () => {
return continuesOnFailure();
},
cons: (head, tail) => {
return calculate(head, continuesOnSuccess, (_) => {
失敗継続で後尾を計算
return calculateAmb(tail);
});
}
});
};
return calculateAmb(choices);
}
});
};
非決定計算機の駆動関数
var driver = (expression) =>{
var suspendedComputation = null;//中断された計算を継続として保存する変数
成功継続
var continuesOnSuccess = (anyValue,
continuesOnFailure) => {//再開に備えて、失敗継続を保存
suspendedComputation = continuesOnFailure;
return anyValue;
};
失敗継続
var continuesOnFailure = () => {
return null;
};
内部に可変な状態suspendedComputationを持つクロージャーを返す
return () => { //中断された継続がなければ、最初から計算
if(suspendedComputation === null) {
return calculate(expression, continuesOnSuccess, continuesOnFailure);
} else { //中断された継続があれば、その継続を実行
return suspendedComputation();
}
};
};
リストモジュールも必要
// expect(array).to.an('array');はコメントアウトしないとだめだった。
テスト
var ambExp = exp.add(
exp.amb(list.fromArray([exp.num(1),exp.num(2)])),
exp.amb(list.fromArray([exp.num(3),exp.num(4)])));
var calculator = driver(ambExp);
calculator() ;
calculator() ;
calculator() ;
calculator() ;
登録:
投稿 (Atom)