2014年1月6日月曜日

【ruby】'encode': "\x85" followed by "\"" on Windows-31J (Encoding::InvalidByteSequenceError)

ruby自体のファイルの文字コードとマジックコメントはUTF-8とします
rubyコマンドを実行する際に文字コードを指定しないと実行しているターミナルのデフォルトの文字コードが使われてしまいうまくマルチバイト文字が処理されないようです

ruby -Eutf-8 sample.rb

環境は以下のとおり
  • Windows7 64bit
  • ruby 2.0.0p195 (2013-05-14) [x64-mingw32]

2013年12月29日日曜日

【Android】java.io.FileNotFoundException: [file_path] open failed: ENOENT (No such file or directory)

Android内でプロパティファイルを読み込む際にFileNotFoundExceptionとなった
原因は以下だった

is = new FileInputStream(new File(path));
↓
is = this.getClass().getClassLoader().getResourceAsStream(path);
としプロパティファイルを「src」直下に配置する

Androidでnew Fileから読み込むと自動的に先頭に「/」が付いてしまっているようでうまくプロパティファイルが読み込めていなかった

2013年12月28日土曜日

ニフティクラウドmobile backendでAndroid(Nexus7)にプッシュ通知を送ってみた

今回作成したソースコードは以下で公開しています

https://github.com/kakakikikeke/android-ncmb-sample

以下にポイントを紹介します

●事前にeclipseとADT(Android Developers Tool)をインストールします

●gcm.jarは以下からダウンロードできます
gcm.jarはすでに開発が停止しているGCM用のクライアントライブラリです
ニフティクラウドmobile backendではgcm.jarが必要なようです
https://code.google.com/p/gcm/source/browse/gcm-client/dist/gcm.jar?name=gcm-1.0.2
ダウンロードしzipファイルを解凍し、./gcm-client/dist/gcm.jarをlib配下にコピーしビルドパスを追加します

●ProjectNumber(SenderId)を取得します
https://cloud.google.com/console#/project/[project_number]
ソースコード内でSenderIdとして利用します

●GoogleAPIKeyの取得
https://cloud.google.com/console#/project/[project_number]/apiui/credential
にてAPIKeyを取得します
ニフティクラウドmobile backendのダッシュボードのアプリ設定 -> プッシュ通知で取得したAPIキーを記載します

●ニフティIDの取得
ニフティクラウドモバイルmobile backendの申し込みにはニフティが提供するIDが必要です
無料で取得できるのでニフティのポータルサイトから取得します
http://www.nifty.com/

●エミュレータでは起動しません
エミュレータには「deviceToken」という端末個別のIDが存在しないためエラーとなります
at com.google.android.gcm.GCMRegistrar.checkDevice(GCMRegistrar.java:98)
実機にアプリを直接インストールして確かめる必要があります

いろいろと方法はありますが、自分はgmailに添付してインストールしました
eclipse -> プロジェクトを右クリック -> Export -> Export Android Application -> デスクトップに保存 -> apkファイルをGmailに添付して送信 -> Android端末で送信したGmailを受信 -> apkファイルをクリック -> アプリをインストール

●USBデバッグモードをONにします
以下を参考にUSBのデバッグモードをONにします
http://kakakikikeke.blogspot.jp/2013/12/nexus7usb.html

●Nexus7用のUSBドライバをインストールします
以下を参考にUSBドライバをインストールします
http://kakakikikeke.blogspot.com/2013/12/windowsnexus7usb.html

●プッシュ開封通知を送信する場合の注意
onCreateメソッド内で NCMBAnalytics.trackAppOpened(getIntent()); を実行しますが左記が呼ばれる条件として
  1. プッシュ通知開封時にバックグラウンドでアプリが起動していないこと
  2. プッシュ通知開封時にバックグラウンドでアプリは起動しているがプッシュ開封時に起動するActivityと同一のActivityが起動していないこと
のどちらかを満たしている必要があります
プッシュ通知を開封した際にActivityを指定できるので開封専用のActivityを用意しておくと確実に送信できるかと思います

■参考サイト

2013年12月27日金曜日

【Windows】Nexus7のUSBドライバをインストールする方法

■環境
WindowsXP 64bit
Nexus7(2012年発売モデル)
ADT 20131030

■事前準備
事前にADT(Android Developer Tools)をインストール必要があります
以下を参考にADTをインストールしてください
http://kakakikikeke.blogspot.jp/2012/10/windows7eclipseandroid.html
今回紹介する記事ではADTのインストールディレクトリを「C:\myinstallprogram\adt-bundle-windows-x86_64-20131030」とします

■ドライバのインストール
1. SDK Managerを起動
SDK Manager.exe をダブルクリックして起動します


2. Google USB Driverをインストール
Google USB Driver のチェックボックスをONにして「Install packages...」をクリックします


次に同意画面が表示されますので「Accept License」をONにして「Install」をクリックします
あとはインストールされるのを待ちます
※スクリーンショットはインストール後になります

3. USBデバッグをONにする
Nexus7はデフォルトではUSBデバッグがONになっていません
以下を参考にUSBデバッグをONにしてください
http://kakakikikeke.blogspot.jp/2013/12/nexus7usb.html

4. Nexus7をUSBでPCに接続
ドライバがないと言われるのでパスを指定してPC上にあるファイルからドライバをインストールします
一覧または特定の場所からインストールするを選択します


次の場所を含めるにドライバのパスを入力します

C:\myinstallprogram\adt-bundle-windows-x86_64-20131030\sdk\extras\google\usb_driver
先ほどGoogle USB Driverをインストールしたの以下のパスが存在しています(インストールしていない状態だとパスが存在しません)
入力後に「次へ」とするとドライバのインストール開始されます

エラーなくインストールされればドライバインストール完了です

■動作確認
eclipseでアプリを実行するときに実機が選択できるかどうか確認します
実行するアプリの「Run Configurations」を開きTargetタブで「Always prompt to pick device」にチェックを入れApplyします


その後Runでアプリを実行すると接続されている実機デバイスの一覧を選択する画面が表示されればWindows上で実機が認識されています


あとは実機を選択してOKをクリックすれば実機上でアプリが動作します、アプリは自動でインストールされインストール後に自動で立ち上がります
もちろんlogcatにも操作している間ログが流れるようになります

■Tips
MTPドライバのインストール
http://emobile.jp/products/gl07s/driver.html

2013年12月26日木曜日

Nexus7でUSBデバッグモードを有効にする方法

設定 -> タブレット情報 -> ビルド番号 -> 7回タップ

すると開発者「開発者 向けオプション」が新たに設定メニュー内に表示されるので「USBデバッグ」という項目のチェックボックスをONにしてください

設定 -> ストレージ -> 右上のメニュー -> USBでパソコンに接続 -> 「メディアデバイス(MTP)」のチェックをはずし「カメラ(PTP)」のチェックをONにする

USBデバッグとMTPモードを共存させることはできません
なのでMTPをOFFにしてPTPをONにします

これでUSBで接続時にデバッグモードとして接続されるようになります

2013年12月20日金曜日

【Java,mongo】java.lang.ClassCastException: java.lang.Double cannot be cast to java.lang.Integer

mongo側のデータが明示的にintで宣言されていないために発生しています
updateする際にNumberIntを使って明示的にintで値を登録します
db.hogeCollection.update({"_id":"abcdefg"},{$set:{"number":NumberInt(1000000000)}}, false, true);

2013年12月19日木曜日

ニフティクラウドRDBにZabbixのデータベースを移行してみた

■事前作業
Zabbixのインストール
バージョンは何でも大丈夫だと思いますが今回自分が試したバージョンは1.8.3です

■RDBの作成
  1. https://console.cloud.nifty.com/web/rdb を開きます
  2. 左メニューのDBサーバーを選択し「DBサーバー新規作成」をクリックします
  3. DBエンジン選択…お好きなバージョンを選択します(2013/12/18現在ではMySQLの「5.5.32」,「5.6.12」が選択可能です、今回は 5.5.32 を選択しました)
  4. 基本設定…DBサーバー名のみを入力します、今回他の機能(HAやディスク変更)は実施しないでいきます
  5. DB設定…DBの名前、DB用のユーザ名とパスワード、LISTENするポートを入力します
  6. オプション設定…自動バックは実施しないので何も変更しません
  7. 確認…内容を確認し作成するをクイックします

だいたい30分から40分くらいでDBサーバーの作成が完了します

■DBファイアウォールの編集
作成したDBサーバーに対して既存のニフクラ上のサーバーが通信できる必要があります
作成したDBサーバーにはデフォルトFWが設定されておりそのFWに対してルールを追加する必要があります
デフォルトではルールは存在していないためどこからもアクセスできない状態となっております
  1. 左メニューのDBファイアウォールを選択します
  2. default.[zone名]というファイアウォールができていると思いますのでチェックボックスをクリックしプルダウンから「DBファイアウォールグループ編集」を選択します
  3. ルールを追加できるダイアログが表示されますので先ほど作成したDBサーバーがLISTENするポートに対して既存のサーバのからのアクセスを許可します
  4. 許可の設定はIPアドレスを直接設定するか、既存のFWグループを選択します

これでファイアウォールの設定は完了です

■RDBへの接続テスト
作成したDBサーバーへのアクセスが完了していると思いますので確認してみます
mysql -u [username] -p [dbname] -h [rdb_ip_address]
[username], [dbname], [rdb_ip_address] の部分にはDBサーバー作成時に設定したユーザ名、DBの名前、DBサーバーのIPアドレスを入力します
DBサーバーのIPアドレスはコントロールパネルのDBサーバー一覧で確認することができます
グローバル、プライベート両方が表示されているのでアクセスどちらかを入力します
(DBサーバーへのアクセスなので基本はプライベートになるかと思います)
パスワードの入力を求められますので、これもDBサーバー作成時に設定したパスワードを入力します

これで接続できるはずです、「show database」等でDBサーバー作成時に設定したDB名が存在していることを確認します
テーブルは1つも作成させれていません
ここで接続できない場合はFWの設定が怪しいのでFWやiptablesの設定を確かめてみてください

■ZabbixDBのエキスポートとインポート
1. 既存サーバーからのエキスポート
cd /var/tmp
mysqldump -u root -p zabbix > zabbix.dmp

2. RDBで作成したDBサーバーへのインポート
mysql -u [username] -p -h [rdb_ip_address]
  mysql > create database zabbix;
cd /var/tmp
mysql -u [username] -p zabbix -h [rdb_ip_address] < zabbix.dmp

DBサーバーに接続して「zabbix」という名前のデータベースにデータが存在することを確認します

■ZabbixServerの設定変更
vim /etc/zabbix/zabbix_server.conf
DBUser=[username]
DBHost=[rdb_ip_address]
DBPassword=DBサーバー作成時に設定したパスワード

vim /etc/zabbix/zabbix.conf.php
$DB["USER"] = '[username]';
$DB["SERVER"] = '[rdb_ip_address]';
$DB["PASSWORD"] = 'DBサーバー作成時に設定したパスワード';

/etc/init.d/zabbix-server restart
エラーなく再起動できればOKです

■動作確認
ZabbixのWebUIから確認します
テンプレートを一つ追加してzabbix.hostsテーブルにに指定した名前のテンプレートのレコードが追加されていることを確認します
ex) select * from hosts where host='test-template';

以上でニフティクラウドRDBへのZabbixDBの以降は完了です

●トラブルシューティング
ERROR 1129 (00000): Host 'xxx.xxx.xxx.xxx' is blocked because of many connection errors; unblock with 'mysqladmin flush-hosts'
mysqladminコマンドが上記のせいでそもそも実行できないので自分は再起動するしかなったです。。。
何か別の方法があるのだろうか

Cannot connect to the database. Exiting...
ZabbixServerのログに出力されていました、これはzabbixの設定ファイルがうまく設定できていなかったために発生していました