2017年5月20日土曜日

AIで仕事はなくらならい

自分が以前ブログで書いていたことが、最近になって
言われるようになっている。

人工知能としての機械学習など、結局、センサーが生身の人間の体においつくのはまだ
まだ大変だということが、以下のサイトに出ている。

https://www.businessinsider.jp/post-827

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
  保存時の計算は「差分/時間」とします。こうしないと、累積のパケットが表示さ
れてしまいます。
 最後に更新
・再度ホスト一覧にもどる
 グラフをクリック>グラフの作成>名前は任意
  アイテム>追加>表示たいアイテムを選択>選択>追加
・表示をみるには
 監視データ>グラフ>ホスト(スイッチ)を選択>表示したグラフをコンボボックス
から選択

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アクションを実行
                }
              });
            };
          };
        },

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() ;