Eclipse for Macで良く使うショートカット

Eclipse for Macで使っているショートカットです。
Macwindowsではだいぶキーが違うので備忘録です。



ショートカット一覧の表示

command + shift + 「L」
はじめはこれを見ながら使いそうな機能を探すといいですね。

コード入力補完

普通の補完
control + スペースキー


・キャメルケース補完
例えば「ArrayList」なら「AL」といれて、
control + スペースキーをするとArrayListが候補に表示される。
自作クラス、自作メソッドについても同様に使えます。

・System.out.println()の挿入
sysoまで入力してcontrol + スペースキー
ちなみにmainやif、fore(foreach)も使えます。


エディタ操作/リファクタリング

・クイックフィックス
command + 「1」
例えばString test = "テスト"+"テスト2";等のコードで、
変数testにカーソルをあわせてクイックフィックスを使うと、
文字列連結に「StringBuilder」を使用するとかも候補にでてきます。

・現在選択している行を移動
option(alt) + ↑↓



・現在選択している行を削除
command + 「D」

・現在選択している行を複製
command + option(alt) + ↑↓

・選択行の拡大
control + shift + ↑↓

・インデントの修正
command + 「i」

・インポートの編成
command + shift + 「O」

・リネーム
option(alt) + command + 「R」


コードリーディング系

・型を開く(キャメルケース補完も利用可)
command + shift + 「T」

・クイックアウトライン
command + 「O」
※クラス内でメソッドにジャンプするのに使っています。

・呼び出し階層を開く
control + command + 「H」
※メソッドがどこから呼び出されるかを表示して、
影響範囲を調べるのに使っています。

ワークスペース内でテキストの検索
option(alt) + command + 「G」

ワークスペース内で宣言の検索
command + 「G」
選択した変数の宣言を検索します。

ワークスペース内で参照の検索
command + shift + 「G」
選択した変数が使われている場所を検索します。

・指定行にジャンプ
command + 「L」

・エディターの切り替え
command + 「E」

iPhoneアプリ開発でテストを試してみる。

少しずつ学習を進めているiPhoneアプリのテストについて書きます。

今回は一番簡単に使えるSenTestingKitを使い、

簡単な「足し算」メソッドを作って、テストを実行させるまでを試してみます。

ボタンを押したりのテストはまだ試しませんが、
万が一やる気がでるかもしれないので「Single View Application」を選択しました。


プロジェクトの設定は以下のようにしました。
ポイントは「include unit tests」ですね。
これでプロジェクトに単体テストをする仕組みが同梱されます。



「include unit tests」を選んでプロジェクトを作ると、
プロジェクト名+Testsというフォルダにテストのひな形クラスが作られています。


早速このままテストを実行してみましょう。
ショートカットはCommand + 「U」です。
もしくは画像の再生ボタンの部分を長押しして「Test」を選びます。



ちなみにこのままでは必ずテストが失敗するようになってます。
STFailは必ず失敗するメソッドだからです。


もう少し準備をします。
足し算をさせたいので「Objective-Cクラス」を作ります。
「New File」から、



「NSObject」のサブクラスを作ります。


名前は「MyCalc」にしました。


ターゲットMyClassTestsにチェックをいれておきます。


クラスの追加も終わったので、
足し算メソッドをインターフェース(MyCalc.h)に用意します。

#import <Foundation/Foundation.h>

@interface MyCalc : NSObject

/**
 * 足し算メソッド
 */
- (int)addition:(int)operand1: (int)operand2;
@end



そして、MyCalcのmにメソッドの本体は書かずに用意します。

#import "MyCalc.h"

@implementation MyCalc
- (int)addition:(int)operand1: (int)operand2{
    //空のメソッド
}
@end



今回は、以下の流れでテストをしていきます。
詳しくはTDD等で調べてみて下さい。

1. テストを失敗させる。
2. テストをとりあえず成功させる。
3. テストをもう少しちゃんと作る。

まずは空のメソッドを動かそうとして失敗させます。

#import "MyCalcTests.h"

// 追加
#import "MyCalc.h"

@implementation MyCalcTests

- (void)setUp
{
    [super setUp];
}

- (void)tearDown
{    
    [super tearDown];
}

/**
 * 足し算ができることを確認する。
 * 2と6を引数に渡して、結果の8が返却される事を確認する。
 */
- (void)testAddition
{
    MyCalc *myCalc = [[MyCalc alloc] init];
    STAssertEquals(8, [myCalc addition:2 :6],@"足し算が失敗しました。");
}

@end



失敗すると以下のように、失敗したテストを赤色で表示してくれます。


いまはメソッドの中身がないので間違いなく失敗します。
なので、2.のテストをとりあえず成功させるようにします。
MyCalc.mのadditionメソッドに「8」を返すように書きます。

- (int)addition:(int)operand1: (int)operand2{
    return 8;
}



これで暫定的にテストに成功しました。



でもこれだと何も足し算できていないので、
少しメソッドを修正して、もう一度「Command」+ 「U」を実行します。
テスト結果が緑ならいったんは成功です。
まずは2つの引数を足して返却する所まで確認できました。

- (int)addition:(int)operand1: (int)operand2{
    return operand1 + operand2;
}



そのうち、また追記します。

XcodeでJavaDoc的なドキュメントを作るDoxygenを試す

Xcode4でJavaDocのようなドキュメントを生成できるDoxygenを試してみました。



Doxygenを使うとiOSのプロジェクトに対してドキュメントを生成することができます。

クライアントからそれっぽいドキュメントを求められた時や、プログラムの関係を整理するのに有用です。
結構手間もかかりますが、必要になる場面がくると思うので少しずつ試していきます。
今回はまずは上の画像のようなとりあえずの形を作る所まで試してみました。

まずはDoxygenをダウンロードします。
Doxygen公式(日本語)


今回は「Mac OS X 10.6 SnowLeopard用」で「http」を選びました。
ちなみに私は「Mac OS X 10.7.4」でLionです、完全に指示を無視しました。



ダウンロードしたDoxygenをアプリケーションフォルダにドラッグ&ドロップ
次にパスを通します。
ターミナルを起動して以下を入力し、bash_profileを編集します。

vi bash_profile


「I」を押すと「INSERT」モードになり入力できるようになります。
以下のパスを入力して「esc」>「:」>「w」>「q」の順に入力します。(:wqで書き込んで終了の意味です。)

export PATH=/Applications/Doxygen.app/Contents/Resources/:$PATH




ようやく「Doxygen」を起動。こんな感じのGUI frontendが立ち上がりました。



Step1:と表示されている所から順番に進めます。

「 Step1:Doxygenを実行するディレクトリを決めてね。」
とのことなので、右横の「Select」からXcodeのプロジェクトがあるディレクトリを選びます。
これでDoxygenを実行するディレクトリまでのパスが入力されます。



次はStep2:です。
「 Wizard と Expertのタブでdoxygenを設定してね、
そんで終わったら Run に切り替えてドキュメントを作ってね。」と書いてあります。



今回は基本の「Wizard」タブだけでやってみます。
以下の順番に設定しました。
1.プロジェクト名
2.プロジェクトの概要
3.バージョン
4.プロジェクトロゴ(幅200px、高さ50px以内)
5.ソースコードがあるディレクトリ(プロジェクトと同じディレクトリ)
6.再帰的なスキャン(チェックいれないとディレクトリ指定でうまくいきませんでした。)
7.ドキュメントを出力するディレクト
設定には細かいルールがあって、ここにまとまっています。英語ですが。
Doxygen Configuration(英語)



5.で設定したソースコードのあるディレクト



上記で設定したあと、タブを「Run」に切り替えて以下の順番に実行します。



ひとまずはなんの役にもたたないドキュメントができました。
以下の番号は先ほど設定した項目と対応しています。
今回の設定はDoxywizardメニューの「File」 > 「Save」から保存できます。
保存しないと再設定が必要なので注意が必要です。

引き続き少しずつ書いてきます。


javaでbyte[]を適当にバイナリファイルとして書き込む

前回Javaのbyte型を使ってみる。の続きでbyte[]をバイナリファイルとしてファイルに書き込んでみます。

バッファ等は一切考慮していませんが、
以下のようにするとバイナリファイルを任意のパスに作成する事ができます。

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;



public class TestByte {
	public static void main(String[] args) {		

		byte bval1[] = { (byte)0x77, (byte)0x88, (byte) 0x99 };
		
		//ファイルオブジェクト作成
		FileOutputStream fileOutStm = null;
		try {
			fileOutStm = 
					new FileOutputStream("任意のパス");
		} catch (FileNotFoundException e1) {
			System.out.println("ファイルが見つからなかった。");
		}
		try {
			fileOutStm.write(bval1);
		} catch (IOException e) {
			System.out.println("入出力エラー。");
		}
		System.out.println("終了");
	}
}



作成されたバイナリをみるには「バイナリエディタ」を使用します。
私はMacなので「0xED」というアプリを使ってます。

http://www.suavetech.com/0xed/0xed.html
これで「778899」というのが書き込まれたのが以下のように確認できます。

Javaのbyte型を使ってみる。

基本的な事ですが、byte[]を使う必要に迫られました、、
個人的にとても苦手な所なので、克服するために1つずつJavaの「byte」について調べてみました。

まず「wiki」を見てみました。
Javaのbyteはintやshort等と同じ基本型といわれるもので、
その中でも整数型として提供されているようです。
符号付きの8bitで1000 0000 (-128) 〜 0111 1111 (+127)まで表現できます。

デフォルト値 サイズ 範囲
byte 0 8bit符号付き -128〜127


あとはどんどん色々な使い方を試して探っていくこととします。
以下はbyte型の変数に整数の127を代入して出力するコードです。

public class TestByte {
	public static void main(String[] args) {		
		// Javaのbyte型
		// 10000000 01111111までを表現可能
		// 整数型の為、値は10進数で保持します。
		byte bval = 127;
		System.out.println(bval);	
	}
}
//[実行結果] 127



「127」が表示されました、「byte」の名前に惑わされましたが整数型ですもんね。
ちなみにbyte型の扱える範囲以上の128を代入しようとするとエラーになります。
クイックフィックスが型をintに変えるかい? それとも128を(byte)でキャストするかい?と聞いてきます。


ちなみに強引に以下のようにキャストすると、

byte bval = (byte) 128;
System.out.println(bval);
[実行結果] -128

「-128」が表示されました。129を代入すると「-127」が表示され、
1ずつ増えていきます。127を超える表示になったら-128に戻り、
127〜-128の範囲内でこれを延々と繰り返すようです。


次は整数の「127」をIntegerクラスのメソッドで2進数と16進数形式で出力してみました。

public class TestByte {
	public static void main(String[] args) {		

		// 10進数127の場合、2進数では 0111 1111になる
		// 0111は 16進数で7、1111は 16進数でfになる。
		// 出力は7fになる。
		byte bval1 =  (byte)127;
		System.out.println("(byte)127を出力");
		System.out.println("10進数表現:"+ bval1);
		System.out.println("2進数表現:"+Integer.toBinaryString(bval1));		
		System.out.println("16進数表現:"+Integer.toHexString(bval1));
		System.out.println("16進数表現2桁:"+String.format("%02x", bval1));
	}
}


[実行結果]
(byte)127を出力
そのまま出力(10進数表現):127
2進数表現:1111111
16進数表現:7f
16進数表現2桁:7f

toBinaryStringの結果で最上位ビットが「0」の場合は省略されて7桁になってますね。


上記のコードを少し変えて、負の値「-4」を代入すると、

		byte bval1 =  (byte)-4;
		System.out.println("(byte)-4を出力");
		System.out.println("10進数表現:"+ bval1);
		System.out.println("2進数表現:"+Integer.toBinaryString(bval1));		
		System.out.println("16進数表現:"+Integer.toHexString(bval1));
		System.out.println("16進数表現2桁:"+String.format("%02x", bval1));



こんな結果になります。1がいっぱい

[実行結果]
(byte)-4を出力
10進数表現:-4
2進数表現:11111111111111111111111111111100
16進数表現:fffffffc
16進数表現2桁:fc



toBinaryStringのJavaDocを確認すると以下のように書いてあります。
2の32乗を加算した結果、1が埋められたようです。
http://java.sun.com/j2se/1.5.0/ja/docs/ja/api/java/lang/Integer.html#toBinaryString(int)

整数の引数の文字列表現を、基数 2 の符号なし整数として返します。
引数が負の数の場合は、符号なし int 値は引数に 2の32乗を加算した値になります。そうでない場合は、引数に等しい値になります。この値は、2 進数 (基数 2) の ASCII 文字列に変換されます。前に 0 は付きません。符号なしの絶対値がゼロの場合は、単一のゼロ文字「0」(「\u0030」) で表されます。そうでない場合は、符号なしの絶対値を表す文字の 1 文字目はゼロではありません。2 進数の桁には、「0」(「\u0030」) および「1」(「\u0031」) が使用されます。



byte型は8進数、16進数のリテラルを代入することもできます。
試しに10進数で153を表す0x99を代入してみます。

		// 16進リテラルも代入可能
		// 0x99を代入した場合、10進数では153となるが、
		// byte型の扱える範囲を超えるのでそのままだと負の値が出力される。
		byte bval1 =  (byte)0x99;
		System.out.println("(byte)0x99を出力");
		System.out.println("10進数表現:"+ bval1);
		System.out.println("2進数表現:"+Integer.toBinaryString(bval1));		
		System.out.println("16進数表現:"+Integer.toHexString(bval1));
		System.out.println("16進数表現2桁:"+String.format("%02x", bval1));

出力時にはbyteで扱える範囲を超えているので負の値が表示されてしまいます。

[実行結果]
(byte)0x99を出力
10進数表現:-103
2進数表現:11111111111111111111111110011001
16進数表現:ffffff99
16進数表現2桁:99



これを10進数153として表示するには以下のようにします。

		System.out.println(bval1 & 0xff);



上記は何をしてるかというと、
変数「bval1」と正の整数255を表す16進数リテラル「0xff」のAND演算をして、
正の値に変換しています。

11111111 11111111 11111111 10011001 (bval1)
00000000 00000000 00000000 11111111 (0xff ) AND

                                                                                                              • -

00000000 00000000 00000000 10011001 結果 正の値に戻る。



あとはこれが単純に配列になっただけなので、こんな感じに利用できます。

		byte bval1[] = { (byte)0x77, (byte)0x88, (byte) 0x99 };
		System.out.println("bval1[]を出力");
		for(int i=0; i < bval1.length ; i++){
			System.out.println("10進数表記:"+ (bval1[i] & 0xff));
			//System.out.println("16進数表記"+ String.format("0x%02x", bval1[i]));
		}

Xcode4のコードスニペット機能を試す。

Xcode4からの便利機能、コードスニペットを使います。

Xcodeコードスニペット機能は、良く使うコードを集めて、
必要な時にすぐ呼び出して利用できる機能です。
ちょっとした事ですが、結構開発効率があがります。


使い方の一例として、
よく使うNSLogをスニペットにしてみます。


まずコードを書きます。


次にスニペットにしたい部分を選択します。


コードを右下の「Code Snippet Library」にドラッグ&ドロップします。


すると新規でユーザー定義のスニペットを編集できるようになります。


今回は以下のようにスニペットを編集しました。<##>と記述した#と#の間はプレースホルダーになります。



編集した各項目は以下の様になります。

Title そのままタイトル
Summary 要約、タイトルの横に表示されます。
Platform All/iOS/MacOSX
Language ObjC/Java等がある、JavaだとObjCのコード中では展開されない
Completion Shortcut ショートカット(Xcodeの入力補完に表示されます。)
Completion Scopes 補完の有効範囲(Function or Methodだとメソッドの外で展開されない)


スニペットを使うときは「Code Snippet Library」からドラッグ&ドロップするか、
ショートカットを指定して以下のように呼び出せます。



プレースホルダーが入るので、わざわざ方向キーで戻らなくてもLogの内容を入力できます。
かなり簡単で効果も大きいのでまだ使っていない人は是非お試しを。


Xcode4.3で「User Defined Runtime Attributes」を試してみる。

iOS5、Xcode4.3から使えるようになった。
「User Defined Runtime Attributes」を試してみました。

この仕組みを使えば、自分で作ったUIのサブクラスに特定の値を用意し、
実行時に設定される値をInterfaceBuilder(以下IB)であらかじめ決める事ができます。

今回は自作クラスではないですが、
「User Defined Runtime Attributes」の使用方法を以下の2つのViewを使って試してみます。

以下のようなView構成で、
一番上の「 うす黄色ビュー」から、IB上でsuperview.backgroundColorにアクセスし、
親の「フェイスブックっぽい色ビュー」を「実行時に赤い色に変える」という事をしたいとします。


その場合、まずは「うす黄色ビュー」を選択して、


「Runtime Attributes」にドット構文でアクセスする事ができます。
自分で作ったクラスのプロパティにも同様にアクセス可能です。


もし、こんなエラーがでたらInterface Builder DocumentでつかうXcodeのバージョンが古いという事なんで、

error: Illegal Configuration: xxx type user defined runtime attributes with Xcode versions prior to 4.3


開発に使用するXcodeのバージョンが、Xcode4.3になっているか確認してみて下さい。


実行結果です。親のビューの色を予め指定できるなんて柔軟ですね。
少しずつ簡単に開発ができるようになっていきますね。