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>

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

参考

Android用にmozcをUbuntuでビルドする

Google日本語入力Android版がオープンソースになったという事で早速ビルドしてみる。

■準備

EC2でUbuntu 12.04を使用。

sudo apt-get update
sudo apt-get install g++ python subversion ibus make libibus-1.0-dev libzinnia-dev unzip ant qt4-dev-tools libqt4-core libqtgui4 git

■JDK

scp -i hogehoge.pem -r ~/Downloads/jdk-6u41-linux-x64.bin user@host:/home/user/jdk1.6.0_41
chmod 0700 jdk-6u41-linux-x64.bin
./jdk-6u41-linux-x64.bin
PATH=$PATH:$HOME/jdk1.6.0_41/bin
JAVA_HOME=$HOME/jdk1.6.0_41
export JAVA_HOME

■SDK

cd ~
wget http://dl.google.com/android/android-sdk_r21.1-linux.tgz
tar zxvf android-sdk_r21.1-linux.tgz
export PATH=/home/ubuntu/android-sdk-linux/tools:"$PATH"

cd ~/android-sdk-linux/platforms/
wget http://dl.google.com/android/repository/android-17_r01.zip
unzip android-17_r01.zip
mv android-4.2 android-17

wget http://dl.google.com/android/repository/android-2.2_r03-linux.zip
unzip android-2.2_r03-linux.zip
mv android-2.2_r03-linux android-8

■NDK

cd ~
wget http://dl.google.com/android/ndk/android-ndk-r8e-linux-x86_64.tar.bz2
tar -jvxf android-ndk-r8e-linux-x86_64.tar.bz2
export PATH=/home/ubuntu/android-ndk-r8e:"$PATH"

■mozc

cd ~/
svn co http://src.chromium.org/svn/trunk/tools/depot_tools
export PATH="$PATH":`pwd`/depot_tools

mkdir -p ~/src/mozc
cd ~/src/mozc
gclient config http://mozc.googlecode.com/svn/trunk/src
gclient sync

ちなみにリビジョンを指定するには以下のようにする。

gclient sync --revision r178

mac

macでgclient syncを実行すると以下のようなエラーが出て完了できない。

Server certificate verification failed: issuer is not trusted (https://zinnia.svn.sourceforge.net)

以下のコマンドで事前に取り込んでおく。

svn ls https://src.chromium.org
svn ls https://zinnia.svn.sourceforge.net
cd ~/src/mozc/src
./build_mozc.py gyp --target_platform=Android --android_sdk_home=/home/ubuntu/android-sdk-linux
./build_mozc.py build_tools -c Release
android update project -s -p android -t android-8
python build_mozc.py build android/android.gyp:apk -c Release_Android

x86

./build_mozc.py gyp --target_platform=Android --android_sdk_home=/home/ubuntu/android-sdk-linux --android_arch_abi=x86

ちなみにcleanは以下のコマンドで行う。

./build_mozc.py clean

リリースビルドしようとするとPlatform toolsが無いと言われて怒られる。

BUILD FAILED
/home/ubuntu/src/mozc/src/android/build.xml:86: The following error occurred while executing this line:
/home/ubuntu/android-sdk-linux/tools/ant/build.xml:401: SDK Platform Tools component is missing. Please install it with the SDK Manager (tools/android)

Ubuntuマシンがローカルに欲しくなる。この状態で既に共有ライブラリなどは生成されているのでローカルにダウンロードしeclipseでビルドできる。

参考

RDSでインスタンスがブロックされMySQLに接続できなくなる

RDSを使っているとMulti-AZ DeploymentがYesになっている場合でも、以下のようにMySQLに接続できない時間が存在する。

Database connection "SQLSTATE[HY000] [2003] Can't connect to MySQL server on 'endpoint.zone.amazonaws.com' " is missing, or could not be created.

ユーザーのアクセスごとにconnectが発生するようなシステムの場合、上述の接続できない時間の間に多数のユーザーがアクセスし、クライアントが接続エラーを繰り返す場合がある。その場合、以下のエラーが発生する。

Database connection "SQLSTATE[HY000] [1129] Host 'instance.zone.compute.internal' is blocked because of many connection errors; unblock with 'mysqladmin flush-hosts'" is missing, or could not be created.

■上限値を増やす

max_connect_errorsを変更することで接続エラーの上限値を変更できる。

■ブロックを解除する

mysqladmin -h endpoint.zone.amazonaws.com -u user --password=password flush-hosts

参考

Factory Imagesを使ってAndroidのバージョンを上げる

Factory Images for Nexus Devicesからダウンロードする。

wget https://dl.google.com/dl/android/aosp/hoge-fuga-factory-piyo.tgz
tar xvzf hoge-fuga-factory-piyo.tgz
cd hoge-fuga/
adb reboot bootloader
fastboot oem unlock
fastboot flash bootloader bootloader-xxxx-yyy.img
fastboot reboot-bootloader
fastboot flash radio radio-xxxx-zzz.img
fastboot reboot-bootloader
fastboot update image-hoge-fuga.zip

書いてなかったので書いておく。

Mountain Lion上でCocoaPodsを導入する

メモ。

ln -s /usr/bin/gcc /usr/bin/gcc-4.2
sudo gem install cocoapods
pod setup
cd your_project
vim Podfile

以下のようにプラットフォームと使用するライブラリを記述する。

platform :ios,'6.0'
pod 'JSONKit','~> 1.4'

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

pod install

Podfileから特定のライブラリが削除されていれば、この時にライブラリが削除される。

ビルドできなくなる

以下の表示になってビルドが止まる。

library not found for -lPods

以下のコマンドでxcodeを起動すれば良い。

open your_project_name.xcworkspace/
  • your_project_name.xcworkspace
  • your_project_name.xcodeproj

libraryを入れるとビルドできなくなる

libraryを入れると以下のエラーが表示されてビルドできなくなる。

duplicate symbols for architecture i386

CocoaPodsで導入したライブラリと直接入れたライブラリが衝突している場合に起こる。直接入れたライブラリを削除する。

■PonyDebugger

サーバー

以下のコマンドでローカルのサーバーをインストールして動作させる。

curl -sk https://cloud.github.com/downloads/square/PonyDebugger/bootstrap-ponyd.py | python - --ponyd-symlink=/usr/local/bin/ponyd ~/Library/PonyDebugger

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

ponyd serve --listen-interface=127.0.0.1

クライアント

vim Podfile

以下のようにライブラリを追記する。

platform :ios,'6.0'
pod 'PonyDebugger'

以下のコマンドでインストールを行う。

pod install

AppDelegate.m

#if DEBUG
#import <PonyDebugger/PonyDebugger.h>
#endif
PonyDebuggerがNotFoundでimportできない。

target header search pathsに$(inherited)を追記する。

#if DEBUG
    PDDebugger *debugger = [PDDebugger defaultInstance];
    [debugger enableNetworkTrafficDebugging];
    [debugger forwardAllNetworkTraffic];
    [debugger enableCoreDataDebugging];
    [debugger enableViewHierarchyDebugging];
    [debugger connectToURL:[NSURL URLWithString:@"ws://localhost:9000/device"]];
#endif

ブラウザでlocalhost:9000/deviceにアクセスする。

URL SchemeでiOSアプリを起動する

自分用のメモ。まず、プロジェクトのURL Typesを開きURL Schemesを追加する。2つ以上の場合はカンマで区切る。

AppDelegate.m

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation {
    if ([[url scheme] isEqualToString:URL_SCHEME_HOGE] && [[url host] isEqualToString:URL_HOST_HOGE]) {
        // do something
    }
}