androidアプリの開発構築

Macで、Androidアプリの開発環境を構築した際のメモ

javaのインストール

Macだと、標準でjavaが入っている?はずなので、特にすることはなしです。
以下のコマンドをうって、javaが入っていなかったら、自分の環境にあったものをインストールしましょう。はい。人任せですね。

$java -version

http://support.apple.com/ja_JP/downloads/#java

android SDKのダウンロード

http://developer.android.com/sdk/index.html
から、mac用のzipファイルを取得。解凍後に任意のフォルダにファイルを配置。
私の場合は、以下のようにおきました。

/Application/android-sdk-mac_x86

その後、パスを通す為に、.bashrcなどに以下のように追加

# add android sdk
ANDROID_HOME=/Applications/android-sdk-mac_x86
export PATH=${ANDROID_HOME}/tools:$PATH

Terminalからandroidとうってみて、avd managerが起動すれば、sdkのダウンロードと、pathの設定は完了です。

eclipseのインストールと、環境設定

ダウンロード

以下のページから,Eclipse IDE for Java Developersをダウンロードします。
32bitか64bitかは自分の環境に合わせてください。

http://www.eclipse.org/downloads/

自分の環境が32か64bitかわからない場合は、以下のページで確認方法が紹介されているので参考にしてください。 (Intel macのみ)
http://support.apple.com/kb/HT3696?viewlocale=ja_JP

ADTのインストール

ダウンロードが完了したら、まずは、ADT(Android Development Tools Plugin)のインストールです。
Help -> Install NewSoftware と進み
work withという項目に、以下のURLを入れ、addボタンを押します。

http://dl-ssl.google.com/android/eclipse/

そうすると、Add Repository というダイアログが出現するので、適当にAndroid Reposなど、入力して、OKします。
そうすると、Developer Toolsというものが出現するので、チェックをし、
いわれるがままに、Next -> Next と進むとライセンス規約がでるので、同意したうえでADTをインストールします。


eclipseandroid sdkのパス設定

eclipse -> 環境設定 -> android と進むと sdk location とsdkの場所を指定する箇所があるので、そこで、先ほど設定した、android sdkのパスを設定します。
今回、私は以下の場所にsdkを設置したので、このパスをそのままそこに入力しました。

/Applications/android-sdk-mac_x86

入力が完了したら、OKを押して設定完了です。


Android SDK Libraryのインストール

eclipseを起動し、window -> Android SDK and AVD Manager を起動します。
Availavle Packageをクリックすると、先ほどADTをインストールする際に設定したAndroid ReposのURLとチェックボックスが出現すると思うので、チェックを行います。
そうすると、利用可能なSDKが出現すると思うので、すべてインストールしておきます。



以上で開発環境の構築は完了です。おつかれさまでした!
もう、javaがわからないとか言ってる場合じゃないですね。。。

空気を読むな、本を読め。 小飼弾の頭が強くなる読書法

今日は久しぶりのブログです。
どの位ぶりだろう。。。

今日は、初めて、買ったその日に本を1気に読みました。
今まで、どんなにおもしろくても本を一気に読み切る事はなかったのですが、
分量もそれほど多くなく。また、元々著者のブログを読んだりはしていたので、
とっつきやすかったので、楽しく本を読めました。

空気を読むな、本を読め。 小飼弾の頭が強くなる読書法 (East Press Business)

空気を読むな、本を読め。 小飼弾の頭が強くなる読書法 (East Press Business)

で、何でブログに書いたかというと、
「本を読んで、何かしらのアウトプットをしないのは、食事をとって排泄をしないのと一緒だ!」
と書いてあったので、今日はブログに書いてみました。やっぱり、出す物はちゃんと出したいのでw

というのは、冗談で、結構いろいろな本で、何かしらのアウトプットをするのは大事と書いてあったけど、
私は別に何かに書いたりはしていなかったのです。

この本もそーゆー事は書いてあったのですが、アウトプットの大事な例として、
「試験勉強をして、その後に一番覚えているのって、実際にテストに出て、その解答をちゃんと書けた(アウトプット)時」
って書いてあったのだけれども、確かにその通りって思ったので、今日は久々にブログってみました。

で、実際の本の内容はというと、とてもおもしろく、ユーモアもありました。
小飼 弾 という人がどのような環境で育ったのか微妙に書いてあったので、小飼 弾という人に興味があって、
本を好きになりたいって人にはお勧めだと思います。というか、もっと本を読まなきゃなって焦りましたw




そして、早速帰ってamazonで、興味あった本をすぐ予約しました。

僕が2ちゃんねるを捨てた理由 (扶桑社新書 54)

僕が2ちゃんねるを捨てた理由 (扶桑社新書 54)

どんどん、本を読もう

配列で特定の要素を削除

備忘録代わりに書いておきます。

phpで特定の要素を一気に削除するみたいな関数がなかったので、解決策をメモしておきます。

例えば、下みたいな配列から、要素が1の要素を全て一気に削除したい場合。

Array(1,2,3,1,2,1,2)

方法は下みたいな感じで、今回は対応しました。

<?php
$array = Array(1,2,3,1,2,1,2) ;
print_r($array) ;
$result = array_filter(
    $array ,
    create_function('$val', 'return ($val==1) ? FALSE : $val ; ') 
) ;
print_r($result) ;
?>

実行結果

Array
(
    [0] => 1
    [1] => 2
    [2] => 3
    [3] => 1
    [4] => 2
    [5] => 1
    [6] => 2
)
Array
(
    [1] => 2
    [2] => 3
    [4] => 2
    [6] => 2
)

このarray_filter関数は、第2引数のコールバック関数の結果がFALSEだった場合に、$resultにはその値が入らないようになるそうです。

う〜ん。。。でも、他にももっとたくさんのやり方がありそうだな。。。しかも、このやり方だと、配列のインデックスの順番がおかしくなるしな。。。まぁ、もしもインデックスの順番を再構築したい場合は、array_values関数を使えばよいかな。もっとよい方法が見つかったら、追記しよ。

配列から要素を探す

phpでは、in_array関数を用いて、ある配列に特定の要素が含まれているかを下の例のように簡単に調べる事ができます

<?php
$arr = Array("a", "b" ) ;
var_dump( in_array("a", $arr) ) ;
?>

が、意外に、perlではin_array関数のように指定要素が特定の配列にふくまれているかを調べるような関数がなかったりもします。

perlで指定要素が配列に含まれているかを調べる方法を探すのに意外に時間がかかったので、メモ。

やりかたは、下のように特定の配列を連想配列に一度格納して、特定のキーが定義されているかを調べる。

my @arr = qw/ a b c d e f g h i j k/ ;
my %hash ;
foreach( @arr ) {
        $hash{$_} = 1 ;
}
if( $hash{"a"} )  {
        print "a" ;
}

う〜ん。。。perl連想配列はソートされるから速度的には早いらしいけど、なんか強引すぎて好きではないな・・・配列を一度まわしている時点で、なんか嫌。。。もっと効率的な方法ってないかな・・・

クラスとコンストラクタ

参考書を読み進めていくうちに頭が混乱してきたので、整理。以下、自分用メモ

オブジェクト

var obj = new man() ;

コンストラクタの定義

function man(name){
    this.name = name;
    this.say = function() { alert(this.name) ; } 
}
var man = function(name) {
    this.name = name;
    this.say = function() { alert(this.name) ; } 
}    

オブジェクトのメソッド定義

var obj = man() ;
obj.say = function() { alert ("hello") ; }

すべてのオブジェクトはconstructorプロパティを持つ。そのconstructorプロパティはprototypeオブジェクトのプロパティ値でもある。

var hoge = Array() ;
alert(hoge.constoructor) ;  // function() {nativeなんちゃら}と表示

すべてのオブジェクトで共通のものは、prototypeで定義、インスタンス事に違うものを定義する場合は、コンストラクタで定義する。

以下もメモ

この場合はインスタンスプロパティ

var hoge = new Object() {} ;
hoge.a ;

この場合はクラスプロパティ

function hoge() {
}
hoge.prop = 1 ;

この場合はインスタンスメソッド

var hoge = function() {
    name : "jigen" ;
}
hoge.prototype.say = function { alert( this.name ) ; } ;
var obj = new hoge() ;
obj.say() ;

この場合はクラスメソッド

function hoge() {
     say : function() { alert("say"); }
}
hoge.say() ;

インスタンスメソッドとクラスメソッドの違いは、インスタンスを介して呼ばれるか、否か。
インスタンスメソッドの例の場合は、コンストラクタを定義した後に、いちどインスタンスを作成しているが、クラスメソッドの場合は、インスタンスを生成せずに、そのまま関数を呼べている。

オブジェクトとプリミティブ

色々参考書を読んでいくと、頭が混乱してきたので、自分の為のメモ

1

var str = "test" ;
str.say = "hello" ;
alert( str ) ;         // testと表示
alert( str.say ) ;     // undefindと表示

2

var str = {} ;
str.say = "hello" ;
alert( str ) ;         // Objectと表示
alert( str.say ) ;     // helloと表示

上のコードと下のコードを自分なりに一番わかりやすく調べる。

3

var str = "test" ;
alert( typeof str ) ;  // String
var str = {} ;
alert( typeof str ) ;  // Object
var str="test";
str.toString = "convert string" ;
alert( str.toString ) ;     //function toString() { [native code] } と表示

1と2の違い、
1では、strはプリミティブになる。
2では、strはオブジェクトになる。
javascriptでは、オブジェクトには、プロパティ値を設定できるが、プリミティブ値には、プロパティ値を設定できない。なので、1のコードでは、undefindと表示されてしまうのだ。
ちなみにプリミティブとは、クラスのようなものになる。なので、1のstrは、String型のクラスそのものになる。また、3のコードで、str.toStringを設定しようとしたが、表示した結果が function ~~~ みたいになるのは、もともとあるjavascriptのStringオブジェクトのtoString関数が呼ばれてしまったせいである。
という事は、1のコードで、str.sayというプロパティ値を設定したいのであれば、strを以下のようにオブジェクトとして、宣言すればよい。

var str = new String("test") ;
str.say = "hello" ;
alert( str ) ;        // testと表示
alert( str.say ) ;  // helloと表示

スコープの順番

javacriptのスコープの順番は厄介だ。。。
例えば、あるオブジェクトに以下のようなコンストラクタ関数が定義されている。

function hoge(hogehoge) {
        this.hoge = hogehoge ;
        this.say = function() { alert(this.hoge) ; }
}

で、以下のようにprototype宣言でプロパティを追加する。

hoge.prototype.say = function() { alert('this is prototype property'); }

上のような定義をし、

var hogeobj = new hoge('local hoge!') ;
hogeobj.say() ;

実行すると・・・

local hoge!

と表示される。

つまり、オブジェクトが生成され、そのプロパティにアクセスすると、javascriptでは、まず、オブジェクトのプロパティにその値があるかを見て、その後プロトタイプオブジェクトに指定したプロパティ値があるかを見るらしい。

う〜ん。。。なんか定義の順番的には、プロトタイプで指定したプロパティ値が呼ばれるって思っちゃうんだよな。。。ややこしや。。。