2013年8月29日木曜日

Facebook iOS SDKで扱われる日付文字列(created_time、updated_time等)をNSDateに変換する

Facebook iOS SDKを使用して検索等を実施した時の返却情報内の日付情報は文字列なのでそれをNSDateに変換する方法を紹介します。



ポイント
  1. Tの部分はシングルクォーテションで囲む
  2. フォーマットの最後の+0000の部分は「Z」と記述する


このエントリーをはてなブックマークに追加

2013年8月22日木曜日

JavaScriptでクラスを定義したい人は集まれ

JavaScriptにおけるクラスの定義はJavaやC++、C#、Objective-Cでのクラスを定義する方法とはかなり違っているのでここで紹介しておきます。
プライベート変数、プライベートメソッドの実装方法もあるYO。
大まかな手順は以下になります。

  1. コンストラクタを定義する
  2. インスタンスメソッドを定義する
  3. クラスメソッドを定義する

ここではモンスタークラスを実際に定義していくことにします。
モンスタークラス仕様
  1. 名前を取得設定出来る。
  2. ライフを取得設定出来る。
  3. x、y座標を指定して移動できる。
  4. モンスターを継承したボスモンスターが存在する。

1.コンストラクタを定義する

コンストラクタとは言ってもただの関数で関数名がクラス名になります。

2.インスタンスメソッドを定義する

インスタンスメソッドはコンストラクタのprototypeオブジェクトに定義します。prototypeってなに?さ、さぁ。。。

3.クラスメソッドを定義する

クラスメソッドやクラス変数はコンストラクタのプロパティとして定義します。

4.モンスタークラスを継承したボスモンスタークラスを定義する

継承は下記の2つで実現出来ます。

  1. コンストラクタでスーパークラスのコンストラクタを呼び出す。
  2. サブクラスのprototypeにスーパークラスのprototypeを設定する、


5.動的な継承

これは下で紹介しているオライリー本に掲載されていました。詳細はよくわかりませんがこの方法でJavaScriptにおける動的なクラスの継承が実現できました。

6.プライベート変数やプライベートメソッドの定義方法

プライベート変数、プライベートメソッドを定義する為のポイント
  1. ファクトリーメソッド内でインスタンスを生成する
  2. プライベート変数、プライベートメソッドをファクトリーメソッド内に定義する
  3. プライベートメソッドはインスタンスにバインドする。
  4. パブリックメソッドをファクトリーメソッド内に定義する
  5. クロージャーを応用してプライベイート変数、プライベートメソッドを実現している

このエントリーをはてなブックマークに追加

2013年8月21日水曜日

FuelPHPのOrm\Modelのto_array()をリレーションに対応させる

FuelPHPのOrm\Modelにto_array()というメソッドがありますが、どうやらリレーションには対応していないようなので、リレーションに対応したメソッドを実装してみました。

PHPは文字列でクラスやメソッド、プロパティ等を指定出来るので使い方を間違わなければ便利ですね。


このエントリーをはてなブックマークに追加

2013年8月17日土曜日

FuelPHPのDebug::dumpで日本語が文字化けしてしまった時の対処方

FuelPHPのDebug::dumpで日本語が文字化けしてしまう現象が発生してしまった場合、Debug::dump内で扱っている文字コードとConfigで設定している文字コードが違っている場合があります。
具体的に言うと
fuel/core/classes/debug.php
内の
public static function format($name, $var, $level = 0, $indent_char = '    ', $scope = '')

というメソッド内に htmlentities($var) の記述があるはずです。 このhtmlentitiesの文字コードが指定されていない為にデフォルトの文字コードISO-8859-1が使用されてしまい文字化けしてしまう場合があるのです。 

[対処方法] 対象方法は文字コードを指定するだけです。
このエントリーをはてなブックマークに追加

2013年8月13日火曜日

[NSData dataWithContentsOfURL:]を使って簡単に非同期HTTP通信を実装する

iPhoneアプリでサーバーと非同期通信してデータを取得したいと思ったら
NSMutableURLRequest
NSURLConnection
NSOperationQueue
を使用して自前で実装したりフリーのライブラリを使用して受信データをNSDataに格納する人が多いと思いますが、実はNSDataには指定されたURLからデータを取得する
/*
 *指定されたurlからデータを取得する
 *@param url データを読み込むurl
 *@param readOptionsMask 読み込んだデータをキャッシュしない等のオプション指定
 *@param errorPtr エラーが発生した際のエラー格納先
 *@return 受信データ
 */
+ (id)dataWithContentsOfURL:(NSURL *)url options:(NSDataReadingOptions)readOptionsMask error:(NSError **)errorPtr;

というメソッドが用意されているんですね。
使い方はいたって簡単で


こんな感じでかなり簡単に実装できます。
が、このdataWithContentsOfURLには重大な欠点があります。
それは非同期では無いという事です。
つまりデータのダウンロードが完了するまでアプリがフリーズしてしまうんですね。

しかし、ご安心くださいGCD(Grand Central Dispatch)というObjective-Cの機能を使用すれば簡単に非同期にすることができるのです。
GCDの簡単な使い方は

dispatch_queue_t q_global = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_queue_t q_main   = dispatch_get_main_queue();
dispatch_async(q_global, ^{
// ここに非同期(バックグラウンド)で実行したい処理を記述
});

こんな感じです。
GCDを使って先ほどのdataWithContentsOfURLを非同期化すると

こうなります。
ベーシック認証なんかもdataWithContentsOfURLを使用すれば簡単に実装できます。


このエントリーをはてなブックマークに追加