jubilee

Programing, Books and more...

git branchのメモ

分岐させると、他のブランチの影響を受けないので、同じリポジトリ内で複数の変更を進めることができる。
例えば、
「masterブランチ:大本の開発中」に機能を追加したいが、うまくできるかわからないのでちょっと試験的にやってみたい。
だけど、ダメだった時に追加前に戻せるかが不安。
こんな時にブランチをきって、そっちで機能追加をする。
うまく行けばmasterにマージし、だめならブランチを削除すればmasterに影響はない。

ブランチの一覧を表示

1
2
$ git branch
* master  // masterしかない状態

ブランチを作成

masterの状態を複製して、ブランチが作成される。

1
2
3
4
5
$ git branch ブランチ名
// 状態を表示
$ git branch
 ブランチ名
*master // masterブランチにいる

ブランチを切り替える

1
2
3
4
5
$ git checkout ブランチ名
// 状態を表示
$ git branch
*ブランチ名  // このブランチにいる
 master

作業

このブランチで作業し、add, commit

masterにマージする

ブランチで作業した内容をmasterにマージする。

1
2
3
4
5
6
7
8
// 一旦、masterに切り替える
$ git checkout master
// 状態を表示
$ git branch
 ブランチ名
*master // masterブランチにいる
// マージする
$ git merge ブランチ名

ブランチを削除する

不要になったブランチは削除する。

1
2
3
4
$ git branch -d ブランチ名
// 状態を表示
$ git branch
*master

参考:http://www.backlog.jp/git-guide/stepup/stepup1_1.html

JSONからデータを取得する方法

以下のようなJSONデータから指定したデータを取得する方法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
meta = 
{
    method = POST;
    url = "/app/ApiPosts/post.json";
};
response =    /// (1)
{
    "comment_id" = 144;   /// (2)
    "video_id" = 144;
    Adviser = {
        name = "<null>";
    };
    Post = {
        "adviser_id" = "-1";
        "video_id" = 144;   /// (3)
    };
    User = {
        id = 1;
        username = taro;
    };
    Comments =  /// ここは配列でComment-Videoが1セットで複数セットくる
    (
        {
            Comment = {
                comment = "\U305d\U305d\U305d\U305d\n";   /// (4)
                id = 144;
            };
            Video = {
                hash = 266d1a0ccabc501149322446e49e274a;    /// (4)
                id = 144;
            };
        }
    );
};

(1) response = 以下のデータを取得

1
NSDictionary *responseDataDic = (NSDictionary*)responseObject[@"response"];

(2) comment_idのデータを取得

1
NSLog(@"commnt_id : %@", responseDataDic[@"comment_id"]);

(3) Post の video_idのデータを取得

1
NSLog(@"Post video_id: %@", responseDataDic[@"Post"][@"video_id"]);

(4) Commentsの中のComment-commentとVideo-hashを取得

1
2
3
4
5
/// 高速列挙で辞書に抜き出し
for (NSDictionary *dic in responseDataDic[@"Comments"]) {
    NSLog(@"Comment id: %@", dic[@"Comment"][@"id"]);
    NSLog(@"Video id: %@", dic[@"Video"][@"id"]);
}

もしくは2ステップで

1
2
3
4
5
6
7
8
9
10
11
/// 可変配列を用意
NSMutableArray *array = [NSMutableArray array];
/// 高速列挙でComments部分を辞書に抜き出し、それを可変配列に追加
for (NSDictionary *dic in responseDataDic[@"Comments"]) {
    [array addObject:dic];
}
/// 可変配列から辞書に抜き出し
for (NSDictionary *dic in array) {
    NSLog(@"Comment id: %@", dic[@"Comment"][@"id"]);
    NSLog(@"Video id: %@", dic[@"Video"][@"id"]);
}

Objective-Cの真偽値

通常はBOOLなのでこっちを使う

  • 真:YES : 1
  • 偽:NO : 0

Booleanの場合

  • 真:TRUE : 1
  • 偽:FALSE : 0
1
2
3
if (!new_flg) {
    偽の判断(new_flgの値はNO = 0
}

OpenSSLのバージョンアップ

2014.8.5現在の最新版は 1.0.1h。

バージョン確認

1
2
3
4
5
$ openssl version
OpenSSL 1.0.1g 7 Apr 2014  ← Macにインストールされているバージョンが表示される

$ brew info openssl
openssl: stable 1.0.1g (bottled)  ← HomeBrewのデータベース上の情報

Homebrewのデータベースを更新

1
2
3
4
$ brew update

$ brew info openssl
openssl: stable 1.0.1h (bottled) ← 更新された

OpenSSLの更新

1
2
3
$ brew upgrade openssl
...
...

利用可能か確認

1
2
3
4
5
$ openssl version
...

$ which openssl
/usr/bin/openssl ← Homebrewでインストールしたものではない

$ brew upgrade openssl のログに This formula is keg-only, so it was not symlinked into /usr/local. とあるように、まだリンクされていない。

HoembrewでインストールしたOpenSSLの使用設定

1
2
3
4
5
6
7
$ brew link openssl --force
...
$ openssl version
OpenSSL 1.0.1h 5 Jun 2014 ← 変わらない場合は、一度Terminalを再起動

$ which openssl
/usr/local/bin/openssl

UIButtonでタップ毎にボタン画像を切替える

UIButtonをトグルスイッチのように使う方法。
プレイボタン → タップ → ストップボタン → タップ → プレイボタン

ボタンに画像を設定する

viewDidLoadなど。画像はアセットカタログに登録済み。

1
2
3
4
5
6
7
8
// 通常(プレイ)
[_button setImage:[UIImage imageNamed:@"playButton"] forState:UIControlStateNormal];
// プレイでボタンをタップ中
[_button setImage:[UIImage imageNamed:@"stopButton"] forState:UIControlStateHighlighted];
// ストップ
[_button setImage:[UIImage imageNamed:@"stopButton"] forState:UIControlStateNormal | UIControlStateSelected];
// ストップでボタンをタップ中
[_button setImage:[UIImage imageNamed:@"playButton"] forState:UIControlStateHighlighted | UIControlStateSelected];

ボタンタップアクション

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
- (IBAction)userButtonTapped:(UIButton *)sender {
    sender.selected = !sender.selected;   // これが重要(状態を入れ替える)
    // プレイをタップ
    if (sender.selected) {
        _userTimer = [NSTimer scheduledTimerWithTimeInterval:[_userFrameSpeedInfos[0] floatValue]
                                                      target:self
                                                    selector:@selector(timerUserView:)
                                                    userInfo:nil
                                                     repeats:YES];
    }
    // ストップをタップ
    else {
        [_userTimer invalidate];
    }
}

おまけ

タイマーが停止した時にボタンをプレイに戻す。

1
2
3
4
5
6
7
8
9
10
11
12
13
 - (void)timerUserView:(NSTimer*)timer
{
    int index = ++_userFramIndex;
    if (index < [_userFrameImageInfos count]) {
        [self displayFrameImageAtIndex:index userDistinction:USER];
    }
    // タイマーを止める
    else {
        [timer invalidate];
        _userFramIndex = 0;
        [_userButton setSelected:NO];   // これでプレイに戻る
    }
}

UIImageViewにスワイプジェスチャーを適用させる

通常に設定(コード or Interface Builder)からだけでは、反応しない。
UIImageViewの初期値が「User Interaction Enabled = NO」になっているので、 以下を設定。(Interface Builderからでも、Attributte Inspector – View – User Interaction Enabledのチェックで可)

1
[_imageView setUserInteractionEnabled = YES];

UINavigationBarの色を制御する

NavigationBarのカラーやアイテムの色を制御する方法。
NavigationControllerの次のViewControllerで設定を行う。

1
2
3
4
5
6
// 背景色
self.navigationController.navigationBar.barTintColor = [UIColor colorWithHex:@"2F78B7"];
// アイテムの色
self.navigationController.navigationBar.tintColor = [UIColor whiteColor];
// タイトルの色
self.navigationController.navigationBar.titleTextAttributes = @{NSForegroundColorAttributeName:[UIColor whiteColor]};

UIScrollViewでタップ検知を追加

UIScrollViewはタップを検知しないため、レスポンダチェーンでVIewControllerまでtouchesBegan:withEventが通知されない。
なので、TextView入力時にキーボードに隠れないようにView位置を押し上げ、入力終了時に画面タップでキーボード非表示制御ができない。
解決法としては、タップイベントを次のレスポンダーに投げるようなUIScrollViewのカテゴリ(touchesBegan:withEvent)を作成する。

UIScrollView+TouchEvent.h

1
2
3
4
5
#import <UIKit/UIKit.h>

@interface UIScrollView (TouchEvent)

@end

UIScrollView+TouchEvent.m

1
2
3
4
5
6
7
8
9
10
#import "UIScrollView+TouchEvent.h"

@implementation UIScrollView (TouchEvent)

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    [[self nextResponder] touchesBegan:touches withEvent:event];
}

@end

ViewController.h

1
#import "UIScrollView+TouchEvent.h"

ViewController.m

1
2
3
4
5
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    // タップ時の処理を記述
    [self.view endEditing:YES];
}

ちなみに、「userInteractionEnabled = YES;」は記述しないでも動作している。

参考:
(http://qiita.com/Potof_/items/1432c39dab083f770e59)
(http://www.objectivec-iphone.com/event/touch-event/touchesBegan.html)