From the monthly archives: 8月 2011

UITableViewを使っていてこれみんな使ってないんじゃね?って思う便利な小ネタがいくつかあったのでいくつか紹介します。

■tableViewの最初または最後だけ別の情報を表示する

これ、割とよくやるんじゃないでしょうか。twitterアプリで一番下に「さらにロード」ボタンを付けたりするやつです。

手段としては

  • numberOfRowsInSectionで一つ多く数を申請しておいて、cellForRowAtIndexPathで一番下なら〜とif分で判定する
  • tableFooterViewプロパティに任意のViewを代入する

があります。

外見はどちらも似たような形にすることは出来ますが、ソースコードの長さ、煩雑さ、cellのカスタマイズのしにくさを考えるとtableFooterViewを使う方が簡単で見やすいものになると思います。



■ナビゲーション時の選択解除

tableViewControllerは階層構造によく使います。
このとき、タップされたアクションで画面遷移して、選択された青いのを消すために選択解除してってやってませんか?

実はtableViewControllerにはclearsSelectionOnViewWillAppearというプロパティがあって、画面遷移した後、戻るボタンで戻ったときに自動で選択を解除する機能がついているんです。
Appleの iOS Human Interface Guidelinesでは

セルの選択に応答して、新規のView ControllerをNavigation Controllerのスタックにプッシュした場合は、そのView Controllerがスタックからポップされたときに、セルを(アニメーションを伴って)選択解除します。

という風に書いてあります。

お勧めされる手法があって、それを簡単に行う方法まであるので、使わない手はないと思います。

 

サーバー+SendMail+Gmailで独自ドメインメールの設定をしてみました。
案外簡単で、調べながらで2時間ぐらいでできてしまいました。



■SendMail受信用の設定

  1. sendmailの設定簡略化プログラムのインストール
    [plain]sudo yum -y install sendmail-cf[/plain]
  2. sendmailの設定変更
    [plain]sudo vi /etc/mail/sendmail.mc[/plain]
    外部からメールを受け取らない設定をコメントアウトする
    [plain]
    DAEMON_OPTIONS(`Port=smtp,Addr=127.0.0.1, Name=MTA’)

    dnl # DAEMON_OPTIONS(`Port=smtp,Addr=127.0.0.1, Name=MTA’)
    [/plain]
  3. sendmailの設定適用
    [plain]m4 /etc/mail/sendmail.mc > /etc/mail/sendmail.cf[/plain]
    ※パーミッションエラーが出た時は
    [plain]sudo chmod 777 /etc/mail/sendmail.cf[/plain]
    をやってからもう一度やって下さい
  4. 自分のホスト名設定
    [plain]sudo vi /etc/mail/local-host-names[/plain]
    改行区切りでメールアドレスのホスト名を指定する
    [plain]example.com
    mail.example.com[/plain]
  5. 再起動
    [plain]sudo /etc/init.d/sendmail restart[/plain]



■ファイヤーウォール

  1. ファイアーウォールのファイルを開く
    [plain]sudo vi /etc/sysconfig/iptables[/plain]
  2. 25番ポートをあける記述を追加する
    [plain]
    -A RH-Firewall-1-INPUT -m state –state NEW -m tcp -p tcp –dport 25 -j ACCEPT[/plain]
  3. 再起動する
    [plain]sudo /etc/rc.d/init.d/iptables restart[/plain]


■SendMailにて転送用設定

  1. 設定ファイルを開く
    [plain]sudo vi /etc/aliases[/plain]
  2. 一番下に転送設定を追記する
    [plain]ユーザー名: 転送先アドレス[/plain]
    ※ユーザー名はaaa@example.comのaaaの部分
  3. 適用する
    [plain]sudo newaliases[/plain]

これだけでメールの転送が簡単にできます。
メーリスを作りたいなどある場合は最後の/etc/aliasesのみを変更すればできます。
複数アドレスに転送するにはカンマ区切りで転送先アドレスを指定すればOKです

転送用設定は何通りも書き方があって、ネット上ではいろいろな方式で情報が飛び交っているようでした。
どの方法が適切なのかというのはこちらが参考になりました。

 

独自ドメインでメールを受信する方法はいくつかあります。自分が知っているのは

  • GoogleApps(無料版)を使う
  • 独自サーバー+Sendmailで送受信する
  • 独自サーバー+Sendmailで他のメールアカウント(Gmailなど)にメールを転送する

の3パターンです。
それぞれメリットデメリットがありますのでまとめてみました。

GoogleApps
(無料版)
独自サーバー
+Sendmail
独自サーバー
+Sendmail
+Gmail
安定性
安心のgoogle

独自サーバーが
落ちると使えない

独自サーバーが
落ちると使えない
容量
gmailと同じ7GB

独自サーバーに依存

gmailと同じ7GB
アカウント数
(アドレス数)

10個まで

無限

無限
メンテナンス
googleがやってくれる
×
自分でメンテナンス

一部自分でメンテナンス
お金
無料(有料版もある)

サーバー代がかかる

サーバー代がかかる

この比較だとGoogleAppsが結構強いですね。
10アカウントで十分という人にはとてもいいのではないでしょうか。

自分は

  • 10アカウントでは足りない(メーリス用のアドレスも後々作る予定だから)
  • もともとVPSを借りている
  • サクラのVPSはgoogleと同じぐらい安定している(と思っている)
  • sendMailを勉強してみたい
  • VPSの容量は10Gしかないのであまり容量を使いたくない

ということより独自サーバー+Sendmail+Gmailで独自ドメインメールを作ることにしました。
VPSサーバーを借りている人は独自サーバー+Sendmail+Gmailでのデメリットがほとんど消えるのでお勧めです。

次回具体的にどのように設定したか紹介したいと思います。

 

おとといappleからdeveloper宛にメールが来てました。
そこに「iPhoneアプリの販売データがDLできるスクリプト公開したから使ってね」ってかいてあったので、早速使ってみました

使い方の詳細はAppleのドキュメントに書いてありました

ドキュメントやメールに使うときの注意点がいくつかのってたので、そちらには必ず目を通しておいてください。

■使い方

  1. AppleのスクリプトをDownloadする
    http://www.apple.com/itunesnews/docs/Autoingestion.class.zip

  2. ファイルを解凍する
    Autoingestion.classがでてきます

  3. ターミナルを開き、Autoingestion.classのあるフォルダまで移動する
    Downloadsフォルダにいれているのなら次のコマンドで移動できます
    [plain]cd ~/Downloads[/plain]

  4. コマンドを打つ
    [plain]java Autoingestion ユーザー名 パスワード ベンダーID レポートタイプ 日付タイプ レポートのサブタイプ 日付[/plain]
    それぞれのパラメータは次の通りです

    ユーザー名 iTunesConnectにログインするときのID
    パスワード iTunesConnectにログインするときのパスワード
    ベンダーID Sales and Trends で左上に出てくる数字
    レポートタイプ いまのところSalesしかないようです
    日付タイプ Daily または Weekly
    レポートのサブタイプ Summary または Opt-In
    日付 YYYYMMDD形式

具体的な例で行くと、
[plain]java Autoingestion john@xyz.com letmein 80012345 Sales Daily Summary 20100204[/plain]
こんな感じでレポートデータがダウンロードできます。

ダウンロードできるデータはSales and Trendsで手動でダウンロードできるテキストファイルとおなじ内容のようです。

しかし、ソフトでダウンロードできるということは自動集計プログラムが書けるということです。
iTunesConnectだと昔のデータが見づらいですし、そのうち自動集計プログラム作ろうかなと思います

 

データを削除しないで削除フラグだけたてておきたいときがよくあります。
webアプリを作る場合はコメントなどはこの機能が必須になります。つけとかないとあとでユーザー間のもめごとが起きたときに困ってしまいます。

Symfony&Doctrineならばこの論理削除が簡単にできます。

■準備

  1. Schema.ymlでactAsにSoftDeleteを追加する
    [plain]Comment:
    actAs: { SoftDelete: ~ }
    columns:
    comment_id: { type: integer, primary: true, autoincrement: true}
    user_id: { type: integer, notnull: true}
    comment: { type: string, notnull: false}
    [/plain]
  2. migrateとかbuild:modelとかをして、DBに変更を適用させる
  3. ProjectConfigration.class.phpでconfigureDoctrine関数を追加し、起動時にDoctrineのSoftDeleteの機能が有効になるように設定する
    [php] public function configureDoctrine(Doctrine_Manager $manager)
    {
    $manager->setAttribute(Doctrine_Core::ATTR_USE_DQL_CALLBACKS, true);
    }[/php]


■つかいかた
この機能を追加する前と何も変わらずに使えます
例)削除済みでないコメントで、特定のユーザーのものを取得する
[php] $data = CommentTable::getInstance()
->createQuery(‘c’)
->where(‘c.user_id = ‘. $userId)
->execute();
[/php]



■削除済みのデータもとりたいとき
削除済みのデータを取りたいときはwhereでdeleted_atのところに条件を追加するようにしてあげます。
例)削除済みのコメントで、特定のユーザーのものを取得する
[php] $data = CommentTable::getInstance()
->createQuery(‘c’)
->where(‘c.user_id = ‘. $userId)
->addWhere(‘c.deleted_at is not null’)
->execute();
[/php]

削除済みのも削除してないのもとりたいときは、ちょっとスマートじゃないですがwhereで両方指定してあげます
例)削除済みのも含め、すべてのコメントで特定のユーザーのものを取得する
[php] $data = CommentTable::getInstance()
->createQuery(‘c’)
->where(‘c.user_id = ‘. $userId)
->addWhere(‘c.deleted_at is null or c.deleted_at is not null’)
->execute();
[/php]

 

まず、sqlでいうselect文はCoreDataだとNSFetchRequestオブジェクトになります。
しかし、このNSFetchRequestはsqlとは全く違う書き方をしないといけないため、sqlに慣れてしまった人にとってはとても扱いづらく感じてしまいます。
そこで、sqlとの比較を基にNSFetchRequestの対応表を書いてみました。

■sqlとの比較

sql文 NSFetchRequestのメソッド
select setPropertiesToFetch
distinct setReturnsDistinctResults
from setEntity
where setPredicate
order setSortDescriptors
limit fetchLimit
offset fetchOffset
join setRelationshipKeyPathsForPrefetching

■NSFetchRequest特有の項目

  • setResultType

    データを受け取る形式の選択ができる。選択肢は次の4つ。
    NSManagedObjectResultType
    NSManagedObjectIDResultType
    NSDictionaryResultType
    NSCountResultType

  • setFetchBatchSize

    limit,offsetとは別に一度のSQLで取得するオブジェクトの数を設定できる。
    イメージとしてはpage=1,2,3…を順番にとる感じ。

それぞれのメソッドの具体的な使い方は今回はパスします。
しかし、こうみるとCoreDataってメソッド名長いですね。

 

svnで自分がよく使うコマンドをまとめてみました。
よく忘れるのはリポジトリ作成とタグ作成あたりです。

■svnのリポジトリを作る
フォルダを作り、権限をsvn用のユーザーに譲る
[plain]sudo svnadmin create /…/svn/プロジェクト名
sudo chown ユーザー名:ユーザー名 プロジェクト名 -R
[/plain]

■ローカルにデータを持ってくる
保存先のフォルダの位置で実行する
[plain]svn co リポジトリのアドレス 保存先のフォルダ名[/plain]

■変化チェック
[plain]svn st[/plain]

■コミット
[plain]svn commit -m "コメント"[/plain]

■タグ作成
[plain]svn cp リポジトリのアドレス タグ作成先のフォルダ名[/plain]

 

iPhoneのゲームライブラリで有名なCocos2dをインストールしてみました。
ちょっと前にxcode4対応のv1.0.0がでて、今はもうv1.0.1が出ているようです。

インストールにはターミナルを使わないと行けないのでちょっと大変ですが、cocos2dはなかり便利&使える来無頼ですので、ゲームを作るなら一度は使ってみたらいいと思います。

■インストール

  1. 本家サイト→Downloadsタブより最新版をダウンロード
    (今回はcocos2d-iphone-1.0.1.tar.gzでした)
  2. ファイルを解凍する
    Macの場合、ダウンロードしたファイルをダブルクリックするだけで解凍されます
  3. メニューからアプリケーション → ユーティリティ → ターミナルを開く
  4. ターミナルで先ほど解凍したフォルダまで移動する
    例)自分の場合はDownloadsフォルダで展開したので次のようになります
    [plain]cd /Users/ユーザー名/Downloads/cocos2d-iphone-1.0.1[/plain]
  5. インストールコマンドを実行する
    [plain]sudo ./install-templates.sh -f[/plain]
    sudoなので、パスワードが聞かれると思いますがPCにログインするときのパスワードを打ってください。
    -fは強制インストールを意味して、簡単に言うと古いcocos2dを上書きしてインストールしてくれます。
    初めてインストールするならいらないかもしれません.

これでインストール完了です。
ためしに新しいプロジェクトを作ろうとして、次のようなテンプレートが出てくればOKです

 

xcode4になって、新しくworkspaceという機能がありました。
いままで全く感心持ってなかったんですが、自作ライブラリをそろそろ作ろうかと思ったときに便利そうだったので使ってみました。

workspaceは

  • 複数のプロジェクトを一つのwindowで開ける
  • そのビルド結果をworkspace内で参照し合える
  • 他のプロジェクトを参照した場合、ビルド時にそのプロジェクトもビルドし直してくれる

という機能があります。
これを利用することで、プロジェクトAでライブラリをつくり、プロジェクトBでそのライブラリを使用するということができるようになります。

プロジェクトはそのまま(設定をいじることなく)流用できるので、複数プロジェクトで同じコードを使っている場合、かなり便利です。



■workspaceをつくる

  1. xcodeでFile → New → New Workspace…を選択し、新規作成する
  2. ライブラリ用のプロジェクトファイルを作成or追加する
    左下の+ボタンから新規作成しても、Finderからのドラッグ&ドロップで追加してもOKですが、「Cocoa Touch Static Library」でプロジェクトを作成するのを間違えないように!
  3. ライブラリ用を使う側のプロジェクトファイルを作成or追加する

最終的にStatic Library用のプロジェクトと、実際にアプリを作るプロジェクトが仲良くたてに二つ並んでいればOKです

※RedViewはプロジェクト作成後に追加したファイルです

■ライブラリ側のプロジェクト設定

  1. プロジェクトのターゲット → Build PhasesですべてのHeaderをPublicにする

    ※おそらくこれは.hファイルを追加するたびに毎回する必要があります

■ライブラリを使う側のプロジェクト設定

  1. プロジェクトのターゲット → Build Phasesで、ライブラリで作成した.aファイルを関連付ける
  2. プロジェクトのターゲット → Build Settingsを開く
  3. Public Headerを読み込むように、User Header Search Paths に”$(BUILT_PRODUCTS_DIR)”を追加する
  4. Other Linker Flagsに”-ObjC”,”-all_load”を追加する

これで設定完了です。
ビルドや実行をするときは左上のターゲットの設定を間違えないように気をつけてください。
ライブラリ用とアプリ用の二種類があると思いますが、基本的にはアプリ用だけ使っていればOKです。

プロジェクト設定はそれぞれ1回ずつでOKですが、ライブラリは使い回すことを考えると多用するのはライブラリを使う側のプロジェクト設定になると思います。

subversionなどの管理も完全にプロジェクト単位になるので楽になりますし、コードを複数プロジェクトで共有している人は使ってみはいかがでしょうか?

 

アプリに必要な画像のサイズを毎回調べるのがめんどくさくなってきたのでココに書いておきます。
意外と知らないサイズ指定があって驚きました。

ソースはiOS Human Interface Guidline
本家なので多分まちがいははない・・・・はず

ちなみに括弧になっているのはガイドラインにはのってなかったけど、経験則的にOKな画像サイズです

■必須画像

iPhone iPhone(Retina) iPad
アプリアイコン 57×57 114×114 72×72
起動画面 320×480
(320×460)
640×960
(640×920)
768×1004
1024×748
AppStoreアイコン 512×512

■オプション

iPhone iPhone(Retina) iPad
スモールアイコン
(検索や設定で使う)
29×29 58×58 50×50
29×29
ドキュメントアイコン 22×29 44×58 64×64
320×320
Webクリップアイコン 57×57 114×114 72×72
ツールバーアイコン 約20×20 約40×40 約20×20
タブバーアイコン 約30×30 約60×60 約30×30