page_adsence

2014年2月8日土曜日

アクセサメソッド

Objective-Cに限らず、オブジェクト指向言語では外部からクラスのインスタンス変数に直接アクセスすることはしません。
一般的にはインスタンス変数の値の取得や、設定にはアクセス用のメソッドを作成し、使用します。
このアクセス用のメソッドのことをアクセサメソッドと呼びます。
また、取得用のメソッドをgetter、設定用のメソッドをsetterと呼びます。

getterの作り方
getterを作成するにはインスタンス変数と同じ名前のメソッドを定義します。 例えばint型の「hoge」というインスタンス変数に対応するgetterを作成するには以下のように記述します。
// ヘッダファイル(XXXX.h)
- (int)hoge;
 
// 実装ファイル(XXXX.m)
- (int)hoge
{
    return hoge;
}


setterの作り方
setterを作成するにはインスタンス変数と同じ名前の前にsetを付けた名前のメソッドを定義します。
// ヘッダファイル(XXXX.h)
- (void)setHoge:(int)value;

//実装ファイル(XXXX.m)
- (void)setHoge:(int)value
{
    hoge = value;
}


アクセサへのアクセス方法
定義したアクセサへアクセスするためにはC言語の構造体のメンバへのアクセスのように,ドット演算子(.)を使用します。
例えば「myClass」というクラスのインスタンスの「hoge」というアクセサにアクセスするには以下のように記述します。

// getterを利用して値を取得している
int intHoge = myClass.hoge;
 
// setterを利用して値を設定している
myClass.hoge = 10;

// 通常の関数として利用することも可能
[myClass setHoge:10]


ここで1つ注意点。
setterはsetHogeというメソッドで用意したのですが、実際に使用する場合はインスタンス名にインスタンス変数名をドット演算子で繋いでいるだけという点。
ちなみに普通の関数として利用することも出来るので、上記の例のようにメッセージ式の書き方で記述することで、setterを利用することが出来る。(面倒ですが・・・)
ここまで書いて初めてPHPとかJavascriptの様に、クラスを作ってインスタンス変数にアクセスすることが出来るようになる。
Objective-Cってなんて面倒くさいんだと思った方はたくさんいると思います。
こんな面倒なことがそのままにされているはずがありません。
Objective-C2.0からはちゃんと自動で生成してくれるための機能が用意されています。
その機能というのがプロパティなのですが、それは次回にしたいと思います。

2014年2月7日金曜日

EmEditor Pro版からFree版へ変更する方法

EmEditorのPro(有償)版からFree(無償)版へとダウングレードする方法のメモ。
最近のEmEditorはPro版とFree版が同じインストーラーで配布されており、インストールするとPro版がインストールされる。
評価版なので、アプリを起動する度に、買うか評価版として使い続けるかのメッセージが出てくるのが嫌だったので、早々にFree版にダウングレードする。
やり方は以下の通り。

1.EmEditorを起動
2.メニュー欄のツール→クイック起動を選択
3.クイック起動画面左上の検索欄でダウングレードと検索するか、リスト上から分類「ヘルプ」のコマンド「ダウングレード」を探す。
4.リスト上のコマンド「ダウングレード」をダブルクリック。
5.確認メッセージが出てくるので、「はい」を選択。

以上でダウングレード完了。

2014年2月6日木曜日

Objective-Cのクラス周りの書き方

Objective-Cの勉強を始めたものの、今までPHPやJSしかやってこなかった自分にとってはとても分かりにくい書き方だった。
演算子とか条件分岐やループ処理といった部分に関しては、今までやってきた言語同様の書き方だったが、クラス関連の書き方が全然違ったので激しく違和感を感じるとともに、慣れていないので非常に書きづらい。
忘れそうなので、ここにまとめておく。

ファイル構造
ヘッダファイル及び実装ファイルのファイル内の構造は以下の通り。

ヘッダファイルのファイル構造
#import <フレームワーク/ファイル>
#import ソースファイル

@interface クラス名;スーパークラス名 <プロトコル>
{
    インスタンス変数宣言;
}
プロパティ宣言;
メソッド宣言;
@end

実装ファイルのファイル構造
#import ヘッダファイル

@interface クラス名() <プロトコル>
{
    インスタンス変数宣言;
}
プロパティ宣言;
メソッドの定義;
@end

@implementation クラス名
メソッド定義;
@end

クラスの宣言
  • クラス宣言は必ず必要
  • クラス宣言はヘッダファイル(XXX.h)に記載する
  • 親クラスは必ず指定しておく(継承すべき親クラスがない場合はNSObjectクラスを指定)
※継承すべき親クラスがない場合にNSObjectクラスを指定する理由は、オブジェクトのしての振る舞いをするために必要な機能がこのクラスに書かれているため。
そのため、用意されている全てのクラスはこのNSObjectクラスが基底クラスとなっている。

書き方
@interface クラス名:親クラス{
    インスタンス変数の定義
}

メソッドの定義

@end

インスタンス変数のスコープの種類 Objective-Cのスコープの種類は以下の3種類で、他の言語と同様。
スコープを省略した場合は自動的にprotectedになる。
  • @private 宣言したクラス内からのみアクセス可能
  • @protected 宣言したクラス内及び継承されたサブクラスからアクセス可能(デフォルト)
  • @public どこからでもアクセス可能

クラスメソッドとインスタンスメソッドの書き分け
  • +から書き出した場合はクラスメソッド
  • -から書きだした場合はインスタンスメソッド
クラスメソッドの書き方
+(返り値のデータ型)メソッド名
クラスメソッドの書き方(引数あり)
+(返り値のデータ型)メソッド名:(引数1のデータ型)引数1 ラベル2:(引数2のデータ型)引数2 ・・・

インスタンスメソッドは先頭の+を-に変更するだけなので省略。
ここまでが主にヘッダファイルに記載する内容。

以下は簡単なサンプル
@interface myClass:NSObject {
    NSInteger aaa; //自動的にprotectedとなる
    @private NSString *bbb;
    @protected BOOL isTrue;
    @public NSString *ddd;
}

+(void)myClassMethod;
-(void)myInstanceMethod;
@end



クラスの実装
  • クラスの実装は必ず実装ファイル(XXX.m)に書く

書き方
#import "クラス名.h";

@implementation クラス名
    ヘッダファイルで宣言したメソッドの実装コード
@end

以下は簡単なサンプル
#import myClass.h;

@implementation myClass

+(void)myClassMethod
{
    NSLog(@"myClassMethod");
}

-(void)myInstanceMethod
{
    NSLog(@"myInstanceMethod");
}

@end



クラスのインスタンス化及び初期化
  • クラスのインスタンス化を行った後に初期化をする。
  • インスタンス化にはNSObjectに定義されているallocメソッドを使う。
  • 初期化にはNSObjectに定義されているinitメソッドを使う。
書き方
変数 = [[クラス名 alloc]init];

以下は簡単なサンプル
MyClass *myClass = [[myClass alloc]init];

以上がクラスの基本的な書き方や使い方。
以下は書いてて気持ち悪かった部分。

クラスメソッドを実行したい場合
[オブジェクト メソッド名];

例)
[myClass myfunc];


クラスメソッドを実行したい場合(引数が1つ)
[オブジェクト メソッド名:引数];

例)
[myObj myfunc:a];


クラスメソッドを実行したい場合(引数が複数)
[オブジェクト メソッド名:引数1 ラベル2:引数2 ラベル3:引数3・・・];

例)
[myObj myfunc:a label2:b label3:c];

※尚、ここに記載されているのはクラスメソッドを実行したい場合で、インスタンスメソッドを実行する場合はインスタンス化して初期化してから下記の書き方でメソッドを実行して下さい。

この書き方だが、メッセージ式の書き方らしい。
[〜]の間で1つのメッセージとして判断される。
1つ納得いかない点は引数の1つ目のラベルがメソッド名になってしまう点だ。
なんか気持ち悪いけど慣れていくしかないか・・・。

2014年2月4日火曜日

Apacheの条件付きログ

Apacheの条件付きのログを残す方法。

例えば、ドメインは一緒だけど、一階層目のディレクトリでサイトが異なる場合。

http://hogehoge.co.jp/a/
http://hogehoge.co.jp/b/

こういった場合に普通にバーチャルホスト切ると、
ログファイルが一緒になってしまい、混乱を招くので条件によってログファイルの出力先ファイルを変更するようにしました。

最終的なバーチャルホストはこんな感じ
<VirtualHost *:80>
    ServerAdmin admin@hogehoge.jp
    DocumentRoot /path/to/dir/web
    ServerName hogehoge.jp
    ErrorLog /path/to/dir/logs/error_log

    SetEnvIf Request_URI "^\/site_a.*$" a_log
    ErrorLog /path/to/dir/logs/error_log env=a_log
    CustomLog /path/to/dir/logs/access_log common env=a_log

    SetEnvIf Request_URI "^\/site_b.*$" b_log
    #ErrorLog /path/to/dir2/logs/error_log env=b_log
    CustomLog /path/to/dir2/logs/access_log common env=b_log
    <IfModule mod_rewrite.c>
        RewriteEngine On
        RewriteCond %{REQUEST_FILENAME} !^/site_a
        RewriteCond /path/to/dir/web/%{REQUEST_FILENAME} -d
        RewriteCond /path/to/dir/web/%{REQUEST_FILENAME} -s [OR]
        RewriteCond /path/to/dir/web/%{REQUEST_FILENAME} -l
        RewriteRule ^(.*)$ /site_a$1 [PT]
        Alias /site_a /path/to/dir/web/

        RewriteCond %{REQUEST_FILENAME} !^/site_b
        RewriteCond /path/to/dir2/web/%{REQUEST_FILENAME} -d
        RewriteCond /path/to/dir2/web/%{REQUEST_FILENAME} -s [OR]
        RewriteCond /path/to/dir2/web/%{REQUEST_FILENAME} -l
        RewriteRule ^(.*)$ /site_b$1 [PT]
        Alias /site_b /path/to/dir2/web/
    </IfModule>
</VirtualHost>

MySQLのクエリログ出力をオンラインで変更する方法(MySQL5.1.12以降)

MySQLのクエリログの出力設定をオンラインで変更する方法です(MySQL5.1.12以降)。

まずMySQLのrootユーザーでログインします。

ログを出力するには

mysql> SET GLOBAL LOG = on;


ログ出力を停止するには

mysql> SET GLOBAL LOG = off;


ログ出力場所の確認は

mysql> SHOW VARIABLES LIKE "general_log_file";


ログ出力場所の変更は

mysql> SET GLOBAL general_log_file = '/var/log/mysql/mysql.log';


ログを出力しっぱなしにすると、ディスク容量を圧迫する可能性があるので、必要な時に出力するようにして、必要がなくなったら停止しておきます。

今更iPhoneアプリの開発を始めてみる(Objective-Cのお勉強)

前回ようやくiOS Developer Programへの登録が完了したのですが、
並行してXcodeの使い方とかObjective-Cのお勉強を進めていました。
ネットの情報でもなんとかなると思っていたのですが、どうもネットの記事を読みながらだと集中できない。
なので本を買うことに。
最終的な目標はUnityを使ってiPhoneアプリを開発することなので、iOSの本とUnityの本を買うことにしました。

とりあえずビックカメラに行って買ってきた。
今回購入した本は3冊。

「初めてのiOSプログラミング 第2版」
「詳細!Objective-C iPhoneアプリ開発 入門ノート Xcode5+iOS」
「ゲームの作り方 Unityで覚える遊びのアルゴリズム」


  • 「初めてのiOSプログラミング 第2版」
    技術書の定番オライリー・ジャパンの本。
    正直最初は難しすぎて理解できないだろうと思いつつ、まぁ詳しく書いてあるだろうから、
    足りない部分を補うために念のため購入。ちなみにXcode4系で書かれているので、現状の5    とは若干違う部分が多い。

  • 「詳細!Objective-C iPhoneアプリ開発 入門ノート Xcode5+iOS」
    この本はネットで色々調べてから買った本。
    やはり最初に一番ネックになるのはXcodeの使い方とObjective-Cの書き方だったので、
    最新のXcode5に対応している本は現状2冊しかないっぽくて、うち1冊は微妙そうだったの     で、こっちの本にしてみました。
    まだ軽くしか読んでいませんが、大分読みやすいと思います。

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

    この本はサンプルアプリが幾つか用意されていて、それを作りながら学習するタイプの本で    す。
    ゲームを自分で作ったことがないので、とりあえずサンプルがいっぱい入っている本を選び     ました。


とりあえず3冊購入したので、徐々に読み進めて書評を書いていきたいと思います。

今更iPhoneアプリの開発を始めてみる(iOS Developer Programへの登録)

大分遅くなってしまったが、今更ながらiPhoneアプリの開発を初めてみようと思った。
最終的にはUnity使ってゲームを作るとこを目的にしてやってみる。

実機でいろいろ試すにはiOS Developer Programへの参加が必要なので、とりあえずその登録をしてみようと思い、サイトを見ながら登録してみた。

が、何度やってもエラー。
購入画面にすらたどり着かない。
新しいAppleID作って購入してみたけど、それでも結果は同じ・・・。
何がいけないのかさっぱり分からず・・・。
時間が深夜だったので、その日は諦めて翌日試すことに。

で、翌日早速登録してみたらあっさり購入画面まで辿り着いた。
昨日のエラーは一体何だったんだ・・・と思いつつ、しばらく待っていると購入完了メールが届いたので、購入自体は正常に終了。
後はアクティベーションメールが届くのを待つ。
早い人は2〜3時間でメールが来ているみたいだったので、そわそわしながら待っていたが、待てど暮らせどメールは来ない。

結局丸2日経ってもメールが来なかったので、サポート宛にメールしてみた(このアドレスは日本語でも大丈夫とのことなので、日本語で質問した)。
半日後にメールが返って来て、AppleIDの情報で日本語になっている部分をローマ字に変えてくれって日本語で返って来た。
早く登録して欲しかったので、AppleIDの情報を修正して返信後にサポートセンターに電話。
アクティベーションメール来てないけど、ローマ字には変更しましたと伝えると、確認するから名前と電話が切れてしまった時のために折り返し用に電話番号を聞かれた。
その後AppleIDの情報は変更の確認が取れたが、アクティベーションメールが来ない件に関しては調査してみますとのことだった。
どうやら1/27にアクティベーション周りのシステムをアップデートしたらしく、その後からうまくアクティベーションメールが送れていないケースがあるらしい。
どのくらい時間掛かるのか聞いてみたが、分からないけどそんなに時間掛からないと言っていたので、今日中に連絡来るかなと思って待っていたが、結局その日は連絡もらえず。
金曜日に連絡がもらえなかったので、登録は来週に持ち越しかとがっかり・・・。

しかし翌朝メールチェックしていたら英語でメールが来ていた。
Google翻訳で訳してみると、課金情報が一致しないから政府発行の身分証を提出しろと。
このURLにアクセスして身分証送れと書かれていたので、入力の際に間違えたかなーと思いながらも、身分証を送信したら、送信後に表示された画面に

「Not Received」

送信に失敗したと思って、同じURLにアクセスしてみると、既にそのURLは使えなくなっていた。
休日だしどうすればいいのかと思っていたら、自動応答メールが送られてきた。

We received your documents.

・・・。
なんじゃそりゃ。
こんにゃろーと思いつつ、ファイルは無事受信されたらしいので、とりあえず週明けまで待ってみることに。

週明け月曜は全く連絡来ず。
火曜日の朝にメール確認したら連絡来ていました。
ようやくアクティベーションのメールが来たのかと思っていたら、

Thank You for Joining an Apple Developer Program

あれ、どうやら登録作業はすべて完了しているらしい。
本文を見てみたが、やはりようこそ的な内容が書いてありました。
なんだか正しい手順じゃないっぽいので、参考にならないと思いますが・・・。
何にせよ登録が完了してよかったです。

とりあえず第一歩目は踏み出せました。