2012年1月27日金曜日

加速度から角度を求める

//加速度取得間隔の設定[sec]
    self.motionManager.accelerometerUpdateInterval = 0.01;
// デバイスモーションの取得開始

    NSOperationQueue *queueAccl = [[[NSOperationQueue alloc] init] autorelease];
    [self.motionManager startAccelerometerUpdatesToQueue:queueAccl
                                             withHandler:^(CMAccelerometerData *data, NSError *error) {
                                                 dispatch_async(dispatch_get_main_queue(), ^{
                                                     x=data.acceleration.x;
                                                     y=data.acceleration.y;

                                                     radian=atan2(x,y)*(180 / M_PI);//角度の計算
                                                     
                                                     NSLog(@"%f",radian);


                                                 });
                                             }];

2012年1月24日火曜日

リソース

ObjectiveC開発で読んだアップルのPDFドキュメントリストです。
随時更新していきます
CoreMotionのCMLogItemクラスについてのドキュメント
http://developer.apple.com/library/ios/DOCUMENTATION/CoreMotion/Reference/CMLogItem_Class/CMLogItem_Class.pdf
ブロック書式についてのドキュメント
http://developer.apple.com/jp/devcenter/ios/library/documentation/Blocks.pdf

ブロックについて(追記)


ブロック変数を宣言し、ブロックリテラルの始まりを表すには、^演算子を使用します。ブロックの本体は、したの例のように、{}で囲まれます

int multiplier = 7;
int (^myBlock)(int) = ^(int num) {
return num * multiplier;
};
ブロックでは、ブロックが定義されているスコープ(有効範囲)に含まれている変数を利用できま す。 ブロックを変数として宣言した場合には、ブロックを関数と同じように使用できます。
int multiplier = 7;
int (^myBlock)(int) = ^(int num) {
return num * multiplier;
};
printf("%d", myBlock(3));
// "21"と出力する


ブロックの概念
アップルのドキュメントにはブロックについて下記のように定義されています


ブロックは、以下のような特徴を持つ無名のインラインコードの集合体です。
● 関数と同様に、型付きの引数リストを持つ
● 推定または宣言された戻り値型を持つ
● ブロックの定義を含むレキシカルスコープの状態を把握できる
● 必要であれば、レキシカルスコープの状態を変更できる
● 変更できるかどうかは、同じレキシカルスコープ内で定義されているほかのブロックと共通である
● レキシカルスコープ(スタックフレーム)が破棄された後も、引き続きそのレキシカルスコープ内で定義されている状態を共有したり変更したりできる
ブロックをコピーしたり、遅延実行のために、ブロックをほかのスレッドに渡すこともできます(または、ブロック自身のスレッド内で、実行ループに渡すことができます)。コンパイラとランタイムは、ブロックのすべてのコピーが存続している間は、そのブロックから参照されるすべての変数を保持するように調整します。ブロックは純粋なCおよびC++で利用できますが、ブロックは常にObjective-Cのオブジェクトでもあります


ブロックの使い方


通常、ブロックは自己完結的な小さなコード部品です。このため、ブロックは、並列に実行されたり、1つのコレクション内の複数のアイテムを対象に実行される一連の作業をカプセル化する手段として、また、別の操作が終了したときのコールバックとして、特に有用です。
ブロックは、主に次の2つの理由から、従来のコールバック関数に代わる有用な手段になります。
1. ブロックを利用すると、メソッド実装のコンテキストで後から実行されるコードを、呼び出しの時点で記述できます。したがって、通常、ブロックはフレームワークメソッドのパラメータになります。

2. ブロックでは、ローカル変数にアクセスできます。
操作の実行に必要なすべてのコンテキスト情報を具体化したデータ構造を要求するコールバックを使用する代わりに、単純にローカル変数に直接アクセスできます。

変数について
ブロック内で使える変数は
クラス変数、ブロックで定義されている関数の変数、__blockストレージ型で定義された変数の3つです。
ブロック内に新しい変数を定義してもエラーが出ます。

__blockストレージ型の使い方例
__block int x = 123; //  xはブロック外
void (^printXAndY)(int) = ^(int y) { //yしか変数が定義されていない
x = x + y;
printf("%d %d\n", x, y);
};
printXAndY(456); // "579,456"と出力する
// xは現在579

CoreMotionで加速度取得

CMMotionManager *manager = [[CMMotionManager alloc] init];
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
// サンプリングレート 100Hz
manager.accelerometerUpdateInterval = 1.0/100;
// 加速度取得開始
[manager startAccelerometerUpdatesToQueue:queue withHandler:
  ^(CMAccelerometerData *data, NSError *error) {
      // 加速度データを取得した時に呼び出されるブロック
      NSLog(@"%f,%f,%f,%f", data.timestamp, 
       data.acceleration.x, data.acceleration.y, data.acceleration.z);
  }
];

2012年1月19日木曜日

複数ビューの呼び出し

iPhoneアプリを作成していくにつれ、1画面で動作するアプリではなく、複数の画面を切り替えたほうがいいケースもたくさんでてくるかと思います。
複数のビューの切り替え方法と準備する流れをメモっておきます
①二個目ののビューコントローラーを作成

適当ななまえをつけます
②xibファイルを追加
user interface→viewを選択、適当な名前をつける
③xibファイルの設定を行う
xibファイルを選択し、File'sOwnerを選択して、右ペインの赤丸の部分を選択。
CustomClassのClassを先ほど追加したビューコントローラーの名前を選ぶ。

④コーディング
最初のビューから二個目のビューを呼び出すので
最初のビューの.mファイルに二個目のビューコントローラーのヘッダファイルをimportし、下記のようなコードでxibファイル名を指定してあげます



2012年1月17日火曜日

僕がObjectiveCに苦戦する理由

ObjectiveCの勉強をはじめて、プログラムの組み立て方やや部分部分での動きはつかめてきたのですが、いまいち書いた処理がどのような順番で呼び出されているか、たくさんヘッダファイルがあるがどのように関連しているかなどがいまいちつかみにくく、苦戦しています。
なぜこんなに苦戦しているかを考えると、PHPなどサーバーサイドのプログラムを見てきたので、イベントドリブンなプログラムの頭で見ているからなのかなと思いました。
考え方の転換を図りたいところです。プログラムの動き方について良い資料を探してそこを理解することから始めたほうがいいような気がしてきました。

ObjectiveC学習サイト

スタンフォード大学のiOSプログラミングコースの教材がとてもわかりやすく、サンプルソースも書いてあるので今週は教材を見ながら学習をしています。

ObjectiveCを学んでいる方はおすすめです!

http://www.stanford.edu/class/cs193p/cgi-bin/drupal/

ブロックについて

ブロック=無名関数
その場限りの名無しの関数
ブロックで書かれる処理のreturnは一個しか書けない

ブロックの書き方
^(仮引数){実行する処理}
ex)
^(id num1 id num2){
if(num1>num2){
res = num1;
}else{
res = num2;
}
return res;
}
書き方2
void (^変数名)(引数)=^(仮引数){処理}


NSNumber (^block)(id,id) = ^(id num1, id num2){
NSnumber result;
if(num1 > num2){
result = num1;
}else{
result = num2;
}
return result;

のような書き方がある
"^"は、関数のポインタを示す。

2012年1月14日土曜日

思いついたサービス


●どの様なサービスか
スマートフォンを使い、絵文字や表情のアイコンなど言語を使わない絵を通じたコミュニケーションをおこなうツールです
●どのような問題を解決するか
何らかの障害などで言葉での表現が難しい方、異なる言語を持つ人とのコミュニケーションをよりカンタンにします。
●ほかとどう違うのか
絵で感情を表現することはデコメや自閉症の人むけのツールなどで可能となっていますが、きまったパターンの絵しかなく、定形的な表現になってしまいます。
絵と表現する言葉を誰でも作って共有して、表現の内容が増えていく所が大きな違いです。

●なぜ必要性があるか
自分の気持を十分に表現できないことは苦痛ですし、障害を持っていない人にとっても言葉だけではコミュニケーションの齟齬があります。
このツールは、人のコミュニケーションにおいて表現の幅をもっと広げてより豊かなコミュニケーションをサポートしてくれるツールになるでしょう

2012年1月13日金曜日

NSArrayの内容をフィルタリングして取り出す

配列からあるものを取り出したい場合、if文で回したり自前で処理を書いたりする必要がありますが、NSPredicateを使うととても便利になります。
サンプルソース
#import 

int main(int argc, const char * argv[])
{

    @autoreleasepool {
        id tst = [NSArray arrayWithObjects:@"one",@"two",@"three",@"four",@"five",@"six",nil]; //oneからsixまでのObject配列を作成
        id pred = [NSPredicate predicateWithFormat:@"self BEGINSWITH 'f'"];
        id filtered = [tst filteredArrayUsingPredicate:pred];
        NSLog(@"%@",filtered);
        return 0;
        
    }
    return 0;
}
NSPredicateの書き方
@"キーパス 演算子 リテラル"
キーパスとは、演算対象の要素をことを差し、配列に保管されてるObject自体を指す場合はself、長さなどそれぞれの性質でフィルタリングを行う場合はlengthなどと書きます。
演算子の種類文などで使われる演算子に加えて下記の演算子を使います
BETWEEN-一定の範囲を指定し、指定された数の間の文字数のObjectを出力
【例】
id bet = [NSArray arrayWithObjects:[NSNumber numberWithInt:2],
[NSNumber numberWithInt:5],nil];
id pred = [NSPredicate predidateWithFormat:@"length BETWEEN %@",bet];
BEGINSWITH、ENDWITH-指定のリテラルから始まる/終わる要素を取り出す
CONTAINS-指定のリテラルが含まれるもののみを取り出す
LIKE-*や?などのワイルドカードをつかった取り出し
MATCHES-正規表現や完全マッチしたものを取り出す
フィルタリングを行う処理を自前で書かなくても指定するだけで抽出してくれるので便利です

2012年1月11日水曜日

NSDate初級

id date = [NSDate date]; //dateメソッドで現在日時を示すdateインスタンスの生成
NSLog(@"%@",date);
出力結果
2012-01-11 11:11:11 +900

-指定した日時のNSDateインスタンス生成方法-

dateWitnStringメソッドを利用してインスタンスを生成する。-

[NSDate dateWithString "指定の日時"]
[NSDate dateWithNaturalLanguageString "指定の日時"];
"指定の日時"の書式
2011-01-01 0:00:00 +900