【PhoneGap】簡単なサンプルを作成

PhoneGap というスマートフォン向けフレームワークを試してみた。

EclipseAndroid アプリの開発環境は構築済み。

PhoneGap の日本語サイト(http://phonegap-fan.com/startup/android.php)のスタートアップガイドを見ながらサンプルを作り、エミュレータで実行してみた。

ちなみに AndroidManifest.xml への追加内容をサイトからコピペすると XML のエラーが出るので、余計な「>」や足りない二重引用符を付け足す必要があるので注意!

問題なくエミュレータで実行できることを確認。更にテキストボックスやボタンを配置してスクリプトを追加してみてもきちんと実行できる。

これは面白い。

ER図を作成

ふとER図を作成してみようという気になりました。

そこで、まずER図を作成するツールにはどんなものがあるかをリサーチ。

・軽快な動作で直感的なGUIによる作画ツール、DBDesigner

・高機能かつ軽量な汎用SQL開発環境、A5:SQL Mk-2

EclipseプラグインAmaterasERD

・WebベースのER図作成ツール、wwwsqldesigner

データベースにMySQLを使う場合はこんな選択肢も。

・データベースの設計、作成、管理をビジュアルに行うことができるツール、MySQL Workbench


とりあえずA5:SQL Mk-2を使ってみました。


作成した、架空の受注システムのER図はこれです。


【Ruby】配列とハッシュ

配列は角括弧でオブジェクトのリストを囲って定義することができます。
配列の要素はインデックスを角括弧の中に指定して取得することができます。最初の要素のインデックスは0ですが、インデックスに負の整数を指定した場合は配列の最後から数えた位置にあるオブジェクトが返ります。

# 配列を作る
ary = [1, "two", 3, "four", 5]
# 配列のサイズ
puts "ary.length=#{ary.length}"
# インデックスを指定して要素を参照
puts "ary[1]=#{ary[1]}"
puts "ary[-1]=#{ary[-1]}"

配列はArrayクラスのオブジェクトです。サイズはlengthメソッドで得ることができます。

上記プログラムの実行結果は以下のようになります。

ary.length=5
ary[1]=two
ary[-1]=5

配列からその配列の一部を生成することができます。
配列のオブジェクト名の後の角括弧内にカンマ区切りで数値を2つ指定すると、1つ目の数値の位置から始まり、2つ目の数値の個数を持つ新しい配列を返します。
配列のオブジェクト名の後の角括弧内に開始位置と終了位置の数値を指定すると、その範囲の新しい配列を返します。範囲は2つまたは3つピリオドで区切ります。2つの場合は終了位置を含み、3つの場合は終了位置を含みません。

# 配列を作る
ary = [1, "two", 3, "four", 5]
# 範囲を指定して新しい配列を得る
puts "ary[1, 3]", ary[1, 3]
puts "ary[1..3]", ary[1..3]
puts "ary[1...3]", ary[1...3]

上記プログラムの実行結果は以下のようになります。

ary[1, 3]
two
3
four
ary[1..3]
two
3
four
ary[1...3]
two
3

配列に要素を代入するには[index]=を使用します。配列の最大インデックスより大きいインデックスを指定すると、指定した位置に要素が代入され、隙間にはnilが入ります。

# 配列を作る
ary = [1, "two", 3, "four", 5]
# 配列に要素を追加
ary[6] = 7
ary.each do |x|
  print x, " "
end

上記プログラムの実行結果は以下のようになります。

1 two 3 four 5 nil 7 

ハッシュは中括弧で「キー=>値」という形式の要素のリストを囲って定義することができます。キーおよび値には任意のオブジェクトを使用することができます。角括弧でキーを囲って値を取得することができます。

# ハッシュを作る
hash = {'Japan' => 'Tokyo', 'USA' => 'Washington,D.C.', 'China' => 'Beijin'}
# ハッシュのサイズ
puts "hash.length=#{hash.length}"
# キーを指定して値を参照
puts "hash['USA']=#{hash['USA']}"

ハッシュはHashクラスのオブジェクトです。サイズはlengthメソッドで得ることができます。

上記プログラムの実行結果は以下のようになります。

hash.length=3
hash['USA']=Washington,D.C. 

角括弧でキーを囲って代入することで値の更新、新しい要素の追加ができます。

# ハッシュにキーと値のペアを追加
hash['France'] = 'Paris'
hash.each do |key, val|
  puts "#{key}=>#{val}"
end

上記プログラムの実行結果は以下のようになります。

USA=>Washington,D.C.
France=>Paris
China=>Beijin
Japan=>Tokyo

【Ruby】メソッド

メソッドは、defの後にメソッド名を記述し、引数がある場合は括弧の中に引数名を記述して定義します。

# メソッドを定義する
def sayHello(name)
  return "Hello, " + name
end
# メソッドを呼び出す
puts sayHello("George")
puts(sayHello("Paul"))

引数のあるメソッドを呼ぶ場合は、引数を括弧で括っても括らなくてもOKです。

上記プログラムの実行結果は以下のようになります。

Hello, George
Hello, Paul

メソッドの戻り値はそのメソッド内の最後の式の値になるのでreturnは省略することができます。

def addNum(num1, num2)
  # メソッドの中の最後の式の値が戻り値
  num1 + num2
end

puts addNum(1, 2)

上記プログラムの実行結果は以下のようになります。

3

メソッド呼び出しにブロックを関連付けて、メソッド内でyield文を使ってそのブロックを呼び出すことができます。

def sayHelloWithBlock1
  # ブロックを呼び出す
  yield
end

sayHelloWithBlock1 {
  puts "Hello"
}

上記プログラムの実行結果は以下のようになります。

Hello

次は引数のあるブロックの例です。

def sayHelloWithBlock2
  # パラメータを指定してブロックを呼び出す
  yield "Hello", "John"
  yield "Hi", "Ringo"
end

sayHelloWithBlock2 do |greeting, name|
  puts greeting + ", " + name
end

ブロックの引数は、|で囲んで指定します。

上記プログラムの実行結果は以下のようになります。

Hello, John
Hi, Ringo

【Ruby】ループ

whileは、条件が真である限り本体を繰り返し実行します。

cnt1 = 1
while cnt1 <= 10
  print cnt1, " "
  cnt1 += 1
end

カウンタ用変数を1で初期化し、カウンタが10以下の間、カウンタ値を出力してカウントアップします。

上記プログラムの実行結果は以下のようになります。

1 2 3 4 5 6 7 8 9 10 

untilは、条件が真になるまで本体を繰り返し実行します。

cnt2 = 1
until cnt2 > 10
  print cnt2, " "
  cnt2 += 1
end

whileとuntilは、ifやunlessのように文の最後に記述して修飾することができます。

cnt3 = 0
# 文の最後に条件を添える
print cnt3 += 1, " " while cnt3 < 10

上記プログラムの実行結果は以下のようになります。

1 2 3 4 5 6 7 8 9 10 

複数の文をbegin/endブロックでまとめることができますが、begin/endブロックの最後に修飾した場合はブロック内が最低1回は実行されます。

cnt4 = 1
# begin/endブロックの最後に条件を添える
begin
  print cnt4, " "
  cnt4 += 1
end while cnt4 <= 1

上記プログラムの実行結果は以下のようになります。

1 

「for 変数 in オブジェクト」で、オブジェクトの要素を1つずつ取り出して変数で参照できるようにし、すべての要素に対して後に続く文を実行します。

for cnt in [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
  print cnt, " "
end

角括弧で囲まれていて、要素がカンマで区切って列挙されているのは配列です。

上記プログラムの実行結果は以下のようになります。

1 2 3 4 5 6 7 8 9 10 

loopはブロック(コードを{と}で囲んだもの、あるいはdoとendで囲んだもの)を永久に繰り返します。
ループ制御文を使うとwhile、until、loopのフローを制御することができます。
breakはループから脱出します。nextはループの終わりにジャンプして次のループに入ります。redoはループをやり直します。

loop、next、breakの例です。

cnt5 = 0
loop {
  cnt5 += 1
  # 偶数だったらスキップ
  next if cnt5 % 2 == 0
  # 10を超えたらループを抜ける
  break if cnt5 > 10
  print cnt5, " "
}

上記プログラムの実行結果は以下のようになります。

1 3 5 7 9 

loopはイテレータです。イテレータとは、配列などのコレクションから連続する要素を返すメソッドのことを言います。
イテレータにはいくつかありますが、その中のtimesメソッド、uptoメソッド、eachメソッドの例を見てみます。

# 3回ループする
3.times do
  puts "Hello"
end
# 1から10まで1ずつカウントアップしてループする
1.upto(10) do |cnt|
  print cnt, " "
end
puts
# 配列の要素数分ループする
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10].each do |cnt|
  print cnt, " "
end

doの後の、|で囲まれているものはメソッドから渡されるパラメータを受け取る変数です。メソッドによっては複数のパラメータを渡してくるものもありますが、その場合は複数の変数をカンマ区切りで記述します。

上記プログラムの実行結果は以下のようになります。

Hello
Hello
Hello
1 2 3 4 5 6 7 8 9 10 
1 2 3 4 5 6 7 8 9 10 

【Ruby】条件分岐

まずはifから。

num = 1
if num == 1 
  puts "1:one"
elsif num == 2
  puts "1:two"
else
  puts "1:other"
end

ifの後に続く式が真ならば、その後に続く文が実行されます。
elsif句を書くことができます。さらにelse句も書くことができます。
よく使われる比較演算子に「==」「!=」「<」「<=」「>」「>=」「=~」などがあります。(「=~」は正規表現パターンマッチです)
AND条件(「and」「&&」)、OR条件(「or」「||」)、否定(「not」「!」)などの演算子もあります。

もちろん上記プログラムの実行結果は以下のようになります。

1:one

if文を1行で書く場合は、条件式の後にthenが必要になります。

num = 1
if num == 1 then puts "2:one"
elsif num == 2 then puts "2:two"
else puts "2:other"
end

もちろん上記プログラムの実行結果は以下のようになります。

2:one

ifの否定版のunlessというのもあります。

num = 1
unless num == 1
  puts "3:other"
else
  puts "3:one"
end

上記プログラムの実行結果は以下のようになります。

3:one

ifは式です。つまり値を返すことができるため、以下のようなプログラムが成立します。

num = 1
str = if num == 1 then "4:one"
      elsif num == 2 then "4:two"
      else "4:other"
      end
puts str

場合分けして変数strに値を設定しています。

上記プログラムの実行結果は以下のようになります。

4:one

C言語にある3項演算子を使うこともできます。

num = 1
puts num == 1 ? "5:one" : "5:other"

もちろん上記プログラムの実行結果は以下のようになります。

5:one

if、unlessは文の最後に条件を添える修飾子として使用することができます。

num = 1
puts "6:one" if num == 1

もちろん上記プログラムの実行結果は以下のようになります。

6:one

Rubyでは、false、nil以外が真です。よって0は真となるので、C言語に慣れている人は注意が必要です。

puts "1:true" if true
puts "2:true" if false
puts "3:true" if 0
puts "4:true" if nil

上記プログラムの実行結果は以下のようになります。

1:true
3:true

多分岐の制御にはcaseが使用できます。

num = 1
case num
  when 1, 3
    puts "7:one or three"
  when 2
    puts "7:two"
  else
    puts "7:other"
end

caseの後の式を、whenの後の式と比較します。

上記プログラムの実行結果は以下のようになります。

7:one or three

【Ruby】Hello World(文字列出力)

はじめは簡単な文字列出力から。
Hello World」と表示してみます。

# putsメソッドは最後に改行が入る
puts "1:Hello World"
# printメソッドは最後に改行が入らないので改行させるためには"\n"をつける
print "2:Hello World\n"

コメントは#で始まり、その行の最後までです。
標準出力に出力するには、putsメソッドまたはprintメソッドが利用できます。
2つのメソッドの違いは、コメントにあるように最後に改行が付くかどうかです。

上記プログラムの実行結果は以下のようになります。

1:Hello World
2:Hello World

文字列リテラルは、シングルクオートまたはダブルクオートで囲った文字列です。シングルクオートで囲った場合は囲まれた文字列そのままが文字列の値となります。ダブルクオートで囲った場合は「\n」「\t」などのエスケープシーケンスを解釈します。

# シングルクオートで囲むと\nがそのまま出力される
print '3:Hello World\n'

上記プログラムの実行結果は以下のようになります。

3:Hello World\n

次に、変数を使ってみます。Rubyでは型を指定した変数宣言は不要です。いきなり変数に値を代入します。正確に言うと、変数は単なるオブジェクトへのリファレンスで、オブジェクトは変数によって参照されます。

# Stringオブジェクトを参照する変数
words = "4:Hello World"
puts words

putsメソッドの引数に変数を指定すれば変数が参照する文字列を出力することができます。

上記プログラムの実行結果は以下のようになります。

4:Hello World

今度は複数の変数を使って一度に出力してみます。

word1 = "Hello"
word2 = "World"
# ダブルクオートで囲んだ文字列中で変数が展開される
puts "5:#{word1} #{word2}"

ダブルクオートで囲った文字列はエスケープシーケンスの解釈だけでなく、文字列中に#{式}というシーケンスがあるとその式の値で置き換えます。

上記プログラムの実行結果は以下のようになります。

5:Hello World

文字列を連結して出力してみます。

word1 = "Hello"
word2 = "World"
# Stringオブジェクトを連結
puts "6:" + word1 + " " + word2
puts "7:".+((word1.+(" ")).+(word2))

「+」を用いて文字列を連結することができます。実はこの「+」はStringクラスのメソッドです。そのため、上記プログラムの5行目のような記述が成り立ちます。

上記プログラムの実行結果は以下のようになります。

6:Hello World
7:Hello World

ちなみにJavaだと以下のようなプログラムになるでしょう。

public class Hello {
	public static void main(String[] args) {
		// System.out.printlnは最後に改行が入る
		System.out.println("1:Hello World");
		// System.out.printは最後に改行が入らないので改行させるためには"\n"をつける
		System.out.print("2:Hello World\n");

		// Stringオブジェクトを参照する変数
		String words = "4:Hello World";
		System.out.println(words);

		String word1 = "Hello";
		String word2 = "World";
		// Stringオブジェクトを連結
		System.out.println("6:" + word1 + " " + word2);
		System.out.println("7:".concat(word1).concat(" ").concat(word2));
	}
}