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作成時の@interface
やmethod
などなどの自動挿入時、
{
は改行されてから挿入するようにしてます。
@interface Hoge : NSObject { } @end @implementation Hoge { } - (void)function { }
Xcodeのテンプレを見てると、括弧が改行されてたりされてなかったりしてキモい。
スニペット登録
Live Templates
Objective-C
を開くとスニペット一覧が表示される+
を押すと新しいスニペットが登録できる
例えば
ifとかelseのスニペットは最初登録されてないので、登録してみる。
+
を押して新規作成- Abbreviation:
if
- Description:
call if
(説明文、コーディング時にも表示される) - Template text: 後述
- No applicable contexts yet. ->
Define
をクリック 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
: Projectcmd + 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/
- pjlib/
上のディレクトリ全てを以下の追加します。
- Header Search Paths
- Library Search Paths
と思ってたら、プロジェクトにファイルを追加した段階でLibrary Search Pathsも追加されてました。
ライブラリの追加もできてました。
Build Phases
の Link Binary With Libraries
から確認できます。
あとは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も詳しくないので質問されてもわかりません!
むしろ教えて下さい。
ということで、お疲れ様でございました。
参考
Storyboardで定義したViewControllerを呼び出す
複数の画面からModalで設定画面を呼びたいケースがあったので、
その時の手法をメモ。
- Storyboard上で、ViewControllerを定義する
- Storyboard上で、ViewControllerのStoryboardIDを定義する
- 呼び出したいクラスで下記のコードを実行する
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がうまく更新されない。
そういえば転職しました
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の変更を反映させたい・・・。
↓↓恥ずかしいコミット
困ったこと
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しよう、という教訓になりました。