狛ログ

2015年6月5日金曜日

モバイル開発 で AWS をどう使う? 【 AWS Summit Tokyo2015 参加報告①】

6月 05, 2015

オフィス狛 インフラチームです。



AWS Summit Tokyo2015 に行ってきました。




写真のグッズは行った際にもらったものです。他にマグカップやクッキーなどもありました。



(ちなみに写真にはありませんが、まい泉のカツサンドも全員に配っていました。。。さすが Amazon )


少しの時間しかいられなかったのですが、
2日目のデベロッパーカンファレンス(DevCon)の中で
「 モバイル開発 におけるデータストアの選び方」というセミナーに
参加してきたので少し報告します。




「 3-Tierアーキテクチャ から 2-Tierアーキテクチャ へ」


【 3-Tierアーキテクチャ とは?】
クライアントから EC2 サーバを介して AWS サービスを利用する仕組み

【 2-Tierアーキテクチャ とは?】
クライアントから直接 AWS のサービスを利用する仕組み


アクセスキー と シークレットキー を モバイル端末 に組み込むわけにはいかず
( アプリ 配布の際に漏れてしまうリスクなど)
従来は 3-Tierアーキテクチャ が必要とされていましたが、
AWS のサービスを活用することで
2-Tierアーキテクチャへと開発の仕組みが変わってきているとのことです。



紹介されていたサービスとしては、

Congnito
S3
DynamoDB
Kinesis
Lambda

がありましたが、
その中でも Cognito と Lambda に関しては
特に注力してお話されていたなと感じました。


Amazon Cognito とは?】
ざっくりいうと「認証」( Amazon Cognito Identity )と「同期」( Amazon Cognito Sync )の機能を提供するサービスです。

○認証( Amazon Cognito Identity )
Google や Facebook などの別サービスの認証情報を利用したり、
独自の認証機能を設定することで、
一時的な認証を安全で簡単にクライアントに与えて AWS のサービスを利用可能にします。


例えば、ゲストユーザー用にも認証を行うことができるので、
登録前のアプリの体験利用などにも活用できそうですね。


○同期機能( Amazon Cognito Sync )
複数のモバイル機器( スマホ 、タブレット 、など)で同じユーザーを利用する場合、
それぞれで異なる操作をしたときにデータの同期が必要になりますが、
Cognito SyncのAPIを利用することで同期を簡単に行えます。


例えば、、、

・オフライン時の動作としてまずローカルストレージにデータを保存してくれる。

・ローカルとクラウド上のデータのバージョンを比較してデータをプッシュ/プルしてくれる。

・複数の機器でデータ変更があった際、最後の書き込みのみを有効にしてデータの同期を取ってくれる。

・ゲストユーザーにも一意な認証を行っているので使っていたデータを会員登録後も引き継いでくれる。

ゲストユーザーでアプリを体験してもらったデータを
会員登録後もそのまま引き継いでサービス利用できるのは作る側にとっても使う側にとっても便利だなと思いました。




「もはや EC2 いらないのでは?」
とふと感じましたが、
容量制限の問題(Cognitoに1ユーザ-の保存できるデータ量が 20MB まで)や
仮に DynamoDB や S3 を使うにしてもモバイル機器は電源の問題などもあるので、
EC2 と併用していく中でどう活用していくのかを考えていくことが大切なのかなと思いました。

今後モバイル開発をする際の AWS の活用法の選択肢として非常に勉強になりました。


ちなみにAndroidで使う場合は



CognitoSyncManagerの初期化
cognito = new CognitoSyncManager (context, Regions.US_EAST_1, provider);



同期するデータ用を入れるDataSetの作成とデータの追加
Dataset dataset = cognito.openOrCreateDataset(datasetName);
dataset.put(key, value);



同期の実行
dataset.syncronize(new SyncCallback(){..});


のような形で利用します。さらっと同期できてしまいますね。



Amazon Lambda とは?】
これもざっくり言うと AWS 上にプログラムをアップロードし、イベント発生に応じて実行することができるサービスです。


例えば、、、

・ S3 に画像をアップロード

       ↓

Lambda のプログラムを起動し、DBにメタデータを保存 + サムネイルを作成し、 S3 へアップロード




・ Cognito Sync でデータの同期を実行

       ↓

Lambda のプログラムで Amazon SNS (モバイル通知)から各モバイル機器にデータ変更を通知



・Amazon Kinesis(リアルタイムデータのストリーミング処理)にデータを送信

       ↓

Lambda のプログラムで集計処理後DBに登録、データに応じて SNS でモバイル通知


など、何かしらのイベントに応じて次の処理を AWS 上で行ってくれます。

今までアプリケーション上で行っていたことが
本当の意味でバックグラウンド処理できるようになったということですね。


Lambda は相当広い範囲で活用することができ、
セミナー内で紹介されていたサービス全てに対して Lambda の活用例 を紹介していました。

※そういえば、 Lambda の言語として Python が使用されていましたが
Python がデフォルトなのでしょうか?
勝手にnodejsかなと思っていましたが。。。



他のサービスに関しても色々とご紹介して頂いたのですが、
最後のまとめのメッセージとしては、


「アプリ開発以外の課題(データ分析や同期、スケーラビリティの確保、メディアの管理など)は AWS に任せて、アプリ開発に集中できる環境を作りましょう」

ということでした。

確かに開発側としてデータの収集や分析、活用といった部分を考える機会が増えていると感じていたので
改めてクラウドサービスの活用方法を考えていく必要があると思いました。

短い時間しかいられませんでしたが、
単純に勉強になった点と今後のモバイル開発の仕組みを作る上での新しい視点を得られた点で
非常に有意義な時間となりました。


あとこのセミナーに参加する前に Amazon Machine Learning のセミナーにも実は参加してきました。

新しいサービスということで、満員状態で立ち見でした。。。

機械学習というと統計学やR言語などかなり専門的な分野だと感じていただけに
それを簡単に使えるようになるというのは非常に興味深かったです。

まとめる時間がなかったので改めて報告したいと思います。

2015年2月17日火曜日

AWSの支払いをドルから円に変えてみた。

2月 17, 2015
オフィス狛 インフラチームです。

AWS(Amazon Web Services)が2015年2月16日(現地時間)、
クラウドサービスの支払い通貨を拡大したと発表しました。

【AWS発表】 AWSアカウントへの支払い通貨の設定機能

これでついに円での支払いが可能になりました。

オフィス狛では米ドル(USD)支払でも何の問題もないのですが、折角なので円支払に変えてみました。

まずはAWSにログイン後、「Billing & Cost Management」の「Dashboard」を表示させます。


上記のように、デフォルトは米ドル(USD)支払になっています。

そこで、左側のメニューから「Account Settings」へ移動し、


「Local Currency Preference」で、通貨を「JPY - Japanese Yen 」に変更します。


これで「Dashboard」を再度表示すると、「JPY」に・・・・・なっていない。
ただ、表示が少し変わっています。


何度か再表示させてみたら、以下のように「JPY」に換算されました。


今まで、円で支払う事が出来ない為に、お客様の決済上の問題で
AWSの使用を諦める事になったプロジェクトもあったので、これはかなり朗報だと思います。

ただ、決済代行サービスを行っている企業はどうするのだろう・・・・などと、心配をしてしまいます。

ちなみに、円で支払う為には、VisaもしくはMasterCardで無いと駄目なようです。

2015年1月20日火曜日

Codeigniter 2.1.4 と PHP5.6 でのエラー。

1月 20, 2015
オフィス狛 技術部です。

久しぶりの Codeigniter です。
今回、Codeigniter で作成したシステムをリニューアルする事になり、
PHPのバージョンを上げる事になりました。(PHP5.2→5.6)

早速、PHPのバージョンを上げて、プログラムは一切変えずに実行してみたところ・・・

A PHP Error was encountered
Severity: Notice
Message: Only variable references should be returned by reference
Filename: core/Common.php
Line Number: 257

どうやら、フレームワーク(Codeigniter)内部のエラーのようです。
エラー内容で検索すると、下記サイトが出てきました。

修正方法としては、上記サイトを参考に、
return $_config[0] =& $config;
という一文を
$_config[0] =& $config;
return $_config[0];
このように変えるだけです。

ちなみに、Codeigniter のバージョンを調べる方法ですが、

system/core/CodeIgniter.php 」に「 define('CI_VERSION', '2.1.4');
のように定義されています。

※昔のバージョンだと、定義してある箇所が違っているようなので、上記場所に無い場合、
こちら(CodeIgniter のバージョンの調べ方)の記事を参考にして調べた方が良いかもしれません。

覚悟をしていたものの・・・PHPのバージョンを上げるのは一苦労です。

2014年9月7日日曜日

Highcharts JS で Highcharts error #14。

9月 07, 2014
オフィス狛 技術部です。

あるシステムで Highcharts JS を使っているのですが、
新しいグラフを追加する事になり、データ提供元のWebAPIを利用しJSONを取得して表示したところ、
以下のエラーになりました。
Highcharts error #14: www.highcharts.com/errors/14

軸のデータが変わっただけで、グラフ表示形式も、JSON形式も他のグラフと違いないはず・・・
とりあえず、エラーメッセージには親切にもURLが付いているのでアクセスしてみます。

String value sent to series.data, expected Number
This happens if you pass in a string as a data point, for example in a setup like this:
series: [{
data: ["3", "5", "1", "6"]
}]
Highcharts expects the data values to be numbers. The most common reason for this is that data is parsed from CSV or from a XML source, and the implementer forgot to run parseFloat on the parsed value. For performance reasons internal type casting is not performed, and only the first value is checked (since 2.3).

読み解くと、x、y軸に表示するデータは、数値扱いにしなければならない。
という事のようです。
上記の例だと、
 series: [{
     data: [3, 5, 1, 6]
 }]
このようにダブルクォーテーションを取る・・・という事ですね。

実は今回のWebAPIも弊社が作成しているので、WebAPI側を修正する事が出来ました。
逆に言うと、他社のWebAPIを利用する場合に、こんな現象に遭遇したら・・・嫌ですね。

2014年8月10日日曜日

ASP.net EnterキーでのSubmit(ポストバック)制御。

8月 10, 2014
オフィス狛 技術部です。

Webシステムで、EnterキーでのSubmitを制御したいという要望はよくあります。

色々と方法はありますが、JavaScriptで制御させる方法が多いと思います。

後は、ASP.netのコントロールであるButtonコントロールを使わず、htmlタグのbuttonタグを使う方法や、
ダミーボタンを用意し、FormのDefaultButtonに設定する、などです。

※ダミーボタンを作成する際は、ButtonコントロールのプロパティであるVibibleをFalseにしてはいけません。
VibibleがFalseになっているコントロールは、htmlに変換する際に対象外となるからです。


ただ、そのような要望が、開発の終盤に出てくると、修正も大変ですよね。

ASP.netを利用しているのであれば、Site.Masterに以下のような記載をすると、修正が1か所で済みます。
<div id="body">
    <asp:Panel ID="PanelDummy" runat="server" DefaultButton="ButtonDefault">
    <asp:ContentPlaceHolder runat="server" ID="FeaturedContent" />
    <asp:ContentPlaceHolder runat="server" ID="MainContent" />
    <asp:Button ID="ButtonDefault" runat="server" Text="" Width="0" Height="0" OnClientClick="return false;" style="visibility:hidden;" />
    </asp:Panel>
</div>
ContentPlaceHolderの部分は各画面で置き換えられるコンテンツ部分ですが、
そのコンテンツ部分をPanelコントロールで括っています。
そして、そのPanelにはデフォルトボタンが設定されていて、
そのボタンは OnClientClick="return false;" でSubmiteを無効にしています。

非表示についても、ボタンのプロパティではなく、CSSのstlye設定を利用しているところもポイントです。

EnterキーでのSubmit(ポストバック)は、利用する人によって、「必要だ」という意見もあれば、
「不要だ」という意見もあり、現場では正直困ってしまう事もあります・・・・。

2014年7月26日土曜日

CodeIgniterのActiveRecord(where句の動的生成)。

7月 26, 2014
オフィス狛 技術部です。

前々回に引き続き、今回もCodeIgniterのActiveRecordで苦労した事を備忘録として残しておきます。

CodeIgniterのActiveRecordでは、
$this->db->where('item1', '1');
$this->db->where('item2', '2');
上記のように、カラムと検索値を指定するだけで、簡単にwhere句が作成できます。

ただし、複雑なSQL文の事を考慮し、動的にwhere句を作成する事もできます。
// 検索条件の作成
$whereString = ' ( item1 = ' . $value1;
$whereString.= '   or  item1 = ' . $value2 . ')';
$whereString.= ' and del_flg = ' . $delFlg;
$whereString.= ' and proc_date < ' . $nowDate;

$updateData = array(
        'del_flg' => self::NOT_DEL_DATA,
        'last_updated_user' => self::PRG_ID,
        'updated_at' => $updateTime,
);

$this->db->where($whereString);
$this->db->update('sample_table', $updateData);
上記は、変数whereStringにwhere句を動的作成して格納していますが、
実はエラーになってしまいます。(正しく解析されない)

原因は、whereStringの先頭に半角スペースが設定されている為です。
先頭の半角スペースを削除すれば、正常に動作します。

修正したものは以下になります。
(半角スペースだけの問題なので、パッと見は変わりませんが)
// 検索条件の作成
$whereString = '( item1 = ' . $value1;
$whereString.= '   or  item1 = ' . $value2 . ')';
$whereString.= ' and del_flg = ' . $delFlg;
$whereString.= ' and proc_date < ' . $nowDate;

$updateData = array(
        'del_flg' => self::NOT_DEL_DATA,
        'last_updated_user' => self::PRG_ID,
        'updated_at' => $updateTime,
);

$this->db->where($whereString);
$this->db->update('sample_table', $updateData);
これは、原因を突き止めるのに、本当に時間が掛かりました。

2014年7月6日日曜日

Unity で Internal compiler error。

7月 06, 2014
オフィス狛 技術部です。

社内でUnity開発用の端末を追加して、環境設定した後、
プロジェクトをコピーしてビルドしたら以下のメッセージが出ました。
(OSはWindows7 64bit、Unityのバージョンは4.3.4)

Internal compiler error. See the console log for more information. output was:
Unhandled Exception: System.UnauthorizedAccessException: Access to the path "C:\xxxx\yyyy\zzzz\Temp\Assembly-CSharp.dll.mdb" is denied.

他の端末では、何の問題もなくビルド出来ています。
メッセージからすると、何か権限絡みエラーな気がしますが・・・

他の端末とのは違いは、アンチウィルスソフトぐらいしか・・・って、調べてみたら、これが原因でした。

今回の設定した端末のみ、アンチウィルスソフトはMcAfeeをインストールしているのですが、
McAfeeのリアルタイムスキャンがビルドの邪魔をしているようです。

検索したら、同じような現象で困っている人が。


とりあえず、リアルタイムスキャンを止めたら、エラーは解消し、ビルド出来ました。
・・・が、毎回リアルタイムスキャン止めるのも面倒なので、結局アンチウィルスソフト変える事にしました。