page_adsence

2014年7月8日火曜日

Macで同一アプリでの画面切り替え

MacはWindowsの様にAlt + Tabでウィンドウ切り替えを行おうとすると、同一アプリケーションで複数ウィンドウ開いている場合に対応出来ない。
Windowsは立ち上がっているウィンドウをAlt + Tabで切り替えられるが、Macはcommand + Tabでアプリケーションを切り替えるようになっている。
アプリケーション内の複数ウィンドウを切り替える場合にはcommand + F1を押す必要がある。
若干遠いので、Option + Tabに設定を変更することにした。

1.リンゴマーク→システム環境設定→キーボードを選択
2.キーボード内のショートカットタブをクリック
3.左側の一覧の中の「キーボード」を選択
4.「次のウィンドウを操作対象にする」の右側のキー入力部分を選択
5.変更したいキーを入力

以上で完了。
とりあえず別アプリのショーットカットとかと競合しないことを祈る。

2014年5月20日火曜日

プログラミング作法(名前の付け方編)

プログラムを書いている時によく頭を悩ますのが変数や関数等々の名前の付け方。
Google翻訳みたいな感じで最適な名前を返してくれるサービスが欲しいと何度思ったことか。

「名前は情報を含み、簡潔で覚えやすく、できれば発音可能な名前が望ましい。」

とか言われても正直そんないい名前ほいほい思いつかないです。
でも、訓練次第ではいい名前が付けられるようになると思うので、自戒の意味を込めて記載しておきます。

1.グローバルとローカルの名前の付け分け


「グローバルにはわかりやすい名前を、ローカルには短い名前をつける。」

グローバル変数は定義上プログラムのどこにでも出現する可能性があるため、読む人がその意味を思い出せる程度に長く、説明的な名前をつける必要がある。
個々のグローバル変数の宣言に短いコメントを入れておくとよい。
変数だけでなく、グローバルな関数、クラス、構造体にも、プログラム中での役割を表す説明的な名前をつける必要がある。

逆にローカル変数は短い名前で十分。
あまり長い名前は逆にプログラムの可読性を下げる。

2.統一性を出し、コードを文章に


「関連性のあるものには関連性のある名前をつけ、関係を示すと共に違いを際立たせるようにする。」

class UserQueue {
    int noOfItemsInQ, frontOnTheQueue, queueCapacity;
    public int noOfUsersInQueue() {…}
}

上記のプログラムではQueueという単語がQ、Queue、queueとして登場している。
しかしキューはUserQueue型の変数からしかアクセス出来ないので、メンバ名に"queue"を入れる必要はない。
文脈だけで十分に理解出来るので、下記の文は冗長である。
queue.queueCapacity

そのため、下記のプログラムの方が優れていると言える。
class userQueue {
    int nitems, front, capacity;
    public int nusers() {…}
}

このように記述することで、下記のように文を書けるようになる。
queue.capacity++;
n = queue.nusers();

3.関数名の付け方


「関数には能動的な名前をつけ、問題がなければそのあとに名詞をつける。」

now = date.getTime();
putchar('¥n');

ブール値を返す場合は、戻り値が不明確にならないような名前をつける必要がある。
わかりにくい
if (checkoctal(c)) ...

わかりやすい
if (isoctal(c))...

とりあえず今回はここまで。
今後もこの内容を意識してプログラミングしていきたいと思います。

2014年5月19日月曜日

Parallels上のWindowsマシンでGoogleIMEのON/OFF切り替え

MacOSでは、日本語入力と英字入力をそれぞれ「かな」キーと「英数」キーに割り当てられている。
しかし、Parallels上のWindowsで「かな」キーと「英数」キーを押すと、MacOSと同様の挙動はしてくれない。
そこでMacOSと同様に「かな」キーと「英数」キーで日本語入力と英字入力を切り替える方法のメモ。

1.Parallels上のWindows環境で、テキストサービスと入力言語画面を開く。(言語バー内で右クリック→設定)
2.全般タブの「Google日本語入力」を選択し、プロパティボタンを押下。

2014年5月16日金曜日

MacOSのプレビュー機能でアクセス権があるのに開けない(未解決)

Macで画像を大量に開く場合、フォルダ内の全画像を選択してダブルクリックで開くのですが、この作業を続けていると

「ファイル”XXXXXX”を表示するためのアクセス権がないため、開けませんでした。」

と出てくる。
以前から何度か経験している現象だ。

・パーミッションに問題がないにも関わらず、画像が開けない。
・別のアプリを使って画像を開くことは可能。

以上の2点から画像自体に問題はなさそう。
では何が問題なのか?
最初は普通に開けるので、メモリの問題かと思って検証してみた。
以下の1〜4の手順を繰り返し行う。
なお、以下の手順の間はプレビューアプリ自体は起動しっぱなし。

1.200枚くらいの画像をまとめて開く。
2.ウィンドウを閉じる。
3.同じ画像200枚をまとめて開く。
4.ウィンドウを閉じる。

これに関しては問題なかった。
最初に全ての画像を開くのにかかった時間と、
2回目以降に全ての画像を開くのにかかった時間では、明らかに2回目以降の方が早かった。
普通に考えたら最近開いた画像に関してはキャッシュか何かしているんだろうと想像出来る。
では次に毎回違う画像を開いて見たらどうか検証してみた。
以下の1〜4の手順を繰り返し行う。
なお、以下の手順の間はプレビューアプリ自体は起動しっぱなし。

1.200枚くらいの画像をまとめて開く。
2.ウィンドウを閉じる。
3.違う画像200枚をまとめて開く。
4.ウィンドウを閉じる。

結果1912枚の画像を開くことが出来たが、1913枚目からは全て開けなかった。
以降プレビューアプリでは1枚も画像が開けなかった。

アクティビティモニタでメモリの使用量とかを確認してみたが、
画像を大量に開いたからといって、メモリ使用量が増えているわけではなかった。
現在の所、原因は不明だが、プレビューアプリを再起動するとまた問題なく見れるようになる。

普通に考えるとプレビューアプリにキャッシュ出来る画像容量に達したから開けなくなったのかと思ったのですが、アクティビティモニタを見た限りではそうじゃないらしい。

謎。

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冊購入したので、徐々に読み進めて書評を書いていきたいと思います。