AWS SDK for Pythonでインスタンスを起動してELBに追加する

pip

いれてなかったので。

wget http://peak.telecommunity.com/dist/ez_setup.py
sudo python ez_setup.py
sudo easy_install pip

何となくPythonのSDKを使うことにした。

botoのインストール

sudo pip install -U boto

code

import boto.ec2
import boto.ec2.elb

key = 'your key'
secret = 'your secret'
instance = 'instance'
balancer = 'balancer name'
region = 'region'
zone = 'zone'

connEc2 = boto.ec2.connect_to_region(
  region,
  aws_access_key_id=key,
  aws_secret_access_key=secret
)
connElb = boto.ec2.elb.connect_to_region(
  region,
  aws_access_key_id=key,
  aws_secret_access_key=secret
)

connEc2.start_instances(instance)
balancers = connElb.get_all_load_balancers(load_balancer_names=[balancer])
balancers[0].register_instances(instance)
balancers[0].enable_zones([zone])

反対の動作は以下のようになる。

balancers = connElb.get_all_load_balancers(load_balancer_names=[balancer])
balancers[0].deregister_instances(instance)
balancers[0].disable_zones([zone])
connEc2.stop_instances(instance)

Kindle Fire HDでcanvas.drawPictureするとUnsupportedOperationExceptionでクラッシュする

以下の部分でUnsupportedOperationExceptionが発生しクラッシュする。

canvas.drawPicture(picture);

drawPicture()はハードウェアアクセラレーションに対応していないらしいので以下のように修正した。

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB && canvas.isHardwareAccelerated()) {
  picture.draw(canvas);
}
else {
  canvas.drawPicture(picture);
}

追記

ImageViewなどのViewの描画でdrawableのdrawの中で以下の処理がされるとkindleでは描画できない。

picture.draw(canvas);

以下のようにハードウェアアクセラレーションが有効になっているViewでソフトウェアレンダリングするように指定した。

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {// for kindle
  imageView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
}

以下のようにPictureDrawableをBitmapに変換してViewにセットしても上手く表示できる。

  canvas.drawBitmap(pictureDrawable2Bitmap(picture), new Matrix(), new Paint());
private static Bitmap pictureDrawable2Bitmap(Picture picture){
  PictureDrawable pictureDrawable = new PictureDrawable(picture);
  Bitmap bitmap = Bitmap.createBitmap(pictureDrawable.getIntrinsicWidth(),pictureDrawable.getIntrinsicHeight(), Config.ARGB_8888);
  Canvas canvas = new Canvas(bitmap);
  canvas.drawPicture(pictureDrawable.getPicture());
  return bitmap;
}

今回はdrawが頻繁にコールされるのでこの手法は取らなかった。

Fused Location Providerを試してみる

ライブラリのコピー。

cp ~/android-sdk-mac_x86/extras/google/google_play_services/libproject/google-play-services_lib/libs/* ./lib/

パーミッションの付加。

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

コード。

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    
    mLocationClient = new LocationClient(getApplicationContext(), this, this);
    mLocationClient.connect();
}
@Override
protected void onDestroy() {
    mLocationClient.disconnect();
    super.onDestroy();
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}

@Override
public void onConnectionFailed(ConnectionResult result) {
}
@Override
public void onConnected(Bundle bundle) {
    Location location = mLocationClient.getLastLocation();
    android.util.Log.e("latitude", "" + location.getLatitude());
    android.util.Log.e("longitude", "" + location.getLongitude());
}
@Override
public void onDisconnected() {
}

参考

mod_dosdetectorを導入する

以下のコマンドでインストールする。

su
yum install httpd-devel -y
cd /usr/local/src
git clone https://github.com/stanaka/mod_dosdetector.git
cd mod_dosdetector
make
make install
exit
sudo vim /etc/httpd/conf/httpd.conf

以下のように設定する。ELB配下ではクライアントのIPはX-Forwarded-Forに格納されているので、DoSForwardedをonにする必要がある。

    <IfModule mod_dosdetector.c>
        DoSDetection     on
        DoSForwarded     on
        DoSPeriod        60
        DoSThreshold     5
        DoSHardThreshold 10
        DoSBanPeriod     60
        DoSTableSize     100
        DoSIgnoreContentType  image/*
    </IfModule>

以下のコマンドで再起動する。

sudo /etc/init.d/httpd restart
vim ~/site/webroot/.htaccess

mod_dosdetectorは環境変数がセットされるだけなので、htaccessで環境変数に応じたステータスを返すようにする。

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond  %{ENV:SuspectDoS} .+
    RewriteRule .*  - [R=503,L]
    RewriteCond  %{ENV:SuspectHardDoS} .+
    RewriteRule .*  - [R=503,L]
</IfModule>

Unicode 6.0の絵文字のソースをコード内で扱える形式に変換する

自分用のメモ。元データをJavaやJavaScript内で扱える形式に変換する。以下のようにnodeで実装した。

var fs = require('fs');
var csv = require('csv');
csv()
.from.stream(fs.createReadStream(__dirname+'/EmojiSources.txt'), {"delimiter" : ";"})
.to.path(__dirname+'/sample.txt')
.transform(function(row){
  var elm = row.slice(0, 1); 
  if (elm[0].indexOf('1F') > -1) {
    var code = parseInt("0x" + elm[0], 16);
    code -= 0x10000;
    var hi = code >> 10; 
    var lo = code & 0x3FF;
    hi |= 0xD800;
    lo |= 0xDC00;
    elm[0] = '\\u' + hi.toString(16) + '\\u' + lo.toString(16);
    elm[1] = String.fromCharCode(hi, lo);
  }
  else {
    elm[1] = String.fromCharCode(parseInt(elm[0], 16));
    elm[0] = '\\u' + elm[0] + ''; 
  }
  return elm;
})
.on('record', function(row,index){
  console.log('#' + index + ' ' + JSON.stringify(row));
})
.on('close', function(count){
  console.log('Number of lines: '+count);
})
.on('error', function(error){
  console.log(error.message);
});

ちなみに適当なファイルをUnicodeエスケープシーケンスに変換するには次のように行う。

var fs = require('fs');
var csv = require('csv');

var combine = function(str, index) {
  var code = str.charCodeAt(index);
  if (isNaN(code)) return ""; 
  return '\\u' + (new Array(4 - code.toString(16).length + 1)).join("0") + code.toString(16) + combine(str, ++index);
}

csv()
.from.stream(fs.createReadStream(__dirname+'/src.txt'), {"delimiter" : ","})
.to.path(__dirname+'/dist.txt')
.transform(function(row){
  var elm = row.slice(0, 1); 
  return '"' + combine(elm[0], 0) + '",\n';
})
.on('record', function(row,index){
  console.log('#' + index + ' ' + JSON.stringify(row));
})
.on('close', function(count){
  console.log('Number of lines: '+count);
})
.on('error', function(error){
  console.log(error.message);
});

iTunes Connectで出力されるCrash Reportsを読む

■Crash Reportsの取得

iTunes Connect > Manage Your Apps > Current Version > View Details > Crash Reportsからcrashファイルをダウンロードして解凍、クラッシュ箇所を特定する。

■バイナリのビルド

以下の状態でビルドしたバイナリが必要である。

  • Build Settings の Strip Debug Symbols During CopyがNo
  • Build Settings の Strip Linked ProductがNo

但し、この状態でビルドすると30~50%ファイルサイズが大きくなるのでリリースビルドではNoにしておくべきである。

unzip hoge.ipa
cd Payload
xcrun atos -arch armv7 -o hoge.app/hoge 0x000ac264

以下のように出力される。

+[TAGResourceUtil expandResource:] (in hoge) + 586

Build Settingsを変更していないと以下のようになる。

___lldb_unnamed_function3890$$hoge (in hoge) + 586

オーガナイザ

ビルド毎に設定変更しバイナリを保存しておくのは非効率である。Window>Organizer>ArchivesでSubmittedのバイナリを右クリックするとfinderでxcarchiveが取得できるのでエラー原因の追求にはこれを使う。

xcrun atos -arch armv7 -o hoge.app.dSYM/Contents/Resources/DWARF/hoge 0x000ac264

参考