Loading [MathJax]/extensions/tex2jax.js

2015-10-25

AWS Lambdaのメモリ設定とパフォーマンスについてのメモ書き

AWS Lambdaをもう少し本気で使ってみようかなということで、ラボで内部利用している非公開なAPIをGAE→Lambdaにしようと企んでいます。ちょっと試してみたんですが、その使用感などメモ書きです。

メモリとコンテナのスペックは連動する
Lambdaにはメモリ設定があります。これは最初悩みどころで、どれぐらいメモリが必要なんだろ?とか思ったりしますがこれは勘違いです。メモリ設定の正体は、Lambdaコンテナのスペックに比例します。つまり、

  • メモリ量を増やすことで、実効速度が速くなる
ということです。逆に言うと、メモリをケチるとめちゃめちゃ遅いです。使い物にならないです。例えば、「amazon product advertising api」をLambdaでコールしてみたんですが、
  • メモリ128MB:→実行速度:6000〜8000ms
  • メモリ1024MB:→実行速度:600〜1000ms
となります。ウェブアプリのREST APIとして使いたいなら、6000〜8000msなんてありえない数値です。1000msでも遅いなぁって気がしますしね。
傾向として初回は起動が遅いですが、連続した2回目以降の処理は速くなります。ただ、メモリ128Mだと、何回やっても6000〜8000msをうろつきます。ちなみに、試したプログラムの最大メモリ使用量は51MBです。

コスト(料金)に注意
ただし、メモリを増やすとコストもかかってきます。これについては、下記の記事を御覧ください。
メモリ設定変更の方法に注意(Javaの場合)
管理画面でメモリを変更できるようになってますが、Javaの場合はメモリ設定だけを変更することはできないようです。jarのアップロード時にしか反映されない感じなので注意が必要です。

コストの点ではLambdaはGAEよりも若干高い気がしますが、制約もなくきちんとしたモノを作りたいのであれば選択肢として充分アリかなという印象ですね。



2015-10-23

GWT:週番号を取得する

過去の記事にも書いているように、GWTでは
  • java.util.Calendar 
  • java.text.SimpleDateFormat
が使えません。そこで、Dateクラスに頼らざるをえないのですが、DateクラスについてもgetYear() , getMonth() などは, deprecated (非推奨) になっています。このような制約のもと、任意の日付の週番号を取得するにはどうしたらよいか、、、ということですが、その解決策を下記に載せます。CalendarUtilクラスを利用するのがポイントですね。
private int getWeekOfYear(Date nowTime){
//コピーする(年始の日付1/1)
Date janTime = CalendarUtil.copyDate(nowTime);
//月初め
CalendarUtil.setToFirstDayOfMonth(janTime);
DateTimeFormat fmt = DateTimeFormat.getFormat("M");
String nowMonth = fmt.format(nowTime);
CalendarUtil.addMonthsToDate(janTime, -Integer.parseInt(nowMonth)+1);
int daysBetween = CalendarUtil.getDaysBetween(janTime, nowTime);
DateTimeFormat fmtWeek = DateTimeFormat.getFormat("EEE");
// 1.1の曜日番号を求める
int dayNum = getDayNumber(janTime);
int weekNum = (int)(daysBetween+dayNum)/7+1;
return weekNum;
}
なお曜日番号の取得は、下記になります。
/**
* GWT では Calendarクラスが使えないので。。。。
* @param day
* @return
*/
private int getDayNumber(Date day){
DateTimeFormat fmt = DateTimeFormat.getFormat("EEE");
Map<String, String> map = new HashMap<String,String>();
map.put("Sun", "0");
map.put("Mon", "1");
map.put("Tue", "2");
map.put("Wed", "3");
map.put("Thr", "4");
map.put("Fri", "5");
map.put("Sat", "6");
String temp = fmt.format(day);
return Integer.parseInt(map.get(temp));
}


2015-10-16

Mac: "Developer Tools Access"に変更を許可するには、パスワードを入力してください。

MacのXCodeで開発中に
「 "Developer Tools Access"に変更を許可するには、パスワードを入力してください」
というメッセージが出る場合は、権限が不足していることが原因です。
sudo dscl . append /Groups/_developer GroupMembership <ユーザ名>
とすればOKです。