アプリ内課金についての調査メモ
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)
参考リンク
- 英語版
- 日本語版
- KRAY - みんなで考え、作り、価値を生み出す
- StoreKitDemo
CakePHPでVARCHAR(256以上)の値を取得すると255byteにカットされてしまう
- 環境
- CakePHP1.2.8
- SQL Server 2005
- VARCHAR(512)
上記の環境で,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登録が済んでいること。
開発環境
- MacOS 10.5.8
- XCode 3.1.4
- iPhone SDK 3.1.3 with Xcode 3.1.4
- PhoneGap 0.9.1
環境構築
XCodeのインストール
- XCodeをダウンロードしようとAppleのサイトに行くと最新(Snow Leopard)版のリンクしか見当たりませんが,「 Xcode 3.1.4 for Leopard 」からダウンロードします。(要Apple Developerログイン)
- Finderで「/Users/user/Downloads/xcode314_2809_developerdvd.dmg」を開き,インストーラに従ってインストールします。
iPhone SDKのインストール
PhoneGapのインストール
- 「 http://www.phonegap.com/download 」から最新版をダウンロードします。
- /Users/user/Downloads/phonegap-0.9.1.zipを解凍し,下記コマンドを入力します。
[user@ ~]$ cd /Users/user/Downloads/phonegap/phonegap-iphone/ [user@ ~]$ sudo make
- PhoneGapLibInstaller.pkgを実行してインストールします。
PhoneGapのサンプルを起動
- /Users/user/Downloads/phonegap/phonegap-iphone/PhoneGapLibTest/PhoneGapLibTest.xcodeprojを開きます。
- XCodeから起動したいという場合は,デフォルトインストールであれば「/Developer/Applications/XCode」から起動できます。
- iPhone シミュレータ 3.1.3 を選択して[ビルドして進行]ボタンをクリックします。
- 「"_kUTTypeImage", referenced from:」というエラーが出たのでググってみると、FAQを読めということなので読んでみます。
http://github.com/phonegap/phonegap-iphone/blob/master/README.md - ずばりのFAQがあり「MobileCoreServices.framework」を追加しましょうということなのでXCodeのFrameworkを右クリックして「追加>既存のフレームワーク」で検索してみると複数見つかりました。
- 今回はiPhoneSimulator3.1.3で動かすつもりなので,「/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator3.1.3.sdk/System/Library/Frameworks/MobileCoreServices.framework」を追加します。
- 再度[ビルドと実行]ボタンをクリックすると,下記画面のように無事に起動することができました。
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) なので,早速このバージョンで試してみます。
前提環境
[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のインストール
CentOSのインストール
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