2013/01/08

iPhoneアプリの作成時にやっておきたいプロジェクトの設定

Xcode の操作方法は 4.5.2 のものです。

1. デバッグログ マクロ
プロジェクトのプリコンパイルヘッダ(.pch)に次のようなマクロを仕込みます。
#ifdef DEBUG
    #define LOG(...)     NSLog(__VA_ARGS__);
    #define LOG_METHOD   NSLog(@"%s", __func__);
    #define LOG_POINT(_x) NSLog(@"Point : %.3f,%.3f", _x.x, _x.y );
    #define LOG_SIZE(_x)  NSLog(@"Size : %.3f,%.3f", _x.width, _x.height );
    #define LOG_RECT(_x)  NSLog(@"Rect : %.3f,%.3f / %.3f,%.3f)", _x.origin.x, _x.origin.y, _x.size.width, _x.size.height);
#else
    // Disable Logging
    #define LOG(...) ;
    #define LOG_METHOD ;
    #define LOG_POINT(_x) ;
    #define LOG_SIZE(_x) ;
    #define LOG_RECT(_x) ;
#endif
見たまんまですが、これらのログマクロはデバッグビルド時のみで有効で、リリースビルド時にはログ出力コードは生成されません。リリース時には不要なデバッグ用の冗長なログ出力用です。
例外情報などのリリースビルド時にもログを出力する場合は、普通に NSLog を使います。

LOG_METHOD は呼び出しをトラッキングしたいメソッドの先頭に記述するマクロで、NSLog にいちいちメソッド名を記述する手間を省きます。
LOG_POINT, LOG_SIZE, LOG_RECT は CGPoint, CGSize, CGRect を読みやすい書式で出力します。(標準の書式だとデバッグコンソール上で読みづらいので)
他に LOG_COLOR みたいなのがあっても良いかもしれませんね。


2. ARC(Automatic Reference Counting)を使う場合は .m ファイルにおまじないを入れておこう
#if !__has_feature(objc_arc)
#error This code needs compiler option -fobjc-arc
#endif
ARC対応のソースはARCを無効にした状態でコンパイルしても普通にコンパイルが通ってしまいますが、当然ながらメモリリークを起こします。
ARCを前提としたプロジェクトを作成して、そのプロジェクト内だけでソースを使用しているうちは問題にはなりませんが、このソースを別のARC無効なプロジェクトで再利用しようとすると、うっかりメモリリークを起こしかねません。
このような事故を未然に防ぐために、上記のおまじないを組み込んでおくと安心です。


3. プロジェクト内でARCなソースと非ARCなソースを混在させる場合の設定
ことの発端はARCを有効にしたプロジェクトで InAppSettingsKit を使おうと思ったら、このソースがARC非対応であったために大量の "not available in automatic reference counting mode" というエラーが発生してプロジェクトがビルドできなかったという経験です。

ARCの有効/無効は、ソース毎にコンパイル時のオプション -fobjc-arc, -fno-objc-arc で指定します。
Xcode のプロジェクト設定でソース毎にコンパイルオプションを指定する事ができるため、ここで上記のオプションを個別に指定することでプロジェクト内にARC対応/非対応のソースを混在させることができます。

Xcode のナビゲータでプロジェクトを選択し、プロジェクトのTARGETを選択後に "Build Phases" を選択します。
"Build Phases" のペインに "Compile Sources" というセクションがあるので、該当するソースの "Compiler Flags" の欄をダブルクリックして上記のコンパイラオプションを指定します。
(Xcodeのペインが3分割の場合、コンパイラオプションを指定するための "Compiler Flags" のヘッダが右隅に追いやられて "C." としか表示されていなくて発見しにくいです)

最初の例の場合、ARCが有効なプロジェクトの中にARC非対応のソース(InAppSettingsKit)が混ざっているため、InAppSettingKit のソース全ての Compiler Flags に "-fno-objc-arc" を指定します。


4. TODOコメントを警告として出力する
プロジェクトの "Build Phase" で設定できます。
プロジェクト > ターゲット と選択したあとに "Build Phase" ペインを開きます。
ここの "Run Script" というセクションを設定しますが、デフォルトではこのセクションがないため、右下にある "+ Add Build Phase" をクリックして "Add Run Script" を選択します。
追加した "Run Script" セクションに以下のシェルスクリプトを記述します。
KEYWORDS="(TODO|FIXME|DEBUG):|\?\?\?:|\!\!\!:"
find ${SRCROOT} \( -name "*.h" -or -name "*.m" \) -print0 | \
xargs -0 egrep --with-filename --line-number --only-matching "($KEYWORDS).*\$" | \
perl -p -e "s/($KEYWORDS)/ warning: \$1/"
※その他のフィールドはデフォルトのまま
すると、コンパイル時に TODO コメントを拾って警告として出力してくれます。
上記のスクリプトは出典のオリジナルに少し手を加え、 DEBUG: という記述も警告として出力するようにしています。

TODO コメントは Xcode のファンクションメニューでも確認できるのですが、コンパイル時に警告として出力しておく事で、常にプロジェクト全体の TODO コメントが把握できるのでわりと便利です。


【出典】
この情報は下記のブログを参考にしました。
これらの情報を公開していただいている Tomohiro Kumagai 氏、h_mori 氏に感謝します。

2012/12/22

Linux(bash)プロンプトの色付けとホスト名の管理


SSH などで Linux を使っていると開発サーバや本番機など、いろいろなサーバを渡り歩きますが、たくさんウィンドウを開いていたりSSH を渡り歩きすぎると時々自分がどこにいるのか見失ってしまいます。

私の場合、自分が管理する運用環境では自分がどこにいるのかをすぐに識別できるようにするため、特に本番環境にいる時の注意喚起のためにサーバに応じてプロンプトの色を変えるように設定しています。

プロンプトに色をつけるには ~/.profile などで設定するというのはよく見かけますが、私の場合には "ホストの設定として全ユーザに適用する" 必要があるため、少し違うやり方をします。

/etc/profile.d というディレクトリに prompt.sh (これは任意の名前)という次のスクリプトを作成します。

# prompt setting
if [ "$PS1" ]; then
  export PS1="\[\033[0;33m\][\u@\h(dev01) \W]\[\033[0;37m\]\\$ "
fi

/etc/profile.d に任意の名前でシェルスクリプトを記述しておくとシェルの起動時に自動的に実行されるため、全てのユーザに適用されます。
私の場合は基本 bash だけなので prompt.sh だけですが、 csh にも対応するには prompt.csh というファイルも作成しておきます。

ログインするとプロンプトは次のようになります。

[user@sv001(dev01) ~]

このまま、スーパーユーザにスイッチしても

[root@sv001(dev01) ~]

となり、色設定が必ず適用されます。
私の場合は開発系を黄色、本番系を赤色にすることで、リモートのホストに接続している状態であることと特に本番機に接続している状態を注意喚起する事を目的としています。

よく忘れるカラーコードは次の通り。
昔の8bit機のカラーコードと同じなら覚えやすいのだけどなぁ・・・(笑)

\033[0;30m : Black
\033[0;31m : Red
\033[0;32m : Green
\033[0;33m : Yellow
\033[0;34m : Blue
\033[0;35m : Magenta
\033[0;36m : Cyan
\033[0;37m : Light Gray
\033[0;30m : Black
\033[1;31m : Dark Gray
\033[1;32m : Light Green
\033[1;33m : Light Yellow
\033[1;34m : Light Blue
\033[1;35m : Light Magenta
\033[1;36m : Light Cyan
\033[1;37m : White

カラーコードに40番台を指定すれば背景の指定となります。


プロンプトに (dev01) というリテラル文字を設定しているのはサーバの論理名です。
サーバの名前の付け方も人それぞれですが、僕の場合はサーバ名には sv001 などの連番を付与し、別名として論理名を付けて管理する方式を好んでいます。

以前はホスト名には db01 などの役割に応じた名前を付けていたのですが、運用してみるといくつか不便を感じることがありました。

・ハードウェアトラブルのために急遽、別のサーバで代替機を立てた際や、インフラの見直しで複数の役割を持つサーバができてしまった際に名前と役割が乖離してしまった。
・役割に応じて命名していると別のシステムと名前がよく重複する。
・ハードウェアの移動などで再構築するたびに名前が変わるので、資産管理の棚卸しなどの際にいちいちシリアル番号を追いかけなければならない。
・ホスト名を考えるのにわりと悩む

これらの教訓から、

・ホストの正式名は sv001 などの連番で付与して未来永劫変更しない。
・ホストの役割はその時々で変わるものなので別名で対応する。
 別名の解決には /etc/hosts や内部DNSと上記のプロンプトの表記で対応する。

この方式にすることで、ホスト名に関する悩みはだいぶなくなりました。

2012/12/09

離席時などに画面をロックするショートカット for Win And Mac

知っていると少しだけ便利なプチ Tips です。

エンジニアに限りませんが仕事でPCを操作しているのであれば、ちょっとした離席時にも常に画面をロックしておくのは習慣にしたいものです。
でも操作が面倒だとついつい忘れてしまったり、わかっていてもそもそも億劫ですよね。
Windows も Mac も実はショートカットキー 一発でスクリーンをロックできるのですが、意外と知られていないようなのでプチTipsとして共有します。

Windows : Windowsキー + L    (Lock の L と覚えませう)
Mac : Option + Command + Eject

何度か試せば、これならば容易に習慣にできることでしょう。

せっかくのスクリーンロックでも、スクリーンセイバーからの復帰時にパスワードを要求しないように設定していたり、そもそもアカウントにパスワードを設定しないないとかは論外です(笑)


話は変わりますが、ショートカットキーつながりということで。
メイン機を Mac に乗り換えて早1年半、いまだにMacのショートカットが覚えきれずに苦慮していますが、Mac の App Store にある CheatSheet というアプリがわりと重宝しているので紹介します。
どんなアプリかというと、Command キーを押しっぱなしにしているとそのアプリで利用できるショートカットをポップアップで一覧表示してくれるアプリです。

http://cheatsheetapp.com/Landing/

Mac のショートカットの暗記でお悩みの方はぜひお試しあれ。

2012/01/17

MacOS X Lion : メール添付されたzipが開けない・・・ Thunderbird が原因だった

Stuffit Expander は優秀。パスワード付き zip でも lha でも、ほとんどのアーカイブを解凍してくれて重宝します。Macユーザにとっては MUST HAVE なツールですね。

MacとWindowsのzipファイルの互換性は過去の話かと思いきや、Windowsで作成され、メールに添付されたzipファイルが開けないという問題に遭遇しました。
Stuffit は「アーカイブが破損している可能性があります」と報告し、コマンドラインのunzipで展開しようとしても「End-of-central-directory signature not found」zipファイルではない、と言われる。

仕事のメールでじっくり調べている時間もないので、とりあえずWin機を起動してそちら側で添付ファイルを解凍していたが、自宅にいないとこれはできないので何かと不便。


最初はzipの互換性の問題かと思い、The Unarchiver や WinZip for Mac などいくつかの解凍ソフトを試すがどれもNG。
一時は AppStore で有償のアーカイバ買わなきゃダメか? とまで思った。

ふと思いつき、メールの添付ファイルをWebメーラからダウンロードしてみたらあっさり解凍できた。
メーラは Thunderbird を使用しているが、Thunderbird には添付ファイルのエンコード名の扱いによって添付ファイルが壊れることがあるらしい。

出典 : [ソフトウェア]Thunderbirdの添付ファイル不具合


これは少し古いバージョンの話なのと、今回の添付ファイル名には日本語は使われていないので同じ原因であるかどうかは怪しいところ。
ただ、メーラの相性によって Thunderbird で添付ファイルが壊れることがあるのだけは事実。
Thunderbird を使用していて上記のエラーに遭遇したら、一度他のメールクライアントやWebメーラなどで添付ファイルを落としてみましょう。

あ、でも Win機も Thunderbird だけど、こっちはファイル壊れていなかったな。
プラットフォームか文字セットの設定に依存しているっぽい。
ん〜、MacとWindowsの障壁はまだまだ無くならないようです。

2012/01/05

NGINX で MySQL に保存されている redmine のアカウント情報を元にBASIC認証する

まだ実施していないけど、実現するために必要そうな情報をちょいメモ。

<やりたいこと>
nginx でBASIC認証をしたいが、認証情報は redmine のアカウント情報(MySQL)をソースとしたい。

<背景>
redmine を導入したプロジェクト管理サーバに jenkins も導入。
jenkins の管理画面や ant により生成した javadoc やテストレポートなどの静的なファイルもプロジェクト管理サーバで閲覧できるようにしたい。
当然、これらのファイルにも認証をかけたいが、アカウント情報はredmineのものを使いたい。
public にこれらのドキュメントを配置しても良いが、静的なコンテンツのために rails のリソースを使うのはもったいないので、これらは nginx で直接返すようにしたい。

<Apacheの場合>
mod_auth_mysql を以下のように設定すればよいらしい
Auth_MySQL                      On
Auth_MySQL_Socket               /var/run/mysqld/mysqld.sock
Auth_MySQL_Host                 localhost
Auth_MySQL_User                 [redmineのデータベースユーザ名]
Auth_MySQL_Password             [redmineのデータベースパスワード]
Auth_MySQL_DB                   [redmineのデータベース名]
Auth_MySQL_Password_Table       users
Auth_MySQL_Username_Field       login
Auth_MySQL_Password_Field       hashed_password
Auth_MySQL_Encryption_Types     SHA1Sum
Auth_MySQL_Empty_Passwords      Off
AuthType Basic
AuthName "Authorization Realm"
Require valid-user

<NGINXの場合>
nginx には mod_auth_mysql はない。
替わりに mod_auth_pampam_mysql を使えばいけそう。

http://web.iti.upv.es/~sto/nginx/
http://pam-mysql.sourceforge.net/

2011/11/03

MySQL を 5.5 にアップデートしたら起動しなくなっちまった


CentOS 5にインストールした MySQL を 5.0.67 から 5.5.17 にアップデートしたら起動しなくなったので解決方法をメモ。
(いきなりバージョン飛ばし過ぎというツッコミはおいておいて・・・)

まずは基本、mysql.log を確認。
111102 23:44:11 [Note] Plugin 'FEDERATED' is disabled.
/usr/libexec/mysqld: Table 'mysql.plugin' doesn't exist
111102 23:44:11 [ERROR] Can't open the mysql.plugin table. Please run mysql_upgrade to create it.
だそうで。
とりあえず言われた通りに mysql_upgrade してみるけどサーバに接続できないと怒られる。だからそのサーバが起動しないんだって!

試行錯誤の結果、 my.cnf の設定が原因であることが判明。
サーバの文字コード設定が default-character-set から character-set-server に変更されています。
実はこの変更は MySQL 5.0 からされていたようですが(知らなかった・・・汗)、MySQL 5.5.3 で非推奨のパラメータが全て廃止された(エラーになるようになった)ために起動しなくなったのでした。

下記のブログが参考になりました。MySQL 5.5.3 での主な変更点がまとめられています。

「え? そこ?」 という感じだが、サーバの文字コード指定の記述を修正したら mysqld_safe が起動するようになった。ついでに FADERATED エンジンも使わないので無効にしておく。
[mysqld]
character-set-server=utf8
skip-federated
その後、mysql_upgrade を実行し、セーフブートから通常の起動に変更して無事にアップデート完了。

ちなみに、アップデート後に my.cnf のサーバ文字コードの設定の記述を default-character-set に戻して mysqld を起動してみたら、ログには以下のようなエラーが出力された。

111103  0:19:50 [ERROR] /usr/libexec/mysqld: unknown variable 'default-character-set=utf8'
111103  0:19:50 [ERROR] Aborting
今度はちゃんと設定がおかしい旨のメッセージが出力されている。

テーブルのアップグレードチェックでエラーとなった場合は、default-character-set に関するエラーメッセージが出力されずに mysqld がシャットダウンしてしまうようなので要注意です。

(2011/11/11:追記)
MySQL 5.5.3-m3 で廃止された変数やオプションは default-character-set だけではありません。
その他の廃止された変数やオプションを指定している場合は、これらも対応しなければなりません。

下記のブログで廃止になった変数とオプションがまとめられています。

[mysql]MySQL 5.5.3-m3 で廃止になった変数やオプションなどを整理しました

2011/11/02

Mac のキーボード操作に慣れない・・・

Mac を使い始めて3ヶ月くらい絶つけれど、いまだにキーボード操作に馴染めない・・・
Mac のキーボード操作での主な不満点。
  • コマンドキーが遠い。Ctrl キー系の操作になれているので、やはりこちらの方がよい。
  • 上記に関連するが、Ctrl + カーソル移動キーで単語移動してくれない。というか、デスクトップが切り替わるので鬱陶しい。
    Option + カーソル移動キーで単語移動するけど、Option キーもこれまた遠いし小さい。
  • ターミナルでコマンドキーがメタキーになってくれない。
    emacs 使いとしては致命的。編集中にコピーリージョンを指定しようとして command + w をタイプすると、ウィンドウが閉じてしまい、全ての編集が水泡に帰す。 orz。
  • 外部キーボード(ELECOMのTK-FBP014。Apple用のASCII配列 Bluetooth キーボード)のキー配列がこれまた違う。
    ASCII配列であるのはOKだけど、補助キーの配置が全く異なってる上に小さい。というか、スペースバー長すぎない?
などなど。

キーボードをカスタマイズしてしまうと他の標準的なマシンを触れなくなってしまうので控えていたのだけれど、注意力が散漫になってしまって生産性が悪いので、あきらめてカスタマイズすることにしよう。

少し調べたら KeyRemap4 MacBook というソフトが便利そうなのでこれを試そう。
補助キーがボトルネックなので、少なくとも普段の操作でこれらのキーを使わなくても良いようにしないと効率が悪いが、そうなるともはや Mac ではなくなるな・・・笑