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を使用すれば簡単に実装できます。


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

2013年5月31日金曜日

WPFでTextBoxやRichTextBoxにファイルをドラッグ&ドロップするには

WPFのTextBoxってのは非常に優秀で何もしなくてもテキストのドラッグ&ドロップに対応しているんですね。解除用のフラグは見当たりませんでしたけど。。。
おかげでファイルのドラッグ&ドロップを実装する場合、テキストのドラッグ&ドロップイベント処理が邪魔をしてしまうので少しこつが必要です。

[コツ]

  1. DragEventArgs.Handled=false;でテキストのドラッグ&ドロップイベントハンドラーを機能しなくする。

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

2013年5月3日金曜日

ARCを使わないObjective-Cのメモリ管理はこうすればリークも不正落ちも怖くない

Objective-Cはガベージコレクションを搭載していないので、メモリ管理が結構たいへんですがルールを決めてしまえばそんなに大変ではなくなるので楽してメモリ管理する方法をまとめてみました。

[前提条件]

  1. xcode4.5以上を使用する。

[ポイント概要]

  1. プロパティ記述時の属性(retain assign copy)を使い分ける
  2. alloc時にはautoreleaseを記述する
  3. 自クラス内のインスタンス変数へアクセスする時はプロパティを使用する
  4. retain、copy属性のプロパティはdealloc内でnilを代入する

[ポイント詳細]


ポイント1:プロパティの記述時の属性(retain assign copy)を使い分ける

ヘッダーファイルのクラス宣言内に記述するプロパティの属性を正しく使い分けます。

  1. object型はretainを指定する
  2. NSString型はcopyを指定する
  3. プリミティブ型はassignを指定する
  4. delegateはassignを指定する

※Objective-Cで使用できる主なプリミティブ型
short (signed short)
unsigned short
int (signed int)
unsigned int
float
double
char
BOOL

ポイント2:alloc時にはautoreleaseを記述する

オブジェクトをallocしたら必ずautoreleaseを記述します。


ポイント3:自クラス内のインスタンス変数へアクセスする時はプロパティを使用する

プロパティを使用しない場合、メモリリークや解放済みのオブジェクトへのアクセスが発生する可能性が高くなります。


ポイント4:retain、copy属性のプロパティはdeallocないでnilを代入する

retain、copy属性が指定されたプロパティはdeallocでnilを代入しないとメモリリークが発生してしまいます。


◎autoreleaseを記述しない方がいい場合

例外としてループ(for、while)内でオブジェクトを生成する場合はメモリ節約の観点からautoreleaseを使用しない方が良いでしょう。

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

2013年5月1日水曜日

ラズベリーパイにGitをインストールする方法俺メモ

ラズベリーパイにGitをインストールする方法をメモっとく

[手順概要]

  1. piでログインする(sudoの権限があるユーザー)
  2. gettextをインストールする(Gitインストールにmsgfmtコマンドが必要なので)
  3. Gitをインストールする

[手順詳細]

1.piでログインする

 全ユーザーでGitを使用したいので「/usr/lib/git」へインストールします。
 その為にsudo権限のあるユーザーでログインする必要があります。

2.gettextをインストールする

   2.1.次のコマンドを順次実行すればok
      $cd /tmp/
      $wget http://ftp.gnu.org/pub/gnu/gettext/gettext-0.18.2.tar.gz
      $tar zxvf gettext-0.18.2.tar.gz 
      $./configure --prefix=/usr --disable-csharp
      $make
      $sudo make install
      ※gettext-0.18.2.tar.gzはインストールするバージョンによって変わります

3.Gitをインストールする

   3.1.次のコマンドを順次実行すればok
      $cd /tmp/
      $wget http://git-core.googlecode.com/files/git-1.8.2.1.tar.gz
      $tar xvfz git-1.8.2.1.tar.gz
      $cd git-1.8.2.1/
      $sudo mkdir -p /usr/lib/git
      $sudo ./configure --prefix=/usr/lib/git
      $sudo make all install
      $cd /usr/bin/
      $sudo ln -s /usr/lib/git/bin/git ./git
      ※git-1.8.2.1.tar.gzはインストールするバージョンによって変わります

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