2015年9月4日金曜日

Munin で JMX を監視する方法

概要

Munin で JMX を監視してみました

環境

  • CentOS 6.6 64bit
  • Munin 2.0.25
  • Tomcat 7.0.33

各種インストール

TomcatのJMXを有効にする

  • vim /etc/tomcat/tomcat.conf

CATALINA_OPTS=”-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=1616 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false”

を最後の行に追記しましょう

  • service tomcat restart

MuninのJMXプラグインをインストールする

  • git clone https://github.com/munin-monitoring/contrib.git
  • cp contrib/plugins/java/jmx/plugin/jmx
  • cp contrib/plugins/java/jmx/plugin/jmx* /usr/share/munin/plugins/
  • chmod a+x /usr/share/munin/plugins/jmx_
  • cp contrib/plugins/java/jmx/examples/java/java_* /usr/share/munin/plugins/
  • ln -s /usr/share/munin/plugins/jmx_ /etc/munin/plugins/jmx_process_memory
  • cd /usr/share/munin/plugins
  • ln -s java_process_memory.conf process_memory
  • vim /etc/munin/plugin-conf.d/munin-node

[jmx_*]
env.jmxurl service:jmx:rmi:///jndi/rmi://localhost:1616/jmxrmi

最後に追記しましょう

動作確認

  • cd /etc/munin/plugins
  • ./jmx_process_memory config
  • ./jmx_process_memory
  • service munin-node restart

で、しばらくすると「Java」という項目がグラフに表れると思います
jmx_process_memory-day.png

最後に

プラグインを入れるだけでグラフまで簡単に表示することができました
今回は Tomcat の JMX を監視しました
ポートは 1616 で監視しましたが、好きなポートでOKです
また、同一ホストで監視したため別ホストから監視したい場合は設定ファイルの書き方を変更してください

2015年9月2日水曜日

開発合宿やった

概要

やってみたい記事を書いて一ヶ月後に実現したのでどんな感じでやったかメモしておきます

メンバー

4人 (男:女=3:1)

合宿先

沖縄
宿泊先 : にらい恩納

日程

2015/08/29 - 2015/08/31 の 2泊3日

料金

  • 飛行機代 : 37,180円
  • 宿泊代 : 15,500円
  • レンタカー:2,355円
  • 食費:約10,000円

-> 合計:65,035円/1人

合宿の記録 (時系列)

  • 初日
    • 7時起床
    • 7:30 - 9:30 成田空港移動
    • 9:30 - 10:30 出発準備 (出発が11時に遅れる)
    • 11:00 - 14:30 飛行機内 (30分くらい開発)
    • 14:30 - 15:00 レンタカー手配
    • 15:00 - 15:30 食事へ
    • 15:30 - 16:20 食事完了
    • 16:20 - 18:00 宿泊地へ移動
    • 18:00 - 18:30 買い出し
    • 18:30 宿舎到着
    • 18:30 - 20:00 開発
    • 20:00 - 21:00 夕食 (食べながら開発)
    • 21:00 - 23:00 開発
    • 23:00 - 24:00 就寝準備
    • 24:00 就寝
  • 二日目
    • 10:00 起床 (他の人は 8:00 とかに起きて開発していた)
    • 10:00 - 13:00 開発
    • 13:00 - 15:30 食事+買い出し
    • 15:30 - 16:30 海
    • 16:30 - 17:30 開発
    • 17:30 - 20:00 BBQ
    • 20:00 - 23:00 開発+プレゼン作成
    • 23:00 - 24:00 全員でプレゼン
    • 24:00 就寝
  • 三日目
    • 10:00 起床 (他の人は 8:00 とかに起きて開発していた)
    • 10:00 - 11:00 チェックアウト準備
    • 11:00 チェックアウト
    • 11:00 - 16:00 フリー行動
    • 16:00 - 18:00 那覇空港へ
    • 18:00 - 18:30 出発準備
    • 18:30 - 21:40 飛行機
    • 21:40 - 22:30 空港から電車に乗り換え
    • 22:30 - 24:00 電車で帰宅
    • 24:00 帰宅

まとめ

開発時間:10時間30分+α
(+αは移動の時間や食事の時間もちょろちょろやっていた分)

所感

  • Bad
    • とにかく移動が多すぎた
    • 移動中開発したが、集中できない
    • コテージが内陸にあり、WiMAXが届かなかった (キャリアの回線は届いた)
    • コテージに電源プラグが少なく、電源タップがなかったらやばかった
  • Good
    • とくかく楽しめた
    • 一応全員アウトプットすることができた
    • 宿泊したコテージの雰囲気は開発合宿にピッタリ
    • 普段とは違う開発環境を味わうことができた

感想

ガチで開発するなら会議室のある近場の民宿がやっぱりいいなと感じた
いいわけだが、今回は旅行も兼ねていたので開発が少なくなってしまったのは仕方ない感じか
(会社にコミットメントも約束していなかったので、、、)

費用が少し高くついてしまった
ツアーではなく、それぞれ別で申し込んだのでそうなってしまった

とりあえず楽しかったのでOK
たまには南国で開発するのもいいなと思った

2015年8月30日日曜日

Elixir + Phoenix で HelloWorld

概要

Elixirという関数型の言語を試してみました
そして、PhoenixというWebアプリケーションフレームワークを使って「HelloWorld」ページを表示してみました

環境

  • Mac OS X 10.10.4
  • Homebrew 0.9.5
  • Elixir 1.0.5
  • Phoenix 1.0.0

Elixir インストール

  • brew install elixir
  • brew intall node

node というか npm が必要になるので node もインストールします

Phoenix インストール

mixは erlang のためパッケージ管理ツールで Elixir でも使えます
Github からソースをダウンロードしてインストールします
~/.mix/archives/phoenix_new-1.0.0.ezというパスで管理されるようです

HelloWorld 用のプロジェクトを作成

  • mix phoenix.new hello_phoenix

hello_phoenixというサンプルプロジェクトを作成します
途中[Y/n]を聞かれる部分があると思うので全部 Yes でOKです

実行

  • cd hello_phoenix
  • mix phoenix.server

とすると起動するはずです
以下のように表示されればOK

[info] Running HelloPhoenix.Endpoint with Cowboy on http://localhost:4000
30 Aug 10:46:50 - info: compiled 5 files into 2 files, copied 3 in 2282ms

これでブラウザで localhost の 4000 番にアクセスすれば HelloWorld のページが表示されるはずです

phoenix_hello_world.png

最後に

感覚的に Ruby on Rails に非常に似ていると思いました

HelloWorld が表示された次は Guilde にそってやっていけばアプリ開発に必要な一通りのことは学べると思います

Tips

  • 古い記事で Phoenix の 0.31 というバージョンをインストール記事がありましたが、それだとコンパイルエラーになりうまく動作しませんでした

2015年8月29日土曜日

APNs を使ったプッシュ送信で受信時のサウンドを変更する方法

概要

iOS の RemoteNotification (APNs) を使ってプッシュを受信した際の受信音を変更する方法を紹介します

環境

  • OS X 10.10.4
  • Xcode 6.4

音声ファイルをアプリに追加する

/System/Library/Sounds/Purr.aiff

XcodeのSupporting Files配下にドラッグアンドドロップする

add_sound.png

こんな感じになればOK
追加する音声ファイルは何でもOKです
findとかで検索すればいっぱい出てくると思います

プッシュを送信する

APNs にリクエストする際のペイロードは以下のような感じにします

aps: {
    alert =     {
        body = test;
        title = "sound test";
    };
    sound = "Purr.aiff";
}

soundの部分をアプリに追加した音声ファイルをそのまま指定します
他は適当でOKです

確認する

Xcode に実機を接続してビルドしましょう
アプリが起動したらバイブをOFFにして音が出るしましょう

これでプッシュを送信すると default ではない追加した音声ファイルの音でプッシュが受信されると思います

2015年8月28日金曜日

NCMB で Android に対してダイアログプッシュしてみた

概要

NCMB で Android 端末に対してダイアログプッシュというのができるみたいなのでやってみました
普通のプッシュは Android の上部通知バーが表示されるのに対してダイアログプッシュはその名の通りプッシュ受信時にダイアログを表示することができます

環境

  • Android 4.0.4 (実機 : SH-01D)
  • Eclipse 4.4.2
  • NCMB.jar 1.5.3

事前準備

今回はこのサンプルを使って説明します
事前に必要になる作業

  • NCMB の登録
  • Google Developer Console で SenderId と APIキーの取得
  • サンプルが動作する環境の作成

は実施しておいてください
サンプルが動作してとりあえず実機の Android でプッシュが受信できるところまでできればOKです
では、コーディングしていきます

コーディング

表示するダイアログの定義をする

AndroidManifext.xml に以下を追記します

<activity
  android:name="com.nifty.cloud.mb.NCMBDialogActivity"
  android:excludeFromRecents="true"
  android:launchMode="singleInstance"
  android:noHistory="true"
  android:theme="@android:style/Theme.Wallpaper.NoTitleBar">
</activity>

これは NCMB.jar に含まれている、Activityを指定しているだけです
<application>タグ内に記載すればOKです

カスタムレシーバを作成する

com.example.android_ncmb_sample.utils.DialogPushReceiver を作成します
android.content.BroadcastReceiver を継承してください

create_receiver.png

作成したら以下のように変更します

package com.example.android_ncmb_sample.utils;

import com.nifty.cloud.mb.NCMBDialogPushConfiguration;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;

public class DialogPushReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        if (intent.getExtras().getString("com.nifty.Dialog").equals("1")) {
            NCMBDialogPushConfiguration dialogPushConfiguration = new NCMBDialogPushConfiguration();
            dialogPushConfiguration.setDisplayType(NCMBDialogPushConfiguration.DIALOG_DISPLAY_DIALOG);
            NCMBPush.dialogPushHandler(context, intent, dialogPushConfiguration);
        }
    }

}

基本は onReceive を変更すればOKです
ダイアログフラグがONのときにだけダイアログプッシュを表示するようにします

カスタムレシーバの定義を追記する

AndroidManifext.xml に以下を追記します

<receiver android:name="com.example.android_ncmb_sample.utils.DialogPushReceiver" >
  <intent-filter>
    <action android:name="com.example.android_ncmb_sample.utils.DIALOG" />
  </intent-filter>
</receiver>

<receiver>タグ内に存在しているandroid:nameには作成したダイアログプッシュ用のレシーバを定義します
<action>タグ内に存在しているandroid:nameには「好きな文字列を指定してください」
ここは何でもOKです
プッシュを送信する際にactionというパラメータを指定するのですが、そのパラメータと<action>タグで指定した文字列にマッチする reciever が自動でコールされる仕組みになっています

サンプルではクラス名っぽいものを指定していますが、何でもOKです

動作確認

ここまでできたら動作確認してみます
まず実機をつないで Eclipse 上でアプリを起動しましょう

lunch_app.png

ここは普通に起動すると思います
起動が完了できて Logcat にもログができることを確認したらアプリをバックグラウンドにしてプッシュを送信してみましょう

プッシュを送信する

プッシュの送信は NCMB のコンパネから送信します
ポイントは1つ
プッシュを登録する画面で「Android 端末に送信する」のチェックをONにします
このときに「アクション」と「ダイアログ」を以下のようにします

  • アクション・・・com.example.android_ncmb_sample.utils.DIALOG
  • ダイアログ・・・チェックをON

を必ず設定してください
ちょっと前に説明しましたが、ここで指定したアクションと AndroidManifest.xml の<action>タグ内に記載した文字列がマッチして初めてカスタムレシーバがコールされます

プッシュを受信する

これでプッシュを登録し受信すると以下のように表示されると思います

dialog_result.png

うまく表示されない場合は

  • カスタムレシーバがそもそもコールされていない
  • コールされているけど、Dialog が有効になっていない

あたりを疑ってください
トラブルシュートは実機を接続しながら Logcat とにらめっこすれば、基本は解決できると思います

最後に

割りと簡単にできました
が、たぶんいろいろと事前に触っていて仕組みの流れを理解していたからだと思います
初見だと公式ドキュメントだけだと難しいかもしれないです

2015年8月21日金曜日

Cygwin 上で growlnotify を実行する方法

概要

Growl for Windows をインストールして Cygwin 上でコマンド実行する方法
オプションの指定方法とかいつも忘れるのでメモ

環境

  • Cygwin 1.7.32
  • Growl for Windows 2.0.9

実行方法

$ /c/Program\ Files\ \(x86\)/Growl\ for\ Windows/growlnotify.exe "/t:タイトル" "メッセージ" 2>&1 | nkf -Lu

オプションはダブルクオートでくくると良い
最後のリダイレクトとnkfはなくてもOK、エラーの場合に日本語が化けるので対応しているだけ
スペースをバックスラッシュでエスケープ

2015年8月19日水曜日

Munin みたいなメモリグラフを Zabbix でも監視したい

概要

Munin のメモリのグラフを Zabbix でも監視できないかなと思って調べていたら記事を見つけたのでやってみました
Zabbix 2.4 で実施しているのでスクリプトを Zabbix 2.4 に対応するように修正しています

環境

  • CentOS 6.6 64bit Final
  • Zabbix 2.4.5
  • Munin 2.0.25
  • Python 2.6.6

各種インストール

Munin インストール

とりあえずこれでhttp://hostname/muninに ID/PW でアクセスできることを確認しましょう
今回 munin は使いませんがメモリの使用量が munin で問題なく取得できていることを確認してください

今回利用するメモリ使用量を取得するプラグインは以下にシンボリックリンクとしてあります

/etc/munin/plugins/memory

Zabbix インストール

ここを参考にインストールしています
今回は Munin も Zabbix (MySQL も) すべて同一ホストにインストールしています

インストールが完了したらとりあえずZabbix Server自体が監視できていればOKです

スクリプト設定

公開されている python スクリプトは指定したテンプレートに対してアイテムおよびグラフを登録してくれます
今回は Zabbix 2.4 でも動作するようにスクリプトを修正しています

テンプレート登録

Zabbix の UI にアクセスしてテンプレートを一つ登録してください
今回は「Template_Munin_Memory」というテンプレートを作成した体で話を進めます

zabbix_agentd.conf 修正

  • echo 'UserParameter=munin[*],/etc/munin/plugins/$1 |grep "^$2.value" |cut -d " " -f2' > /etc/zabbix/zabbix_agentd.d/userparameter_munin_plugin.conf

echo 文で conf ファイルを1つ作成します
作成したらservice zabbix-agent restartで再起動しましょう

スクリプト修正

適当なディレクトリに移動してスクリプトを取得しましょう

  • cd work
  • git clone git://github.com/oopsops/scripts.git
  • cd scripts/zabbix

zabbix_munin_plugin.py 修正

  • 39 - 40行目 : Zabbix にアクセスするための ID/PW に変更します
39,40c39,40
< username = "Admin"
< password = "zabbix"
---
> username = "Your ID"
> password = "Your PW"
  • 65行目 : カラーコードを6桁にします
65c65
<   for x in range(1,6):
---
>   for x in range(1,7):
  • 71行目 : graph.create の際に templateid を送信しないようにする
71c71
< createdgraphids = zapi.graph.create([{'gitems': (gitems) ,'name': (graph_title),'width':'900','height':'200','yaxismin':'
0.0000','yaxismax':'3.0000','templateid':'0','show_work_period':'1','show_triggers':'1','graphtype':'0','show_legend':'1','
show_3d':'0','percent_left':'0.0000','percent_right':'0.0000','ymin_type':'0','ymax_type':'0','ymin_itemid':'0','ymax_itemi
d':'0'}])["graphids"][0]
---
> createdgraphids = zapi.graph.create([{'gitems': (gitems) ,'name': (graph_title),'width':'900','height':'200','yaxismin':'
0.0000','yaxismax':'3.0000','show_work_period':'1','show_triggers':'1','graphtype':'0','show_legend':'1','show_3d':'0','per
cent_left':'0.0000','percent_right':'0.0000','ymin_type':'0','ymax_type':'0','ymin_itemid':'0','ymax_itemid':'0'}])["graphi
ds"][0]

zabbix_api.py 修正

  • 201 - 206 行目: user.login method の場合に auth パラメータを付与しないようにする
201,206c201,213
<         obj = {'jsonrpc': '2.0',
<                'method': method,
<                'params': params,
<                'auth': self.auth,
<                'id': self.id
<               }
---
>         if method == "user.login":
>             obj = {'jsonrpc': '2.0',
>                    'method': method,
>                    'params': params,
>                    'id': self.id
>                   }
>         else:
>             obj = {'jsonrpc': '2.0',
>                    'method': method,
>                    'params': params,
>                    'auth': self.auth,
>                    'id': self.id
>                   }
  • 230 行目 : user.authenticate を user.login に変更する
230c237
<         obj = self.json_obj('user.authenticate', {'user': l_user,
---
>         obj = self.json_obj('user.login', {'user': l_user,

修正箇所は以上です
とりあえず自分は上記のみで動作しましたが、他にも Zabbix Server のホスト名を記載する部分もあったので環境によってはまだ修正が必要な箇所があるかもしれません

スクリプト実行

  • chmod 755 zabbix_munin_plugin.py
  • ./zabbix_munin_plugin.py memory Template_Munin_Memory

でエラーがでなければOKです
エラーの場合は Exception の内容を確認して上記スクリプトを更に修正する必要があります

各種調整

スクリプトの動作が完了するとテンプレートにアイテムが13個とグラフ1個が追加されます
以下手動での操作ですがやったほうが良さそうな点を紹介します

グラフ修正

  • グラフタイプの変更
    グラフのタイプが「ノーマル」になっているので「積算グラフ」に変更しましょう

  • 不要なアイテムの削除
    グラフから以下のアイテムを削除しましょう

committed
active
inactive
vmalloc_used
mapped

上記はあってもいいのですが積算グラフにすることで縦軸が合わなくなります
Munin のグラフは積算+折れ線グラフでメモリ使用量を表示しており上記のアイテムは折れ線グラフで表示している項目になるため Zabbix では削除しないと縦軸の値が合いません
なので、やるとしたら別途、ノーマルタイプの折れ線グラフを作成して、そちらに移行するといいと思います

完成するとこんな感じになります

sample_memory.png

色はzabbix_munin_plugin.py内でランダムで生成しているので必要に合わせて変更してください

最後に

munin-node を使って Zabbix で Munin ってぽいメモリ監視をすることができました
Python スクリプトも使っているので、スクリプトの実行で失敗しまくる場合は、素直に Munin を使いましょう

Tips

  • Zabbix 2.0.3 でも実施してみましたが Color を作成する for 文のところだけ変更すれば動作しました