AWS:EC2インスタンスからRDSインスタンスへ接続できない場合の確認点

RDSへデータをインポートしようとしたら以下のメッセージが出力されて接続ができなかった。

1
ERROR 2003 (HY000): Can't connect to MySQL server on 'xxxxxx.ap-northeast-1.rds.amazonaws.com' (110)

EC2のSecurity Groups設定に、MySQLの許可を追加(rule:リストから”MYSQL”を選択)することで接続できるようになった。

AWS-RDS

AWSにApacheをインストールする際に利用したコマンド

Apache をインストール
$ sudo yum -y install httpd

Apache 起動、自動起動
$ sudo service httpd start
$ sudo chkconfig httpd on

mysql をインストール
$ sudo yum -y install mysql-server

Mysql 起動、自動起動
$ sudo service mysqld start
$ sudo chkconfig mysqld on

conf 設定ファイルの記述をチェック
$ sudo service httpd configtest

AWSへファイルをアップロード
$ scp -i ~/.ssh/(.pemファイル) (アップロードするファイル) ec2-user@(AWSサーバ):/home/ec2-user/

RDSにデータをインポート
$ mysql -u (DBユーザ) -p \
–database=(DB名) \
–host=(RDS名).ap-northeast-1.rds.amazonaws.com < /tmp/backup.sql

OS X 10.8.4 アップデート後 xcode シミュレータ実行時エラーの対処方法

OS X 10.8.4 にしてから、xcode からシミュレータ実行した際にエラーが出力されて困っていたが、一時的な対処方法が紹介されていた。
再実行 (⌘+R) でエラーでまくりで困ってたんですよ。(^^)

とりあえず、以下の記事の内容の通り、デバッガを LLDB から GDB に変更。

参照:OS X 10.8.4でXcodeでiOS Simulatorを実行したときにSIGABRTでアプリがクラッシュすることがある問題の暫定的な対処

追記: 6/14 Xcode 4.6.3 がリリースされており、問題も対処されているようです。

CoreData データベースにマスタデータを取り込む方法

iOS アプリで SQLite のマスタデータをデータベースに用意することに少し苦労したので、メモしておく。

iOS アプリで生成した SQLite データベースのテーブル構成を SQLite database browser で確認した。

・CoreData のテーブルには、テーブル名に"Z"が付加されている
・テーブル カラムにも"Z_PK", "Z_ENT", "Z_OPT" などの制御カラム(?)が追加されている

上記制御カラムの生成ルールがよくわからなかったので、CoreData データベースへのデータ追加は CoreData プログラムコードで行うこととした。
(他にいい方法はないのものか?)

1. 自作のCSVデータ取り込みアプリ(CoreData)でデータをインポート

CSVデータ取り込みアプリの .xcdatamodel にマスタテーブルを定義する
マスタテーブルへデータを取り込めるように改変する
マスタ データを取り込む

2. アプリで利用するSQLiteデータベースへデータをコピー

1
2
3
4
5
6
7
8
$ sqlite3 アプリのデータベース ファイル名.sqlite
sqlite> attach database 'マスタを保持したデータベース ファイル名.sqlite' as old;
sqlite> .database
sqlite> begin;
sqlite> insert into main.テーブル名('Z_ENT', 'Z_OPT', …カラム名) select Z_ENT, Z_OPT, …カラム名 from old.テーブル名; 
注意点: Z_PK などのプライマリキーは指定できない
sqlite> commit;
sqlite> .exit

3. NSBundle からデータベースをコピー

マスタデータを含むデータベースを xcode プロジェクトに追加しておき、アプリ起動時に以下のコードでコピーする。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#pragma mark - Application's documents directory
 
// アプリのドキュメント ディレクトリ パスを返す
- (NSString *)applicationDocumentsDirectory
{    
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *basePath = ([paths count] > 0) ? [paths objectAtIndex:0] : nil;
    return basePath;
}
 
- (void)setupSqliteDb
{
    // SQLiteデータベース を保存するパスを取得する
    NSString *storePath = [[self applicationDocumentsDirectory] stringByAppendingPathComponent: @"BikeMaintenance.sqlite"];
    NSFileManager *fileManager = [NSFileManager defaultManager];
 
    // SQLiteデータベースが存在しない場合、作成する
    if (![fileManager fileExistsAtPath:storePath]) {
        NSString *defaultStorePath = [[NSBundle mainBundle] pathForResource:@"BikeMaintenance" ofType:@"sqlite"];
        if (defaultStorePath) {
            [fileManager copyItemAtPath:defaultStorePath toPath:storePath error:NULL];
        }
    }
}