2015年2月28日土曜日

RabbitMQのプラグインを開発するための環境を準備してみた

概要

RabbitMQプラグインを開発するための環境構築をしてみました
実際にRabbtMQプラグインを開発するためにはerlangのコードが書けないとダメです
自分は書けないので環境を構築するまでの手順を紹介します

環境

  • CentOS 6.6 64bit (Final)
  • RabbitMQ 3.4.4
    RabbitMQ自体のインストールは今回は紹介しません
    インストール方法に関してはこちらで紹介しているので参照してみてください

環境構築

基本はコマンドベース構築していきます

必要なパッケージのインストール

作成するプラグインをビルドするために必要なパッケージをインストールしておきます

yum -y install libxslt gcc

Umbrellaのインストール

UmbrellaとはRabbitMQのプラグインを管理している仕組みです
サンプル開発用のプラグインも含めRabbitMQの安定版として動作しているプラグインのソースもインストールすることができます

git clone https://github.com/rabbitmq/rabbitmq-public-umbrella.git
cd rabbitmq-public-umbrella/
make co

make coするとRabbitMQのプラグインを次々とダウンロードしてきてくれます
結構な数があるのですべてのプラグインのダウンロードが完了するまで待ちます
ダウンロードが完了しmakeが問題なく終了すればUmbrellaのインストールは完了です

長いですが、完了後は以下のような感じでプラグインのフォルダが存在していればOKです

-rw-r--r--  1 root root   955  2月 24 19:58 2015 README-packaging
-rw-r--r--  1 root root  5505  2月 24 19:58 2015 Makefile
-rw-r--r--  1 root root 24897  2月 24 19:58 2015 LICENSE
-rw-r--r--  1 root root  2666  2月 24 19:58 2015 generate_deps
-rw-r--r--  1 root root   622  2月 24 19:58 2015 generate_app
-rwxr-xr-x  1 root root   142  2月 24 19:58 2015 foreachrepo
-rw-r--r--  1 root root 22541  2月 24 19:58 2015 do-package.mk
-rw-r--r--  1 root root  4461  2月 24 19:58 2015 common.mk
-rwxr-xr-x  1 root root  3206  2月 24 19:58 2015 check_xref
-rw-r--r--  1 root root   448  2月 24 19:58 2015 all-packages.mk
-rw-r--r--  1 root root   337  2月 24 19:58 2015 README.md
-rw-r--r--  1 root root 19770  2月 24 19:58 2015 README.makefiles
drwxr-xr-x  5 root root  4096  2月 24 19:58 2015 rabbitmq-docs
drwxr-xr-x  3 root root  4096  2月 24 19:58 2015 util
-rw-r--r--  1 root root  1368  2月 24 19:58 2015 umbrella.mk
-rw-r--r--  1 root root 11268  2月 24 19:58 2015 release.mk
drwxr-xr-x  2 root root  4096  2月 24 19:58 2015 release-build
drwxr-xr-x  9 root root  4096  2月 24 19:59 2015 rabbitmq-java-client
drwxr-xr-x  7 root root  4096  2月 24 20:00 2015 rabbitmq-dotnet-client
drwxr-xr-x  6 root root  4096  2月 24 20:00 2015 rabbitmq-test
drwxr-xr-x  3 root root  4096  2月 24 20:00 2015 cowboy-wrapper
drwxr-xr-x  3 root root  4096  2月 24 20:00 2015 eldap-wrapper
drwxr-xr-x  3 root root  4096  2月 24 20:00 2015 mochiweb-wrapper
drwxr-xr-x  7 root root  4096  2月 24 20:00 2015 rabbitmq-amqp1.0
drwxr-xr-x  7 root root  4096  2月 24 20:00 2015 rabbitmq-auth-backend-ldap
drwxr-xr-x  4 root root  4096  2月 24 20:00 2015 rabbitmq-auth-mechanism-ssl
drwxr-xr-x  5 root root  4096  2月 24 20:00 2015 rabbitmq-consistent-hash-exchange
drwxr-xr-x  7 root root  4096  2月 24 20:00 2015 rabbitmq-federation
drwxr-xr-x  5 root root  4096  2月 24 20:00 2015 rabbitmq-federation-management
drwxr-xr-x  9 root root  4096  2月 24 20:00 2015 rabbitmq-management
drwxr-xr-x  4 root root  4096  2月 24 20:00 2015 rabbitmq-management-agent
drwxr-xr-x  5 root root  4096  2月 24 20:00 2015 rabbitmq-management-visualiser
drwxr-xr-x  5 root root  4096  2月 24 20:01 2015 rabbitmq-web-dispatch
drwxr-xr-x  6 root root  4096  2月 24 20:01 2015 rabbitmq-mqtt
drwxr-xr-x  6 root root  4096  2月 24 20:01 2015 rabbitmq-shovel
drwxr-xr-x  7 root root  4096  2月 24 20:01 2015 rabbitmq-shovel-management
drwxr-xr-x  8 root root  4096  2月 24 20:01 2015 rabbitmq-stomp
drwxr-xr-x  4 root root  4096  2月 24 20:01 2015 rabbitmq-toke
drwxr-xr-x  6 root root  4096  2月 24 20:01 2015 rabbitmq-tracing
drwxr-xr-x  5 root root  4096  2月 24 20:01 2015 rabbitmq-web-stomp
drwxr-xr-x  5 root root  4096  2月 24 20:01 2015 rabbitmq-web-stomp-examples
drwxr-xr-x  3 root root  4096  2月 24 20:01 2015 sockjs-erlang-wrapper
drwxr-xr-x  6 root root  4096  2月 24 20:01 2015 toke
drwxr-xr-x  3 root root  4096  2月 24 20:01 2015 webmachine-wrapper
drwxr-xr-x  4 root root  4096  2月 24 20:09 2015 coverage
drwxr-xr-x  3 root root  4096  2月 24 20:09 2015 rabbitmq-codegen
drwxr-xr-x 11 root root  4096  2月 24 20:15 2015 rabbitmq-server
drwxr-xr-x  9 root root  4096  2月 24 20:15 2015 rabbitmq-erlang-client
drwxr-xr-x  8 root root  4096  2月 24 20:15 2015 rabbitmq-metronome

サンプルプラグインをビルドしてみる

ダウンロードしたプラグインの中にrabbitmq-metronomeというフォルダがあり、これがサンプル用のプラグインになります
これをビルドして実際にRabbitMQ本体に追加するところまでやってみたいと思います

まずはビルドしてみます

cd rabbitmq-metronome
make

するとダーっとログが流れてビルドがはじまります
結構時間がかかるので失敗しないように祈りながら待ちます

ビルドが完了したら成果物である.ezファイルをRabbitMQ本体にインストールしてプラグインを有効にします

cp dist/rabbitmq_metronome-0.0.0.ez /usr/lib/rabbitmq/lib/rabbitmq_server-3.4.4/plugins/
rabbitmq-plugins list
rabbitmq-plugins enable rabbitmq_metronome

.ezファイルを本体にpluginsフォルダに移動するだけでOKです
そのあとはrabbitmq-pluginsコマンドを使ってプラグインを有効にするだけです
listしてみると分かりますが、移動したezファイルのプラグインが一覧に出てくることがわかると思います

動作を確認してみる

サンプルのrabbitmq-metronomeプラグインはConnectionとChannelをExchangeを1つずつ生成してMessageRate 1.0 req/sec でメッセージを送信してくれるプラグインのようです
管理UIにアクセスしてConnectionsタブを見てみましょう
connections.png
こんな感じで常に接続されているConnectionsが確認できればプラグインがうまく動作していることになります

最後に

このままrabbitmq-metronomeプラグインを修正したい場合はrabbitmq-metronome/src配下の.erlファイルや.srcファイルを修正しmakeしてezファイルを作成してから、pluginsファルダに移動してという流れを繰り返せばOKです
参考サイトに記載した公式をみるとrabbit_metronome_worker.erlがコアの部分を実装しているのでここを修正しましょう的なことが書いてありました
が、ボクは試していないので最中ではないです

erlangが書けて読める人だったらこっからちょろっとプラグインを作ってしまうのだろうか
時間があったらやってみよう

参考サイト

2015年2月27日金曜日

Apache Kafkaを試してみた

概要

KafkaはScalaで書かれたpub/subモデルの分散メッセージングプラットフォームです
有名なサービスだとLinkedInが導入しているようです
同じようなミドルウェアにKestrel(ケストレル)やRabbitMQがあります
そもそも、KafkaさんがどんなものなのかよくわかったなかったのでとりあえずQuickStartをやってみたので紹介します

環境

  • Mac OS X 10.8.5
  • kafka 0.8.2.0 (Scala 2.11)

インストール

公式で配布されているバイナリをダウンロードしてインストールしてみたいと思います

cd ~/Downloads
wget http://supergsego.com/apache/kafka/0.8.2.0/kafka_2.11-0.8.2.0.tgz
tar zvxf kafka_2.11-0.8.2.0.tgz
mv kafka_2.11-0.8.2.0 /usr/local/
cd /usr/local
ln -s kafka_2.11-0.8.2.0/ kafka

MacであればHomebrewでもインストールできそうです
インストールは上記で完了です
インストールが完了したら早速試してみましょう

試してみる

kafkaの起動

zookeeperの起動

cd /usr/local/kafka
sh bin/zookeeper-server-start.sh config/zookeeper.properties

kafkaサーバの起動

cd /usr/local/kafka
sh bin/kafka-server-start.sh config/server.properties

先にzookeeperのプロセスを起動してください
それぞれ別ターミナルで実行してください

シェルを叩いているだけですが、内部的にはjarファイルが実行されてJavaのプロセスが立ち上がっています

トピックの作成

メッセージを送信するためのトピックを作成します

cd /usr/local/kafka
sh bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic test

testというトピックを作成しました
bin/kafka-topics.sh --zookeeper localhost:2181の部分はテンプレ的な感じです
その他パラメータの説明は以下の通りです

  • create・・・トピックを作成するためのオプションです、このオプションを変更することでトピックの一覧を表示したり削除したりすることができます
  • replication-factor・・・kafkaクラスタ内に存在するkafkaブローカーの何台にトピックを作成するか指定できます、なのでkafkaブローカーが1つしかない場合は1以上は指定できません
  • partitions・・・トピックをいくつのパーティションに分割するか指定します、この辺はちょっと自身がないですが1つのバーティション上にトピックを作成するとアクセス効率が悪いので複数のバーティションに分割することでアクセスを分散するためだと思います(The number of partitions for the topic being created or altered (WARNING: If partitions are increased for a topic that has
    a key, the partition logic or ordering of the messages will be affected)
  • topic・・・作成するトピック名を指定します

といった感じです
この辺のオプション周りは詳しくは調べていないので詳細は公式ドキュメントを見ていただければと思います

作成したトピックを確認するにはlistを使います

cd /usr/local/kafka
sh bin/kafka-topics.sh --list --zookeeper localhost:2181

作成したトピックの一覧が表示されると思います

更に各トピックごとの詳細を知りたい場合は「–describe」を利用します

cd /usr/local/kafka
sh bin/kafka-topics.sh --describe --zookeeper localhost:2181 --topic test

以下のような感じでパーティションの情報やレプリケーションの情報を確認することができます

Topic:test      PartitionCount:1        ReplicationFactor:1     Configs:
        Topic: test     Partition: 0    Leader: 0       Replicas: 0     Isr: 0

トピックの削除

ここで注意が必要ですが今回使っているkafka0.8.2.0ではトピックを削除するのに「–delete」というオプションを使えばいいのですが、release版の0.8.1.1では「–delete」オプションがありません
そのため作成したトピックは削除することができないようです

0.8.2.0では以下のようにしてトピックを削除します

cd /usr/local/kafka
echo 'delete.topic.enable=true' >> config/server.properties

まず「–delete」オプションを有効にする設定を追記します
そして再度kafkaサーバを起動し以下のコマンドを実行しま

cd /usr/local/kafka
bin/kafka-topics.sh --delete --topic test --zookeeper localhost:2181

これで作成したトピックの削除を実施することができます

メッセージを送信

作成したtestトピックにメッセージを送信してみましょう

cd /usr/local/kafka
sh bin/kafka-console-producer.sh --broker-list localhost:9092 --topic test

メッセージを送信する際のポートは9092になります

上記を実行すると入力待ち状態になります
メッセージを入力してEnterを押すとメッセージを送信することができます
連続で何個もメッセージを送信することができます
終了する場合はCtrl+cで抜けます

メッセージを受信

では送信したメッセージを受信してみましょう
以下のコマンドで受信することができます

cd /usr/local/kafka
sh bin/kafka-console-consumer.sh --zookeeper localhost:2181 --topic test --from-beginning

先ほど送信したメッセージの一覧が表示されると思います
メッセージの受信も送信時と同じように待ち状態になります
この状態でメッセージの送信を別のターミナルで実行してみるとリアルタイムにメッセージを受信できると思います

「–from-beginning」を指定するとトピックに送信されたメッセージを最初からすべて取得することができます
接続した時点からのメッセージのみを取得したい場合は「–from-beginning」オプションを削除して受信してみてください

最後に

Kafkaはあくまでもメッセージを管理するための基盤で、スケーラビリティとか分散に特化したミドルウェアです
Kafka自体にはMQTTやWebSocket、HTTPなどのインタフェースを持っていなくて本当にメッセージを管理するだけの基盤になります
いろいろ調べるとkafkaと連携してMQTTインタフェースを持たせるブリッジ的なものを作成している方もいたので、インタフェース周りはエコシステム的に作られていくのかなと思いました

今回は基本的な部分しか触れていませんがQuickStartはこの後Kafkaクラスタを構築する手順になっています
本気でやろうとするとKafkaクラスタを構築するのはおそらく必須条件になると思います

参考サイト

2015年2月26日木曜日

sedコマンドを使って指定した行の次の行に任意の文字列を追加する

概要

タイトルの通り
ある行の後ろにピンポイントで追記したいときってあると思います
いちいちvimやemacsを開くのも面倒なのでsedコマンドで追記してみました

環境

  • CentOS 6.6 64bit (Final)
  • sed 4.2.1

使い方

実際のコマンドと挙動は以下の通りです

テスト用ファイル

cat text.txt

hoge
hoge1
hoge2
hoge3
hoge4

3行目の後ろに追記する

sed '3a hoge-add' text.txt

hoge
hoge1
hoge2
hoge-add
hoge3
hoge4

or

sed '3N;s/\n/\nhoge-add\n/;' text.txt

hoge
hoge1
hoge2
hoge-add
hoge3
hoge4

指定した正規表現に該当する次の行に追記する

sed '/hoge2/a hoge-add' text.txt

hoge
hoge1
hoge2
hoge-add
hoge3
hoge4

or

sed '/hoge2/N;s/\n/\nhoge-add\n/;' text.txt

hoge
hoge1
hoge2
hoge-add
hoge3
hoge4

ちょっと解説

どちらも2パターン紹介してしますが「a」コマンドを使うほうがどちらも断然簡単です

「a」コマンドは

text を追加する。 text に改行を含めたい場合は、その前にバックスラッシュを置く。

「N」コマンドは

入力の次の行をパターンスペースに読み込む/追加する。

がそれぞれのコマンドの説明です
aコマンドは直感的でかつ単純です
Nコマンドが少々挙動が複雑でかつ指定方法も難読です

aコマンドは特に説明することはないと思います

Nコマンドを使って行を指定して追記する場合は「3N;」のように指定します
「3」の部分はそのまま行数に該当するので4とすれば4行目の次の行に追記することができます
置換する文字列は「\n」で改行を指定しています
今回はLinux上で挙動を確認したので「\n」LFの改行コードを指定いますがWindows環境のファイルなどで改行コードが「\r」の場合はそちらを指定してください
置換後の文字列の前後にも改行コードを入れることで行の追加を実現しています

また正規表現の方は「/hoge2/N;」といった感じで指定します
こっちの挙動が若干思った通りの挙動にはなりません
思った通りの挙動にならないのはNコマンドの説明を理解するとよくわかるのですが、Nコマンドは次の行を対象に置換を実行します
サンプルでは「hoge2」に該当する行が1行しかないので問題ないのですが例えば以下のように実行すると結果が飛び飛びになっていることがわかると思います

sed '/hoge/N;s/\n/\nhoge-add\n/;' text.txt

hoge
hoge-add
hoge1
hoge2
hoge-add
hoge3
hoge4
hoge-add

Nコマンドは1行目のhogeが見つかったら2行目のhoge1の行に対して置換を実行します
そして次に評価する行はhoge2の行になります
hoge2が評価されるとhoge3の行に対して置換が実行されるので評価が飛ばされます
そしてその次はhoge4が評価される、といった挙動になります
なので結果として飛び飛びの結果になった感じです

今回の目的は該当する各行に対して追記ことなのでNコマンドはそもそもユースケースに合わないと思います
じゃあなんで紹介したんだと言われると、たまたま見つけちゃったのでどうせなら紹介しちゃおうかなと思ったからです

あと今回は上書きしてないですが、上書きしたい場合は「-i」オプションを付ければOKです

2015年2月25日水曜日

CentOSにRabbitMQをインストール

概要

過去に試してみたのですが改めてインストール手順をまとめてみました
前回はChefでレシピからインストールしましたが今回はChefを使わずコマンドベースで順次インストールしてみました

環境

  • CentOS 6.6 64bit (Final)
  • RabbitMQ 3.4.4
  • erlang R14B04 (5.8.5)

インストール

erlangのインストール

RabbitMQを使うためにはerlang R13B-03以上が動作する環境が必要です
erlangのパッケージはEPELで公開されているのまずEPELのリポジトリを追加します

EPELリポジトリの追加

rpm -Uvh http://download.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm

インストールするバージョンに気をつけてください
RabbitMQの公式からもリンクされているページに各バージョンごとのEPELリポジトリのインストール方法が記載されているので確認してください

erlangパッケージをyumでインストール

yum clean all
yum -y install erlang

大量の依存性解決が発生すると思います
インストールが完了したらバージョンが表示されることを確認してください

erl -version

Erlang (SMP,ASYNC_THREADS) (BEAM) emulator version 5.8.5

erlangのインストールはこれで完了です

RabbitMQのインストール

rpmコマンドでrabbitmq-serverのインストール

公式で公開されているrpmを使ってrabbitmq-serverをインストールします
バージョンは変更している可能性があるので公式で適宜確認してください

rpm -Uvh https://www.rabbitmq.com/releases/rabbitmq-server/v3.4.4/rabbitmq-server-3.4.4-1.noarch.rpm

インストールが完了するとrabbitmq-serverrabbitmqctlというコマンドが使えるようになっています

バージョンを確認してみましょう
一度起動する必要があります

service rabbitmq-server start
rabbitmqctl status | grep running_applications

{running_applications,[{rabbit,"RabbitMQ","3.4.4"},

起動スクリプトも作成されているので必要であればchkconfigでrabbitmq-serverをonにしてください

chkconfig rabbitmq-server on

起動

バージョンを確認するのに起動していると思いますが以下のコマンドで起動できます
停止する場合はstopにします

service rabbitmq-server start

管理画面を表示するプラグインの追加

これはインストールしたら絶対にやったほうがいいと思います
RabbitMQにはプラグイン機構がありプラグインを有効にするだけで簡単に機能を追加することができます

rabbitmq-plugins enable rabbitmq_management
service rabbitmq-server restart

プラグインをenableにしたらrabbitmq-serverを再起動しましょう
rabbitmq-plugins listというコマンドを実行すれば現在有効になっているプラグインの一覧を確認することができます

guestユーザでログインできるように設定する

いつからのバージョンからかデフォルトで用意されているguestユーザがリモート環境からアクセスできずlocalhostからのみアクセス可能になっていました

セキュリティの観点からだと思いますが/etc/rabbitmq/rabbitmq.configに以下を記載することでguestユーザがリモートからアクセスできるようになります

[{rabbit, [{loopback_users, []}]}].

設定ファイルがない場合は作成してOKです
記載したらrabbitmq-serverを再起動しましょう

管理画面にアクセスしてみる

管理画面が有効になっているか確認してみましょう
http://hostname:15672/
にアクセスします

認証画面が表示されるのでUsernameとPasswordに guest/guest と入力してください
デフォルトで作成されているguestアカウントでログインします

ログインできればあとはここからキューを作成したりメッセージを飛ばしたりすることができます

とりあえずこの管理画面を表示するまでがインストールの一覧の流れかなと思います

最後に

紹介は以上です
過去に紹介した記事と同じような内容になってしまいましたがguestユーザのACLに関しては前回紹介していなかったと思います

おそらくChefのレシピでインストールしてもyumとrpmを使っていると思いますがちゃんとインストール方法を理解しておくのも大事かなと思います

2015年2月24日火曜日

CentOS6.6にNginx1.6.2をインストール

概要

CentOSの6.6にnginxをインストールしてみました
nginxの安定ビルドの最新版をyumでインストールします

環境

  • CentOS 6.6 64bit (Final)
  • nginx 1.6.2 stable

インストール

リポジトリの追加

rpm -Uvh http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpm

CentOS6用のリポジトリを追加します
5系や7系をお使いの場合はインストールするリポジトリも異なるので気をつけてください
リポジトリを削除したい場合は
rpm -e nginx-release-centos-6-0.el6.ngx.noarchで削除できます

nginxのインストール

yum clean all
yum -y install nginx

でインストールは完了です
ついでにバージョンも確認してみます

nginx -V

nginx version: nginx/1.6.2
built by gcc 4.4.7 20120313 (Red Hat 4.4.7-3) (GCC)
TLS SNI support enabled

最新版は1.7系ですが、yumでインストールした場合は安定版がインストールされるようです

起動

service nginx start

停止はstopにすればOKです
yumでインストールすると起動用のスクリプトも作成されるのでserviceコマンド経由で起動できます

とりあえず起動してhttp://hostname/にアクセスすると「Welcome to nginx!」という見出しの画面が表示されると思います

設定ファイル

主な設定ファイルだけ紹介します

  • /etc/nginx/nginx.conf
    nginx全体の設定を管理します
    デフォルトでは起動するユーザや起動するワーカーの数、ログの場所などが設定されています
    nginx全体の設定を変更したい場合にはこのファイルを修正します
  • /etc/nginx/conf.d/default.conf
    80番ポートでLISTENするhttpの設定を管理します
    このファイルはnginx.confから呼び出される設定ファイルです
    デフォルトではconf.d配下に各ポートごとの設定ファイルを配置することで各ポートごとの設定を管理します
    nginxはブロックと呼ばれる単位で設定を記載していきます
    serverブロックが80番などのポートでLISTENするための設定になります
    また、ルートにアクセスした際のコンテンツを管理しているデフォルトのディレクトリ(所謂、ドキュメントルート)ですが/usr/share/nginx/htmlになっています
    この配下にindex.htmlがありこれがルートアクセス時にこれのindex.htmlが表示されています
    その他の基本的な設定を知りたい場合はビギナーズガイドを見たりググったりすればある程度わかると思います

設定の再読み込み

例えばLISTENするポートを81番に変えたいとします
default.confのlistenの部分を81に変更します

diff default.conf default.conf.back
2c2
<     listen       81;
---
>     listen       80;

設定を変更したら

nginx -s reload

とすることで再起動をせずに設定を再読み込みすることができます
試してに80番ポートにアクセスしてみるとアクセスできずに81番だとアクセスできることが確認できると思います
http://hostname:81/

最後に

今回の紹介は以上です
単純にインストールしただけでしたが、nginxは他にも便利な機能をたくさん持っているので興味のある方は調べてみるといいと思います
自分も(今更ですが)別の機能を試したらまた紹介したいと思います

Tips

  • シンボリックの参照を追従する方法
    /etc/nginx/conf.d/default.conf に以下を追記し設定を再読み込みする
server {
    disable_symlinks off;
    ...
}

参照元のファイルへのディレクトリがすべてnginxのワーカープロセスから読み込み可能であること(644や755になっていること)
対象のファイルだけではなくディレクトリも含めてすべてであることに注意

参考サイト

2015年2月21日土曜日

CloudMQTTを使ってみた

概要

MQTT as a Service であるCloudMQTTを使ってみました
サインアップからRubyでのサンプルの動作まで実施してみました
あと最後に軽く考察しています

環境

  • CloudMQTT 2015/02/20時点
  • CentOS 6.6 64bit (Final)
  • Ruby 2.2.0

試す

サインアップ

まずはサインアップします
CloudMQTTのサイトトップにアクセスして右上のメニューの「Control Panel」をクリックします
home.png

ログイン or サインアップする画面になるので「Sign Up」側にメールアドレスを入力します
signup.png
メールアドレスを入力して「Sign Up」をクリックするとサインアップ用のURLが記載されたメールがくるのでURLにアクセスしてサインアップします

サインアップ画面では

  • E-mail
  • Company name
  • Address
  • Country
  • Password
  • Confirm password

の項目が必須になります
input_account_info.png

入力が完了したら「Submit」をクリックしてサインアップを完了しましょう

インスタンス作成

インスタンスと呼ばれるMQTTの器を作成します
インスタンスにはプランがあり無料から$299の有料版まで全4プランがあります
今回は無料プランの「Cute Cat」のインスタンスを作成します

Control Panelからインスタンスを作成します
「+Create」ボタンがあるのでクリックします

インスタンス情報を入力する画面に遷移するので必要な情報を入力してインスタンスを作成します
input_instance_info.png

  • Name・・・好きなインスタンス名を入力してください
  • Data Center・・・Northern Virginia と Ireland の2つから選択できます、どちらでもOKです
  • Plan・・・今回は「Cute Cat」を選択します

必要な情報が入力できたら「Create」をクリックしてインスタンスを作成しましょう

Control Panelに戻ると作成したインスタンスが存在することが確認できると思います
list.png

「Details」をクリックするとインスタンスの詳細を確認することができます
ここにMQTTに接続するための情報(アクセスポイントやID/PW)が記載されてます

Rubyから呼び出してみる

さて、作成したインスタンスに対してMQTTプロトコルでアクセスしてメッセージのpublishとsubscribeを実施してみたいと思います
CloudMQTTはpublisherとsubscriberのためのSDKが充実しており様々なプログラム言語やPaaSサービス(HerokuやAmazon Kinesis)からCloudMQTTにアクセスすることができるようになっています
今回はCentOS上にインストールしたRubyからCloudMQTTにアクセスしてみたいと思います

必要なGemのインストール

gem install mqtt

CloudMQTTが用意しているGemではなく既存のMQTTライブラリを使うことでアクセスすることができます

Publisher

Publisherのソースコードは以下のとおりです

  • publisher.rb
require 'mqtt'
require 'uri'

# Create a hash with the connection parameters from the URL
uri = URI.parse ENV['CLOUDMQTT_URL'] || 'Please input your MQTT URL'
conn_opts = {
  remote_host: uri.host,
  remote_port: uri.port,
  username: uri.user,
  password: uri.password,
}

MQTT::Client.connect(conn_opts) do |c|
  # publish a message to the topic 'test'
  c.publish('test', 'Hello World')
  sleep 1
end

testというトピックに対して1つのメッセージを送信します
uri = URI.parse ENV['CLOUDMQTT_URL'] || 'Please input your MQTT URL'
でアクセスするURLを指定しています
環境変数のCLOUDMQTT_URLにアクセスするURLをセットしてrubyを実行するかPlease input your MQTT URLにControl Panelに表示されているURLの部分を貼り付けてもOKです

Subscriber

subscriberのソースコードは以下のとおりです

  • subscriber.rb
require 'mqtt'
require 'uri'

# Create a hash with the connection parameters from the URL
uri = URI.parse ENV['CLOUDMQTT_URL'] || 'Please input your MQTT URL'
conn_opts = {
  remote_host: uri.host,
  remote_port: uri.port,
  username: uri.user,
  password: uri.password,
}

MQTT::Client.connect(conn_opts) do |c|
  # The block will be called when you messages arrive to the topic
  loop do
    c.get('test') do |topic, message|
      puts "#{topic}: #{message}"
    end
  end
end

Subscriberは無限ループしてtestというトピックに入ってきたメッセージを常に取得するようにします
アクセスURLに関してはpubliser.rbのときと同じです

実行してみる

まず先にsubscriber.rbを起動します
無限ループになるのでターミナルは返ってこないと思います

次にpublisher.rbを実行します
すると先に起動させておいたsubscriber.rbのターミナルの方にpublishしたメッセージの情報が表示されると思います

[root@localhost cloud_mqtt]$ ruby subscriber.rb
test: Hello World
test: Hello World

...

subscriber.rbを終了する場合はCtrl+cでOKです

その他Tips

CloudMQTTには他にも便利な機能があります

「Users and ACL」はトピックに対してアクセス制限を設けることが出来る機能で例えばAというユーザはtestというトピックに対してはsubscribeしかできないなどの設定ができます
作成したユーザを使用する場合はアクセスURLに記載されているID:PWの部分を変更すればOKです

mqtt://ID:PW@m11.cloudmqtt.com:11111

実際に試してみるとわかりますが、例えば「Read Access」のみにした場合はpublishできなくなります
Rubyスクリプトで試した場合の挙動ですが特にエラーは返却されずメッセージが投入されずに終了しました

「bridge」という機能は他のMQTTサービスにメッセージを転送する機能です
CloudMQTT側のあるトピックにきたメッセージをリモート側の指定したトピックに転送できます
ちょっとこの機能は詳細に試せていないので説明に自信がないです、すいません

あとは「Amazon Kinesis」という機能があり、おそらくこれもCloudMQTTで受け取ったメッセージをKinesisに転送できる機能かと思います

などなど様々な機能が用意されています

最後に

CloudMQTTは無料で使える割には機能が充実していると感じました
ただ無料プランは最大が10同時接続で転送量が10 Kbit/sなので公開するサービスで使うにはちょっとスペック的に厳しいかなと思います
今回みたいに試してみるだけならぴったりだと思います

CloudMQTTは非常にユーザフレンドリーに作られているような気がしました
機能も多いしドキュメントも充実しているし、導入のハードルも低いです
他のPaaSサービスとのシナジーもちゃんと考えられているのも素晴らしいと思います

あとインスタンスのステータスを確認できる画面があり、そこで裏側の情報も見れたのですが、どうやらCloudMQTTはmosquittoというオープンソースのMQTTブローカーを利用しているようです
instance_status.png

参考サイト

2015年2月20日金曜日

CentOSにRVMをインストール

概要

RVM(Ruby Version Manager) を今更ながらCentOSに入れて試してみました
すごい昔はyumでインストールしたりRubyの公式サイトから.tar.gzをダウンロードしてソースコンパイルしてインストールしていましたが、さすがに卒業しようかと思います

環境

  • CentOS 6.6 64bit (Final)
  • RVM 1.26.10
  • AutoConf 2.69

各種インストール作業

RVMインストール

rootで実施しました
ユーザは適当に変更してください

gpg --keyserver hkp://keys.gnupg.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3
\curl -sSL https://get.rvm.io | bash -s stable
echo 'export PATH=$PATH:/usr/local/rvm/bin' >> /root/.bashrc
source /root/.bashrc
  • P.S 2015/04/06
    curl先のURLが変更されていたのでインストールコマンドを修正しました

curlの前の円マークは必要です
コマンドの前に円マークを付けることでaliasの設定を一時的に無視することができます

rvm -v
rvm 1.26.10 (latest) by Wayne E. Seguin <wayneeseguin@gmail.com>, Michal Papis <mpapis@gmail.com> [https://rvm.io/]

ひとまずバージョンが表示されればOKです

autoconf2.69のインストール

rubyをインストールするのにautoconfのバージョン2.67以上が必要になります
2.67以上をインストールしないと

configure.in:6: error: Autoconf version 2.67 or higher is required

というエラーとなりrubyをインストールする際にmakeでエラーとなります
CentOS 6.6にデフォルトでインストールされているautoconfが2.63だったのでバージョンアップします

autoconf自体の最新バージョンは2.69のようです
せっかくなので最新版をインストールたいと思います

cd /var/tmp/
wget http://ftp.gnu.org/gnu/autoconf/autoconf-2.69.tar.gz
tar zvxf autoconf-2.69.tar.gz
cd autoconf-2.69
./configure
make
make install

これでインストールできました
/usr/local/bin/autoconfにインストールされました
前のautoconfのPATHが効いている場合は再ログインすると新しいバージョンのautoconfを見るようになります

Rubyのインストール

まずインストール可能なRubyのバージョンを調べます

rvm list known

インストール可能なパッケージの一覧が表示されます
Ruby以外でのパッケージのバージョン一覧も表示されるので、ここからRubyの最新版を選択してインストールします

rvm install 2.2-head

Rubyの動作に必要なほかのパッケージの依存関係を解決してインストールしてくれます

インストールが完了すればrubyを使えるようになります
インストールされているディレクトリは以下のようです
/usr/local/rvm/rubies/ruby-2.2-head/bin/ruby

rvmを使ってみる

違うバージョンのRubyをインストールして切り替えてみる

次に違うバージョンのRubyをインストールしてみます
先ほどと同じようにrvm list knownでバージョンを確認して好きなバージョンをインストールしましょう
自分は1.9系をインストールしました

rvm install 1.9.3

インストールが完了するとすでに1.9.3にバージョンが切り替わっていました
パスは以下にインストールされています

/usr/local/rvm/rubies/ruby-1.9.3-p551/bin/ruby

ではここからまた2.2.0に切り替えてみましょう
すでにインストールされているRubyのバージョンを確認するにはrvm listを使います

rvm list

rvm rubies

=> ruby-1.9.3-p551 [ x86_64 ]
 * ruby-2.2-head [ x86_64 ]
   ruby-2.2.0 [ x86_64 ]

# => - current
# =* - current && default
#  * - default

1.9.3と2.2.0がインストールされていることがわかると思います
現在のバージョンが1.9.3になっていることもわかると思います

ここから2.2.0に切り替えるにはrvm useを使います

rvm use 2.2-head

これで2.2.0が使われるようになります
うまくrvm useが出来ない場合は一旦ログアウトしてから再度試してみてください

Gemの挙動を確認する

Rubyのバージョンを切り替えた場合のgemコマンドの挙動も確認しておきます
まずそれぞれのRubyのバージョンで使われるGemのバージョンを確認します

[root@localhost tmp]$ rvm use 2.2-head
Using /usr/local/rvm/gems/ruby-2.2-head
[root@localhost tmp]$ gem -v
2.4.6
[root@localhost tmp]$ which gem
/usr/local/rvm/rubies/ruby-1.9.3-p551/bin/gem
[root@localhost tmp]$ rvm use 1.9.3
Using /usr/local/rvm/gems/ruby-1.9.3-p551
[root@localhost tmp]$ gem -v
2.4.3
[root@localhost tmp]$ which gem
/usr/local/rvm/rubies/ruby-1.9.3-p551/bin/gem

それぞれの別のgemが使われているようです

ではこの状況でgem installを実行してみます
インストールするgemは何でもOKです
ruby 2.2.0の方でcapistranoをインストールしてみます

gem install capistrano

インストールの状況を確認すると

[root@localhost tmp]$ rvm use 2.2-head
Using /usr/local/rvm/gems/ruby-2.2-head
[root@localhost tmp]$ cap install
mkdir -p config/deploy
[skip] config/deploy.rb already exists
[skip] config/deploy/staging.rb already exists
[skip] config/deploy/production.rb already exists
mkdir -p lib/capistrano/tasks
[skip] Capfile already exists
Capified
[root@localhost tmp]$ rvm use 1.9.3
Using /usr/local/rvm/gems/ruby-1.9.3-p551
[root@localhost tmp]$ cap install
-bash: cap: コマンドが見つかりません

当たり前かもしれませんが1.9.3ではcapコマンドが使えませんでした
つまりgemも各バージョンごとで閉じていることになります

最後に

いまさらですがRVMを試してみました
これからはクリーンな環境にRubyをインストールするときはRVMを使いたいと思います
自分は特にRubyの各種バージョンを使い分けてテストしたり動作確認したりする必要のない人間だと思うのですが、検証とかにも便利そうなのとRuby自体のインストールも簡単にできるので使い続けてみたいと思います

参考サイト

Tips

  • ログインするとPATHが設定されていない
    rubyやgemコマンドへのパスはデフォルトでは通っていません
    どうやらrvm useで使用するrubyを指定するとPATHに通るようでコマンドを実行できるようになります
    なのでログイン時にデフォルトで使用するrubyを使うように.bashrcあたりに記載しておくといいと思います
echo 'rvm use ruby-2.2.1' >> /root/.bashrc

P.S 20150416
すでにrubyコマンドがPATHにある場合はuseしているのでその場合はuseしないほうがいいっぽいのでそこを制御した版は以下の通り
こっちのほうがCapistranoとかと絡んだ時に相性が良さそう

(! which ruby > /dev/null 2>&1) && rvm use ruby-2.2.1 > /dev/null 2>&1

2015年2月17日火曜日

ニフティクラウドmobile backendでiOSにプッシュ通知してみた

概要

これから始めるプッシュ通知の一連流れを試してみたいと思います
最終的にはニフティクラウドmobile backend(以下NCMB)のコンパネからプッシュ通知が送信できるようになります
出来る限り詳細に書いたつもりなので長いです

環境

  • Mac OS X 10.10
  • iPhone 5 ( iOS 8.1.3 )
  • Xcode 6.1.1
  • Developer Center 2015/02/17 時点でのUI
  • ニフティクラウド mobile backend 2015/02/17 時点でのUI
  • NCMB iOS SDK 2.0.5

試す

いきなりですが

いきなり超ハードルが高いのですがiPhoneアプリを作ることになるのでAppleIDを取得してiOSのDeveloperProgramに登録する必要があります
個人的にはこれが一番ハードルが高いです(面倒でコストもかかるので。。。)
有料です(8,000円/年くらいかと思ったら11,800円/年に値上げされてた)
これがクリアできないと先に進めません
アクティベーションが完了してDeveloperCenterにログインできるようになり、証明書が作成できればOKです

あと環境には書いていますが、MacとiPhoneの実機も必要です

DeveloperCenterでの作業

CSRの作成

ここだけMac上での作業になります
作成方法はこちらを参照してください
最終的には「CertificateSigningRequest.certSigningRequest」というファイルが作成できればOKです

App IDの作成

DeveloperCenterにログインし証明書を作成する画面を表示してください

左メニューの「Identifiers」にある「App IDs」を選択してApp IDを作成します
choose_app_id.png
右上に「+」ボタンがあるのでクリックして作成画面を表示します

「Registering an App ID」という画面になるのでApp IDを作成していきます
regist_app_id.png
以下の項目を確認し入力してください

  • App ID Description・・・好きなApp IDを入力します
  • App ID Suffix・・・Explicit App IDかWildcard App IDを選択します、Bundle IDはXcodeで作成するプロジェクトで指定するBundle IDと同じにする必要があります、今回はExplicit App IDを選択して「kakakikikeke.ios-push-sample」と入力しました
  • App Services・・・Push Notificationsにチェックを入れます

入力し終えたらContinueをクリックします
「Confirm your App ID」という確認画面になるので確認して問題なければSubmitをクリックしApp IDを作成します

一覧に戻って作成したApp IDが存在していればOKです

Certificateの作成

次に左メニューの「Certificates」にある「All」を選択してCertificateを作成します
choose_certificate.png

右上に「+」ボタンがあるのでクリックして作成画面を表示します

「What type of certificate do you need?」という画面になるのでCertificateを作成していきます
regist_certificate.png
以下の項目を確認し入力してください

  • Development or Production・・・開発用の証明書か製品用の証明書か選択します、今回はテストなのでDevelopmentを選択し「Apple Push Notification service SSL (Sandbox)」を選択しました、AppleStoreで公開するアプリであればProductionを選択し「Apple Push Notification service SSL (Production)」を選択してください

選択したらContinueをクリックします

すると「Which App ID would you like to use?」という画面になります
ここでは先ほど作成したApp IDを選択します
choose_app_id_for_certificate.png
選択したらContinueをクリックします

「About Creating a Certificate Signing Request (CSR)」という画面になります
ここでは特に選択や入力する項目はないので内容を確認したらContinueをクリックします

「Generate your certificate.」という画面になります
Upload CSR file. で先ほど作成したCSRを選択してください
choose_csr.png
選択が完了したら「Generate」をクリックして証明書を作成しましょう

一覧に戻って作成した証明書が存在することを確認してください
証明書の作成はこれで完了です

作成した証明書からp12ファイルを作成する

先ほど作成した証明書を選択します、詳細表示にDownloadボタンがあるのでクリックして証明書をダウンロードしてください
download_certificate.png

aps_development.cer というファイルがダウンロードされるのでクリックして「キーチェーンアクセスで開く」を選択します
するとキーチェーンアクセスで開き証明書がローカルのMacにインストールされます
インストールされた証明書を選択し右クリックして「… を書き出す」を選択します
write_p12_file.png

するとp12ファイルを保存するダイアログが出力されるので保存するフォルダを指定して「保存」をクリックします
save_p12.png

パスワードを入力する画面が出るのでここは何も入力せずにOKをクリックします
パスワードを入力するとプッシュが送信できないので入力しないようにしてください
input_password.png

p12ファイルが作成されていることを確認しましょう
これでp12ファイルの書き出しは完了です

ここまでで70%くらい完了しました

NCMBでの作業

ここからはこれをやっていきます
以下の作業は@niftyIDが必要になるので事前に取得しておいてください、@niftyIDの取得方法は省略します

アプリを作成する

まずNCMBのダッシュボードにログインします
https://console.mb.cloud.nifty.com
アプリが1つもないとはじめにアプリを作ることになるのでアプリ名を入力して作成します
create_app.png
使えない文字があるので注意してください
入力が完了したら「新規作成」をクリックし作成します
次の画面でOKをクリックするとダッシュボードに遷移します
これでアプリの作成は完了です

アプリの設定をする

以下をコンパネから順次設定していきます

ダッシュボード -> アプリ設定 -> プッシュ通知

「許可する」を保存

ダッシュボード -> アプリ設定 -> プッシュ通知

iOSプッシュ通知に作成したp12ファイルを選択してアップロード

ダッシュボード -> アプリ設定 -> 基本

APIキーのアプリケーションキーとクライアントキーをコピーしておく

アプリの設定は以上です
ここまでで80%くらい完了です

Xcodeでサンプルアプリの作成

Xcodeが必要になるのでAppleStoreからダウンロードしておいてください
ここからはこれをやっていきます

プロジェクトの作成

Xcodeを起動してプロジェクトを作成しましょう(SSは省略します)
新規で問題ないので「Create a new Xcode project」を選択してプロジェクトを作成します
「Single View Application」を選択してNextをクリックします
「Choose options your new project」では以下のように入力します

  • Product Name・・・好きなプロジェクト名を入力してください
  • Organization Name・・・好きな組織名を入力してください
  • Organization Identifier・・・ios-push-sample
  • Language・・・Objective-C
  • Devices・・・Universal

ポイントはOrganization IdentifierでこれはDeveloperCenterで作成したApp IDの後ろの部分と同じにする必要があります
Bundle IDという概念がありこれがXcode側とDeveloperCenter側で同じ値である必要があります

必要な内容を入力したらNextをクリックしてプロジェクトを保存するディレクトリを指定したらCreateをクリックしてプロジェクトの作成します

Bundle Identifierの確認

プロジェクトの作成が完了したら「Bundle Identifier」を確認します
先程も言いましたがここがApp IDと同じになるように修正します
confirm_bundle_id.png

「.」以降はここでは修正できません
プロジェクトを作成した際のOrganization Identifierに紐付いているので間違えた場合はプロジェクトを作成し直してください(もしくはApp IDを作成しなおしてください)

XcodeとDeveloperCenterの証明書情報を同期

これをやりましょう
これをやることでDeveloperCenterにDevelopment用のProvisioning Profileが作成されます
いきなり出てきたProvisioning Profileですが、これをプロジェクトに設定することでDeveloperCenterとの情報と紐付けます

DeveloperCenterでProvisioning ProfilesからAllを選択し、一覧からXcodeで作成されたProvisioning Profileを選択すれば詳細を確認できます
choose_provisioning.png

confirm_provisioning.png

このProvisioning Profileはあとで使用します

Teamを設定する

先ほど設定したBundle Identifierと同じ箇所に「Team」というのがあるのでそこに登録した自分のAppleIDを選択しましょう

Build SettingsにProvisioning Profileを設定する

プロジェクトの設定にBuild Settingsというタブがあるので選択します
その中の設定項目に「Provisioning Profile」という欄があるのでここに先ほど作成されたProvisioning Profileを選択します

Xcodeに「Provisioning Profile」という欄がない場合はTeamの設定箇所の下に「Fix Issue」というボタンがあるのでこれを押してみましょう
適当なProvisioning Profileを設定してくれてBuild Settingsにも設定欄が作成されると思います
これで正しいProvisioning Profileを設定してみてください
config_provisioning_profile.png
※Fix IssueをするとDeveloperCenterにApp IDとProvisioning Profileが自動で生成されるので不要なものは削除してください

実機を接続して実機にProvisioning Profileを登録する

実機でテストするためにProvisioning Profileを設定する必要があります
MacにiPhoneを接続してください
そしてXcodeで

Window -> Devices

で接続されているデバイスを選択します
choose_device.png

右クリックから「Show Provisioning Profile」を選択します
add_provisioning_profile_to_device.png

するとダイアログが表示されるのでそのダイアログの左下にある「+」ボタンからProvisioning Profileを選択してください
Provisioning ProfileはDeveloperCenterからダウンロードすればOKです(先ほど紹介したProvisioning Profileの詳細確認画面からダウンロードできます)

コーディング

ようやくコーディングです
ここからは先ほどのドキュメントとこれをやっていきます

NCMB iOS SDKのインストール

CocoaPodsを使ってもインストールできますが今回はframeworkをダウンロードしてインストールします
この作業はドキュメントに記載の方法とほぼ同じなので詳細な説明は省略します

zipをダウンロードしてNCMB.frameworkをプロジェクトに追加すればOKです
NCMB.frameworkはプロジェクト内に移動してからLink Binary With Librariesを設定するといいと思います

端末情報をNCMBに登録するコードを記載する

これもドキュメント通りですが、簡単に説明すると

  • AppDelegate.mのヘッダ部分
#import <NCMB/NCMB.h>

先頭のヘッダファイル読み込み部分に上記を追記します
NCMBのSDKを使うためのインポート文です

  • AppDelegate.mのdidFinishLaunchingWithOptions
[NCMB setApplicationKey:@"YOUR_APPLICATION_KEY" clientKey:@"YOUR_CLIENT_KEY"];

didFinishLaunchingWithOptions メソッドに上記を追記します
@"YOUR_APPLICATION_KEY"
@"YOUR_CLIENT_KEY"
はNCMBのアプリ設定画面でメモしておいたアプリケーションキーとクライアントキーを入力してください
これでSDKを通してNCMBのAPIを端末からコールできるようになります

  • AppDelegate.mのdidFinishLaunchingWithOptions
if (NSFoundationVersionNumber > NSFoundationVersionNumber_iOS_7_1){
    UIUserNotificationType type = UIUserNotificationTypeAlert |
    UIUserNotificationTypeBadge |
    UIUserNotificationTypeSound;
    UIUserNotificationSettings *setting = [UIUserNotificationSettings settingsForTypes:type categories:nil];
    [[UIApplication sharedApplication] registerUserNotificationSettings:setting];
    [[UIApplication sharedApplication] registerForRemoteNotifications];
} else {
    [[UIApplication sharedApplication] registerForRemoteNotificationTypes:
     (UIRemoteNotificationTypeAlert |
      UIRemoteNotificationTypeBadge |
      UIRemoteNotificationTypeSound)];
}

先ほどのコードの直後にかけばOKです
デバイスを識別するのID情報(デバイストークン)をAppleから取得します
iOSのバージョンによって取得方法が異なるようです

  • AppDelegate.m
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
    NSLog(@"%@", deviceToken);
    NCMBInstallation *currentInstallation = [NCMBInstallation currentInstallation];
    [currentInstallation setDeviceTokenFromData:deviceToken];
    [currentInstallation save:nil];
}

別メソッドとして定義してください
取得したデバイストークンをNCMB上に保存するためのメソッドです

アプリをビルドして実機にアプリを転送する

実機を接続している状態でビルドするデバイスを実機に変更してください
Xcodeの左上でテストするデバイスを選択できます
choose_real_device.png

これでビルドをして実機上にアプリが転送されアプリが起動することを確認しましょう
起動時にプッシュ通知の許可をするかどうか聞かれるのでOKをタップしてください

アプリの起動が確認できたらNCMBのコンパネを確認してみてください

ダッシュボード -> データストア -> Installtaion

にデバイスIDが登録されていると思います
登録されていない場合はアプリケーションキーとクライアントキーの設定が正しいか確認してください

よし!プッシュを送ってみる

NCMBのコンパネにログインしてプッシュを送ってみましょう

ダッシュボード -> プッシュ通知 -> 新しいプッシュ通知

と移動してプッシュ通知を作成しましょう
特に気にすることはないと思いますポチポチやっていけばOKです
時間指定もできますがテストなので即時配信でいいと思います

「プッシュ通知を作成する」をクリックするとすぐに通知がくると思います
iPhoneでのプッシュ通知はアプリを起動した状態だと通知が見えない(実際には来ているがブーってならない)のでホーム画面に戻してからプッシュ通知を作成してください

きっとプッシュ通知がくるはずです

最後に

いかがでしたでしょうか、正直ボクはややこしすぎると感じました
慣れれば簡単ですが正直慣れてない人にはハードルが高いかなと思います
AppleのAPNSのドキュメントも基本的に英語なので読み解くのも大変でした
コーディングよりも環境構築や設定のほうがだいぶ大変な印象を受けたというのが正直な感想です

2015年2月13日金曜日

初期設定状態のYosemiteでauのHWD12を使う方法

概要

これをYosemiteで使う方法を紹介します
image.jpg
基本は参考サイトを元にしていますが、ここではYosemiteが入っているMacでまだ何も設定していない状態を前提とした設定方法のみを紹介します

環境

  • Mac OS X 10.10

設定方法

ターミナル作業

まずターミナルを起動して以下のコマンドを順次実行していきます

Launchpad -> その他 -> ターミナル

  • sudo touch /usr/libexec/StartupItemContext
  • sudo vim /usr/libexec/StartupItemContext
    • 以下を貼り付けて保存して終了
#!/bin/sh

unset LAUNCHD_SOCKET
exec launchctl bsexec / "$@"
  • sudo chmod 755 /usr/libexec/StartupItemContext

sudo のときはパスワードを聞かれると思うのでログインしているユーザのパスワードを入力してください

上記が完了したら一旦Macを再起動します

左上りんごマーク -> 再起動

USBを指す

あとはMacが起動したらauのUSBを刺します
自動的にドライバがインストールされUSBのランプがピンクになればOKです

原因は/usr/libexec/StartupItemContextがYosemiteからなくなってしまったことみたいです
これでもうまくいかない場合は権限まわりや記載してシェルの内容に不備がないかもう一度確認してみてください

P.S 20151106
初回起動時や久しぶりに USB を使った場合は USB を刺した時に表示される Finder の「USB STICK LTE setting tool」をダブルクリックで実行しパスワード入力する必要がありそうです

最後に

こういう記事を書いていて思うのは
そもそもネットワークにつながらない状況だからこういう記事を探したくても探せないんじゃないかな ーって思ってます
特に自宅とかで別に有線とかを引いていない場合とかどうするんだろう
携帯とかネットカフェに行くしかないのだろうか

参考サイト

2015年2月12日木曜日

ニンテンドーDS Liteのラバーボタンを修理した

概要

ニンテンドーDS Liteのラバーボタンを修理しました
昔書いていたブログ記事からの転載になります
一部文章の校正をしています
結構アクセスがあって需要がありそうだったのでこちらにも記載しておきます

環境

  • DS Lite White

修理

用意するもの

画像
  • DSLite本体
  • DSLボタンラバー
  • Y字ドライバー
  • 精密ドライバー(プラス、マイナス)

DSLiteの修理には上記がないとできません
特にドライバーはかなり特殊なドライバーになるので百貨店等で売ってないない場合はネットやアキハバラで購入してください

DS/DSi/DSlite対応ツール Y字ドライバー 分解・修理
モバイルカスタムファ クトリー

そして本題のボタンラバーですが、今回アキハバラのとあるお店で購入しました
ネットでも売っているのでそれでもOKです
200円から300円くらいで購入できます

DSLite対 応パーツ DSLite ボタンラバー DSLite専用の交換用ラバーパッド
モバイルカスタムファクトリー

あと、写真にはありませんが、精密ドライバーも必要です
これは普通の百貨店にも売っていると思います
最近は100円ショップでも普通に買えると思います

アネック ス(ANEX) 精密ドライバーセット マイナス・プラス6本組 No.900
兼古製作所

道具の準備は以上です
では、早速分解していきます

本体を分解

事前に電源をOFFにしてカセットを抜いておいてください
また作業中は充電もしないでください

裏カバーを外す

画像

いきなり全部のドライバを使用して裏面のネジをすべてはずします
はずす部分は全部で8箇所くらいあります

基本はすべて見えている部分のネジを外せばOKですが、バッテリーのウラに隠れているネジがあるので忘れずに外してください

Y字および精密ドライバーを駆使して適宜はずしていきます

画像

ネジを外す際のポイントですが、各ネジがかなり細かいので上記の写真のようにどのネジがどこの場所のネジかを書いて管理するといいと思います

これはやっておいて損はないと思います
意外とめんどうですが、がんばってやってみてください

画像

ネジを全部はずしたらカバーを外してください
裏と表カバーの間にマイナスドライバーを差し込みながら徐々に外していくと外しやすいです
そしてこれが、全部のネジを外して裏のカバーをはずした状態です

ここからは基盤を直接触って行くので、静電気などに気をつけて
本当に慎重に行いましょう!

パーツを外していく

裏カバーを外したら、まずはL, Rボタンをはずします
これも意外とやっかいで、しっかりハマっているのでケースを抑えながらピンセット等で外してください
これもはずした後は管理をしっかり行いましょう

画像

ここまで外せばカバーと基盤部分をほぼ分離することができます
気をつけなければいけないのは基盤と画面側のカバーで必ず接続していなければいけないケーブルがあり、これは外せないので無理やり外さないでください
なので分離というよりかは基盤をひっくり返す感じです

画像

基盤をひっくり返せば、遂にボタン部分に到着です
写真の左側がABXYボタンで右側が十字キーです
左下にある長方形の形をしたやつはスタートセレクトボンタです

ラバーボタンを交換する

画像

まずは壊れた十字ラバーボタンを取りましょう
ただ本体カバーに乗っているだけなので簡単に取れます

これが全く効かなくなった下ボタンです
ボタンが効かなくなると写真のようにラバーが擦り切れてしまっている状態になっているようです

壊れたラバーボタンを外したら新しく買ったラバーボタンと取り替えましょう
特に向きはないのでおいてあったように置き直せばOKです
裏表の向きだけ気をつけてください

今回十字キーだけ交換予定でしたが、購入したラバーボタンセットにはABXYボタンとスタートセレクトボタンも入っていたので、それも交換しておきました

また、写真はないのですがラバーボタンとカバー側には意外と汚れが溜まっています
写真のボタンではわかりづらいのですが、このボタンとカバーもかなり汚れていました

なので、この時にボタンやカバー、LRキーをキレイにしてあげると良いかもしれません

ボタン交換の作業が完了したらあとは元通りに戻していくだけです
体感ですが、解体よりも元に戻すのほう数倍大変でした
順番はそのまま逆をたどればOKです

ボタン配置 -> 基盤戻す -> LRボタン配置 -> 裏カバーをかぶせる(ここが大変、カバーが咬み合わない) -> ネジを締める

動作を確認する

画像

すべての裏カバーをはめてネジを締め直せば終了です
充電を開始して電源が入るか確認してみましょう
しっかりと復活することができました

効かなかったボタンも無事元通りにすることができました

バッテリーをはずすとDSLiteの登録情報が消去されるようなので、もう一度情報を登録しましょう。

これでDSLiteのラバーボタン修理は終了です

最後に

道具にピンセットがあると非常に便利です
終始細かい作業になり、指先だけの作業では難しい場面が多いのであると便利です

今回解体してわかったのですが予想以上にDS本体は見えない部分でダメージを追っています
汚れやキズなどもそうですが、中を開けるとよくわかりました

みなさんもDSを長持ちさせるために定期的にメンテナンスをするといいかもしれませんね

また、今回は自分での修理を行いましたが、もし心配な方は普通にニンテンドーさんがやっている修理サービス
に申し込むのがいいと思います
修理代は2000円くらいかかるようです
あと期間が2週間ほどかかります

自分でやれば380円と1時間ほどで済むのでリスクを問わない方は是非自分でやってみることをお勧めいたします

2015年2月10日火曜日

ExecutorServiceを使ってListの集計処理

概要

Java1.6から導入されたスレッドの仕組みであるExcutorServiceを使ってfor分をスレッド化してListの集計処理をやってみました
ExecutorServiceのサンプルコード的な感覚で見ていただけると助かります

環境

  • Mac OS X 10.8.5
  • Java 1.8.0_25

サンプルコード

package test;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class ExecutorServiceTest {

    public ExecutorServiceTest() {

    }

    public static void main(String[] args) {
        final List<Integer> result = Collections.synchronizedList(new ArrayList<Integer>());
        ArrayList<Integer> data = new ArrayList<Integer>();
        for (int i = 0; i < 10000000; i++) {
            data.add(i);
        }
        ExecutorService exec = Executors.newFixedThreadPool(3);

        for (final int s : data) {
            exec.execute(new Runnable() {
                public void run() {
                    result.add(s);
                }
            });
        }
        // 終了まで待機する
        while(true) {
            System.out.println(data.size());
            System.out.println(result.size());
            if(data.size() == result.size()) {
                break;
            }
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        // スレッドタスクの終了
        exec.shutdown();

        System.out.println("end");
    }

}

ポイント

  • スレッドの数を制御
ExecutorService exec = Executors.newFixedThreadPool(3);

ここの引数の数で最大同時スレッドの数が決定します
CPUの数やサーバリソース、ミドルウェアの設定と相談して決めましょう
Threadクラスを継承してとかRunableインタフェースを継承してとかをやる手法よりかは断然楽にスレッドを管理、操作できます

  • Listの同期化
Collections.synchronizedList(new ArrayList<Integer>());

でListを作成することでaddが別スレッドにより同時に行われてもaddの内容が失われることを防いでいる

  • スレッドの停止
exec.shutdown();

これを実行することで子スレッド側の処理を終了し、mainスレッド全体が終了します
ただ、サンプルの停止方法はかなりお行儀が悪く、ちゃんとスレッドのタイムアウトを管理して(awaitTermination)タイムアウトしたら実行中の全スレッドを停止する(shutdownNow)みたいな処理を書くのがいいみたいです
(自分はこの辺全然わかってないので詳しくは調べてみてください、すいません)

早くなったのか確認

スレッドの数を調整して計測しました
リスト内のデータはサンプルコードの通り10,000,000件を対象にしています
10回施行したその平均を取得しました
PCのスペックのスペックにより時間はだいぶブレるので参考までに見てください

スレッド数 時間(msec)
1 6835.9
3 9019
5 9077
10 9113

早くなってない

最後に

ExecutorServiceを使ってJavaのスレッドを簡単に操作してみました

実は今回の目的はfor文の高速化だったのですが、結果を見ると残念な感じになってしまいました
スレッドを使えば早くなるケースは多いと思いますが今回のようにListの集計処理では遅くなるのかもしれません
synchronizedListを使っているせいで排他制御が入ってしまいその分遅くなったとか?わからん。。。

Javaのforの高速化ってどうやるのが定石なのだろうか

2015年2月9日月曜日

EclipseでGrep Consoleを使って必要なコンソールログだけを表示する

概要

Eclipseのコンソールログはデフォルトだと検索はできますが表示の絞込はできません
絞り込みをするためにGrep Consoleプラグインを利用すると必要なログだけが表示されるようになるのでやってみました

環境

  • Mac OS X 10.8.5
  • Eclipse 4.3 Kepler
  • Grep Console 3.6.1

作業内容

プラグインインストール

Eclipse Marketplaceを使ってインストールすることが可能です

Help -> Eclipse Marketplace

と進みSearchで「grep」と入力します
すると検索結果にGrep Consoleが表示されるのでこれをインストールします
search_result_grep_console.png

インストールを実施するのにライセンスアグリーメントとEclipseの再起動が必要になります

設定

インストールが完了したら早速設定していきます
その前に言語は何でもいいので標準出力する簡単なサンプルコードを作成しておいてください
今回は以下を使います

package test;

public class Test {

    public static void main(String[] args) {
        System.out.println("[DEBUG] test");
        System.out.println("not showing");
        System.out.println("[WARN] test");
        System.out.println("[ERROR] test");
        System.out.println("[FATAL] test");
    }

}

Grep Viewを表示する

そのままのコンソールビューでも使えますが表示の絞り込みをするためにGrep Viewを表示しておきます

Window -> Show View -> Other -> Grep Console -> Grep View

と選択しGrep Viewを表示します

ログに色を付ける

まずログに色を付ける方法です
仕組みは簡単で指定した正規表現にマッチする行を色付けする感じです

Grep Viewが表示されているペインの右側にある(?)マークのボタンを選択します
config_button.png

最初のアクセスだとバージョン情報等が表示されるかもしれません、その場合はOKボタンを押せば設定画面に遷移します

すると設定画面が表示されます
default_config.png
実はもうこの状態で実行しても色がつくようになっています
主要なパーツを説明すると

  • Log Outputはフォルダと言われる概念で色付けのルールは必ずどこかのフォルダに属する必要があります
  • Debug から FatalはExpressionのルールで該当する正規表現の場合に指定された色で指定されたビューにログを表示します
  • 四角とフィルタマークと丸と三角は表示のON/OFFです
    • 四角はExpressionの有効/無効を制御
    • フィルタマークはGrep Viewへの表示を制御
    • 丸はGrep Staticsビューへの表示を制御
    • 三角はトリガーのON/OFF制御
  • 今回、丸と三角のON/OFFについてはここで触れないので詳しく知り方は参考サイトにある公式ドキュメントを参照ください
  • ON/OFFの状態は黒塗りがONの状態、OFFが白抜きの状態です
  • ()は継承で例えば図の場合、Log Outputフォルダに括弧ありで黒塗りの四角になっていますが、この場合はフォルダ以下のExpressionは全部、黒塗り状態として解釈されます
  • 色の指定は先の色が文字の色で後ろの色が背景色です

とりあえずこの状態でサンプルコードを実行してみましょう
以下のように表示されると思います
color_test.png

2行目には何も色付けされていれません
これに色付けしてみましょう
先ほどの設定画面からAdd Folderでフォルダを追加します
Nameは好きな名前を入力してください
チェックボックスはとりあえず全部ONで作成します
create_folder.png

作成したフォルダを選択した状態でAdd Expressionでルールを追加します
Expressionに正規表現のルールを追加します、今回は.*not.*を入力してみます
あとはNameに適当な名前を入力します
create_expression_general.png

他の項目ですが(ちょっと詳しく理解してないですが)

  • Quick expression・・・メインのExpressionよりも優先される正規表現、Quick expressionが含まれていなければそもそも評価されない
  • Unless・・・指定した文字列が含まれていないものに色を付ける
  • Case sensitive・・・チェックがONであれば大文字小文字を区別する

といった感じです
正確には公式ドキュメントを御覧ください

次に隣のタブの「Style & Links」を選択します
ここでどのように色付けするか決定します
左側に現在適用されているスタイルが表示されて右側に適用可能なスタイルの一覧があります
既存のスタイルを適用したい場合は右側のスタイルを選択してAssignをクリックすればOKです
新たにスタイルを追加したい場合はNewを選択して独自のスタイルを作成します
create_new_style.pn.png
Nameに好きなスタイル名を入力してください
下にサンプルが表示されるのでそれを見ながら設定すればいい感じに設置できると思います
問題なければOKをクリックしてスタイルを作成します

作成したスタイルをAssignすればOKです
以下のような感じになると思います
config_style.png

この状態でサンプルコードを実行すると以下のように色付けされていなかった2行目に色がつきます
color_test_origin.png

色付けに関してはこんな感じに設定してください

表示を絞り込む

次に表示を絞り込む方法を紹介します
これはGrep View側に表示されるので絞込の結果はGrep Viewを見てください

先ほどの設定画面を開いてください
表示を絞り込むにはフィルタマークの部分を黒塗り or 白抜きにすればOKです
例えば以下のようにLog Output側だけフィルタマークを黒塗りにします
config_filter.png

この状態で実行してGrep Viewを見てください(通常のコンソールの結果ではなく追加したGrep Viewを見てください)
すると以下のように「not showing」の部分がフィルタ(削除)されて表示されていると思います
filter_result.png

OriginのNot Expressionのほうも黒塗り状態にすれば「not showing」も表示されていることが確認できると思います
コンソールの方には絞込設定をしても常に表示されます

絞込の設定は以上です

最後に

今回の紹介は以上です
これでいちいちファイルに出力してgrepする必要がなくなると思います

ちょっと注意しなければいけないのはこの設定がJavaの実行単位ごとに制御されているという点です
別のサンプルコードを作成したらまたそっちでも表示の制御のON/OFFを設定しなければいけません
FolderやExpression、作成したスタイルは引き継がれます
あとWebアプリ(Tomcat上で動作するアプリなど)のロギングに対しても別の設定が必要かもしれません
(軽く検証してみたらうまく色が付けられませんでした。。。またやり方がわかったら紹介します)
-> Eclipse上でTomcatを起動してコンソールに起動ログが出ている状態でGrep Consoleの設定をすればうまく適用できました

参考サイト