Re:

感銘高き名言は「1%のひらめきがなければ99%の努力は無駄である」(トーマス・エジソン)

カテゴリ:開発 > プログラム関連

08 午後

Unity いろいろ便利だけどちゃんと使ったこと無いし、目的はアルゴリズムの考え方を参考にしよーと思って買ってきた。

発売されたときから気になってはいたけど立ち読みに終止符w

ほら。オーダーした iMac も今週末に届くことだし、もっかい体験版入れて一ヶ月の間に本書を試せるし。

ゲームの作り方 Unityで覚える遊びのアルゴリズム

レシートの検証で sandbox.itunes.apple.com/verifyReceipt に POST リクエストを投げてたんだけど(この度はアプリ内実装ではなくサーバサイドのPHPプログラム)、cURL によるレスポンスが空っていう現象に遭遇。

リリーステストをしたのは数ヶ月前で、その時は何の問題もなく検証結果( receipt, status = 0 )を受け取ってたよ(´・ω・`)

複数のサービスを詰め込んでる開発環境ってヤツは困り者ですな…。


結論から言うと cURL の CA 証明書の検証で認証エラーが起こってる
なお、この問題は解決に至っておらず(開発環境が自由じゃないから放置プレイ)、認証しないことでレスポンスの受け取りだけ確認してオッケーとした。
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // サーバ証明書の検証を行わないオプションをセット


Jailbreakしてるの実機が原因か?とか考えて昨日リストアしたっていうのに問題は変わらなかったw

てか、iOS 5からシミュレータでも確認できんのかな?

テストアカウントも課金コースの登録も正常だし、そもそもレシートはちゃんと受けてる訳で、その検証だけが出来ないっていう状況。

POST の方法を変えて file_get_contents() にて POST してみると…


レスポンス正常に受け取るし! 


receipt, status 共に問題なし。なんてこったい、原因が cURL だなんて…。

cURL の connection をデバッグしてみたら、結論に述べた証明書の検証でエラーが起こってたっていうね。

オプションを指定して証明書の検証を行わないと cURL でも問題なく。


原因の切り分けに経験不足が祟ったー。

証明書のディレクトリとか指定してみたけど結果は変わらないし、まぁその指定も適切じゃない気もするし、なんかサーバ設定が悪さしてる?んだろうね(万が一、Apple Developer がおかしいなんてこともある)
 

プログラムからサーバまで幅広い知識が求められるっていうのは、、、分業を成せない現状があるからで、その辺を担ってくれるほどの人員と会社の成長を遂げるしかないのか。

とりあえず、

libpng
libjpeg,
libtiff
zlib

&それぞれの-devel を入れておこうぜ( ・`ω・´)

Leptonicaをインストールしないとconfigureでおこられた。


Leptonicaをインストールしたらまたおこられた。

cannot find input file: `Makefile.in'

./autogen.shを実行した!


またなんか言われた。

cannot find macro directory `m4'  

$ mkdir m4


./configure
make
make install


done!

と行くと思ったら…makeでエラーが出て進まない←いまここ

strngs.h:1: error: stray '\357' in program


さて…。


追記:
含まれてるソースの一部(./ccutil/strngs.h)にBOM付きなファイルがあるせいでエラーになったようだ。

BOM削除して再度makeしたら通っタ━━━━(゚∀゚)━━━━!!


BOMのファイルを発見するコマンド

find . -type f|while read file;do [ "`head -c3 -- "$file"`" == $'\xef\xbb\xbf' ] && echo "found BOM in: $file";done

BOMナシに変換もできるのかもしれないけどできないってことで、発見したファイルをBOM表示させて編集にて取り除いて保存でおk!

BOM付きUTF-8テキストからBOMをとる - foursics blog
http://blog.foursics.jp/hironobu/2008/11/utf8-bom-removal.html

$ vim -b ./ccutil/strngs.h


GREE崩壊!良いシナリオだと思うな。



さて、ルールとか( ・`ω・´)


class MemberStatuses {}

const ERR_MEMBER_NOT_FOUND = 'Member Not Found!';

/**
 * phpDocumentor
 */
private $__memberStatus
protected $_memberId
public $memberName

private function __checkMember()
protected function _getMemberId()
final public function test()
public function index()

$sum = 0;
$memberCount = 0;
for($i = 0; $i < 10; $i++){
  $_n = $i + 1;
  $sum += $_n;
  $memberCount++;
}

echo $sum; # 55
echo $memberCount; # 10

echo json_encode(array('sum' => $sum, 'member_count' => $memberCount));

<script>
$(function(){
  var params = {
    page: 1,
    member_id: 123
  };
  var getData = function(response){
    var _data = $.evalJSON(response); // with jquery.json
    console.log(_data.sum);
    console.log(_data.member_count);

    $('#contents').append(
      $('<span>').addClass('member-count').text(_data.member_count)
    );
  };
  $.post('/controller/action', params, getData);
}
</script>

<style>
#contents {
  background-color: orange;
}
.member-name {
  font-size: x-large;
}
.member-count {
  color: red;
  font-weight: bold;
}
</style>

<div id="contents">
Welcome <span class="memeber-name">Nor.</span>
All of member counts: </div>



内部変数に関してはLCCで、外部変数やビューなどで扱う変数に関してはアンダースコアで小文字統一がイイと思うんだ。

扱いと流れが明確で原因の特定もしやすいだろうし。

プライベート変数とメソッドはアンダースコア2個、プロテクトは1個ではじまる。

ローカル変数も1個。 


id, class セレクタは小文字・ハイフン。


 

Data API Developer's Guide: PHP - Google Calendar APIs and Tools - Google Code
http://code.google.com/intl/ja/apis/calendar/data/1.0/developers_guide_php.html

  1. iPadがメインクライアント(店舗用)
  2. iPhoneがサブクライアント(各スタッフ用)
  3. Googleカレンダーによるバックアップ

About the 'Quick Add' feature - カレンダー ヘルプ
http://www.google.com/support/calendar/bin/answer.py?answer=36604

$quickAddText = 'お買い物、わくわく(´・ω・`) 10-13:30';

とか、ちゃんと午前10時から午後1時半に予定が作成された(実行時間よりも過去時間のため翌日の予定として)。

そのままでも日本語も問題ないようだ(試した環境はUTF-8です)。


独自のDB上で何かするときは、イベントのURLを保持しておくと変更や削除が直接行える。

// イベントを保存
$newEvent = $gdataCal->insertEvent($event);
// イベントのURLを取得
$href = $newEvent->title->text;

// イベント内容の更新
$oldEvent = $gdataCal->getCalendarEventEntry($href);
$oldEvent->title = $gdataCal->newTitle('買い物いくお(´・ω・`)'); # 内容
$startDate = '2011-06-19';
$endDate = '2011-06-19';
$startTime = '13:00';
$endTime = '15:00';
$tzOffset = '+09'; # Asia/Tokyo
$when = new Zend_Gdata_Extension_When(); # マジックメッソドだとなぜかWarningでるから…
//$when = $gdataCal->newWhen();
$when->startTime = "{$startDate}T{$startTime}:00.000{$tzOffset}:00";
$when->endTime = "{$endDate}T{$endTime}:00.000{$tzOffset}:00";       
$oldEvent->when = array($when); #日時
$oldEvent->save();

// イベント削除
$gdataCal->delete($href);

http://framework.zend.com/manual/ja/zend.gdata.calendar.html


↑このページのトップヘ