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 文のところだけ変更すれば動作しました

2015年8月18日火曜日

Gradle + Eclipse で System.out をコンソールに出力する方法

概要

例えば、JUnitのテスト内でSystem.outしている場合にその内容を出力したいときとかに使えます

環境

  • Windows 7 64bit
  • Eclipse Luna 4.4.1
  • Java 1.8.0_25
  • Gradle 2.1 (Embedded Plugin)

設定方法

Gradle プロジェクトを右クリックして

Run As -> Gradle Build …

ダイアログが表示されたら Arguments タブに移動して Program Args に「-i」を指定します

add_detail_option.png

gradle のオプションでログレベルを INFO に指定することができます
これでSystem.outの内容が Gradle ビルド経由でも Eclipse のコンソールにも出力されます

2015年8月17日月曜日

Zabbix の UserParameter の引数に特殊文字を指定する方法

概要

デフォルトだと UserParameter の引数に特殊文字「*」「{}」等のが使えないらしいです
使えるようにする方法を紹介します

環境

  • CentOS 6.6
  • Zabbix 2.0.3

設定方法

zabbix_agentd.confを修正します
以下の1行を追加すればOKです

UnsafeUserParameters=1

修正したらzabbix-agentを再起動してください
これで特殊文字が使えるようになります

Tips

デフォルトだと使用できない特殊文字の一覧は以下の通りです(真ん中くらい)
https://www.zabbix.com/documentation/2.0/manual/config/items/userparameters

変数を渡したい場合はそのまま使えるようです
例えばホスト名を表す環境変数{HOSTNAME}を渡したい場合は

original.key[{HOSTNAME}]

でOKです