アプリ内課金についての調査メモ

iPhoneアプリでアプリ内課金を実現すべく,「In App Purchaseプログラミングガイド」と「iTunes Connect デベロッパガイド」を読んで勉強しています。
その中で自分用に気になった点をメモ代わりに列挙しておきます。(読中なので随時追記予定)

In App Purchaseプログラミングガイド

  • In App Purchaseは、問題なく購入された後のアプリケーションにパッチを適用する機能を提供しません。プロダクトでアプリケーションのバンドルを変更する必要がある場合、App Storeにアプリケーションの更新版を配布しなければなりません。(P11)
  • サーバを使用してコンテンツを配布するアプリケーションの場合、iPhoneアプリケーションとサーバ間のやり取りに使用するプロトコルの設計と実装の責任はデベロッパにあります。(P26)
  • Store KitはiPhoneシミュレータ上では動作しません。Storeのテストは実際のデバイス上で行う必要があります。(P31)
    • iPhone Developer Programに登録する必要があるということ。

iTunes Connect デベロッパガイド 6.0

  • 新たに導入されたVersion Release Control(バージョンのリリース制御)を利用すると、アプリケーションの新バージョンを審査終了直後に公開させずに、特定の日を選択してAppStoreで公開できます。(P11)
  • App Storeで配布するためのデベロッパアカウントは主言語と会社名は以後編集できません。(P19)
  • 本社が日本国外にある場合は、日本の納税申告用紙は任意です(日本国内にある場合は不要です)。(P32)
  • iTunes ConnectユーザのロールにはAdmin,Legal,Finance,Technicalがある。(P34)
  • iTunes Connectにおいて、1つのアプリケーションにつき、最大3,000個の異なるプロダクトID を作成し、In App Purchaseに割り当てることができます。(P142)

参考リンク

CakePHPでVARCHAR(256以上)の値を取得すると255byteにカットされてしまう

  • 環境

上記の環境で,VARCHAR(512)をSELECTすると255byteでカットされてしまうようです。


以下のファイルを中心に調べてみたのですが,根本に辿り着けずで断念してしまいました。

  • cake\libs\model\datasources\datasource.php
  • cake\libs\model\datasources\dbo_source.php
  • cake\libs\model\datasources\dbo\dbo_mssql.php


cake\libs\model\datasources\dbo\dbo_mssql.phpにそれらしき'255'があったので,書き換えてみるも変化無し。。。

<?php
/**
 * MS SQL column definition
 *
 * @var array
 */
  var $columns = array(
    'primary_key' => array('name' => 'IDENTITY (1, 1) NOT NULL'),
    'string'      => array('name' => 'varchar', 'limit' => '255'),
    'text'        => array('name' => 'text'),
    'integer'     => array('name' => 'int', 'formatter' => 'intval'),
    'float'       => array('name' => 'numeric', 'formatter' => 'floatval'),
    'datetime'    => array('name' => 'datetime', 'format' => 'Y-m-d H:i:s', 'formatter' => 'date'),
    'timestamp'   => array('name' => 'timestamp', 'format' => 'Y-m-d H:i:s', 'formatter' => 'date'),
    'time'        => array('name' => 'datetime', 'format' => 'H:i:s', 'formatter' => 'date'),
    'date'        => array('name' => 'datetime', 'format' => 'Y-m-d', 'formatter' => 'date'),
    'binary'      => array('name' => 'image'),
    'boolean'     => array('name' => 'bit')
  );


今回は根本原因は判りませんでしたが,VARCHAR型で長さが256以上のカラムをTEXT型に変更することで解決しました。
CakePHP1.3にアップデートするや他のDBは試していません。


主要なDBのVARCHARサイズを調べたので参考までに載せておきます。

DB Min Max 出典
SQL Server 2008 R2 1 8,000 char および varchar (Transact-SQL) - SQL Server | Microsoft Docs
MySQL 5.1 0 65,535 http://dev.mysql.com/doc/refman/5.1-olh/ja/char.html
Oracle 11g 1 4,000 Oracleデータ型
PostgreSQL 9.0 1 正の整数 http://www.postgresql.jp/document/9.0/html/datatype-character.html

LeopardにPhoneGapをインストールする

環境構築からiPhoneシミュレータでサンプルを動かすまで,一通り出来たので作業メモを残しておきます。
(注:Mac歴24時間程度です)

前提条件

  • Apple Developer登録が済んでいること。

開発環境

環境構築

XCodeのインストール
  1. XCodeをダウンロードしようとAppleのサイトに行くと最新(Snow Leopard)版のリンクしか見当たりませんが,「 Xcode 3.1.4 for Leopard 」からダウンロードします。(要Apple Developerログイン)
  2. Finderで「/Users/user/Downloads/xcode314_2809_developerdvd.dmg」を開き,インストーラに従ってインストールします。
iPhone SDKのインストール
  1. こちらも同じく見つけづらいですが,「 iPhone SDK 3.1.3 with Xcode 3.1.4 – Leopard 」からダウンロードします。(要Apple Developerログイン)
  2. Finderで「iphone_sdk_3.1.3_with_xcode_3.1.4__leopard__9m2809a.dmg」を開き,インストーラに従ってインストールします。
PhoneGapのインストール
  1. http://www.phonegap.com/download 」から最新版をダウンロードします。
  2. /Users/user/Downloads/phonegap-0.9.1.zipを解凍し,下記コマンドを入力します。
[user@ ~]$ cd /Users/user/Downloads/phonegap/phonegap-iphone/
[user@ ~]$ sudo make
  1. PhoneGapLibInstaller.pkgを実行してインストールします。

PhoneGapのサンプルを起動

  1. /Users/user/Downloads/phonegap/phonegap-iphone/PhoneGapLibTest/PhoneGapLibTest.xcodeprojを開きます。
  2. XCodeから起動したいという場合は,デフォルトインストールであれば「/Developer/Applications/XCode」から起動できます。
  3. iPhone シミュレータ 3.1.3 を選択して[ビルドして進行]ボタンをクリックします。
  4. 「"_kUTTypeImage", referenced from:」というエラーが出たのでググってみると、FAQを読めということなので読んでみます。
    http://github.com/phonegap/phonegap-iphone/blob/master/README.md
  5. ずばりのFAQがあり「MobileCoreServices.framework」を追加しましょうということなのでXCodeのFrameworkを右クリックして「追加>既存のフレームワーク」で検索してみると複数見つかりました。
  6. 今回はiPhoneSimulator3.1.3で動かすつもりなので,「/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator3.1.3.sdk/System/Library/Frameworks/MobileCoreServices.framework」を追加します。
  7. 再度[ビルドと実行]ボタンをクリックすると,下記画面のように無事に起動することができました。


PHPMD(PHP Mess Detector) を試してみた

ZendStudioに同梱されている「ZendCodeAnalyzer」というツールを業務で使ってたんですが,
残念ながらZend Studio 7 評価版で確認したところ含まれていないようです。*1
※ZendCodeAnalyzerを使用するにはZendStudioのライセンスが必要です。


そこで代わりになるものを探してたらありました,PHP Mess Detector です。
PHPMDとは,JavaでいうところのPMDで,以下のような問題を見つけてくれます。

  • バグの可能性
  • 準最適なコード
  • 複雑な式
  • 未使用パラメータ,メソッド,プロパティ


今日(2010/05/26)時点の最新版が,PHPMD 0.2.5 (2010/04/03 released) なので,早速このバージョンで試してみます。

前提環境

  • PHP >= 5.2.3
  • PHP_Depend >= 0.9.11
[root@localhost ~]# pear channel-discover pear.pdepend.org
[root@localhost ~]# pear install pdepend/PHP_Depend-beta

PHPMDのインストール

[root@localhost ~]# pear channel-discover pear.phpmd.org
[root@localhost ~]# pear channel-discover pear.pdepend.org
[root@localhost ~]# pear install --alldeps phpmd/PHP_PMD-alpha
[root@localhost ~]# phpmd
Mandatory arguments:
1) A php source code filename or directory
2) A report format
3) A ruleset filename or a comma-separated string of rulesetfilenames

Optional arguments that may be put after the mandatory arguments:
--minimumpriority: rule priority threshold; rules with lower priority than this will not be used
--reportfile: send report output to a file; default to STDOUT
--extensions: comma-separated string of valid source code filename extensions
--ignore: comma-separated string of patterns that are used to ignore directories

テスト用のphpファイルを作成

<?php
class Something
{
    private static $FOO = 2; // unused
    private $i = 5; // unused
    private $j = 6;
    public function addOne()
    {
        return $this->j++;
    }

    private function foo() {} // unused

    private function bar()
    {
        $i = 5; // unused
        $j = 5;

        switch ($j) {
            case 0:
                if (1) {
                    // hoge
                }
                break;
            case 1: /* hoge */ break;
            case 2: /* hoge */ break;
            case 3: /* hoge */ break;
            case 4: /* hoge */ break;
            case 5: /* hoge */ break;
            case 6: /* hoge */ break;
            case 7: /* hoge */ break;
            case 8: /* hoge */ break;
            case 9: /* hoge */ break;
            default: break;
        }
    }

    private function baz($hoge)
    {
        // $hoge is not used
    }
}

レポート:'text',ルールセット:'Code Size Rules' で実行

[user@localhost ~]$ phpmd test.php text codesize

test.php:14 The method bar() has a Cyclomatic Complexity of 12.

レポート:'text',ルールセット:'Naming Rules' で実行

[user@localhost ~]$ phpmd test.php text naming

test.php:5  Avoid variables with short names like $i
test.php:6  Avoid variables with short names like $j
test.php:16 Avoid variables with short names like $i
test.php:17 Avoid variables with short names like $j

レポート:'text',ルールセット:'Unused Code Rules' で実行

[user@localhost ~]$ phpmd test.php text unusedcode

test.php:4  Avoid unused private fields such as '$FOO'.
test.php:5  Avoid unused private fields such as '$i'.
test.php:12 Avoid unused private methods such as 'foo'.
test.php:14 Avoid unused private methods such as 'bar'.
test.php:16 Avoid unused local variables such as '$i'.
test.php:38 Avoid unused private methods such as 'baz'.
test.php:38 Avoid unused parameters such as '$hoge'.

レポート:'xml',ルールセット:'Unused Code Rules' で実行

[user@localhost ~]$ phpmd test.php xml unusedcode
<?xml version="1.0" encoding="UTF-8" ?>
<pmd version="0.2.5" timestamp="2010-04-25T10:49:34+09:00">
  <file name="test.php">
    <violation beginline="4" endline="4" rule="UnusedPrivateField" ruleset="Unused Code Rules" externalInfoUrl="http://phpmd.org/rules/unusedcode.html#unusedprivatefield" priority="3">
      Avoid unused private fields such as '$FOO'.
    </violation>
    <violation beginline="5" endline="5" rule="UnusedPrivateField" ruleset="Unused Code Rules" externalInfoUrl="http://phpmd.org/rules/unusedcode.html#unusedprivatefield" priority="3">
      Avoid unused private fields such as '$i'.
    </violation>
    <violation beginline="12" endline="12" rule="UnusedPrivateMethod" ruleset="Unused Code Rules" package="+global" externalInfoUrl="http://phpmd.org/rules/unusedcode.html#unusedprivatemethod" class="Something" method="foo" priority="3">
      Avoid unused private methods such as 'foo'.
    </violation>
    <violation beginline="14" endline="36" rule="UnusedPrivateMethod" ruleset="Unused Code Rules" package="+global" externalInfoUrl="http://phpmd.org/rules/unusedcode.html#unusedprivatemethod" class="Something" method="bar" priority="3">
      Avoid unused private methods such as 'bar'.
    </violation>
    <violation beginline="16" endline="16" rule="UnusedLocalVariable" ruleset="Unused Code Rules" externalInfoUrl="http://phpmd.org/rules/unusedcode.html#unusedlocalvariable" priority="3">
      Avoid unused local variables such as '$i'.
    </violation>
    <violation beginline="38" endline="41" rule="UnusedPrivateMethod" ruleset="Unused Code Rules" package="+global" externalInfoUrl="http://phpmd.org/rules/unusedcode.html#unusedprivatemethod" class="Something" method="baz" priority="3">
      Avoid unused private methods such as 'baz'.
    </violation>
    <violation beginline="38" endline="38" rule="UnusedFormalParameter" ruleset="Unused Code Rules" externalInfoUrl="http://phpmd.org/rules/unusedcode.html#unusedformalparameter" priority="3">
      Avoid unused parameters such as '$hoge'.
    </violation>
  </file>
</pmd>

良い感じの結果が出力されました:-)
ルールセットの種類およびチェック詳細は,http://phpmd.org/rules/index.html を参照してみてください。

*1:サポートに問い合わせたところ,機能を個別に利用する方法は開示出来ないとのことなので推測です。

HipHop for PHP 環境の作り方

Windows7上に仮想マシンを構築してHipHop for PHPを試してみました。
以下に環境構築〜動作確認までの手順をまとめておきます。

前提環境

  • VT対応の64bitCPU (私はCorei5 750を使っています)
  • Windows7 Professional 64bit

構築環境

VMware Playerを使用している理由は,Virtual PCで64bitOSが動作しないため。

VMware Playerのインストール

  1. ユーザ登録してダウンロード!
  2. VMware-player-3.0.1-227600.exe をインストール。
  3. isoからインストール
  4. VMware Tools Linuxをインストールする必要ありと言われるので従ってインストール。
  5. OS再起動

CentOSのインストール

OSのインストール

インストーラの指示に従ってデフォルトインストール。

  1. インストール言語:日本語
  2. キーボード:日本語
  3. パーティション:デフォルトのまま
  4. ネットワークデバイス:デフォルトのまま
  5. 地域:アジア/東京
  6. ルート:
  7. ソフトウェア
  8. インストール後再起動
  9. ファイアウォール:無効
  10. SELinux:無効
  11. 日付と時刻:デフォルトのまま
  12. ユーザの作成:お任せ
  13. 追加のCDデフォルトのまま
  14. 再起動

HipHop for PHPのビルドとインストール

[user@localhost ~]$ su -
[root@localhost ~]# mkdir build
[root@localhost ~]# cd build
[root@localhost build]# yum install yum-priorities
[root@localhost build]# wget http://apt.sw.be/redhat/el5/en/i386/RPMS.dag/rpmforge-release-0.3.6-1.el5.rf.i386.rpm
[root@localhost build]# rpm -import http://dag.wieers.com/rpm/packages/RPM-GPG-KEY.dag.txt
[root@localhost build]# rpm -K rpmforge-release-0.3.6-1.el5.rf.*.rpm
rpmforge-release-0.3.6-1.el5.rf.i386.rpm: (sha1) dsa sha1 md5 gpg OK
[root@localhost build]# rpm -i rpmforge-release-0.3.6-1.el5.rf.*.rpm
[root@localhost build]# yum check-update
[root@localhost build]# vim /etc/yum.repos.d/rpmforge.repo
enabled = 0 に変更
[root@localhost build]# yum install \
  binutils-devel \
  bison \
  cmake \
  curl-devel \
  distcc \
  expat-devel \
  gcc gcc-c++ \
  gd gd-devel \
  git \
  libcap-devel \
  libevent-devel \
  libmcrypt-devel \
  libssh2 \
  libxml2-devel \
  mysql-server mysql-devel \
  openssl-devel \
  pcre-devel \
  re2c \
  --enablerepo=rpmforge
[root@localhost build]# wget http://www.kernel.org/pub/software/scm/git/RPMS/x86_64/git-1.5.6.1-1.x86_64.rpm
[root@localhost build]# wget http://www.kernel.org/pub/software/scm/git/RPMS/x86_64/perl-Git-1.5.6.1-1.x86_64.rpm
[root@localhost build]# rpm -U git-1.5.6.1-1.x86_64.rpm perl-Git-1.5.6.1-1.x86_64.rpm 

[root@localhost build]# wget http://www.threadingbuildingblocks.org/uploads/77/142/2.2/tbb22_20090809oss_lin.tgz
[root@localhost build]# tar xvzf tbb22_20090809oss_lin.tgz
[root@localhost build]# export TBB_INSTALL_DIR="/root/build/tbb22_20090809oss"
[root@localhost build]# export TBB_ARCH_PLATFORM="intel64/cc4.1.0_libc2.4_kernel2.6.16.21"

[root@localhost build]# wget http://github.com/downloads/johnwyles/hiphop-rpm-centos/boost-1_37_0-1.x86_64.rpm
[root@localhost build]# wget http://github.com/downloads/johnwyles/hiphop-rpm-centos/boost-debuginfo-1_37_0-1.x86_64.rpm
[root@localhost build]# wget http://github.com/downloads/johnwyles/hiphop-rpm-centos/boost-devel-1_37_0-1.x86_64.rpm
[root@localhost build]# wget http://github.com/downloads/johnwyles/hiphop-rpm-centos/icu-4.2.1-1.x86_64.rpm
[root@localhost build]# wget http://github.com/downloads/johnwyles/hiphop-rpm-centos/icu-debuginfo-4.2.1-1.x86_64.rpm
[root@localhost build]# wget http://github.com/downloads/johnwyles/hiphop-rpm-centos/libicu42-4.2.1-1.x86_64.rpm
[root@localhost build]# wget http://github.com/downloads/johnwyles/hiphop-rpm-centos/libicu-devel-4.2.1-1.x86_64.rpm
[root@localhost build]# rpm -ivh \
  icu-4.2.1-1.x86_64.rpm \
  libicu42-4.2.1-1.x86_64.rpm \
  libicu-devel-4.2.1-1.x86_64.rpm \
  icu-debuginfo-4.2.1-1.x86_64.rpm \
  boost-1_37_0-1.x86_64.rpm \
  boost-devel-1_37_0-1.x86_64.rpm \
  boost-debuginfo-1_37_0-1.x86_64.rpm

[root@localhost build]# wget http://downloads.sourceforge.net/project/flex/flex/flex-2.5.35/flex-2.5.35.tar.gz?use_mirror=jaist
[root@localhost build]# tar xvzf flex-2.5.35.tar.gz
[root@localhost build]# cd flex-2.5.35
[root@localhost flex-2.5.35]# ./configure && make && sudo make install
[root@localhost flex-2.5.35]# cd ..

[root@localhost build]# wget http://www.geocities.jp/kosako3/oniguruma/archive/onig-5.9.2.tar.gz
[root@localhost build]# tar xvfz onig-5.9.2.tar.gz
[root@localhost build]# cd onig-5.9.2
[root@localhost onig-5.9.2]# ./configure && make && sudo make install
[root@localhost onig-5.9.2]# cd ..

[root@localhost build]# git clone git://github.com/facebook/hiphop-php.git

[root@localhost build]# wget http://www.monkey.org/~provos/libevent-1.4.13-stable.tar.gz
[root@localhost build]# tar xvzf libevent-1.4.13-stable.tar.gz
[root@localhost build]# cd libevent-1.4.13-stable
[root@localhost libevent-1.4.13-stable]# cp ../hiphop-php/src/third_party/libevent.fb-changes.diff .
[root@localhost libevent-1.4.13-stable]# patch < libevent.fb-changes.diff
[root@localhost libevent-1.4.13-stable]# ./configure && make && sudo make install
[root@localhost libevent-1.4.13-stable]# cd ..

[root@localhost build]# wget http://curl.haxx.se/download/curl-7.20.0.tar.gz
[root@localhost build]# tar xvzf curl-7.20.0.tar.gz
[root@localhost build]# cd curl-7.20.0
[root@localhost curl-7.20.0]# cp ../hiphop-php/src/third_party/libcurl.fb-changes.diff .
[root@localhost curl-7.20.0]# patch -p0 < libcurl.fb-changes.diff
[root@localhost curl-7.20.0]# ./configure && make && sudo make install
[root@localhost curl-7.20.0]# cd ..

[root@localhost build]# export CMAKE_PREFIX_PATH=/root/build
[root@localhost build]# cd hiphop-php/
[root@localhost hiphop-php]# git submodule init
[root@localhost hiphop-php]# git submodule update
[root@localhost hiphop-php]# export HPHP_HOME=`pwd`
[root@localhost hiphop-php]# export HPHP_LIB=`pwd`/bin
[root@localhost hiphop-php]# cmake .
[root@localhost hiphop-php]# make

HipHop for PHPの動作確認

[root@localhost hiphop-php]# export TBB_INSTALL_DIR="/root/build/tbb22_20090809oss"
[root@localhost hiphop-php]# export TBB_ARCH_PLATFORM="intel64/cc4.1.0_libc2.4_kernel2.6.16.21"
[root@localhost hiphop-php]# export HPHP_HOME=`pwd`
[root@localhost hiphop-php]# export HPHP_LIB=`pwd`/bin
[root@localhost hiphop-php]# vi test.php
<?php
echo 'Hello hiphop-php!!';

[root@localhost hiphop-php]# src/hphp/hphp test.php

VMware Playerの仮想マシンをコピーする方法

VMware Player 3.0.1には仮想マシンをコピーする機能が無いらしいので,自力でコピーしてみました。
使用していて問題は発生していませんが,自己責任でお願いします。


コピー元:「CentOS」,コピー先:「CentOS_copy」という前提で進めていきます。


1. C:\Users\renoiv\Documents\Virtual Machinesフォルダに,
仮想マシンのフォルダがあるのでフォルダ毎コピーします。

 C:\Users\renoiv\Documents\Virtual Machines\CentOS
        ↓↓↓↓    COPY    ↓↓↓↓
 C:\Users\renoiv\Documents\Virtual Machines\CentOS_copy

2. コピー先のファイル名を下記のようにリネームします。

CentOS.nvram → CentOS_copy.nvram
CentOS.vmdk  → CentOS_copy.vmdk
CentOS.vmem  → CentOS_copy.vmem
CentOS.vmsd  → CentOS_copy.vmsd
CentOS.vmss  → CentOS_copy.vmss
CentOS.vmx   → CentOS_copy.vmx
CentOS.vmxf  → CentOS_copy.vmxf

3. CentOS_copy.vmxをテキストエディタで開いて下記のように編集します。

11行| scsi0:0.fileName = "CentOS_copy.vmdk"
43行| displayName = "CentOS_copy"
45行| nvram = "CentOS_copy.nvram"
48行| extendedConfigFile = "CentOS_copy.vmxf"
49行| checkpoint.vmState = "CentOS_copy.vmss"

4. VMware Playerの起動して「仮想マシンを開く」から「CentOS_copy.vmx」を開きます。

コピーした仮想マシンかどうか聞いてきますので「コピーしました」を選択して
[OK]ボタンをクリックすれば仮想マシンが起動します。


以上です。


CentOS_copy.vmxfファイル内のを変更すれば,
確認ダイアログは表示されないかもしれませんが試していません。

7年ぶりにメインPCをリニューアル

Windows2000で今まで頑張ってきましたが,そろそろサポート期間が終わるのと,
色々動かないソフトたち(iTune8/VC2008/ATOK/Google Chrome/Evernote)が居るので,
新年度を気分よく迎えるという理由(いいわけ)を作って自作しました。


パーツ構成は以下の通りです。

パーツ メーカ 製品名 メモ
OS Microsoft Windows7 Professional 64bit DSP
CPU Intel Core i5 750 BOX
マザー ASUS P7P55D-E
メモリ CFD W3U1333Q-2G (DDR3 PC3-10600 2GB 2枚組)
HDD 日立 HDS721010CLA332 (1TB/SATA3G/7200rpm/16MB) ×2台でRAID1
DVD-D BAFFALO 手持ち
グラボ SAPPHIRE HD 4550 512MB DDR3 PCIE HDMI LP ファンレス
電源 HEC HEC-550TE-2WX (WIN+POWER 550W電源)
PCケース ANTEC SOLO


それと,HDDのベンチマーク結果も張っておきます。

組み立て時間はトラブル無で3時間くらいでしょうか。
いやいや,Windows7って快適じゃないですか!
それと静音ケースの静音っぷりに感動しました。


次はモニタが15インチなのでもっと大きくしたいところ;-P