Monthly Archives: 8月 2014

iOSにFlurry SDKを導入する

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので十分ご注意ください。

■前提条件

・Flurryアカウントは取得済み
・当該プロジェクトにFlurry SDKを新規導入する
・Flurry 5.3.0
・iOS 7.1.2
・Xcode 5.1.1
・MacOSX 10.9.4

■手順

(1) SDKをダウンロードする

https://dev.flurry.com/

Flurryのサイトへログインし、Manage ApplicationsのAdd a New Applicationをクリックします。

 

プラットフォーム選択画面にてiPhoneアイコンを押下します。

 

Application Nameにアプリ名(英数字)入力し、Categoriesではカテゴリーを選択してからCreate Appボタンを押下します。

※Restrict Feature Set?はデフォルトで構いません。

 

生成されたApplication Keyを書き留め、Downloadボタンを押下しSDKをダウンロードします。

 

(2) 当該プロジェクトにセットアップする

ダウンロードしたFlurry iPhone SDK viPhone 5.3.0.zipを展開し、

Flurry.h
libFlurry_5.3.0.a

上記二つのファイルをプロジェクトに追加します。

 

SystemConfiguration.framework
Security.framework

上記二つのフレームワークもプロジェクトに追加します。

 

#import "Flurry.h"
・・・
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    [Flurry setCrashReportingEnabled:YES];
    [Flurry startSession:@"*********************"];  // Application Key
    ・・・
}

AppDelegate.m内でライブラリの初期化を行います。startSessionでApplication Keyを指定します。

 

 [Flurry setCrashReportingEnabled:YES];

上記を記述することでクラッシュレポートを受け取れますが、Crashlyticsなど他のサービスを使用しているときは不要かもしれません。必要に応じて記述してください。

 

デバッグモードで起動し、

Flurry: Starting session on Agent Version [Flurry_iOS_*******]

このように表示されればOKです。

この状態がミニマムセットです。これだけでも最低限の情報は受け取れますが、用意されている豊富なメソッドを追加することで細かい情報を受け取ることができます。

 


performSelectorでプリミティブ型の変数を引数として渡す方法

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので十分ご注意ください。

たとえば、BOOL型を渡したい時、

[self performSelector:@selector(foo:) withObject:YES afterDelay:0.1f];

このように直接指定してしまうと、

Implicit conversion of ‘BOOL’ (aka ‘signed char’) to ‘id’ is disallowed with ARC

怒られます。オブジェクト型(id)のみ受け付ける仕様のためです。このような場合はNSNumberでラップすることで渡すことができます。

[self performSelector:@selector(foo:) withObject:[NSNumber numberWithBool:YES] afterDelay:0.5f];

これでOKです。BOOLの他にも、int、doubleなどのプリミティブ型はNSNumberでラップする必要があります。

 


AWS EC2にFTPサーバをインストール

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので十分ご注意ください。

■前提条件

・OS(AMI):Amazon Linux
・ftpサーバ:vsftpd
・デフォルトユーザ(ec2-user)でログイン
・Elastic IPはアサイン済み

※インストール手順は用途、環境に合わせて読み替え、もしくは、変更してください。

■手順

(1) セキュリティグループにてポートを設定を行う

AWSのコンソールからEC2 Dashboardに遷移し、NETWORK & SECURITYカテゴリのSecurityGroupSを選択します。次に当該インスタンスに紐付けているセキュリティグループ選択して詳細画面を開いたら、Inboundタブを選択してEditボタンを押下します。

以下のルールを追加します。

Custom TCP Rule | TCP | 21 | Anywhere 0.0.0.0/0
Custom TCP Rule | TCP | 60000 – 60010 | Anywhere 0.0.0.0/0

追加したらSaveボタンを押下します。

※Source項目は任意で選択および入力してください。この例ではAnywhereで進めます。
※なお、空きポートに関しては以下のコマンドで確認してください。

# cat /proc/sys/net/ipv4/ip_local_port_range

 

(2) vsftpdをインストールする

# yum -y install vsftpd
Loaded plugins: fastestmirror, priorities, security, update-motd
Loading mirror speeds from cached hostfile
 * amzn-main: packages.*****.amazonaws.com
 * amzn-updates: packages.*****.amazonaws.com
amzn-main                                                                                        | 2.1 kB     00:00
amzn-updates                                                                                     | 2.3 kB     00:00
Setting up Install Process
Resolving Dependencies
・・・
Complete!

 

(3) コンフィグファイルを編集する

# vi /etc/vsftpd/vsftpd.conf

以下のように変更(追加、コメント外し)します。

・・・
anonymous_enable=NO
ascii_upload_enable=YES
ascii_download_enable=YES
pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=NO
use_localtime=YES
force_dot_files=YES
pasv_address=***.***.***.***  # Elastic IP
pasv_enable=YES
pasv_addr_resolve=YES
pasv_min_port=60000
pasv_max_port=60010
・・・

chroot機能は必要に応じて有効化してください。その場合は、

・・・
chroot_local_user=YES
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list  # デフォルト
・・・

この3項目の追記と /etc/vsftpd/chroot_list ファイルの生成とファイル内部へのユーザ指定(取り急ぎは空でもOK)が必要です。

 

(4) vsftpdを起動する

# service vsftpd start

 

(5) 自動起動設定を行う

# chkconfig vsftpd on

サーバ側はこれでOKです。

 

(6) ftpクライアントからの接続テストを行う

ターミナルからは

$ sftp -i ********.pem ec2-user@ec2-**-**-***-***.***************.amazonaws.com

GUIクライアント(例としてcyberduck)からは

このような感じで接続します(鍵指定を忘れずに)。問題なく接続できればOKです。

 


libPods.aの参照が外れているときの対処方法

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので十分ご注意ください。

CocoaPods を使用した開発の際、Xcode の NavigationArea で libPods.a が赤字で表示されてしまうことがあります。これを解消します。

 

(1) Podsプロジェクトをスキームに設定する

Product -> Scheme -> Manage Schemes もしくは Toolbar から直接 Manage Schemes を選択します。

 

Pods project の Show をチェックし、OKボタンを押下します。

 

(2) ビルドロケーションを設定する

Xcode -> Preferences… を選択します。

 

Locations タブを選択し、Derived Data 項目 の Advanced…ボタンを押下します。

 

Build Location として Custom を選択し、Relative to Workspace が選択されている状態で Doneボタンを押下します。

 

(3) Podsプロジェクトをビルドする

Toolbar にて Podsプロジェクトに切り替え、ターゲットに iOS Devece を指定した状態でビルドします。

これで libPods.aの赤字が消えます。

 

 


ライブラリ管理のためCocoaPodsを導入する

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので十分ご注意ください。

CocoaPodsの詳解は他のサイトに譲るとして、手順のみ書き残しておきます。

(1) gemをアップデートする

$ sudo gem update --system
・・・
RubyGems system software updated

(2) CocoaPodsをインストールします

$ sudo gem install cocoapods
・・・
Successfully installed cocoapods-0.33.1
・・・
18 gems installed

インストールそのものはここまでで終了です。
以下は、特定のライブラリをXcodeプロジェクトへ導入する手順となります。

(3) 対象プロジェクトのディレクトリへ移動します

$ cd project 

(4) Podfileを編集します

$ vi Podfile
platform :ios, "7.0"
pod "MPPlot"

ここでは例としてMPPlotを指定します。

(5) 指定したライブラリをインストールします

※実行する前にプロジェクトファイルは閉じておきます

$ pod install
Setting up CocoaPods master repo
Setup completed (read-only access)
Analyzing dependencies
Downloading dependencies
Installing MPPlot (0.1.0)
Generating Pods project
Integrating client project

これでOKです。


StoryBoardを使った画面遷移で値を渡す

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので十分ご注意ください。

簡単なのですが、意外とハマる方が多いようなので書いておきます。
画面遷移直前にprepareForSegueが呼ばれるので、その中で値を代入することで実現できます。

// 遷移元(OriginViewController.m)
- (void)prepareForSegue:(UIStoryboardSegue*)segue sender:(id)sender
{
    if ([segue.identifier isEqualToString:@"nextView"]) {
        NextViewController *viewController = segue.destinationViewController;
        viewController.mode = YES;
    }
}

遷移先には受け渡し用のプロパティを宣言しておきます。

// 遷移先(NextViewController.h)
@interface NextViewController : UIViewController
{
	・・・
}
 
@property BOOL mode;

@end

他にも方法はありますが、ほとんどの場合この方法を採ることが多いです。


NSNotificationCenterを利用して日付が変わったことを通知させる

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので十分ご注意ください。

name へ UIApplicationSignificantTimeChangeNotification を設定します。

- (void)viewDidLoad
{
	・・・
	[[NSNotificationCenter defaultCenter] addObserver:self
	                                         selector:@selector(dateChange:)
	                                             name:UIApplicationSignificantTimeChangeNotification
	                                           object:nil];
	・・・
}
- (void)dateChange:(id)sender
{
	NSLog(@"日付が変わりました");
}

これで、日付が変わった時やサマータイムへの切り替えなど、時間に大きな変更があった場合に通知を受けることができます。


NSUserDefaultsで”mutating method sent to immutable object”

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので十分ご注意ください。

NSUserDefaultsを使用して取り出した配列にデータを追加して保存する際、下記にエラーになりました。

*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: '-[__NSCFArray insertObject:atIndex:]: mutating method sent to immutable object'
*** First throw call stack:

immutable(不変)なオブジェクトを書き換えようとしたようです。

NSUserDefaultsはimmutableなオブジェクトを返しますので、NSDictionaryやNSArrayなどオブジェクト集合に対して操作する場合はmutableCopyでインスタンスの可変コピーを取得するように書き換えます。

修正前。

NSMutableArray *favList = [[NSUserDefaults standardUserDefaults] objectForKey:@"key"];    
[favList addObject:@"object"];
[[NSUserDefaults standardUserDefaults] setObject:favList forKey:@"key"];
[[NSUserDefaults standardUserDefaults] synchronize];

修正後。

NSMutableArray *favList = [[[NSUserDefaults standardUserDefaults] objectForKey:@"key"] mutableCopy];    
[favList addObject:@"object"];
[[NSUserDefaults standardUserDefaults] setObject:favList forKey:@"key"];
[[NSUserDefaults standardUserDefaults] synchronize];

これでOKです。

 


MacOSXにVirtualBox+Vagrantを導入してCentOS環境を構築する

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので十分ご注意ください。

MacOS X上に仮想化ソフトウェアとしてVirtualBox、仮想環境管理ツールとしてVagrantを導入し、CentOS環境を構築する手順の記録。

※2014.7.31現在の内容です

■前提条件

・MacOS X 10.9.4
・VirtualBox 4.3.14
・Vagrant 1.6.3
・CentOS 6.4

 

■手順

(1) VirtualBoxのインストール


下記ページの
https://www.virtualbox.org/wiki/Downloads

VirtualBox 4.3.14 for OS X hosts の x86/amd64
をクリックしてdmgファイルをダウンロードし、MacOS Xにインストール。

 

(2) Vagrantをインストール

下記ページの
http://www.vagrantup.com/downloads
MAC OS X Universal (32 and 64-bit)
をクリックしてdmgファイルをダウンロードし、MacOS Xにインストール。

 

(3) boxファイルをダウンロード

以下のサイトにboxファイルが列挙されています。
http://www.vagrantbox.es/
今回はCentOS 6.4 x86_64 Minimalを導入します。

$ vagrant box add centos64 http://developer.nrel.gov/downloads/vagrant-boxes/CentOS-6.4-x86_64-v20131103.box
==> box: Adding box 'centos64' (v0) for provider:
    box: Downloading: http://developer.nrel.gov/downloads/vagrant-boxes/CentOS-6.4-x86_64-v20131103.box
==> box: Successfully added box 'centos64' (v0) for 'virtualbox'!
$ vagrant box list

centos64 (virtualbox, 0)

ダウンロード完了までには少し時間がかかります。

 

(5) 任意の場所に仮想マシン用のディレクトリを作成

$ mkdir centos
$ cd centos

 

(6) 仮想マシンの初期化

$ vagrant init centos64
A `Vagrantfile` has been placed in this directory. You are now
ready to `vagrant up` your first virtual environment! Please read
the comments in the Vagrantfile as well as documentation on
`vagrantup.com` for more information on using Vagrant.

Vagrantfileが生成されます。

 

(7) 仮想マシンの起動

$ vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Importing base box 'centos64'...
==> default: Matching MAC address for NAT networking...
==> default: Setting the name of the VM: centos_default_1406797151929_32405
==> default: Clearing any previously set network interfaces...
==> default: Preparing network interfaces based on configuration...
    default: Adapter 1: nat
==> default: Forwarding ports...
    default: 22 => 2222 (adapter 1)
==> default: Booting VM...
==> default: Waiting for machine to boot. This may take a few minutes...
    default: SSH address: 127.0.0.1:2222
    default: SSH username: vagrant
    default: SSH auth method: private key
    default: Warning: Connection timeout. Retrying...
    default: Warning: Connection timeout. Retrying...
==> default: Machine booted and ready!
==> default: Checking for guest additions in VM...
    default: The guest additions on this VM do not match the installed version of
    default: VirtualBox! In most cases this is fine, but in rare cases it can
    default: prevent things such as shared folders from working properly. If you see
    default: shared folder errors, please make sure the guest additions within the
    default: virtual machine match the version of VirtualBox you have installed on
    default: your host and reload your VM.
    default:
    default: Guest Additions Version: 4.2.12
    default: VirtualBox Version: 4.3
==> default: Mounting shared folders...
    default: /vagrant => /Users/****/centos

これで仮想マシンが立ち上がりました。

 

(8) 仮想マシンに接続

$ vagrant ssh
[vagrant@localhost ~]$

インストールしっぱなしの状態ですが、下準備はOKです。あとは必要に応じて環境を構築していきます。

なお、仮想マシンを常時起動しておくとマシンリソースを消費しますので、不要なときはシャットダウンしておきます。

シャットダウンは、

$ vagrant halt
==> default: Attempting graceful shutdown of VM...

これでOKです。