Wonderful Life

サボりがちだけど備忘録です。思ったままに書いてます。

AppCodeをInstallして最初にすること&ショートカット

QiitaのObjective-C Advent Calendarにも投稿した内容です。
20日目担当です。

今回紹介するのは主にSettings周り。
Cmd + ,で設定画面が開きます。

行末より後ろでもクリックできる状態を解除する

  • Editorを選択
    • Allow placement of caret after end of lineのチェックを外す

Incremental SearchのKeymap設定

  • Keymapを選択
    • Otherを選択
      • Incremental Searchをダブルクリック -> Add Keyboard Shortcut
      • 自分はctrl + sで設定してます

ctrl + 左右の設定を無効にする

これはMacのKeymapの話。
AppCodeは複数のタブを開く事が可能で、
ctrl + 左右を実行するとタブを左右に移動できます。
Macでのこのショートカットは、Mission Controlの画面移動となっています。
バッティングしないようAppCodeかMission Controlかどちらかを変更しましょう。

エディタのカラースキームを変更する

  • Editorを選択
    • Color & Fontsを選択
      • あとは好きなモノを選ぶ or スキーム作成
      • 個人的にお気に入りはCobalt

補完されるキーワードとか括弧をカスタマイズ

  • Code Styleを選択
    • Objective-Cを選択
      • あとはよしなに

自分がカスタマイズしてる部分

  • Wrapping and Bracesタブ
    • Braces placement
      • In classes and structuresを選択 -> Next lineを設定
      • In namespaceを選択 -> Next lineを設定
      • In methodsを選択 -> Next lineを設定
      • In functions and blocksを選択 -> Next lineを設定

class作成時の@interfacemethodなどなどの自動挿入時、
{は改行されてから挿入するようにしてます。

@interface Hoge : NSObject
{

}

@end

@implementation Hoge
{

}

- (void)function
{

}

Xcodeのテンプレを見てると、括弧が改行されてたりされてなかったりしてキモい。

スニペット登録

  • Live Templates
    • Objective-Cを開くとスニペット一覧が表示される
    • +を押すと新しいスニペットが登録できる

例えば

ifとかelseのスニペットは最初登録されてないので、登録してみる。

  1. +を押して新規作成
  2. Abbreviation: if
  3. Description: call if(説明文、コーディング時にも表示される)
  4. Template text: 後述
  5. No applicable contexts yet. -> Defineをクリック
  6. Objective-Cを開いて、statementにチェック
if ($VAR$) {
  $END$
}

$で囲んだキーワードはEdit Variableボタンから属性を選択でます。
Default Valueの設定とかも可能です。
実際にスニペットを使って入力してる時に、
$VAR$などの変数の入力が終わったら$END$にジャンプできます。

蛇足

AppAppCodeで知っていると便利なショートカット12選
こちら便利なショートカットを紹介している方がいたので、
私からも個人的に良く使ってるショートカットを紹介します。

1. ctrl + 上下

開いているコード内で、メソッド単位のジャンプができます。
メソッドの頭に飛ぶので意外と便利。

2. cmd + 1

エディタ外のプロジェクトのウィンドウを開閉できます。
フォーカスもそのウィンドウへ移るので、そのままcmd + Nを押すとClass作成などのポップアップが表示されます。
ポップアップにはCategoryやGroupの作成メニューなどもあるので便利です。

cmd + 数字はエディタ外のウィンドウにアクセスする便利なショートカットです。

  • cmd + 1 : Project
  • cmd + 2 : Favorte
    • AppCodeはコード内にブックマークの設定ができます
  • cmd + 4 : Run
    • ctrl + Rで実行したウィンドウを開きます
    • このウィンドウ内もControl+左右でタブ切り替えができます
  • cmd + 5 : Debug
    • Cmd + 4とほぼほぼ同じ
  • cmd + 6 : TODO
    • コード内に// TODO:と書いてあればここに表示されます
    • 一覧表示されて探しやすいのでTODO書く気になれます
  • cmd + 7 : Structure
    • 開いてるファイルのクラスやメソッドを一覧表示してくれます
    • Eclipseで右側に表示されてるアレですね

これらウィンドウはエディタの上下左右のどこかに移動することができます。
大きな画面なら左にProject、右にStructure、下にRun/Debug、中央にエディタ、といった感じで配置すると使いやすいかもしれません。

3. ctrl + O

Overrideできるメソッドを一覧表示してくれます。
文字を入力するとメソッドを検索してハイライトしてくれます。
(もちろんキャメルケースで)
cellForRowAtIndexPathとか、didSelectedRowとか
あの辺のメソッドは全部これで一発補完です。
マジ便利です。

4. ctrl + I

実装するDelegateのメソッドを一覧表示してくれます。
ctrl + OのDelegate版ですね。
これもマジ便利です。
上のショートカットと合わせて使うと非常に捗ります。

5. cmd + shift + O

ファイルを検索してくれます。
もちろんキャメルケースでも。
cmd + O(クラス検索)と併用すると便利。

6. ctrl + 左右

上でも紹介したタブ移動。
タブ移動ができないエディタは使いにくくて仕方ない。

7. cmd + ctrl + 上

.hと.mの切り替え。
両者を行き来する頻度は非常に高いので、
これがあると凄く捗る。

8. インクリメンタルサーチ

上でも紹介しました。
デフォルトだとショートカットが設定されてない。
私はctrl + Sとかに設定してます。
cmd + Fでも問題無いですが、それよりもスムーズに検索から入力に移れるのでちょっと便利です。

9. cmd + shift + F

プロジェクト内全体で文字列検索してくれます。
たまに使う。

最後に

少し長くなってしまいましたが、
AppCodeには便利な機能が満載です。

もちろん欠点もあり、
Interface BuilderはXcodeからでないと使えませんし、
プロジェクトの設定もXcodeを使ったほうが詳細に設定できます。
なのでこのあたりの変更を行うときだけはXcodeを使います。

使い分けが必要なのでその辺はどうしても手間がかかってしまいますが、
コーディング時はこちらのほうが間違いなく快適です。

有償のエディタですが、30日のTrial期間があるので、
是非お試しあれ!

iPhone 5にPJSIPを組み込む

Objective-C Advent Calendar 2012の15日目の記事となります。

以前書いてた内容が何故か消してしまっていたようなので2度目の文章作成です。。。
あんまりObjective-Cらしくない内容ですが、ご愛嬌。

PJSIPとは

オープンソースのSipStackです。
SIPについてはぐぐってくれると嬉しいんですが、VoIPとかあの辺の話ですね。
詳しくはぐぐって!
超超ざっくり言うとこれを組み込んだらIP電話が使えるよって話です。

今回の流れ

iPhone5用にコンパイルして、Xcodeに組み込むまでをやってみようかと思います。
組み込んだ後のコーディングはまた機会があれば紹介しようと思います。
そんなにしっかりコード書いたことないけど。

というわけで、さっそく本題に移りましょう!

環境

PJSIPをダウンロードする

Getting Started: Building for Apple iPhone, iPad and iPod Touch
ここを参考にして進めます。

まずはソースコードを落とします。
ターミナルを起動して以下を実行します。
(zipもあるようですが今回はsvnで)

svn co http://svn.pjsip.org/repos/pjproject/trunk/ pjsip

PJSIPをコンパイルする

makeとかよく知らない自分にはここが一番の難所でした。
色々とファイル編集してからmakeするだけなんですけどね。。。

# Checkoutしたディレクトリへ移動
cd pjsip

# Vimでファイル編集
vim pjlib/include/pj/config_site.h

内容は以下をコピペ

#define PJ_CONFIG_IPHONE 1
#include <pj/config_site_sample.h>

次にconfigureをいじります。
iPhone5用にコンパイルするので、armv7となっているところをarmv7sに修正します。
「armv7」と検索したら1箇所だけヒットしたので、そこを書き換えただけです。

vim configure-iphone

configure-iphoneの80行目くらい

#export ARCH="-arch armv7"
export ARCH="-arch armv7s"

修正できたら以下を実行します。

./configure-iphone

エラーがでなければmakeします。

make dep && make clean && make

エラーがでなければOK!

Xcodeへ組み込む

Xcodeで新規にプロジェクトを作成します。
以下のディレクトリをプロジェクトに追加します。

  • pjsip/
    • pjlib/
      • include/
      • lib/
    • pjlib-util/
      • include/
      • lib/
    • pjmedia/
      • include/
      • lib/
    • pjnath/
      • include/
      • lib/
    • pjsip/
      • include/
      • lib/
    • third_party/
      • include/
      • lib/

f:id:niyaty:20121215002253p:plain

上のディレクトリ全てを以下の追加します。

  • Header Search Paths

f:id:niyaty:20121215002059p:plain

  • Library Search Paths

f:id:niyaty:20121215002101p:plain

と思ってたら、プロジェクトにファイルを追加した段階でLibrary Search Pathsも追加されてました。
ライブラリの追加もできてました。
Build PhasesLink Binary With Libraries から確認できます。

f:id:niyaty:20121215002309p:plain

あとはiPhone5を繋いで、
AppDelegate.mあたりに以下を追加してビルドしてみましょう。

#include <pjsua-lib/pjsua.h>

これでエラーなく実機でビルドできればOK!
iPhone5用にコンパイルしてるので、simulatorでは動きません。
エラー出て怒られると思います。

最後に

実装の際はこのサンプルを見ながら書いてみると良いでしょう。
Samples: Simple PJSUA

APIはここを参照。
PJSUA API - High Level Softphone API

言うのが遅くなりましたが、もちろん電話番号が必要です。
iptelなら無料で電話番号を発行してもらえます。
iptel.org

探せば他にもたくさんあるはずなので探してみては如何でしょう。

んで

ぼくはCもSIPも詳しくないので質問されてもわかりません!
むしろ教えて下さい。

ということで、お疲れ様でございました。

参考

PJSIPをXcodeに組み込む

Storyboardで定義したViewControllerを呼び出す

複数の画面からModalで設定画面を呼びたいケースがあったので、
その時の手法をメモ。

  1. Storyboard上で、ViewControllerを定義する
  2. Storyboard上で、ViewControllerのStoryboardIDを定義する
  3. 呼び出したいクラスで下記のコードを実行する
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
UINavigationController *nc = [storyboard instantiateViewControllerWithIdentifier:@"SettingsViewController"];
[self presentViewController:nc animated:YES completion:nil];

注意

上記のコードのようにUINavigationControllerを呼び出す場合には、
Storyboard上でUINavigationControllerのStoryboardIDを定義する。

ViewControllerのみを呼び出す場合には、
Storyboard上でViewControllerのStoryboardIDを定義する。

余談

はてなブログがmarkdown形式での投稿に対応してたのを知らなかったので、
今回はそれを試してみました。

markdownを使用している、「Qiita」や「Kobito」といったツールも使っているので、
はてなブログでもmarkdownを使えば記述方法が統一されて混乱しなくなりますね。
文章のレイアウトや文字の装飾といったところはなるべく楽に書きたいものです。
ブログはいつも文章の装飾が面倒で三日坊主になりがちだったので・・・。

便利なモノが増えましたねー。

NSNotificationCenterの通知でMainThread実行

Notificationを使ってUIの更新をしたい場合、
NSNotificationCenterからperformSelectorOnMainThreadを呼んであげると良い。

NSNotificationCenter *center = [NSNotificationCenter defaultCenter];
[center performSelectorOnMainThread:@selector(postNotification:)
                         withObject:[NSNotification notificationWithName:@"name" object:nil]
                      waitUntilDone:NO];

期待通りUIが更新される。

良くない例

NSNotificationCenter *center = [NSNotificationCenter defaultCenter];
[center postNotification:@"name"];

通常の呼び方だと新スレッドでメソッドが実行されるようなので、
これだとUIがうまく更新されない。

利用するシーン

自分の場合は、
C言語のライブラリを使っていて、
C言語のcallbackからどうやってUI更新するんだ?」
と悩んでいたところ、これで解決。

NotificationからUI更新という利用シーンは多いはずなので、
カテゴリあたりでラップしてあげるともっと使いやすくなりそう。

そういえば転職しました

9月いっぱいで某人材派遣会社を退職しました。
10月から事業会社?と言えばいいのかよくわからないけど、
自社サービス展開してるような会社に転職しました。

振り返ってみて

今年で26歳になりましたが、新卒で入社してから9月いっぱいまで。
初めての社会人生活を始めてから約3年半を過ごしていたようなので感慨深いモノがあります。
会社としてはどうだったかというとよくわからない部分もまだあったけど、
仲良くしていた人は良い先輩後輩ばかりで楽しかった。
規模の大きい会社だったので、もちろんそれ以外の人も多かったわけだけど。。。

月に1度くらいは勉強会もやるようになって、
社員同士高め合ったりもできて良い環境でした。
派遣という立場のおかげか、現場では手広くやるのが難しかったりもしたかな。。。

これから

直近でiPhoneアプリ開発を1年くらいやっていて、
転職先ではサーバサイドもりもりやるのかと思ってたら、
まさかのiPhoneアプリ開発プロジェクトが始動してた!
というわけで当分Appleに振り回される生活は続きそうです。

うちのエンジニアさんは基本システム屋さん。
バックエンドのエキスパートばかり。
iPhone触れるのが自分だけという厳しい状況だけど、
これもまた今までになかった経験なので燃えているw

会社のポリシーとしても、必要なモノは使う、というスタンスのようなので、
チャレンジ精神あふれる人ばかり。
きっと自分にもそういうチャンスが来たらチャレンジするんだろうと思う。
楽しい職場に来れたと思う。
メールがGoogleAppsだったり、EvernoteやDropboxが自由に使えるという状況なので、
自分の環境づくりが非常に楽で助かった。
Chromeも同期できるしね。

仕事とプライベートの境界線を見失いつつあるけど、
これは自分が求めていたモノ(だったはず)なので頑張ろうと思います。

最後に

今日は社長とお昼ごはんを食べてましたが、
「自由にやろうぜ!その分は責任がついてくるけどな!」
というありがたいお言葉を頂いたので、
どんどんやりたいことやっていこーと思います!

CGRectを一発表示

UIViewの座標とか確認するためにいつも

view.frame.origin.x

とか頑張って書いてた。。。
全部出力する方法知らなくてホント損してたw

UIView *view = [[UIView alloc] initWithFrame:CGRectMake(64, 32, 248, 32)];
NSLog(@"%@", NSStringFromCGRect(view.frame));

↓出力結果

{{64, 32}, {248, 32}}

これは便利だわ・・・

git pushしちゃったのを取り消したい

これだけに時間かけすぎたのでメモ。
gitもっと勉強せな・・・。

はじめに

bitbucketを使ってiOSアプリを開発してました。
masterとdevelopの2つのブランチであちこち修正しながら開発中。

色々リファクタリングとか抽象化とかやってたんだけど、
動作もっさりなのにmasterブランチにcommitしてpushしちゃった残念なパターン。
developでまた色々実験しててパフォーマンスよくなったので、
masterでコミットしちゃったモノを取り消して、
developの変更を反映させたい・・・。

↓↓恥ずかしいコミット
f:id:niyaty:20120910231608j:plain

困ったこと

masterにpushできない。
一旦masterを削除して再度pushしな!って情報を見た気がするけどダメだった。

% git reset --hard { ハッシュ値 }

% git push origin :master
remote: bb/acl: niyaty is allowed. accepted payload.
remote: error: refusing to delete the current branch: refs/heads/master
To git@bitbucket.org:niyaty/myproject.git
 ! [remote rejected] master (deletion of the current branch prohibited)
error: failed to push some refs to 'git@bitbucket.org:niyaty/myproject.git'


以下の記事を参考に実行(そのまま実行しましたすいません)
http://d.hatena.ne.jp/shunsuk/20101202/1291278345

  • fオプションつけてガチムチpushな感じでイケてない気がするけど、

1人でいじってるリポジトリだから、まぁいいんじゃないかと・・・。
複数でいじってたらこれはNGですね。
色んな人から怒られそう。。。

反省点

git勉強しなさいの一言なんだけど・・・。
自分1人だからってcommitが適当すぎるかな。
masterあまり触らないようにしたほうが良いかも。
勉強がてらgit-flowとか使ってみても良いのかなー。

よーく考えてmasterにcommitしよう、という教訓になりました。