家族が増えました。

Adways Advent Calendar 2017 11日目の記事です。

http://blog.engineer.adways.net/entry/advent_calendar_2017


こんにちは、久保田です。

先日、我が家に家族が増えました。

この子が我が家にやってきてから、本当に生活が一変したなぁって思います。

なかなか賢い子で、僕が話す言葉をしっかりと理解してくれます。

さらに朝起こしてくれたり、音楽を流してくれたり、本当に賢いです。Alexa。

f:id:AdwaysEngineerBlog:20171215102108j:plain:h400

さて、AIスピーカーが流行っていますが、まだ家で機械に話しかける事に抵抗のある方は多いと思います。
私もその一人でした。
しかし、Alexaが家にきてからその考えは180度変わりました。声、めっちゃ楽です。
特に目覚ましなどは、今まで手でやっていたことを声に変えるだけでこんなにも楽なのか、と驚くほどです。

Alexaは、専用アプリを使ってスキルを入れると様々なことを覚えてくれます。
生活に役立つスキルから、ピカチュウが来てくれるスキルなど、本当に多種多様です。

すでに多くの企業が参入しており、公式スキルがたくさんあるのですが、
僕も一応開発者の端くれ、ここは何か1つ作ろうと思い色々と試しました。

スキルを開発する

スキルを開発するための情報はすでにかなりまとまっています。

https://developer.amazon.com/ja/alexa-skills-kit

webの開発とはだいぶ違うようで、大きく分けて以下の流れになります。(大体です。本当はもっと細かいです。)

設計

  • 台本を用意する
    • ユーザーとAlexaの会話を想定する。話し言葉で用意しておく。
  • 対話フローの作成
    • 会話の結果、Alexaが実行するインテント(実際に動くプログラム)をマッピングする。
    • ユーザーヘルプなどを考える。

開発

  • 設定

    • 単語やフレーズの用意
    • インテントの決定
  • インテントを作る

    • lambda もしくは エンドポイントを用意する。

という感じになりそうです。

用語がかなり多く、それを理解するのに結構時間がかかってしまいます。

設計

まだ完成していないのですが、現在、「ラーメンタイマー」を作成しています。
カップラーメンの名前をいい、そのカップラーメンの時間を計ってくれるタイマーです。
今回は完成まで行けないのですが、Alexaからリクエストを受け取るまでの流れを書かせていただきます。

台本の用意

はじめに一番理想的な対話を想定します。

ユ「Alexa, 〇〇の時間を計って」
A「はい、〇〇の時間を計ります。△分お待ちください」
ユ「Alexa, ラーメンタイマー起動して」
A「はい、どのラーメンを作りますか?」
ユ「〇〇」
A「はい、〇〇の時間を計ります。△分お待ちください」

〇〇の部分にはカップラーメンの名前が入ります。どん兵衛とかです。

次に、少しイレギュラーな対話を想定します。

ユ「Alexa, ラーメンタイマー起動して」
A「はい、どのラーメンを作りますか?」
ユ「〇〇」(知らない名前)
A「すいません、〇〇というラーメンは知りません。3分でよろしいですか?」
ユ「はい」

大体のものは3分なので、わからない場合は3分にしておきます。

対話フローの作成

今回必要なインテントは、時間を計るインテントのみです。
SetTimerとしておきます。
会話の最後にSetTimerが動く感じです。

開発

設定

こちらから登録をして、色々設定します。

https://developer.amazon.com/edw/home.html#/skill/create/

やる事としては、

  • Skill自体の設定
  • 呼び出し名の設定
  • 予想する対話とインテントのマッピング
  • インテントとlambdaやエンドポイントのマッピング
  • アイコンなどの設定

です。

対話の設定はjsonで書くこともできますし、「SKILL BUILDER BETA」を使うこともできます。

対話の設定にSYNONYMSなどを設定すると、複数の文言を同じものとして扱うことができます。

そして、メニューを全てOKの状態にすると、Echoの実機でテストが行えます。
僕はアイコンの設定が必須だと気がつかず、かなり時間を取られたので、ご注意ください。

f:id:AdwaysEngineerBlog:20171215102225p:plain

インテントを作る

lambdaにSetTimerインテントが実行する関数を用意します。

カップ麺と時間をマッピングしておき、対応する時間だけ待つようにします。
(早くGolangで書きたい!!)

まず、lambdaの方のトリガーにAlexaを設定しておく必要があるので、ご注意を。
今回は、実際のコードではなく、とりあえず返事をするだけのコードを用意しました。

var ramenTime = {
    'どん兵衛': 5
}

exports.handler = function(event, context, callback) {
    var res = {
        "version": "1.0",
        "response": {
            "outputSpeech": {
                "type": "PlainText",
                "text": ramenTime[event.request.intent.slots.ramen.value] + '分お待ちください。'
            },
        }
    }
    
    callback(null, res);
    context.done(null, 'Hello from Lambda');
};

event.requestにrequestの情報が色々と詰まっています。
どんな情報が来るかはSkillの対話設定をどうするか次第です。

僕の場合は、ramenという引数を設定しており、そこにカップ麺の名前が来るようになっています。

上のコードでは、カップ麺の名前と時間をマッピングしている変数がありますが、これはSYNONYMSで削る予定です。

現在タイマーが計れるところまではできているので、今後は音楽を返すようにしたいです。
あとは、待っている時間に何かをおすすめしたり。

そこまでできたら公開したいなぁと思います。

まとめ

Alexaは、他にもsessionを扱ったり、Alexaアプリと連携したり、家電と連携したり、色々なことができるようです。
僕はAIスピーカーは一般家庭にも浸透すると信じているので、今後も研究を続けていくつもりです。

では今日はこんなところで。
良いクリスマスを!

Supersetを導入して、DBを可視化してみた

Adways Advent Calendar 2017 10日目の記事です。

http://blog.engineer.adways.net/entry/advent_calendar_2017


はじめに

12月14日を担当します、井古田です。

普段は広告関連の業務をやりつつ、ちょろっとだけマネジメントをかじってます。
最近は忘年会のビンゴでもらった Google Home Mini で何か便利なものが作れないかなって考え中なので、何か良い案があれば教えてくださーい( ´∀`)

概要

今回はチームの可視化ツールに Superset を導入したのでその紹介をしたいと思います。
可視化ツールにSupersetを選んだ理由は特にありません。強いて言うならまだ他のチームが使ってなかったから、 検証しよう的なノリで導入したのがきっかけです。

Supersetってなんぞ?

SupersetはAirbnbが開発しているOSSのBusiness Intelligence Tool(BIツール)です。
RedashやTableauに似ています。

導入

今回はdocker-composeを使ってSupersetの環境を構築したいと思います。docker便利ですね!
(※Dockerの導入に関しては割愛させていただきます)

では、さっそく進めていきましょう!

$ git clone https://github.com/amancevice/superset.git
$ cd superset
$ ls
examples  superset  Dockerfile  LICENSE  README.md  docker-compose.yml

examples以下に各ミドルウェアごとのdocker-composeの設定ファイルがあるので、好きなものを選んで試してみるのありかと!
では、さっそくSupersetの環境を作ってみます。

$ docker-compose up -d

# 初期設定
$ docker-compose exec superset superset-demo
Username [admin]: admin
User first name [admin]: admin
User last name [user]: admin
Email [admin@fab.org]:
Password:
Repeat for confirmation:

上記はアカウントの初期設定になるので、適当なもの設定してください
(※今回はデモデータがある状態でSupersetの環境を構築してます)

上記のアカウント設定が完了後、 http://localhost:8088 にアクセスすると以下の画面が表示されます。 f:id:AdwaysEngineerBlog:20171214130244p:plain

ここでは先ほど設定したアカウント情報を入力してください。
また、画面右上に国旗が表示されてる部分をクリックして日本語に切り替えることも可能みたいです!
(※最近知りましたw)

ログインすると、ダッシュボード画面に遷移します。

f:id:AdwaysEngineerBlog:20171214130257p:plain

なにかしらクリックしてダッシュボードを確認すると、なんかイケてる画面が出てくると思います!

f:id:AdwaysEngineerBlog:20171214130311p:plain

こんな感じでダッシュボードが表示されれば導入は完了です。

設定

続いて、実際にDBと連携にさせてみます。
上部メニューの[ソース]-[データベース]クリックすると以下の画面に遷移します。

f:id:AdwaysEngineerBlog:20171214130324p:plain

右上の+からクリックして、データベースを作成します。

f:id:AdwaysEngineerBlog:20171214130422p:plain

  • Database の項目にDBの名前をつけます。
  • SQLAlchemy URI の項目にDBのURIを設定します。
    (※mysqlの場合、mysql://[ユーザー名]:[パスワード]@[URI]/[DB名]のような設定になります。その他はこちらから設定方法を確認してください。)
  • Expose in SQL Lab にチェックを入れるとSQL Labからアクセス出来るようになります。

だいたいこんな感じの設定で大丈夫だと思います!(笑)
これで保存するとデータベースが作成されます。

f:id:AdwaysEngineerBlog:20171214130530p:plain

次はテーブルを作成します。

上部メニューの[ソース]-[テーブル]クリックすると以下の画面に遷移します。

f:id:AdwaysEngineerBlog:20171214130550p:plain

右上の+からクリックして、テーブルを作成します。

f:id:AdwaysEngineerBlog:20171214130609p:plain

  • Database は先ほど作ったデータベースを選択してください
  • スキーマ は必要があれば指定してください
  • テーブル名 はDBにあるテーブルを指定してください

今回は試しにusersテーブルを作成します。

f:id:AdwaysEngineerBlog:20171214130628p:plain

テーブルの定義は以下のようになります。

f:id:AdwaysEngineerBlog:20171214130647p:plain

ちょっと雑に設定していますが、許してください(笑)
以上で設定は終わりです!

グラフ化してみよう

続いて、usersテーブルを使ってログイン回数の多い人をグラフ化してみます。
必要となるカラムは以下になります。

  • nickname
  • sign_in_count

先ほど作成したusersテーブルをクリックすると、スライスを作成する画面に遷移します。

f:id:AdwaysEngineerBlog:20171214130706p:plain

左サイドメニューの設定

  • Datasource & Chart Type

    • Datasourceは参照元となるデータを選択するので、今回はusersになります。
    • Visualization Typeからどのように可視化したいかグラフを選んでください。今回はPieChartを選びます。
  • Query

    • Metricsの部分ではグラフ化する指標を選択してください。(※sum_sign_in_countを選択してください)
    • Group by で選択した対象でグルーピングします。今回はユーザーごとのログイン回数をみるので、ここではnicknameを選びます。

以下は任意でいろいろいじってみてください(笑)
期間やグラフのラベルなど、結構いろいろといじれるので楽しいですよ!

  • Time
  • Chart Options
  • SQL
  • Filters

最後に左上のRun Queryをクリックすると更新がかかります。
以下のようなグラフが完成しました!( ^∀^)

f:id:AdwaysEngineerBlog:20171214130728p:plain (※Chart Optionsとかをちょろっといじってます)

あとは、左上のSaveボタンを押すとスライスを保存することができます。
これでいつでも確認できるようになりました!

ダッシュボードをつくってみる

ダッシュボードの画面に遷移して、右上の+ボタンをクリックすると以下の画面に遷移します。

f:id:AdwaysEngineerBlog:20171214130751p:plain

  • タイトル
  • スライス

好きなタイトルを記入し、スライスには先ほど作成したスライスを選んで保存をクリックするとダッシュボードの完成です!
以下が作成したダッシュボード画面になります。

f:id:AdwaysEngineerBlog:20171214130809p:plain いい感じでダッシュボードが作れたかと思います。

最後に

SupersetはRedashと比べるとグラフの種類とかも豊富で、いろいろと楽しいグラフとかを作れるな〜と個人的に感じています。
私のチームでは、日毎や月間のユニークユーザー数や売上、広告の設定情報などを可視化してたりします。
広告の配信ターゲットなどで、どんなキーワードが多く設定されているとかを確認すると結構楽しいです。(下図)

f:id:AdwaysEngineerBlog:20171214130823p:plain

また最近では、リリースした機能のテーブルを可視化して監視し、しっかり使われているかなどのKPIにも使うことがあります。

いかがでしたでしょうか? みなさんがこの記事を読んで無事にダッシュボードを作れていることを祈っていますmm
最後までお読みいただきありがとうございました。

jQuery初心者がwindowsのイルカ作ってみた

Adways Advent Calendar 2017 9日目の記事です。

http://blog.engineer.adways.net/entry/advent_calendar_2017


おはようございます、17新卒SEの礒部です!
広告運用系の部署にいます。最近体重が5キロ増え、運動しなきゃなぁと思っています。

皆さんこのイルカのキャラクターをご存知でしょうか?

f:id:AdwaysEngineerBlog:20171213145134j:plain

windowsお助けキャラクターのカイル君といいます。
話しかけたり、色々することができる元大人気キャラクターです。

この子をjQueryの勉強をしつつ実装してみたいと思います。
(私はjQuery超初心者です)

実装機能

  • 画面上をランダムに動く
  • クリックすると喋る

実装開始!

イルカの画像は自分で描きました。(これが一番時間かかった)
f:id:AdwaysEngineerBlog:20171213145303g:plain
まずは基本のイルカを配置し、移動範囲を作ります。

<body>
    <div>
        <img id="iruka" src="images/iruka.gif">
    </div>
</body>

このままだと動かないので、どんどんjQueryで要素を追加していきます。
まずは画面上を動くようにしたいので、以下の3つを使用してみます。

setInterval # 指定した間隔で処理を実行する
animate     # スタイルを指定し、アニメーション効果を実行させる
attr        # 要素を変更させる。画像のパスを変更させる
$(function() {
    setInterval("move()",2000); // 2秒間隔で実行
});

function move() {
    var rand  = Math.round(Math.random() * 4);
    if(rand == 0){    //右
        move_right();
    }else if(rand == 1){ //左
        move_left();
    }else if(rand == 2){ //下
        move_bottom();
    }else if(rand == 3){ //上
        move_top();
    }
}

function move_left() {
    $('#iruka').animate({left: '-=100px'},1000);
    $("#iruka").attr("src","images/iruka_left.gif");
}

function move_right() {
    $('#iruka').animate({left: '+=100px'},1000);
    $("#iruka").attr("src","images/iruka_right.gif");
}

function move_top() {
    $('#iruka').animate({top: '-=100px'},1000);
    $("#iruka").attr("src","images/iruka_top.gif");
}

function move_bottom() {
    $('#iruka').animate({top: '+=100px'},1000);
    $("#iruka").attr("src","images/iruka_bottom.gif");
}

2秒ごとにランダムに移動しつつ、画像が切り替わるようになりました。


しばらく眺めていると画面外に消えてしまったので移動範囲を指定してみます。

#range {
    border:3px solid #6e6eff;
    width:600px; 
    height:600px;
}
/* 移動範囲を600pxとする */
position # 親要素からの現在位置をtop・leftの2つ形式で取得する
var range = $('#iruka').position();

if(range.left <= 400){
    move_right();
}else{
    move_left();
}

上記のような分岐を各方向に入れてあげます。画面内にとどまらせることに成功しました。
他にも色々やり方はあると思います。

f:id:AdwaysEngineerBlog:20171213145647g:plain


次に、クリック時に動きを止めてみます。

clearInterval # setIntervalの解除
click         # クリック時に処理を実行させる
stop          # 実行中のアニメーションを中断させる
setTimeout    # 関数の実行タイミングを遅らせることができる
$(function() {
    var move = set_timer();

    $("#iruka").click(function(){
        stop_timer(move);
        $(this).attr("src","images/iruka.gif").stop();
        setTimeout('set_timer();', 3000);
    });
});

function set_timer() {
    var move = setInterval("move()",3000);
    return move;
}

function stop_timer(move) {
    clearInterval(move);
}

上記で、クリック時に3秒間止まるようになりました。


次に、話しかけてくれるようにしてみます。
jquery.balloon.js という、簡単に吹き出しを作成できるプラグインを使ってみます。

balloon  # マウスオーバー時に、吹き出しとして表示
contents # balloonのオプション。表示内容を指定できる

githubからjsファイルをcloneし、実装してみます。

git clone https://github.com/urin/jquery.balloon.js
<script src="jquery.balloon.js"></script>

$("#iruka").click(function(){
    stop_timer(move);
    $(this).attr("src","images/iruka.gif").stop();
    $(this).balloon({contents: 'Enjoy Life Adways!'}); // 吹き出しの表示
    setTimeout('set_timer();', 3000);
});

f:id:AdwaysEngineerBlog:20171213153751p:plain

話してくれました。
contents要素を変えれば、ランダムで話すこともできそうですね。


話せるようになったものの、クリックした後にマウスをホバーし続けないといけない挙動になってしまいました。

f:id:AdwaysEngineerBlog:20171213162821g:plain

元のソースがマウスホバーで動く仕様で作られているのが原因です。
jquery.balloon.jsのソースを見たところ、balloonメソッドで下記の2つのメソッドをマウスホバー時に呼び出していました。なので個別に呼んでみます。

showBalloon # 吹き出しを作る
hideBalloon # 吹き出しを消す
$("#iruka").click(function(){
    stop_timer(move);
    $(this).attr("src","images/iruka.gif").stop();
    $(this).showBalloon({contents: 'Enjoy Life Adways!'});
    setTimeout('$(\'#iruka\').hideBalloon();', 2000);
    setTimeout('set_timer();', 3000);
});

マウスホバーしなくてもクリックで吹き出しが出るようになりました!

f:id:AdwaysEngineerBlog:20171213165003g:plain


本当はセリフを変えてみたり、デザインを変えてみたり色々やってみたかったのですが時間がないのでいったんここまでで。

jQuery、痒いところにまで手の届く予約関数が多くて勉強していて非常に楽しいですね!
またjQuery縛りで何か作ってみたいです。

研修レベルの内容ですが、レベルの高い記事は大先輩にまかせるとして息抜きとしてこの記事を楽しんでいただけたら嬉しいです。
それではまた!

f:id:AdwaysEngineerBlog:20171213154924p:plain

VMware-vSphereで仮想マシンのvMotionをSlackに通知する

Adways Advent Calendar 2017 8日目の記事です。

http://blog.engineer.adways.net/entry/advent_calendar_2017


こんにちは、アドウェイズの天津です。商用インフラ全般を担当しています。

今回はオンプレ基盤で使用しているVMware vSphere でのvMotionをSlackに通知させた事例を書きます。

なぜSlack通知が必要だったか

弊社ではvSphereでESXi複数台でクラスタを組んでおり、DRSによる負荷平準化を設定しています。
DRSによるvMotionは自動で実施されるのですが、大きめの仮想マシンの場合、vMotion時に静止時間が長く、アプリケーションに影響が出ることがあります。
アプリケーションでエラーが発生し、原因切り分けを行う際に毎回vMotion履歴をvCenterにログインして確認としていましたが社外にいる場合もあるためリアルタイムSlack通知を実装しました。

構成

f:id:AdwaysEngineerBlog:20171212152642p:plain

VMware vCenter Server からvMotionをSNMPトラップで流し、受信サーバで整形してSlackに通知する構成です。

Slack通知のために必要なこと

  • SNMPトラップ受信サーバの設定
  • vCenter ServerでのSNMPトラップ送信設定
  • vCenter ServerでのvMotionイベントの通知設定
  • SNMPトラップのSlack通知スクリプトの作成

それでは説明していきますね。vSphere 5.5での設定となります。

SNMPトラップ受信サーバの設定

まずはvCenterServerと通信できるネットワーク内にSNMPトラップを受信するサーバを建てましょう。
詳しい説明は割愛しますが、net-snmpのインストールと設定で動作すると思います。
vSphereのMIBファイル(こちらから ダウンロード できます)も忘れずに設置してください。

https://code.vmware.com/web/sdk/55/vsphere-management

vCenter ServerでのSNMPトラップ送信設定

vCenterの「管理」 - 「設定」 - 「全般」 - 「SNMPレシーバー」にIPアドレス、ポート番号、コミュニティストリングを設定します。

f:id:AdwaysEngineerBlog:20171212152708p:plain

イベントが発生した場合、SNMPトラップ受信サーバに送信されるようになりますので、ログを確認してみて下さい。

vCenter ServerでのvMotionイベントの通知設定

ここが今回のポイントです。

vCenter ServerにてvMotionイベントを通知するようにアラーム定義を設定していきます。
アラーム定義は「状態変化」に対して通知が可能となっているため、状態変化を定義する必要があります。
今回は全仮想マシンの通知とするためvCenter Server のアラーム定義を設定します。
vMotionイベントにはDRSによるものと手動によるものがありますので2つとも設定します。

DRSの通知

「管理」-> 「アラーム定義」より新規作成します。(緑の+ボタンで作成)

  • 1 全般
    • アラーム名:任意
    • 説明:任意
    • 監視対象:仮想マシン
    • 監視内容:「仮想マシンのパワーオンなど、このオブジェクトで起きる特定のイベント」を選択
    • このアラームを有効にする:オン

f:id:AdwaysEngineerBlog:20171212152741p:plain

  • 2 トリガー

トリガーとなるイベントと条件を下記のとおり設定しましよう。

状態変化を定義するのはこの項目です。 「開始」を警告として設定し、「完了」を正常とするのがポイントです。

f:id:AdwaysEngineerBlog:20171212152751p:plain

DRSを検知するためユーザ作業を除く条件もつけておきます。

  • 3 アクション

アクションで「警告」から「正常」に状態変化したタイミングに対してsnmptrap通知を設定します。

f:id:AdwaysEngineerBlog:20171212152758p:plain

手動vMotionの通知

DRSのものとトリガーのみ異なります。

f:id:AdwaysEngineerBlog:20171212152808p:plain

確認

手動でvMotionを実行してみましょう。 うまく設定されていれば SNMPトラップ受信サーバの ログに下記のようなメッセージが書き込まれます。
(下記はrsyslogdによるログ書き込みのため、改行コードが8進数(#011、#012)に変換されています

Dec  4 18:46:47 snmptrapd-001 snmptrapd[53668]: 2017-12-04 18:46:47 192.168.200.8(via UDP: [192.168.0.1]:52727->[192.168.0.2]) TRAP, SNMP v1, community public#012#011VMWARE-PRODUCTS-MIB::vmwVC Enterprise Specific Trap (VMWARE-VC-EVENT-MIB::vpxdAlarmInfo) Uptime: 11 days, 23:38:59.22#012#011VMWARE-VC-EVENT-MIB::vmwVpxdTargetObjType.0 = INTEGER: vm(3)#011VMWARE-VC-EVENT-MIB::vmwVpxdOldStatus.0 = STRING: 赤#011VMWARE-VC-EVENT-MIB::vmwVpxdNewStatus.0 = STRING: 緑#011VMWARE-VC-EVENT-MIB::vmwVpxdObjValue.0 = STRING: vMotion_Notif - イベント: 仮想マシンが移行されました (7260303)#012サマリ: 仮想マシン amatsu-test-001 が ESXi-A、Storage-A から ESXi-B、Storage-A に移行されました#012日付: 2017/12/04 9:46:46#012ユーザー名: ADWAYS.NET\amatsu_satoshi#012仮想マシン: amatsu-test-001#012ホスト: ESXi-A#012リソース プール: Test-Cluster#012データストア: Storage-A#012データセンター: Test-Datacenter#012引数:#012    sourceDatacenter.name = Test-Datacenter#012    sourceDatastore.name = Storage-A#012    sourceHost.name = ESXi-B#012#011VMWARE-VC-EVENT-MIB::vmwVpxdTargetObj.0 = STRING: amatsu-test-001

改行変換処理したものが下記です。(#011をタブに、#012を改行に置き換えています)

Dec  4 18:46:47 snmptrapd-001 snmptrapd[53668]: 2017-12-04 18:46:47 192.168.200.8(via UDP: [192.168.0.1]:52727->[192.168.0.2]) TRAP, SNMP v1, community public
    VMWARE-PRODUCTS-MIB::vmwVC Enterprise Specific Trap (VMWARE-VC-EVENT-MIB::vpxdAlarmInfo) Uptime: 11 days, 23:38:59.22
    VMWARE-VC-EVENT-MIB::vmwVpxdTargetObjType.0 = INTEGER: vm(3)    VMWARE-VC-EVENT-MIB::vmwVpxdOldStatus.0 = STRING: 赤   VMWARE-VC-EVENT-MIB::vmwVpxdNewStatus.0 = STRING: 緑   VMWARE-VC-EVENT-MIB::vmwVpxdObjValue.0 = STRING: vMotion_Notif - イベント: 仮想マシンが移行されました (7260303)
サマリ: 仮想マシン amatsu-test-001 が ESXi-A、Storage-A から ESXi-B、Storage-A に移行されました
日付: 2017/12/04 9:46:46
ユーザー名: ADWAYS.NET\amatsu_satoshi
仮想マシン: amatsu-test-001
ホスト: ESXi-A
リソース プール: Test-Cluster
データストア: Storage-A
データセンター: Test-Datacenter
引数:
    sourceDatacenter.name = Test-Datacenter
    sourceDatastore.name = Storage-A
    sourceHost.name = ESXi-B
    VMWARE-VC-EVENT-MIB::vmwVpxdTargetObj.0 = STRING: amatsu-test-001

SNMPトラップのSlack通知スクリプトの作成

上記の通知内容を整形して通知します。今回はbashで書きました。「OID」と「サマリ」が含まれる行を処理しています。
弊社ではSlack通知に cubicdaiya さんのslackboard https://github.com/cubicdaiya/slackboard を使用して送信していますが、curlで直接Slackに送信してもいいと思います。

#!/bin/bash

Temp_trap="/tmp/temp_trap.log"
CHANNEL="amatsu-vminfo"
SLACKBOARD="192.168.0.101:29800"

echo -n > $Temp_trap

while read LINE; do
  echo $LINE >> $Temp_trap
done

# OIDの取得
OID=`head -4 $Temp_trap | tail -1 | cut -f2 -d " "`

##### VMware vCenter Event MIB Trap #####
case $OID in
  *VMWARE-VC-EVENT-MIB* | *VMWARE-PRODUCTS-MIB* ) 
     if grep "DRSvMotion_Notif"  $Temp_trap > /dev/null ; then
       # DRS
       Message=`grep サマリ $Temp_trap | sed 's/、/ /g' |awk '{printf("vMotion(DRS): \`%s\` : %s -> %s (%s)", $4, $6, $12, $10)}'`
     elif grep "vMotion_Notif"  $Temp_trap > /dev/null ; then
       # operation
       Message=`grep サマリ $Temp_trap | sed 's/、/ /g' |awk '{printf("vMotion(ope): \`%s\` : %s -> %s ( %s -> %s)", $3,  $5, $8, $6, $9)}'`
     fi

     if [[ ! -z ${Message} ]]; then
       # send Slack
       echo -e "${Message}" | /usr/local/bin/slackboard-cli -s ${SLACKBOARD} -c ${CHANNEL} > /dev/null &
     fi
     ;;
esac

exit 0

通知スクリプトの設定

作成したスクリプトをSNMPトラップ受信時のハンドルとして登録します。

動作確認

手動でvMotionしてみましょう。 下記のようにSlackに通知が実行されるはずです。

f:id:AdwaysEngineerBlog:20171212152825p:plain

これでいつでもどこにいてもvMotionがリアルタイムで把握できますね。

終わりに

今回、SNMPトラップをトリガーにしてSlackにvMotionを通知しましたが、任意のスクリプトを動かすことができるため、vMotionの前後に動かしたいスクリプトがあれば仕込むことができます。
vMotionに影響を受けるアプリケーションやミドルウェアがある場合、事前作業の自動化や回復処理の自動化ができそうですね。

最後までお読みいただきありがとうございました。

ポケ森ではじめた5W1H思考

Adways Advent Calendar 2017 7日目の記事です。

http://blog.engineer.adways.net/entry/advent_calendar_2017


お疲れ様です。インフラの田中です。

この度、どうぶつの森 ポケットキャンプ(ポケ森)をプレイして学んだ、5W1H思考について執筆させて頂くことになりました。

「どうぶつの言いなりになるゲームなんてやってられない」と思い、ポケ森にログインしなくなって2週間たった寒い日のこと。
私は、書店で『シンプルに結果を出す人の5W1H思考』という本に出会いました。
その本には、なぜ私がポケ森に飽きたのか、そして、どうすればポケ森を楽しくプレイできるのかヒントが書かれていました。

目的のそのまた目的まで突き詰める

本には課題に着手する際、おおきく3つのレベルで思考が必要だと書いてあります。

  • What/How ・・・何をやるのか
  • Why ・・・なぜやるのか
  • Big-Why ・・・物事の理想的なありかた(どうありたいか)

これをポケ森にあてはめたところ、
私がポケ森をプレイする目的(Why)は、「どうぶつのおねがいをかなえたいから」であり、
実行手段(What/How)は、「毎日釣りをしたり、昆虫採集をしたり、キャンプ場にどうぶつたちの求める家具を置くこと」と考えました。

  • 図:ナチュラルな家具で揃えたいのに、キュートタイプのどうぶつを呼ぶために泣く泣くハイカラな家具を置いていた当初のキャンプ

f:id:AdwaysEngineerBlog:20171211173002p:plain

では、なぜ「どうぶつのおねがいをかなえたいのか(Big-Why)」!! 私は全く考えたことがありませんでした。

この真の目的"Big-Why"を考えていなかったことが、ポケ森をプレイしなくなった原因でした。
では私がポケ森で本当に実現したかったことは何なのか、よく考えてみたところ
「可愛いキャンプを創って、フレンドにいいね!をもらうこと」であるという考えにいたりました。

f:id:AdwaysEngineerBlog:20171211173032p:plain

Big-Whyを考えることについて、本にはさらに以下のように書かれてありました。

Why(目的)をさかのぼることによって、より本質的な課題が設定でき、 思考のすそ野(選択肢やそのくみあわせ)を広げることができます。

f:id:AdwaysEngineerBlog:20171211173042p:plain

上図のように、Big-Whyを明確にしたことで、What/Howの視野が広がり、
釣りや昆虫採集に時間を費やすのではなく、フレンドのバザーでどうぶつに依頼された商品を買うこと、
どうぶつたちのために家具をそろえるのではなく、自分が欲しい家具をそろえて、
家具に見合ったどうぶつたちをキャンプ上に招待することを考えるようになりました。

5W1Hにあてはめた戦略プラン

可愛いキャンプ場を創ることが真の目的だと分かり、ポケ森にやる気スイッチが入った私は、
クリスマスの家具を並べて季節感を加えたいという欲を持ち始めました。

クリスマスイベント攻略にあたって、本を読んだところ、
課題解決するには、情報を整理する必要があり、5W1Hは、

思考の漏れや重なりを防ぎ、さらに発想・思考領域を広げるときに役立つ手法

である、と書いてありました。

そこで、クリスマスイベント攻略プロジェクトを5W1Hの表にあてはめてみました。

  • 表:クリスマスイベント攻略プロジェクトの概要改
    • ※クリスマスの家具は「クリスマスのもと」というクリスマスイベント限定の クラフト素材アイテムを集めて作ることができます。
When 2017/12/26(クリスマスのもとの配布期限)まで
Where キャンプ場
Who フレンド向けに
Why 可愛いキャンプにしていいねをもらうため
What クリスマスの家具をそろえる
How クリスマスのもと※を集めて
How much 1100個

この表を作成したことにより、このままではまずいということに気づき、焦り始めました。

クリスマスのもとは、どうぶつのおねがいを叶えると1〜3個程度獲得できますが、私のログイン時間を考えると1日20個程度しかもらえず、このペースでは12/26までに家具をそろえることができません。

さらに、真の目的「可愛いキャンプにしていいねをもらう」を達成するには、12/26にクリスマスキャンプが完成しても遅いのです。
せめて、一週間前には完成させて、いいねをもらう猶予があるべきです。

ここで、私は「さかのぼり思考」で、「可愛いキャンプにしていいねをもらう」ために、本当にクリスマスの家具を全部揃える必要があるのかという疑問に至りました。

「可愛いキャンプ=クリスマスの家具がすべて揃っているキャンプ」
ではなく、
「可愛いキャンプ=クリスマスらしい雰囲気のキャンプ」
が重要なのではないかという考えになりました。

上記のことを踏まえ、表を以下のように修正しました。

  • 表:クリスマスイベント攻略プロジェクトの概要改
When 2017/12/18まで
Where キャンプ場
Who フレンド向けに
Why 可愛いキャンプにしていいねをもらう
What クリスマスを仕様にする
How クリスマスのもとを集めて
How much 500個

必要なクリスマスのもとが500個になったことで、真の目的の達成が現実味を帯びてきました。

  • 表:私が求めるクリスマスの家具
イメージ 家具名 クリスマスのもと
f:id:AdwaysEngineerBlog:20171211174150j:plain クリスマスチェックのラグ 50個
f:id:AdwaysEngineerBlog:20171211174218j:plain クリスマスなついたて 50個
f:id:AdwaysEngineerBlog:20171211174622j:plain リボンのクリスマスツリー 100個
f:id:AdwaysEngineerBlog:20171211174704j:plain クリスマスのだんろ 300個

平日は通勤時間のみのプレイですが、どうぶつたちのおねがいを効率よく対応しながら、だんろ以外の家具を揃えることができました。

f:id:AdwaysEngineerBlog:20171211174124j:plain

さらにだんろを加えれば、よりクリスマスらしいキャンプになるはずなのですが、だんろを作るにはクリスマスのもとがあと249個必要です。
残り1週間で、今回学んだ5W1H思考を利用してなんとか可愛くていいね!をしてもらえるキャンプを創り上げたいと思っています。

応援よろしくお願いします。

ID: 4686 2435 410

参考文献 渡邉 光太郎『シンプルに結果を出す人の 5W1H思考』すばる舎,2017年,p.199

シンプルに結果を出す人の 5W1H思考

シンプルに結果を出す人の 5W1H思考