Monthly Archives: 10月 2015

2015-10-30

Hashicorp新プロダクトnomadのexample.nomadを読み解いてみた

nomad

はじめまして。CTO室のT.N.です

HashiConf2015で発表されたHashiCorpの新プロダクトOttoNomad
OttoについてはVagrantの後継ツール(というわけではないんですが)という触れ込みもあり日本語の話題も増えています
しかしNomadについてはなかなか情報もないので、まず一番最初に触れるであろうexample.nomadをドキュメントベースで読み解いたので、記載したいと思います

Nomadとは?

Nomad is a tool for managing a cluster of machines and running applications on them.

Introduction – Nomad by HashiCorp
https://nomadproject.io/intro/index.html

HashiCorpのサイトには上記のようにかかれています

つまり

  1. 複数マシンに対してMW/SW/アプリケーションをデプロイ
  2. 1でデプロイしたアプリケーションの実行をスケジューリングする

ということができると考えられます

他のソフトウェアの比較でYARN, Terraform, Mesosなどがあがっていますが、これらのソフトウェアと似た機能を保有していると考えるのが一番近いかと思います

どうやってつかうの?

これについてはまずGetting Startedを見るのをオススメします

今回はこの3ページ目のnomad initで作成されるexample.nomadが何を記述しているかを簡単に解説します

example.nomadの解説

Getting Startedに従い、nomad initコマンドを実施すると、以下のファイルが作成されます(コメント除去済み)
今回はこのうち主要と思われる項目を解説していきます

constraint

  • attribute: 制約を加えたい項目名を記述
  • value:項目に設定する値を記述

ここでは「OSがLinuxである場合のみ実行する」という制約が加えられます
ですのでWindowsで実行したい場合には”windows”, Macで実行したい場合は”darwin”と変更しなければいけません

attributeの候補値はドキュメントにあります
↓は頻繁に使えそうなAttributeですね

Attribute 用途
hostname 特定ホストを指定して実行する
platform.aws.ami-id AWSのAMI-IDを指定して実行する

update

  • stagger: Rolling Updateする際に、それぞれのUpdateの間隔となる時間
  • max_parallel:一度にRolling Updateできる数
    ※両方を0にするとUpdateが無効化されます

そもそもupdateとは?という疑問がありますが、これについてはGetting Started内で以下のような記述があります

Our example job is configured to do a rolling update via the stagger attribute, doing a single update every 10 seconds.

Jobs – Nomad by HashiCorp
https://www.nomadproject.io/intro/getting-started/jobs.html

つまり、nomadファイルを修正し、再度Runした場合には、この定義に従い既存のJobがUpdateされることだと考えられます

driver

driverではTask内で実行する作業を指定します

driver 内容
docker docker Containerを作成。コンテナ内でのコマンド実行やPort割当も同時に実行できる
java jarファイルを取得し、実行する
Fork/Exec コマンドの実行
Qemu qemuイメージを使いVirtual Machine環境を作成する
Custom ※現時点ではPluggableな拡張はできないが将来的に使用可能になる予定

参考: https://nomadproject.io/docs/drivers/index.html

ここではdriverがdocker、imageがredis:latestとなっていることから、redisのdockerイメージを立ち上げるという事がわかります

resrouces

resourceについてはドキュメントに以下のようにあります

Note: Typically any agent running in client mode must be run with root level privilege. Nomad makes use of operating system primitives for resource isolation which require elevated permissions. The agent will function as non-root, but certain task drivers will not be available.

Running Nomad – Nomad by HashiCorp
https://nomadproject.io/intro/getting-started/running.html

要約すると「Nomadは必要とするリソースを分離・独立させるのでroot権限で実行すること」といった感じでしょうか
つまりこのresourcesでは、「必要とするリソース」を定義しているということになりそうです

redis dockerを実行するためにCPU 500M/memory 256MB…確保し、独立させるということが定義されていると考えられます

以上でexample.nomadの概要を一通り説明しました
とはいえまだ私もドキュメントベースの理解が主のため、これを元に具体的なアプリケーションを動かす定義を作成し、機会があればご紹介したいと思います

2015-10-29

Intel EdisonとAzure APIを活用して年齢性別判定装置を作成

CRkjWhiUcAAom4d.jpg_large

IoTのビッグウェーブに乗り遅れないためにIntel Edisonを購入し勉強しているCTO室のJ.Nです。

Intel EdisonとはCPU、WiFi、Bluetoothが入ったSDカードサイズのコンピューターモジュールです。

Linuxがデフォルトで入っているので、SSH接続しすぐにプログラミングができます。

Intel Edison で始めるIoT開発

今回はこの小さいコンピューターの活用事例として、Microsoft Azure APIと組み合わせた年齢性別判定装置を作ってみたいと思います。

構成図は以下です

azure

実際にはタッチセンサーを用いてタッチセンサーにタッチしたら写真を撮り、画像をAzureMLに送信するようにします。

用意するパーツ

購入した装置は以下になります。

組み立て

phot11o

  1. Arduinoボードに、Intel Edisonのチップを接続します
  2. Arduinoボートに、ベースシールドを接続します
  3. USBカメラを接続します
  4. ベースシールドの適当なポートにLCDを接続します
  5. ベースシールドの適当なポートにタッチセンサーを接続します

注意点としてはベースシールドのスイッチをV5にしないとLCDで正しく文字が表示されません。
USBカメラは接続するだけでLinuxが自動的にドライバを読み込み使えるようになります。(dmesgで確認できます)

画像ファイルをAzure ML(Project Oxford)に送信し結果を受け取るプログラム

Project Oxfordとはマイクロソフトのクラウド機械学習サービスの一部で、画像解析に特化したクラウドサービスになります。
REST API形式でAPIを実行することができ、クライアントプログラムは画像を送信しOxfordが瞬時に解析した結果を受け取ることができます。

プログラミング言語としてはIntel EdisonのLinuxでは標準でPython2、Node.jsが利用できます。
RubyやJavaも追加できるのですが、ライブラリが欠損していたりうまく動かなかったりするので最初はPython2 or Node.jsでIntel Edisonを操作するのをお勧めします。

まずはIntel Edisonのpython2で画像をAzureMLに送信するプログラムを作成します

AzureのAPIキーを格納する設定ファイルになります。

コマンドラインの第一引数のファイルをAzureMLに送信し、返却されたJSON(年齢性別が入ったデータ)を標準出力にprintします。

次に、タッチセンサーにタッチがあったらWEBカメラを起動し撮影しその画像をAzureMLに送信し結果をLCDに表示するプログラムを作成します。

プログラムのポイントを解説すると

  • Intel Edisonから機器を制御するにはmraaライブラリを使用する
  • LinuxからWEBカメラを制御するコマンドはいくつかあるが今回はfswebcamを使用(Intel Edisonにインストールが必要)
  • Azureに画像を送信中にタッチセンサーが動いて再度写真を送信するのを防ぐためwait変数で、画像処理中は再度撮影しないように制御(あまり連続でAzureAPIを叩くと一時的にAPIからBANされます)

node touch_and_shot.jsでプログラムを起動しカメラの前に立ちタッチセンサーを触ると1秒程度でLCDが点灯します。

CRkjWhiUcAAom4d.jpg_large (1)

age:23
Male(男性)

・・と表示されました。
※「Sec~」の部分はテストの時の表示なので無視してください。

今回学んだ事

  • Intel EdisonからのWEBカメラ制御
  • Intel Edisonからのタッチセンサー制御
  • Intel EdisonからのLCDディスプレイ制御
  • pythonでのAzureML Project Oxford API操作

まとめ

今回はIntel EdisonとクラウドAPIを使用して年齢性別判定プログラムと装置を開発しました。
このアプリケーションを発展させてデジタルサイネージでその人の年齢・性別に合った商品を紹介するといったものを作ると面白いと思います。

似たようなアプリケーションはスマートフォンのカメラを使っても作成できますが、Intel Edisonの強みの1つとしてLinuxがそのまま入っている自由な環境でのプログラミングが可能と言う点がスマートフォンのアプリ開発と比べて優っていると感じました。
今日の記事をきっかけにIntel Edisonを使って様々なプログラミング言語でのIoTアプリケーション開発を楽しんでいただけると幸いです。

2015-10-22

はじめまして

はじめまして、JWordのクリスです。

このたび、GMOアドパドナーズグループのエンジニア横断テックブログを開設することになりました。
現在APグループには、約70名のエンジニアが在籍しています。
それぞれ、広告、メディア、データ、ゲームなどの分野において開発業務を行っています。
事業領域についてはこちらのリンク先をご参照ください。
http://www.gmo-ap.jp/service/

このブログを通して、APグループエンジニアの活動を少しでも知ってもらいたいと同時に
皆さんに役立つコンテンツを発信していきたいと考えています。
今後ともよろしくお願いします。