Hatena::ブログ(Diary)

Over&Out その後 このページをアンテナに追加 RSSフィード

2014-04-30

Xcodeの「全機能」を網羅した全752ページの超大作『Xcode 5 徹底解説』書評

先日 yidev 恵比寿勉強会 に行った際、隣の席にいらっしゃった @es_kumagai さんより、すごいプレゼントをいただきました。



この本を手に取ってまず驚くのが、その 752ページ(!!!!) という超特大ボリュームです。世の中に「徹底解説」を謳う解説本は数あれど、 本当に「全機能」を網羅している本 は初めてみたかもしれません。


f:id:shu223:20140430102540j:image

(iPhone5sとの比較。分厚さが伝わりますでしょうか)


対象読者:入門者から上級者まで!

目次を見てみると、「Xcode とは」「Xcode をインストールする」から始まるので、Xcodeを未ダウンロードな入門者 から読めますし、「xcodebuild コマンドを使ってビルドする」「ユニットテストを実現する XCTest」「Xcode サーバーと Bot でテストを自動化する」といった 中級者向け の内容もがっつり解説されています。


また、Xcode を使いこなしている上級者といえど、なかなかこの 752 ページの内容を全て把握してる人はいないんじゃないかなと。そういう意味では、それこそ入門者から上級者まで、iOSアプリ開発に携わる人全員に何かしらのお役立ち情報があるのでは、と思います。


Xcode5徹底解説 for iOS/OSX
熊谷 友宏
秀和システム
売り上げランキング: 31,269


全ページを通して読んでみた感想としては、全項目の冒頭に「◯◯とは」「この機能はどんなときに役立つのか」という説明があるので、 目次だけではなく、各項の冒頭だけでも一通り目を通す という読み方をするといいんじゃないかなと思いました。


勉強になった項目

以下には、自分が全項目に目を通してみて勉強になった項目を書いていきます。


※重要な機能でも、自分が知ってたものについては書いてないので、書籍の魅力を要約するものではありません。


7.2.3 スコープ内の変数名をまとめて編集する

コード内の変数名にカーソルを合わせて、▼ マークをクリックして出てくるメニューから [Edit All in Scope] を選択すると、同じスコープ内のその変数が全て選択された状態になり、同時編集できる、というもの。


Refactor メニューでも同様のことができるけど、知りませんでした。


7.2.8 カーソル位置のスコープを自動でハイライトする

これは地味ながらも個人的に「おお!」と思った機能。


[Editor] > [Code Folding] > [Focus Follows Selection] を選択すると、カーソルがあるスコープだけがハイライトされる というもの。


規模の大きいコードを書いていると、意識があっちこっちにいってしまいがちなので、これは助かるかも。


8.6.4 レイアウトをプレビュー画面で確認する

アシスタントエディタのプレビュー機能で、iOS6 / iOS7, 3.5 inch / 4.0 inch でのストーリーボードの見え方をビルドなしで確認することができます。


8.7.4 アウトレットコレクション

@property (strong, nonatomic) IBOutletCollection(UIButton) NSArray *buttons;

みたいにやると、複数のコントロールをアウトレットとして連結できる。


8.8.3 コントロールの表示テキストを言語環境に応じて変化させる

Object IDを使ったローカライズ方法。


9.4.5 Build Phases 設定

Run Script フェイズの

  • Run script only when Installing オプションにチェックを入れると Build Settings の Deployment Postprocessing がONのときだけスクリプトが実行される
  • Input Files / Output Files オプションがそれぞれどの環境変数に渡されるか

9.4.6 Build Rules 設定

ここいじったことないなぁ。。


10.4 スキームの設定項目

"Parallelized Build", "Find Implicit Dependencies" といった Build Option の効果や、Arguments タブ、Options タブの各設定項目について説明があります。


f:id:shu223:20140430105529j:image

(↑このへんの話です)


10.5 スキームにカスタム実行スクリプトを登録する

各アクションを実行する前後で、任意のスクリプトを実行できる(Pre-actions / Post-actions)とのこと。たとえば アクションの前後にメールを送信 したり。(奥が深い。。)


13.3.4 OpenGL ES フレームキャプチャによる一時停止

アプリの実行を一時停止して、OpenGL ES の描画状況を確認することができる機能。


13.4 ブレークポイントの設置と扱い方

すごく昔の記事 にちょろっと書いたことがありますが、Xcode のブレークポイントって奥が深いんですよね。。本項では、[Edit Breakpoint] から設定できる項目ひとつひとつについて解説されています。


13.4.6 ブレークポイントに停止条件を設定する

「3回このブレークポイントを通過したら停止させる」みたいなことができます。


13.4.7 ブレークポイントでログメッセージを出力する

ブレークポイント通過時に、コンソールにログメッセージを出力できます。このメソッドを通ったかどうかみたいな確認のときには、ソースにNSLogとかを直接書くよりも、こっちの方法を使った方がソースを汚さずに済むので良さそうです。


13.4.8 ブレークポイントで変数に値を設定する

ソースをいじることなく、一時的に変数の値を差し替えられます。UIImage とかでも差し替え可能。


13.4.9 特殊なブレークポイント

ソースコード内に置く通常のブレークポイントだけではなく、

  • 例外が発生したときに処理を行うブレークポイント
  • 指定したシンボルが実行されるタイミングで処理を行うブレークポイント
  • OpenGL ESエラーブレークポイント
  • テスト失敗時ブレークポイント

といったものも作成できます。


シンボルブレークポイントはソースコードが公開されていない外部ライブラリ内のメソッド実行時に止めたいときとかにも使えるので、便利そうです。


13.4.10 ブレークポイントを他の制作者と共有する

[Share Breakpoint] でワークスペース内の "Shared Data" に保存されるようになるとのこと。


13.5 ブレークポイントで停止した状況を把握する

以前書いた Quick Look や [Print Description] についても触れられています。


13.5.2 の、スタックトレースの表示の精度を調整できるスライダー、知らなかった。。


13.6 ステップ実行で原因箇所を特定する

Step Over / Step Into / Step Out の違いの解説から、それぞれを使いこなしてどのようにデバッグしていくか、という具体的な方法が解説されています。


13.6.4 の、デバッグエリアの変数ビューの右クリックメニューから [Edit Value] で変数の値を書き換えられるのは知りませんでした。ステップ実行していて見つけたクサイ部分を詳しく検証する際に使えそうです。


13.6.8 の後半にある、「ステップ実行時に、自分のスレッドだけ動かして、他スレッドは中断させる」方法も初めて知りました。なんと control + shift で GUI からもこの操作を行えるとのこと。。


Chapter15 ユニットテストを作成してソースコードを検証する

XCTestフレームワークを用いてユニットテストを実行する方法が解説されています。最近は iOS アプリのテストに特化した技術書 も出ていますが、後述の Chapter 16 と合わせると約50ページと、テスト部分だけ見ても相当なボリュームがあります。


標準フレームワーク/環境を使用した基本的なテスト手法だけでも知りたい、という場合にも本書は買いだと思います。


Chapter16 XcodeサーバーとBotでテストを自動化する

OS X Server をインストールして Xcodeサーバーを稼働させる方法から、それと連携して

  • テスト
  • ソースの静的解析 (static analyzerの実行)
  • ビルド (archive)

を自動実行する Bot を作成して運用する方法 がステップバイステップで詳しく書かれています。


まとめ

というわけで、Xcode 5 を本当に徹底解説した書籍『Xcode 5 徹底解説』オススメです!


Xcode5徹底解説 for iOS/OSX
熊谷 友宏
秀和システム
売り上げランキング: 31,269


関連記事

iOS7の新機能を軸とした解説本。こちらも書評を詳しく書いたのでぜひご覧ください。


拙著の紹介。こちらは中級者向けのレシピが100個載っています。ライブラリを使うレシピでもそのソースコードにも触れており、ある程度アプリ開発に慣れてきた方々には何かと参考になる項目があると思うので、ぜひ目次だけでも目を通していただけると嬉しいです。


2014-01-08

シェルスクリプトでmp4からアニメーションgifを生成する

mp4からアニメーションgifを生成したい、というケースが最近ちょくちょくありまして。


たとえば「GitHub の README に動く様子を載せたい」場合、YouTubeやVimeoの埋め込みタグをREADME.mdに載せてもプレイヤーを表示してくれないので、アニメーションgifをつくって載せています。

元の動画はQuickTimeでシミュレータのキャプチャ動画を撮ったものだったり、iPhoneのカメラで撮ったものだったりするのですが、アニメーションgifへの変換はどういう方法があるのか知らなかったので、

  • QuickTimeで動画を短くトリムする
  • Photoshopで動画を読み込んで適当にフレーム飛ばしてAnimation Gifに書き出す

という非常に面倒なことをやっていました。


で、ふと下記記事を見ていると、

「90sのmp4から12fpsで320*180のアニメgifを作る」スクリプトが例に挙げられています。


高速化云々以前に、そんな便利なことができたのか!と。


というわけで試してみました。


準備

まず、自分の環境にはffmpegが入ってなかったのでインストール。

$ brew install ffmpeg

あとアニメーションgifを生成する gifsicle もインストールする必要があるのですが、brew installしようとすると

gifsicle: Unsatisfied dependency: XQuartz

Homebrew does not package XQuartz. Installers may be found at:

https://xquartz.macosforge.org

と怒られたので、エラー文の言う通りに https://xquartz.macosforge.org に行って、インストーラから XQuart をインストール。


で、あらためて gifsicle をインストール。

$ brew install gifsicle

シェルスクリプト作成

$ touch gen_animegif.sh
$ vi gen_animegif.sh

で以下のように編集(shellわからないので、元記事のコードをほぼそのままお借りしています)。

#!/bin/sh

# Task 1
SRC="$1"
[[ ! -f "$SRC" ]] && echo 'no exists' && exit 1
INI=$SECONDS
mkdir ./temp

# Task 2-3
ffmpeg -loglevel panic -ss 0 -i "$SRC" -r 12 -an -f image2 -s 320x180 "./temp/%03d.gif"
gifsicle -O3 --batch ./temp/*.gif

# Task 4
gifsicle ./temp/*.gif > output.gif
rm -rf ./temp
echo "done with `expr $SECONDS - $INI`s" && exit 0

実行してみる

$ sh ./gen_animegif.sh xxxx.mp4

23.9MB の mp4 動画ファイルが、コマンド一発で1.7MBのgifアニメに!


movファイルも試してみました。

$ sh ./gen_animegif.sh xxxx.mov

24MB → 5.1MBに!


問題点

上記shellだと、mp4(iPhoneで撮影)は出力ファイルにおける動画の向きが90度回転してしまい、mov(QuickTimeでスクリーンキャプチャ)は元々縦長だった動画が横長になって上下方向につぶれた感じになってしまいました。きちんと向きを処理する必要がありそうです。


まとめ

シェルスクリプト、他にも知らずに損してることがたくさんありそうです。勉強します。


2013-03-14

Mac のスクリーンショットを定期的に自動撮影する

10分ごととかにMacスクリーンショットを自動撮影する方法です。ライフログに、あるいはサボり防止に役立つかもしれません。


以下、手順です。


1. シェルスクリプトの準備

適当なフォルダを作成して、シェルスクリプトのファイルを生成します。(下記サンプルではホーム直下にssというフォルダを作成)

$ cd
$ mkdir ss
$ cd ss
$ touch capture.sh

生成したスクリプトファイルを編集します。(最後のパスは出力先。よしなに変えてください)

#!/bin/bash

/usr/sbin/screencapture -m -C -T0 -x ~/ss/capture_`date +%Y%m%d%H%M`.png

スクリプトに実行権限をつけます。

$ chmod +x capture.sh

※注意:このスクリプトではファイル名に日時をつけているので、画像がどんどん溜まっていくことになります。定期的に溜まったファイルを削除するスクリプトを登録する等、HDDがいつの間にか一杯にならないような工夫をしないと実用的ではないので、ご注意ください。


2. crontab の編集

$ crontab -e

で、crontabの編集に入るので、


*/5 * * * * ~/ss/capture.sh

と書いて保存します。


こうすると5分ごとにスクリーンキャプチャが保存されるようになります。


保存間隔を10分ごとにしたい場合は、次のようにします。

*/10 * * * * ~/ss/capture.sh

ちなみに、現在の crontab の内容を確認するには、-l オプションを使用します。

$ crontab -l

(参考)

crontabの書き方


余談

本件で crontab を初めて使ったのですが、はじめ動作せず困りました。


スクリプトの1行目の

#!/bin/bash

を書いていなかったことと、


screencaptureコマンドを

/usr/sbin/screencapture

とせず

screencapture

とだけ指定していたことが原因でした。


どちらもスクリプトをターミナルから実行する際には問題なかったので、なかなか気付くことができず。。


この辺りは、環境変数の設定とか実行ユーザーとか、環境に依るところなので誰にでも当てはまる話ではないと思いますが、ご参考まで。


Thanks

こちらのリポジトリで方法を知りました。大西さんありがとうございます!


https://github.com/024t910/yc2013



2013-03-13

.ipa ファイル生成を自動化する

通常.ipaファイルを作成するには、Product メニューの Archive 実行後に、

  • Organizer から アーカイブを選択し Distribute ボタン押下
  • "Save for Enterprise or Ad-Hoc Deployment" を選択し Next ボタン押下
  • ドロップダウンリストから該当するプロビジョニングプロファイルを選択
  • 保存先を指定

という手順を踏みます。ウィザードに従って進めるだけなので、たまに行う程度であれば問題ないのですが、.ipaファイルを作成して共有する頻度が多い場合(例えばリリースが近く細かい修正と確認を繰り返す場合)は面倒になってきます。


Xcode の Run Script を利用し、アーカイブ完了後に自動で ipa ファイルを生成するように設定する方法を紹介します。


※通常のアドホックビルドの準備の手順(アドホックビルド用のプロビジョニングプロファイルの作成とインストール、Configurationの作成と Code Signing Identity の設定)については説明を省略します。


準備

Build Phases タブの右下にある "Add Build Phase" ボタンから Run Script を追加し、次のスクリプトを登録するだけ

if [ "${CONFIGURATION}" = "<Configuration名>" ]; then
xcrun -sdk iphoneos PackageApplication "${INSTALL_DIR}"/<バンドル名>.app -o <出力パス>/<ipaファイル名>.ipa --embed ~/Library/MobileDevice/Provisioning Profiles/<プロファイルのファイル名>.mobileprovision
fi

<Configuration名>と<バンドル名>はプロジェクトの設定に従って置き換え、<出力パス>、<ipaファイル名>はそれぞれ任意のパス、名前に置き換えてください。


<プロファイルのファイル名>は、オーガナイザで該当するプロファイルを選択し、右クリックメニューの「Reveal Profile in Finder」からプロファイルの実体ファイルをFinderで表示して調べることができます。


たとえば、Configuration名が Ad Hoc、バンドル名が Hoge となるプロジェクトの.ipaファイルをホームフォルダ直下に自動生成したい場合のスクリプトは次のようになります。

if [ "${CONFIGURATION}" = "Ad Hoc" ]; then
xcrun -sdk iphoneos PackageApplication "${INSTALL_DIR}"/Hoge.app -o ~/Hoge.ipa --embed ~/Library/MobileDevice/Provisioning Profiles/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx.mobileprovision
fi

実行

(Edit SchemeからArchiveのConfigurationとして "Ad Hoc" を選択した状態で、)Product メニューから Archive を実行するだけで、自動で.ipa ファイルが生成されます。


More

xcrunコマンド(これで .ipa ファイルを生成している)の後に curl コマンドで Testflight の API を叩くようにすれば、アーカイブ実行時に Testflight へのアップロードまで自動化することもできます。


参考



2012-08-04

$(SRCROOT) や $(BUILD_DIR) 等の Xcode で使用しているマクロの置換内容の一覧を調べる方法

Info.plistや、ビルド設定をいじっていると、こんな文字列に出くわすかと思います。


  • $(PRODUCT_NAME)
  • $(TARGET_TEMP_DIR)
  • $(SRCROOT)

これらはそれぞれ特別な意味を持ち、Xcode がビルド時だか何だかのタイミングでプロダクト名とか環境に応じたパスとかに置き換えたりしてくれるものです。




が、



「SRCROOTってどこだっけ?プロジェクト直下?それともその一つ下?」

「Library Search Path を指定したいけどこの場所を指定するのにどのマクロを使っていいかわからない」



みたいなことになることが度々あるのではないでしょうか?(僕はあります)


そして困ったことに、これらを網羅したAppleのドキュメントもありません

(※というのは間違いで、バッチリありました。末尾の追記をご参照ください)



最近やっとその「Xcode で使用しているマクロの置換内容の一覧を見る方法」を見つけたので、ご紹介させていただきます。



方法

env > env.txt

Run Scriptに登録してビルド実行



これだけです。



ビルド実行すると、プロジェクトフォルダに env.txt というファイルが生成され、

PRODUCT_NAME=xxxxxx

TEMP_FILES_DIR=/Users/xxxx/Library/Developer/Xcode/DerivedData/xxxxx/Build/Intermediates/xxxx.build/Debug-iphoneos/xxxx.build

SRCROOT=/Users/xxxx/xxx/xxxx/xxxx

みたいな感じでズラズラとマクロ名とその置換内容の一覧が出力されます。




ちなみに、Run Script にスクリプトを登録する方法がよくわからない方は、

"xcode run script build phase"

あたりのキーワードでググってみるときっとわかりやすい解説記事が見つかるのではないかと思います。


キャプチャがないとよくわからないかもしれませんが、簡単に手順を書くと、

  1. Build Phases タブを開く
  2. 右下にあるAdd Build Phase ボタン押下
  3. Add Run Script を選択
  4. スクリプト記入欄があるのでスクリプトをコピペ

こんな感じです。




参考ページ




追記

この記事を公開して5分後ぐらいに@azu_re様よりツイートいただきました。

http://bit.ly/Mq3kkv とかに大体まとまってた気がする


おっしゃる通り大体まとまってました。。



「まとまったドキュメントはない」というのは間違いだったわけですが、この記事に書いた env でやる方法使うと自分の環境での path がわかるので、これはこれでアリかなと思っております。


azu_re様、情報ありがとうございました!



2009 | 08 |
2011 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2012 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2013 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2014 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2015 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2016 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 11 | 12 |
2017 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2018 | 02 |