Fluentd + Elastichsearch + Kibana(4)Fluentdでホスト名を追加する

2016年8月12日

Fluentdでログを転送する際、ホスト名も付加したい。そんなときは、標準のfilterプラグインを使って、以下の設定を加える。

sudo vi /etc/td-agent/td-agent.conf

<filter **>
  @type record_transformer
  <record>
    hostname ${hostname}
  </record>
</filter>

このときに、matchタグよりも上位に記述しないと動作しないので注意が必要である。

Fluentd + Elastichsearch + Kibana(3)FluentdからElasticsearchへの転送

2016年8月11日

Fluentdの設定

前回までにFluentd + Elastichsearch + Kibanaの環境設定と、ログの送信元となるMacの設定を行った。

今回は、受信したデータをElasticsearchに転送する処理を扱う。設定は以下の通り。

sudo vi /etc/td-agent/td-agent.conf

<source>
  @type forward
</source>

<match example.app>
  type elasticsearch
  host localhost
  port 9200
  type_name exampleapp
  logstash_format true
</match>

type_nameは、Elasticsearchタイプ名を指定する。識別できる文字列なら好きに指定して良いようだ。logstash_formatは、logstashフォーマットで出力するオプションで、とりあえず今回はtrueにしておく。

Fluentdの再起動

Fluentdを再起動する。

sudo systemctl restart td-agent

Kinabaにアクセス

Kibanaにアクセスすると、データの受信に伴って、インストール直後とは表示が変わっている。ログインすると受信データが確認できる。

http://XXX.XXX.XXX.XXX:5601

Fluentd + Elastichsearch + Kibana(2)MacでFluentdを動かそう

インストールと起動

MacにFluentdをインストールし、Macで動くアプリのログを、Elastichsearchが動くサーバへと転送する。FluentdのダウンロードページにMac用のdmgイメージがあるので、これをダウンロードし実行する。

Mac Fluentd dmg

Macのデーモンは、launchctlと呼ばれるツールで管理される。launchctlは、設定ファイル(plist)のロードによってデーモンを登録し、デーモンの開始や終了など制御する。通常は、デーモンの登録を行った上で、デーモンの開始を行うという流れとなるが、設定ファイル内で「RunAtLoad = true」が設定されている場合は、ロードと同時にデーモンが起動され、OSの起動時にも自動的にデーモンは起動する。

Fluentd(td-agent)の設定ファイルは、「RunAtLoad = true」に設定されているため、設定ファイルをロードするだけで、デーモンは起動され、自動起動に設定される。

launchctl load /Library/LaunchDaemons/td-agent.plist 

元データの設定

Fluentdは、元データの指定と転送先の指定が必要となる。元データは以下のような種類を指定できる。

ログファイルから取得する

転送ログの元データを指定する。設定するパラメータは以下の通り。

パラメータ 意味
type tail
path ログファイルのパス
pos_file 読み込んだ位置を記憶しておくファイル
tag ログの識別子
<source>
  type tail
  format apache
  path /var/log/httpd-access.log
  tag td.apache.access
</source>

httpから取得する

http通信によってデータを取得する。設定するパラメータは以下の通り。

パラメータ 意味
type http
port ポート番号

tagは、URLヘッダで指定する。

<source>
  type http
  port 8888
</source>

実行したコマンドの標準出力から取得する

コマンドの実行によってデータを取得する。設定するパラメータは以下の通り。

パラメータ 意味
type exec
command 実行するコマンド
tag ログの識別子

他のFluentdから取得する

他のFluentdから転送されたデータを受信する。設定するパラメータは以下の通り。

パラメータ 意味
type forward
<source>
  type forward
</source>

設定例

今回は、Macで動作するアプリが出力する以下の形式のログを元データに指定する。

ログファイルの例

2016-08-11 04:56:31.518 exampleApp[321:2853] <Normal> "Application is started."
2016-08-11 04:56:31.518 exampleApp[321:2853] <Normal> "Application is initialized."
2016-08-11 04:56:31.518 exampleApp[321:2853] <Normal> "Data is received: apple=3, orange=4"
2016-08-11 04:56:31.518 exampleApp[321:2853] <Normal> "Application will be terminated."

Fluentdは様々なログをJSON形式に変換した上で転送を行う。ログの変換を行うためには、どのようなフォーマットでログが記述されているかを正規表現でFluentdに教えてあげる必要があり、この設定が最も難しい。今回のログは、スペース区切りで、[日付][プロセス情報][ステータス][メッセージ]の情報が並んでいるので、正規表現で表現すると以下のようになる。

sudo vi /etc/td-agent/td-agent.conf

<source>
  type tail
  path /tmp/exampleApp.log
  pos_file /var/log/td-agent/exampleApp.log.pos
  tag example.app
  format /(?<time>[^\]]*) (?<process>.*) <(?<stat>.*)> "(?<message>.*)"/
  time_format %Y-%m-%d %H:%M:%S.%N
</source>

出力先の設定

Fluentdは、出力先も様々な方法を選択できる。

標準出力に転送

データを標準出力に転送する。設定するパラメータは以下の通り。

パラメータ 意味
type stdout
<match **>
  type stdout
</match>

ファイルに転送

データをファイルに転送する。設定するパラメータは以下の通り。

パラメータ 意味
type file
path 出力ファイルのパス
time_slice_format ファイル名のサフィックス
time_slice_wait ファイルを分割する時間単位
<match **>
  type file
  path /var/log/fluent/exampleApp.export
  time_slice_format %Y%m%d
  time_slice_wait 10m
</match>

他のFluentdに転送

データを他のFluentdに転送する。設定するパラメータは以下の通り。

パラメータ 意味
type forward
server 転送先サーバの情報

今回は、Macアプリのログを、Elasticsearchを導入した他のサーバに転送したいので、以下の設定とした。

<match **>
  type forward
  <server>
    name server_1
    host XXX.XXX.XXX.XXX
  </server>
</match>

設定ファイル

設定ファイルは以下となった。

sudo vi /etc/td-agent/td-agent.conf

<source>
  type tail
  path /tmp/exampleApp.log
  pos_file /var/log/td-agent/exampleApp.log.pos
  tag example.app
  format /(?<time>[^\]]*) (?<process>.*) <(?<stat>.*)> "(?<message>.*)"/
  time_format %Y-%m-%d %H:%M:%S.%N
</source>

<match **>
  type forward
  <server>
    name server_1
    host XXX.XXX.XXX.XXX
  </server>
</match>

Fluentdを再起動して新たな設定ファイルを読み込む。このとき、/var/log/td-agent/td-agent.logに正常なログが吐き出されていたらOK!

launchctl unload /Library/LaunchDaemons/td-agent.plist 
launchctl load /Library/LaunchDaemons/td-agent.plist 

参考になるページ

Fluentd + Elastichsearch + Kibana(1)CentOS7で環境構築する

Fluentdで収集したログをElastichsearch + Kibanaに入れて可視化する。ここを参考にしながら、まずはCentOS7に環境構築してみる。

Elastichsearch

OpenJDKのインストール

Elasticsearchは、インストールにJAVA7以降(Java8 Update 20以降、もしくはJava7 Update 55以降)のJDKを必要とする。Oracle JavaもしくはOpen JDKがサポートされているようなので、今回はOpenJDK8をインストールする。

sudo yum -y install java-1.8.0-openjdk

Elastichsearch のインストール

RPMからElastichsearchをインストールする。

sudo rpm -ivh https://download.elastic.co/elasticsearch/release/org/elasticsearch/distribution/rpm/elasticsearch/2.3.5/elasticsearch-2.3.5.rpm

インストールが終わると以下のように忠告されるので、

### NOT starting on installation, please execute the following statements to configure elasticsearch service to start automatically using systemd
 sudo systemctl daemon-reload
 sudo systemctl enable elasticsearch.service
### You can start elasticsearch service by executing
 sudo systemctl start elasticsearch.service

言われた通りにコマンドを実行し、Elastichsearchを起動。

sudo systemctl daemon-reload
sudo systemctl enable elasticsearch
sudo systemctl start elasticsearch

Fluentd

Fluentdをインストール

自動インストールスクリプトが用意されているので、これを実行する。現在、Fluentdは2.X系で開発が進められているので、td-agent2を指定してインストールを行う。

sudo curl -L http://toolbelt.treasuredata.com/sh/install-redhat-td-agent2.sh | sh

FluentdとElastichsearchとの連携

FluentdからElastichsearchへデータを受け渡すためのプラグインをインストールする。

sudo yum -y install gcc libcurl-devel
sudo td-agent-gem install fluent-plugin-elasticsearch

Fluentdを起動

sudo systemctl enable td-agent
sudo systemctl start td-agent

Kibana

Kibanaのインストール

Elastichsearchのリポジトリを追加する。

sudo vi /etc/yum.repos.d/elastic.repo

[kibana-4.4]
name=Kibana repository for 4.4.x packages
baseurl=http://packages.elastic.co/kibana/4.4/centos
gpgcheck=1
gpgkey=http://packages.elastic.co/GPG-KEY-elasticsearch
enabled=1

yumからインストールする。

sudo yum install kibana -y

Kibanaを起動

sudo systemctl enable kibana
sudo systemctl start kibana

Kibanaを起動

これでインストール作業が全て完了。
インストールしたサーバの5601ポートにアクセスするとこんなページが見れるはず。

http://XXX.XXX.XXX.XXX:5601

Kibana

Zabbix(3)SNMP監視

2016年8月8日

SNMPポーリング

Zabbixサーバから、SNMPエージェント(クライアント)に対して、定期的にSNMPの問い合わせを行い、情報を取得する場合の環境構築方法は以下の通り。

パッケージのインストール

sudo yum install net-snmp net-snmp-utils

SNMPインタフェースの追加

設定 > ホストからSNMPインタフェースを追加する。
SNMPインタフェースの追加

監視アイテムの追加

テンプレート > アイテムから監視アイテム(項目)を追加する。Zabbixは、アプリケーションや監視アイテム、トリガーなどを収納するテンプレートを作成することが可能で、監視アイテムやトリガーは、複数のアプリケーションに属すことが可能となっている。アイテムを追加する際には、SNMPコミュニティ名SNMP OIDキーなどが必要となる。

SNMP設定

出力される値は、値のマッピング、もしくは、管理 > 一般設定 > 値のマッピングに設定を加えることで、識別しやすい文字列を登録することが可能である。

値のマッピング
以上の設定で、SNMPエージェントから値を取得し、状態を表示させることが可能となる。

トリガーの設定

登録した監視アイテムは、トリガーを設定することで、エラー判定することが可能となる。エラーの深刻度は、深刻な方から軽度なものから順番に、情報、警告、軽度の障害、重度の障害、致命的な障害と分類される。

以上で、SNMPで定期的に値を取得し、しきい値との比較を行うことで、エラーを検出することができるようになった。

SNMPトラップ

Zabbixサーバで、SNMPエージェント(クライアント)からのトラップを受信するためには、SNMP Trap デーモン(snmptrapd)SMNPTTという2つのパッケージが必要となる。

SNMPエージェント(クライアント)からのSNMP Trapデータは、SNMP Trapデーモンがまず受信する。SNMP Trapデーモンは、この値をSNMP Handler経由で、SNMP Trapデータ整形プログラムであるSNMPTTに転送する。SNMPTTは、あらかじめ定めたフォーマットにしたがってTrapデータを整形し、ファイルに出力する。Zabbixは、このファイルを定期的に参照することで、SNMP TrapデータをZabbixに取り込む。

パッケージのインストール

SNMP関連のパッケージをインストールする。

sudo yum install -y net-snmp-perl perl-Sys-Syslog

SNMPTTのパッケージをインストールする。SNMPTTのパッケージはepelリポジトリから取得することができる。

sudo rpm -ivh http://dl.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-7.noarch.rpm
sudo rpm --import http://dl.fedoraproject.org/pub/epel/RPM-GPG-KEY-EPEL-7

sudo yum install -y snmptt

SNMP Trapデーモン(snmptrapd)の設定を変更

TrapデータをSNMPTTで処理するために、SNMP TrapデーモンからSNMP Handlerにデータ転送する設定とする。このとき、受信するTrapデータをコミュニティ名を指定して限定することもできる。今回は、全てのTrapデータを転送する処理にしている。

sudo vi /etc/snmp/snmptrapd.conf

# 全てのTrapを受信
disableAuthorization yes
# SNMP Handlerに転送する
traphandle default /usr/sbin/snmptthandler

SNMP Trapデーモンの起動オプションに以下を追加する。

sudo vi /etc/sysconfig/snmptrapd

OPTIONS="-m +ALL -On"

SNMPTTの設定を変更

SNMPTTは、SNMP Handler経由で受信したデータをZabbixで解釈できるデータフォーマットに変換する。Zabbixはこの変換後のテキストデータを定期的に取得する。

sudo vi snmptt.ini

# SNMP Handler経由の場合はdaemonを指定
mode = daemon
# NetSNMPでPerlモジュールを使用する
net_snmp_perl_enable = 1
# This sets the best_guess parameter used by the UCD-SNMP / NET-SNMP Perl module for 
# translating symbolic nams to OIDs and vice versa.
# For UCD-SNMP, and Net-SNMP 5.0.8 and previous versions, set this value to 0.
# For Net-SNMP 5.0.9, or any Net-SNMP with patch 722075 applied, set this value to 2.
net_snmp_perl_best_guess = 2
# Syslogへは、snmptrapdがログ書き込みを行う
syslog_enable = 0

また、snmptt.confに変換するフォーマットを記述する。受信データ種別毎にかき分けても良いが、取り敢えず以下の記述にしておけば、Zabbixで全てのデータを読み込めるようになる。

EVENT general .* "General event" Normal 
FORMAT ZBXTRAP $aA $ar $1

サービスの開始

以上で設定は完了なので、SNMP TrapデーモンとSNMPTTを開始する。

sudo systemctl start snmptrapd
sudo systemctl enable snmptrapd
sudo systemctl start snmptt
sudo systemctl enable snmptt

動作テスト

SNMP TrapのテストデータをZabbixサーバ宛に送信し、これがSNMP Trapデーモン、SNMPTT経由で受信できているかを確認する。

sudo snmptrap -v 2c -c public 192.168.0.10 '' .1.2.3.4.5.6.7.0 .1.2.3.4.5.6.7.0 s 'TEST'

正常に受信した場合は、/var/log/snmptt.logに以下のようなテキストが追加されていることが確認できる。Zabbixはこのファイルを定期的に参照する。

01:00:00 2016/08/09 .1.2.3.4.5.6.7.0 Normal "General event" 192.168.0.11 - ZBXTRAP 192.168.0.11 192.168.0.11 4345

Zabbixの設定

SNMP Trapデータの参照先を設定する。

sudo vi /etc/zabbix/zabbix_server.conf

SNMPTrapperFile=/var/log/snmptt/snmptt.log 
StartSNMPTrapper=1

サービスの再起動。

sudo systemctl restart zabbix-server
sudo systemctl enable zabbix-server

以下のようにアイテムを登録することで、受信したTrapデータを取り込むことが可能となる。今回便宜上、Template名やアプリケーション名を、Template SNMP Trap、SNMP Trapなどとし、作成したアイテムはこれらにぶらさげる形とした。

SNMPトラップアイテムの追加

/var/log/snmptt.logから文字列のパターンマッチングを行うことで、任意の事象に対してのトリガーの設定を行うことができる。

SNMPトラップアイテムの追加

Zabbix(2)初期設定

2016年8月3日

前回、Zabbixのインストールと関連する設定を行った。今回はWeb上で行う各種設定を確認する。

ログイン

標準のログインアカウントは、

なので、ログイン後適宜変更する。

Zabbixログイン

エラーメール設定

管理 > ユーザ > メディア からユーザと送信先メールアドレスの紐付けを行う。

送信先メールアドレスの設定

また、送信元アドレスの設定を、管理 > メディア > Email から行う。今回は、ローカルのpostfix経由でメールを送信するので、SMTPサーバをlocalhostとしている。

送信元メールアドレスの設定

最後に、どのタイミングでエラーメールを送信するかを設定するために、設定 > アクションから新たなアクションを作成する。メンテナンス期間外、かつ障害発生時(「情報あり」ステータスも障害に含む)に、Adminユーザにメールを送信する場合は、以下の通りの設定とする。

アラートアクションの設定
アラートアクションの設定
アラートアクションの設定

Zabbix(1)CentOS7にZabbix3.0をインストールする

サーバ

サーバの構築環境は、CentOS7、およびZabbix Server 3.0とする。また、サーバにもエージェントをインストールし、自身を自身で監視する体制とする。Zabbixを設定する際には、FirewallやSElinuxの設定にも変更が必要となる。ただし、今回は閉じたネットワーク内で監視を行うことを想定して設定するため、FirewallもSElinuxも無効にしている。

Zabbixサーバの設定

sudo yum install http://repo.zabbix.com/zabbix/3.0/rhel/7/x86_64/zabbix-release-3.0-1.el7.noarch.rpm
sudo yum install zabbix-server-mysql zabbix-web-mysql zabbix-web-japanese zabbix-agent
sudo yum install mariadb-server

関連するサービスの設定

ログの時刻を正確な値にするため、定期的にNTPによる時刻合わせを行う

sudo yum install -y ntpdate
sudo crontab -e

0 * * * *       /usr/sbin/ntpdate XXX.XXX.XXX.XXX

エラーメールを送信するためのSMTP設定を行う

myhostname = XXX.surbiton.jp
relayhost = [XXX.XXX.XXX.XXX]

メールサーバ起動

sudo systemctl start postfix
sudo systemctl enable postfix

エージェント

監視対象のサーバにはエージェントをインストールする。サーバの構築環境は、CentOS6、およびZabbix Server 2.4とする。

Zabbixエージェントの設定

sudo yum install http://repo.zabbix.com/zabbix/2.4/rhel/6/x86_64/zabbix-release-2.4-1.el6.noarch.rpm
sudo yum install -y zabbix-agent-2.4.8-1.el6

参考URL

Zabbix 3.0をCentOS 7にインストール

シェル(1)Bashの基本設定

2016年5月26日

Bashとは

シェルは、コマンドライン・インタプリタとも呼ばれ、ユーザが入力したコマンドをカーネルに渡すプログラムである。シェルには、Bashcshzshなど様々な種類が存在するが、LinuxやMac OSでは、Bashが標準シェルとなっている。/bin/shは、Linuxにおける標準シェルを示しており、通常はBashへのシンボリックリンクとなっている。

$ ls -l /bin/sh
lrwxrwxrwx 1 root root 4  9月 26 15:52 2014 /bin/sh -> bash

なお、Bashを/bin/shとして実行させるとPOSIX準拠モードで起動するため、厳密にはBashと挙動が異なる。以下のコマンドを実行することで、インストール済みのシェルを確認することができる。

$ cat /etc/shells 
/bin/sh
/bin/bash
/sbin/nologin
/bin/dash
/bin/tcsh
/bin/csh

ファイルディスクリプタ

シェルは、実行するプログラムの以下の値を取得することが可能となっている。

ディスクリプタ 略記 内容
<0 < 標準入力
>1 > 標準出力
>2 >2 標準エラー出力

標準出力も標準エラー出力も同時に出力したい場合は、2>&1と記述する。

ショートカット

カーソルの移動や編集を行う際に以下のショートカットを使うと便利。

コマンド 意味 内容
Ctrl + a ahead 行頭に移動
Ctrl + e end 行末へ移動
Alt + b before 一単語左へ
Alt + f foward 一単語右へ
Ctrl + d delete カーソルの文字を消す
Ctrl + h 0x08 (Backspace) カーソルの左の文字を消す
Ctrl + w word カーソルの左の単語を消す
Ctrl + u unix-line-discard カーソルより左の文字を全てカット
Ctrl + k kut カーソルより右の文字を全てカット
Ctrl + y yank ペースト
Ctrl + p previous 前の履歴を表示
Ctrl + n next 次の履歴を表示
Ctrl + r reverse 過去の履歴から検索
OLDPWD 直前にいたディレクトリ

設定ファイルの読み込み順序

bashの設定ファイルはいくつもあるが、以下の順序で読み込まれるらしい。

読み込み順序 読み込み時 対象 ファイル
1 ログイン時 全ユーザ /etc/profile
2 ログイン時 各ユーザ ~/.bash_profile
3 ログイン時 各ユーザ ~/.bash_login
4 bash起動時 各ユーザ ~/.bashrc
5 ログイン時のシェル終了時 各ユーザ ~/.bashrc

PATHを通すときなどに無意識に~/.bashrcにPATHを書いてたけど、~/.bashrcにPATHを書いてbashを複数タブで起動すると、その度に同じPATHが追加されてしまうようだ。というわけで、設定ファイルは、~/.bash_profileに書いておけばいいということか。

設定ファイルの内容

historyコマンド時に時間情報も表示させると便利。
過去のコマンドが消えてしまわないように、historyの上限値も増やしておくと、なお便利。
ちなみに、![履歴番号]で、history内の過去のコマンドを実行できる。

# History
HISTSIZE=50000
HISTTIMEFORMAT='%Y-%m-%d %H:%M:%S '

# Path
PATH="$PATH":/usr/local/bin:/bin:/sbin:/usr/bin

コマンドの実行

シェルで実行ファイルを実行する場合、PATH付きで指定しなければいけない。カレントディレクトリの実行ファイルを、

$ ./a.out

などと書くのは上記ルールによる。ただし、シェルにPATHが通っている場合は、PARHを省略できる。実行したファイルのPATHを確認するにはwitchコマンドを使って、

$ witch ls

alias ls='ls --color=auto'
	/bin/ls

とすればよい。また、cd, echo, pwdなどのコマンドは、ビルトインコマンドと呼ばれ、シェル自身に組み込まれたコマンドである。コマンドのタイプを確認するためには、

$ type pwd
pwd is a shell builtin

typeコマンドを使用する。

AWS S3(2)S3Sync:S3バックアップツール

2016年5月25日

S3Sync

以前、S3にバケットを作成してGlacierアーカイブを行う手順を確認したが、この仕組みを利用してMacの任意のディレクトリをS3 Glacierと自動的に同期するアプリケーション「S3Sync」を作ってみた。Macのスリープを検知すると同期を始めるので、寝ている間にラクラク同期できる。

といってもこのアプリ、単にNSTaskを使ってシステムコマンドを実行しているだけのアプリなので、任意のコマンドを自由に実行することができる。ステータスバーに常駐しているアプリなので、作業の邪魔にもならない。

S3Sync

スリープ検知

スリープ検知をするには、NSWorkspace ClassNSWorkspaceWillSleepNotification属性を使う。

    func applicationDidFinishLaunching(aNotification: NSNotification) {
        // スリープ検知
        NSWorkspace.sharedWorkspace().notificationCenter.addObserver(self, selector: #selector(self.receiveSleepNotification(_:)), name: NSWorkspaceWillSleepNotification, object: nil)
    }

    func receiveSleepNotification(notification: NSNotification){
        // スリープ実行時に行う処理
    }

システムコマンドの実行

システムコマンドは、NSTask Classから実行することが可能である。
NSTaskは、実行したシステムコマンドの出力結果を取り出すことも可能だが、readDataToEndOfFile()を使うとブロッキング処理が発生してしまうので、dispatch_async()を使って非同期に順次出力処理していく必要がある。

let task = NSTask() 
// 実行コマンドをフルパスで指定
task.launchPath = "/usr/local/bin/aws "
// パラメータを配列形式で指定
task.arguments = ["-h", "hogehoge"]
// 標準出力をパイプに渡す
let pipe: NSPipe = NSPipe()
task.standardOutput = pipe
let stdoutHundle = pipe.fileHandleForReading     
// 非同期処理
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0), {
var dataRead = stdoutHundle.availableData
while(dataRead.length > 0){
	let stringRead = NSString(data: dataRead, encoding: NSUTF8StringEncoding)
        if let output = stringRead {
		// 出力結果処理
        }
        dataRead = stdoutHundle.availableData
}
// コマンドの実行
task.launch()

NSTaskは、suspend()terminate()を使って、途中で処理を停止したり、完全に終了してしまったりすることができる。suspend()で中断した処理は、resume()で再開することができる。また、タスクが実行中にも関わらず再度launch()を実行してしまうと、下記の実行エラーが発生してしまう。

task already launched

通知の送信

本アプリは、コマンド実行毎にMacの通知センターに実行状況を通知する。

アプリ通知

Macの通知センターに通知を送信するには、NSUserNotificationCenter Classを使う。送信する通知には、「タイトル」「サブタイトル」の他に様々な項目を設定することが可能である。

// NSUserNotificationCenterDelegateが必要
class AppDelegate: NSObject, NSApplicationDelegate, NSUserNotificationCenterDelegate {

    func deliverNotification(title : String, subtitle : String, informativeText: String){
        // AppDelegate Classにデリゲードを指定
        NSUserNotificationCenter.defaultUserNotificationCenter().delegate = self
        let notification = NSUserNotification()
        notification.title = title
        notification.subtitle = subtitle
        notification.informativeText = informativeText
        notification.contentImage =  NSImage(named: "MainIcon")
        notification.userInfo = ["title" : "タイトル"]
        NSUserNotificationCenter.defaultUserNotificationCenter().deliverNotification(notification)
    }

}

ログを保存するディレクトリの指定

本アプリは、実行ログをファイルに保存することができる。

NSOpenPanel

Macでディレクトリやファイルを開くする際は、NSOpenPanel Classを利用する。
また、保存の際はNSSavePanel Classというクラスも用意されている。

// MARK: ディレクトリ選択画面
let panel = NSOpenPanel()
// ファイル選択の可否
panel.canChooseFiles = false
// ディレクトリ選択の可否
panel.canChooseDirectories = true
// 複数選択の可否
panel.allowsMultipleSelection = false
panel.beginWithCompletionHandler({(num) -> Void in
      if num == NSModalResponseOK {
           // ディレクトリ・ファイル決定時の処理
      }
})

常駐アプリ

ステータスバーに常駐するアプリを作成するためには、Project > TARGET > Info > Custom OS X Application Target Propertiesから、Application is agent (UIElement)YESに設定する。

Application is agent

StoryBoardのTips

Main Menu : Edit

機械学習(1)TensorFlowをMacにインストールする

2016年5月15日

TensorFlowは、Googleが開発し公開している機械学習ライブラリ。

インストール方法

Pythonパッケージ管理ツール「easy_install」を使うとよいとのことなので、以下のコマンドを実行。このとき、XCodeのコマンドラインツールのインストールも求められる。

sudo easy_install pip
sudo easy_install --upgrade six
sudo pip install --upgrade https://storage.googleapis.com/tensorflow/mac/tensorflow-0.8.0-py3-none-any.whl

tensorflow-0.8.0-py3-none-any.whl is not a supported wheel on this platform.

TensorFlowを入れるためにはpip3(python3)が必要とのこと。
brewからpython3のインストールを行う。

このときpythonのバージョン管理を行うことのできるpyenvを入れておくと、Python2.7とPython3を切り替えることができるので便利。

/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
brew install pyenv

現在のPythonバージョンを確認することができる。

pyenv versions
* system (set by /Users/***/.pyenv/version)

まだ何も入れていないので、systemのみ。

ここで、~/.profileファイル(ログイン時に読み込むbash設定)に以下を追加。
設定を読み込ませるためにOS再起動。

vi ~/.profile

export PATH="$HOME/.pyenv/bin:$PATH"
eval "$(pyenv init -)"

インストール可能なバージョンを確認して、Python3(今回は3.5.1)をインストール。

pyenv install --list
pyenv install 3.5.1

使用するPythonのバージョンを3.5.1に変更。

pyenv global 3.5.1
pyenv versions
  system
* 3.5.1 (set by /Users/eiji/.pyenv/version)

このときにもし以下のようなエラーが発生する場合は…

Downloading Python-3.5.1.tgz...
-> https://www.python.org/ftp/python/3.5.1/Python-3.5.1.tgz
Installing Python-3.5.1...

BUILD FAILED (OS X 10.11.4 using python-build 20160130)

Inspect or clean up the working tree at /var/folders/my/txp4p33n1lzf2hbzp0vmqbc40000gn/T/python-build.20160515224141.3027
Results logged to /var/folders/my/txp4p33n1lzf2hbzp0vmqbc40000gn/T/python-build.20160515224141.3027.log

Last 10 log lines:
  File "/private/var/folders/my/txp4p33n1lzf2hbzp0vmqbc40000gn/T/python-build.20160515224141.3027/Python-3.5.1/Lib/ensurepip/__main__.py", line 4, in <module>
    ensurepip._main()
  File "/private/var/folders/my/txp4p33n1lzf2hbzp0vmqbc40000gn/T/python-build.20160515224141.3027/Python-3.5.1/Lib/ensurepip/__init__.py", line 209, in _main
    default_pip=args.default_pip,
  File "/private/var/folders/my/txp4p33n1lzf2hbzp0vmqbc40000gn/T/python-build.20160515224141.3027/Python-3.5.1/Lib/ensurepip/__init__.py", line 116, in bootstrap
    _run_pip(args + [p[0] for p in _PROJECTS], additional_paths)
  File "/private/var/folders/my/txp4p33n1lzf2hbzp0vmqbc40000gn/T/python-build.20160515224141.3027/Python-3.5.1/Lib/ensurepip/__init__.py", line 40, in _run_pip
    import pip
zipimport.ZipImportError: can't decompress data; zlib not available
make: *** [install] Error 1

XCodeのコマンドラインツールもインストールする。

xcode-select --install

最後に、TensorFlowをインストール。

sudo pip3 install --upgrade https://storage.googleapis.com/tensorflow/mac/tensorflow-0.8.0-py3-none-any.whl

インストールされたかどうかの確認は、以下のコマンドを打ってエラーが発生しないことを確認する。

python

Python 3.5.1 (default, May 15 2016, 09:29:31) 
[GCC 4.2.1 Compatible Apple LLVM 7.3.0 (clang-703.0.31)] on darwin
Type "help", "copyright", "credits" or "license" for more information.

import tensorflow as tf 

Tags