Hatena::Groupbioruby

"aac".translate #=> "N" このページをアンテナに追加 RSSフィード

2007-10-10情報技術基礎I

プログラミング基礎I Ruby入門

|  プログラミング基礎I Ruby入門 - "aac".translate #=> "N" を含むブックマーク はてなブックマーク -  プログラミング基礎I Ruby入門 - "aac".translate #=> "N"  プログラミング基礎I Ruby入門 - "aac".translate #=> "N" のブックマークコメント

プログラミング言語 Ruby の基本的を紹介します。プログラミング言語 Ruby は文字列操作や複雑なデータ構造やデータ操作が比較的手軽にできます。

はじめに、文字列や数値の扱いを紹介します。

文字列 String

文字列の生成
"Hello Bio"

ダブルクォートで囲まれたものが文字列になります。

"ACGT"
文字列を変数 str に代入
str = "Hello Bio"
str の内容を表示
puts str #=> "Hello Bio"

puts をつかうと文字列の内容を表示することができます。

コメント

行の # 以降はコメントになります。コメントプログラムには影響を与えません。

# これはコメント
dna = "ACGT" # ここもコメント

コードを実行したときに期待される画面表示を #=> につづけて表します

dna = "ACGT"
puts dna #=> "ACGT"

bioruby シェル

ここからは、bioruby シェルという対話的プログラミング環境で実際にコードを実行しながらすすめます。

bioruby コマンドを実行する(ターミナルのプロンプト $ に bioruby入力してリターンキーを押す)と、次のような表示になります。

ターミナル入力

bioruby

△実行結果

$ bioruby↓
Loading config (shell/session/config) ... done
Loading object (shell/session/object) ... done
Loading history (shell/session/history) ... done

. . . B i o R u b y   i n   t h e   s h e l l . . .

  Version : BioRuby 1.1.0 / Ruby 1.8.5

bioruby> 
bioruby コマンドの終了方法

入力

exit

△実行結果

bioruby> exit↓


. . . B i o R u b y   i n   t h e   s h e l l . . .

Saving object (shell/session/object) ... done
Saving config (shell/session/config) ... done
Leaving directory '.'
History is saved in './shell/session/history'

exit で終了します。ここではリターンキーを「↓」で表現しています。なお、これで終了できないときは、コントロールキーとcキーを同時に押してみてください。

bioruby シェルのより詳しい紹介は BioRuby の使い方の BioRuby シェルの項目を参照ください。

screenshot

▼先ほど紹介した文字列の変数への代入を bioruby シェルで試してみます。

"Hello Bio"

△実行結果

bioruby> "Hello Bio"
  ==> "Hello Bio"

bioruby シェルでは行単位Rubyコードを実行できます。bioruby> に続いてコード入力してリターンキーをおすとそのコードが実行できます。実行するとその行の値が表示されます。この場合では、文字列の自身が表示されています。

▼文字列の変数への代入

str = "Hello Bio"

△実行結果

bioruby> str = "Hello Bio"
  ==> "Hello Bio"

変数の表示

puts str

△実行結果

bioruby> puts str
Hello Bio
  ==> nil

文字列を変数に代入し、puts で表示しました。ここでの nil はその行の自体(puts str)の値を指しています。

▼複数行のペースト

# これはコメント
dna = "ACGT" # ここもコメント

△実行結果

bioruby> # これはコメント
bioruby+ dna = "ACGT" # ここもコメント
  ==> "ACGT"

複数行をペーストすると、bioruby> の表示に bioruby+ の表示がならびます。

それでは、文字列の説明にもどります。


文字列の長さ

▼文字列の長さは size メソッドで取得します。

"Hello Bio".size

△実行結果

bioruby> "Hello Bio".size
  ==> 9

▼文字列 "Hello Bio" を代入した変数 str でも size で文字列の長さがわかります。

str.size

△実行結果

bioruby> str.size
  ==> 9

コード

"ACGT".size
文字列の連結

▼+ で文字列を連結できます。

"Hello Bio" + "informatics" #=> "Hello Bioinformatics"

△実行結果

bioruby> "Hello Bio" + "informatics"
  ==> "Hello Bioinformatics"
文字列のくりかえし

▼ * で「文字列のかけ算」ができます。

"Hello Bio" * 3

△実行結果

bioruby> "Hello Bio" * 3
  ==> "Hello BioHello BioHello Bio"

コード

"ACGT" * 10

△実行結果

bioruby> "ACGT" * 10
  ==> "ACGTACGTACGTACGTACGTACGTACGTACGTACGTACGT"
大文字にする

▼uppercase letter(大文字)にします。

"Hello Bio".upcase

△実行結果

bioruby> "Hello Bio".upcase 
  ==> "HELLO BIO"
小文字にする

▼lower case letter(小文字)にします。

"Hello Bio".downcase

△実行結果

bioruby> "Hello Bio".downcase 
  ==> "hello bio"

コード

"ACGT".downcase

△実行結果

bioruby> "ACGT".downcase
  ==> "acgt"
大文字小文字を入れ替える

case を入れ替えます。

"Hello Bio".swapcase

△実行結果

bioruby> "Hello Bio".swapcase 
  ==> "hELLO bIO"

写植活字を入れる箱(case)の置き方が大文字が棚の上(upper)で小文字が棚の下(lowwer)という習慣から命名されているようです。

反転

▼文字列を逆からにします。

"Hello Bio".reverse

△実行結果

bioruby> "Hello Bio".reverse 
  ==> "oiB olleH"

コード

"ACGT".reverse

△実行結果

bioruby> "ACGT".reverse
  ==> "TGCA"
文字置換

▼translateします。

"ACGT".tr("T", "U")

△実行結果

bioruby> "ACGT".tr("T", "U") 
  ==> "ACGU"

DNA 文字列を RNA 文字列にしました。

▼相補鎖にします。

"ACGT".tr("ACGT", "tgca")

△実行結果

bioruby> "ACGT".tr("ACGT", "tgca") 
  ==> "tgca"

DNA 文字列の相補鎖(3'->5')にしました。

反転と文字置換をくみあわせると DNA の相補鎖(5'->3')を計算することができます。

変数 dnaDNA文字列を代入します。

dna = "ACGT"

△実行結果

bioruby> dna = "ACGT"
  ==> "ACGT"

DNA 文字列の相補鎖(3'->5')にします。

dna.tr("ACGT", "tgca")

△実行結果

bioruby> dna.tr("ACGT", "tgca")
  ==> "tgca"

DNA 文字列の相補鎖(5'->3')にします。

dna.tr("ACGT", "tgca").reverse

△実行結果

bioruby> dna.tr("ACGT", "tgca").reverse
  ==> "acgt"

このように tr メソッドと reverse メソッドを連続して適用することもできます。


部分をとりだす

▼0文字目から2文字分とりだしています。

"ACGT".slice(0, 2)

△実行結果

bioruby> "ACGT".slice(0, 2) 
  ==> "AC"

プログラミング言語では番号は0からはじまります。

▼n文字目から2文字分とりだしています。

"ACGT".slice(1, 2)
"ACGT".slice(2, 2)
"ACGT".slice(3, 2)
"ACGT".slice(4, 2)

△実行結果

bioruby> "ACGT".slice(1, 2)
  ==> "CG"
bioruby> "ACGT".slice(2, 2)
  ==> "GT"
bioruby> "ACGT".slice(3, 2)
  ==> "T"
bioruby> "ACGT".slice(4, 2)
  ==> ""

最後の文字 T(3番目の文字)を超えた範囲では空文字 "" が返ります。


文字列を走査する

▼GTを走査する

dna = "ACGT" * 10
dna.scan("GT")

△実行結果

bioruby> dna = "ACGT" * 10
  ==> "ACGTACGTACGTACGTACGTACGTACGTACGTACGTACGT"
bioruby> dna.scan("GT")
  ==> ["GT", "GT", "GT", "GT", "GT", "GT", "GT", "GT", "GT", "GT"]

▼GTの数をかぞえる

dna.scan("GT").size

△実行結果

bioruby> dna.scan("GT").size
  ==> 10

置換

▼単語置換

"Hello Bio".sub("Bio", "Bioinformatics")

△実行結果

bioruby> "Hello Bio".sub("Bio", "Bioinformatics")
  ==> "Hello Bioinformatics"

▼単語置換は最初のマッチだけに作用します

"ACGTACGT".sub("GT", "gt")

△実行結果

bioruby> "ACGTACGT".sub("GT", "gt")
  ==> "ACgtACGT"

▼すべての単語置換をするには、gsub を使います。

"ACGTACGT".gsub("GT", "gt")

△実行結果

bioruby> "ACGTACGT".gsub("GT", "gt")
  ==> "ACgtACgt"

分割

▼空白文字一文字で分割します。

"Hello Bio".split(" ")

△実行結果

bioruby> "Hello Bio".split(" ")
  ==> ["Hello", "Bio"]

分割した結果は Array という複数の要素を扱うデータ構造になっています。Array については後ほど説明します。

▼空文字で分割すると、一文字毎に分割することができます。

"Hello Bio".split("")

△実行結果

bioruby> "Hello Bio".split("") 
  ==> ["H", "e", "l", "l", "o", " ", "B", "i", "o"]

コード

"ACGT".split("")

△実行結果

bioruby> "ACGT".split("") 
  ==> ["A", "C", "G", "T"]
文字列 String のまとめ
  1. 文字列 String の操作について簡単にふれました。
  2. 文字列 String にはほかにもおおくのメソッドがあります。それらを調べる方法は最後にまとめて解説します。

文字列 String のもっているメソッドを簡単に調べる方法をひとつ紹介します。

つぎのように空の文字列 "" にピリオド . をつづけ、そこでタブキーを二回押します。

bioruby> "".

△タブキーを二回押した結果実行結果

bioruby> "".
Display all 163 possibilities? (y or n)

ここで y キーを押すと、ピリオドのあとに続けることの出来るメソッド名のリストが表示されます。このリストはリターンキーでスクロールします。

△実行結果

                                  .instance_eval                    .select
.__id__                           .instance_of?                     .send
.__send__                         .instance_variable_defined?       .singleton_methods
.all?                             .instance_variable_get            .size
.any?                             .instance_variable_set            .skip
.between?                         .instance_variables               .slice
(以下省略)

これはメソッド名の補完と呼ばれる機能です。メソッド名を途中まで書いてタブキーをおすと候補がリストされます。

▼sからはじまるメソッド名ってなんだっけ?

bioruby> "".s

△sからはじまる候補リスト

.scan               .size               .sort               .squeeze!           .sub                .sum
.select             .skip               .sort_by            .step               .sub!               .swapcase
.send               .slice              .split              .strip              .succ               .swapcase!
.singleton_methods  .slice!             .squeeze            .strip!             .succ!     

この機能になれると非常に便利です。


数値 Fixnum, Float

数値は整数(Fixnum)と実数(浮動小数点 Float)があります。

一般的には、コンピュータで扱う数値には桁数などさまざまな制限があるので、精度を気にする必要があることを覚えておくと良いでしょう。

四則演算

▼足し算

1 + 1

△実行結果

bioruby> 1 + 1
  ==> 2

▼引き算

2 - 2

△実行結果

bioruby> 2 - 2 
  ==> 0

▼かけ算

4 * 4 * 4

△実行結果

bioruby> 4 * 4 * 4
  ==> 64

▼割り算

4 / 3

△実行結果

bioruby> 4 / 3
  ==> 1

整数整数の計算ではその結果は整数であることが期待されるので、割り算の定義が直感と異なり、整数部分だけが返ります。直感とおなじ結果にするには、実数(浮動小数点)Float をつかいます。

▼Float での割り算

4.0 / 3

△実行結果

bioruby> 4.0 / 3
  ==> 1.33333333333333

今日講義の総秒数(90分、3コマ)

90 * 3 * 60

△実行結果

bioruby> 90 * 3 * 60
  ==> 16200

このように、bioruby シェルは簡単な電卓にもなることが実感できたかとおもいます。


剰余 modulo

▼割り算の余りです。

10 % 2
11 % 2

△実行結果

bioruby> 10 % 2
  ==> 0
bioruby> 11 % 2
  ==> 1

偶数判定に利用できます。たとえば、テーブルの行の背景色を交互に替える場合などに利用できます。

一般的には、任意の周期で起こる動作を判定するのにたびたび利用されます。


divmod

▼割り算の商と余りの組みです。

10.divmod(3)
10.divmod(4)
10.divmod(5)

△実行結果

bioruby> 10.divmod(3)
  ==> [3, 1]
bioruby> 10.divmod(4)
  ==> [2, 2]
bioruby> 10.divmod(5)
  ==> [2, 0]

指数

▼** で指数計算ができます。

2 ** 8

△実行結果

bioruby> 2 ** 8
  ==> 256

対数

▼底が e の対数は Math.log を用います。

Math.log(2)

△実行結果

bioruby> Math.log(2)
  ==> 0.693147180559945

log や sin などの数学的な計算には Math モジュールを使用します。

▼底が 10 の対数は底の交換公式を思い出します。

Math.log(1000) / Math.log(10)

△実行結果

bioruby> Math.log(1000) / Math.log(10)
  ==> 3.0

\log_{10} 1000 = \frac{\log_e 1000}{\log_e 10}


数値への変換

▼文字列から整数への変換

"10".to_i

△実行結果

bioruby> "10".to_i
  ==> 10

to Integer という感じです。

▼文字列から浮動小数点 Float への変換

"10".to_f

△実行結果

bioruby> "10".to_f
  ==> 10.0

to Float という感じです。

▼数値(整数)から文字列への変換

10.to_s

△実行結果

bioruby> 10.to_s
  ==> "10"

▼数値(Float)から文字列への変換

10.0.to_s

△実行結果

bioruby> 10.0.to_s
  ==> "10"

to String という感じです。


計算の優先順位

▼数値の計算には優先順位があります。ここで紹介した範囲では、一般的な順位と同等です。

1 + 2 * 10

△実行結果

bioruby> 1 + 2 * 10 
  ==> 21

▼先に計算したい部分をカッコで囲います。

(1 + 2) * 10

△実行結果

bioruby> (1 + 2) * 10 
  ==> 30
数値のまとめ
  1. 数値には整数と実数(浮動小数点)があります。
  2. 四則計算で直感とことなる場合があります。
  3. 計算の優先順位はつぎのサイトに説明があります。
    1. プログラミング言語 Ruby リファレンスマニュアル

集合 Array, Hash

集合には配列 Array とハッシュ Hash があります。これらの違いは、要素単位、要素の取り出し方と順番の保存性にあります。また、Ruby は集合を比較的簡単にあつかうことが出来ます。

はじめに配列 Array を紹介します。

配列 Array の作成

[1, 2, 4, 8, 16]

△実行結果

bioruby> [1, 2, 4, 8, 16]
  ==> [1, 2, 4, 8, 16]

[ と ] で要素を囲み、要素間は , で区切ると配列 Array が作成できます。

配列 Array の要素には数値や文字列を混ぜることができます。

array = [1, 2.0, "DNA", "RNA"]

△実行結果

bioruby> array = [1, 2.0, "DNA", "RNA"]
  ==> [1, 2.0, "DNA", "RNA"]
要素の取り出し

▼要素は 0 番目からはじまります。これは添字(index)といいます。

array[0]

△実行結果

bioruby> array[0]
  ==> 1

コード例1

array[1]

△実行結果

bioruby> array[1]
  ==> 2.0

コード例2

array[2]

△実行結果

bioruby> array[2]
  ==> "DNA"

素数

▼文字列と同様に size で調べます。

array.size

△実行結果

bioruby> array.size
  ==> 4

要素の追加(後ろから)

▼要素を push します

array = [1, 2.0, "DNA", "RNA"]
array.push("Bio")
array

△実行結果

bioruby> array = [1, 2.0, "DNA", "RNA"]
  ==> [1, 2.0, "DNA", "RNA"]
bioruby> array.push("Bio")
  ==> [1, 2.0, "DNA", "RNA", "Bio"]
bioruby> array
  ==> [1, 2.0, "DNA", "RNA", "Bio"]
要素の取り出し(後ろから)

▼要素を pop します

array.pop
array

△実行結果

bioruby> array.pop
  ==> "Bio"
bioruby> array
  ==> [1, 2.0, "DNA", "RNA"]

このように、pushpop の動作は対称的になっています。


要素の取り出し(前から)

▼全体を shift します

array = [1, 2.0, "DNA", "RNA"]
array.shift
array

△実行結果

bioruby> array = [1, 2.0, "DNA", "RNA"]
  ==> [1, 2.0, "DNA", "RNA"]
bioruby> array.shift
  ==> 1
bioruby> array
  ==> [2.0, "DNA", "RNA"]
要素の追加(前から)

▼shift の逆です。

array.unshift(10)
array

△実行結果

bioruby> array.unshift(10)
  ==> [10, 2.0, "DNA", "RNA"]
bioruby> array
  ==> [10, 2.0, "DNA", "RNA"]

このように、shift と unshift の動作は対称的になっています。


要素のソート

▼sort でソートします。

array = ["A", "T", "G", "C"]
array.sort

△実行結果

bioruby> array = ["A", "T", "G", "C"]
  ==> ["A", "T", "G", "C"]
bioruby> array.sort
  ==> ["A", "C", "G", "T"]

ソートは昇順になります。降順やそれ以外の並べ方をすることもできます。それらの方法の調べからは後ほど紹介します。


次元配列

二次元配列を生成します。

d1 = ["A", "C", "G", "T"]
d2 = ["a", "c", "g", "t"]
marray = [d1, d2]

△実行結果

bioruby> d1 = ["A", "C", "G", "T"]
  ==> ["A", "C", "G", "T"]
bioruby> d2 = ["a", "c", "g", "t"]
  ==> ["a", "c", "g", "t"]
bioruby> marray = [d1, d2]
  ==> [["A", "C", "G", "T"], ["a", "c", "g", "t"]]

配列 Array の要素に配列 Array をいれることができます。すると、二次元配列になります。この方法はバイオインフォマティクスでは良く利用されるデータの持ち方です。

▼要素にアクセスします(1)

marray[0]

△実行結果

bioruby> marray[0]
  ==> ["A", "C", "G", "T"]

▼要素にアクセスします(2)

marray[1]

△実行結果

bioruby> marray[1]
  ==> ["a", "c", "g", "t"]

▼要素にアクセスします(3)

marray[1][0]

△実行結果

bioruby> marray[1][0]
  ==> ["a"]

▼要素にアクセスします(4)

marray[0][0]

△実行結果

bioruby> marray[0][0]
  ==> ["A"]
配列の要素を結合する

▼全要素を結合して文字列にします。

array = ["A", "T", "G", "C"]
array.join

△実行結果

bioruby> array = ["A", "T", "G", "C"]
  ==> ["A", "T", "G", "C"]
bioruby> array.join
  ==> "ATGC"

▼スペース(空白)文字一文字で結合します。

array.join(" ")

△実行結果

bioruby> array.join(" ") 
  ==> "A T G C"

▼前出したように Array#join の逆は String#split です。

array = ["A", "T", "G", "C"]
array.join("")
array.join("").split("")

△実行結果

bioruby> array = ["A", "T", "G", "C"]
  ==> ["A", "T", "G", "C"]
bioruby> array.join("")
  ==> "ATGC"
bioruby> array.join("").split("")
  ==> ["A", "T", "G", "C"]

ここまでで配列 Array について簡単に紹介しました。つぎにハッシュ Hash について説明します。


ハッシュ Hash

ハッシュ Hash の生成

hash = {"DNA" => "ACGT", "RNA" => "ACGU"}

△実行結果

bioruby> hash = {"DNA" => "ACGT", "RNA" => "ACGU"}
  ==> {"DNA"=>"ACGT", "RNA"=>"ACGU"}

ハッシュ Hash は key => value という組みの集合です。要素の取り出しは key でおこないます。{ と } で囲むと生成できます。

ハッシュ Hash は、「キー」と「値」の組みの集合なので、データベースエントリ(たとえば、名簿など)の内容を格納する場合などに利用できます。

要素の取り出し

▼要素の取り出し

hash["DNA"]

△実行結果

bioruby> hash["DNA"]
  ==> "ACGT"

▼要素の取り出し、その2

hash["RNA"]

△実行結果

bioruby> hash["RNA"]
  ==> "ACGU"

配列 Array では要素の番号から要素を取り出しましたが、ハッシュ Hash では「値」の「キー」でとりだします。


要素の追加

▼要素の取り出しと対称的にできます。

hash["Protein"] = "AminoAcids"
hash

△実行結果

bioruby> hash["Protein"] = "AminoAcids"
  ==> "AminoAcids"
bioruby> hash 
  ==> {"DNA"=>"ACGT", "RNA"=>"ACGU", "Protein"=>"AminoAcids"}
要素の値の変更

▼要素の取り出しと対称的にできます。

hash["DNA"] = "acgt"
hash

△実行結果

bioruby> hash["DNA"] = "acgt"
  ==> "acgt"
bioruby> hash 
  ==> {"DNA"=>"acgt", "RNA"=>"ACGU", "Protein"=>"AminoAcids"}

要素の追加と変更は同じ方法でできます。

要素の追加(その2)

hash.update({"Genome" => "DNA"})
hash

△実行結果

bioruby> hash.update({"Genome" => "DNA"})
  ==> {"Genome"=>"DNA", "DNA"=>"acgt", "RNA"=>"ACGU", "Protein"=>"AminoAcids"}
bioruby> hash 
  ==> {"Genome"=>"DNA", "DNA"=>"acgt", "RNA"=>"ACGU", "Protein"=>"AminoAcids"}
要素の値の変更(その2)

hash.update({"RNA" => "acgu"})
hash

△実行結果

bioruby> hash.update({"RNA" => "acgu"})
  ==> {"Genome"=>"DNA", "DNA"=>"acgt", "RNA"=>"acgu", "Protein"=>"AminoAcids"}
bioruby> hash 
  ==> {"Genome"=>"DNA", "DNA"=>"acgt", "RNA"=>"acgu", "Protein"=>"AminoAcids"}

要素の追加と変更は同じ方法でできます。


key の集合

▼キーの集合を取り出します。

hash
hash.keys

△実行結果

bioruby> hash
  ==> {"Genome"=>"DNA", "DNA"=>"acgt", "RNA"=>"acgu", "Protein"=>"AminoAcids"}
bioruby> hash.keys
  ==> ["Genome", "DNA", "RNA", "Protein"]

ハッシュの性質として、keys の並び順は不定です。この場合では、["DNA", "RNA"] か ["RNA", "DNA"] かは決まってません。使用する計算機や環境によって変わります。

value の集合

▼値の集合を取り出します。

hash
hash.values

△実行結果

bioruby> hash
  ==> {"Genome"=>"DNA", "DNA"=>"acgt", "RNA"=>"acgu", "Protein"=>"AminoAcids"}
bioruby> hash.values
  ==> ["DNA", "acgt", "acgu", "AminoAcids"]

ハッシュの性質として、values の並び順は不定です。

集合のまとめ
  1. 集合には配列 Array とハッシュ Hash があります。
  2. それらの良く利用するメソッドの紹介をしました。
  3. 値の追加や取り出しのメソッドには対称性があります。

You-KeyYou-Key2007/11/17 07:36KNOB をマックOS Xに ダウンロードしたのですが、その後どのようにして使ったら良いのかわかりません。
Parallel virtual system も つかっています。基本的な質問ですみません。

You-KeyYou-Key2007/11/17 13:10すみません。解りました。KNOB2.0.0 を Download してknob-2.0.0.iso になった file をParallel を Double click して出てきたWindow からNew をselectして、さらにTypicalをselect, and Next, OS Type Linux, OS version, Other linux. そして、More Option で、iso file を指定すれば良いのでした。、、、 昨日も、Ruby on Rails の Bruce Tate さんにつまらない質問をして、FirstRule of Kayak: When in doubt, paddle like hell。と言う、email を頂いた所でした。

トラックバック - http://bioruby.g.hatena.ne.jp/nakao_mitsuteru/20071010