たのしいRuby
「たのしい Ruby」を第7章まで読みました(^^
感想は、「たのしい!分かりやすい!」です。
Rubyはスッキリコードをかけるので、すごく書いていて気持ち良いです。
Ruby独自のメソッドもかなり使えるし、Rubyが使われる理由が分かります。
Rubyを始めたい方は是非オススメです!
「たのしい Ruby」を第7章まで読みました(^^
感想は、「たのしい!分かりやすい!」です。
Rubyはスッキリコードをかけるので、すごく書いていて気持ち良いです。
Ruby独自のメソッドもかなり使えるし、Rubyが使われる理由が分かります。
Rubyを始めたい方は是非オススメです!
本日は、Ruby講義第4回。
「たのしい Ruby」の1章から7章までをやりました。
1章から7章までは、僕個人的には、サクっとやれたので、楽でした。
Ruby独特のメソッドやPerlやPHPとの差を理解できて、良かったです。
次回からはオブジェクト指向に入るということで、気合が入ります!
ということで、本日のまとめ。
1章から7章のまとめなので、変数、配列、などの事を書くと思うでしょうけど、基本的なことは書きません(^^;
基本的なことは、本に譲ります。
本日の講義で、気になった事を記しておきます。
------------------------------------
○極端に大きな数字や、極端に小さな数字の表し方
123000 == 123e+3
0.0015 == 1.5e-3
○変数とメモリー
変数の箱 == メモリー
○[ irb ]は文法チェック、正規表現の勉強などに便利

○数学的な計算が得意(?)なプログラム
HASKEL とか
○「表」という文字を書くと文字化け、エラーを起こす。
Shift_JIS 、EUC-JP、UTF8で書いてもちゃんと表示されない。
Windowsの場合は、ファイルをsjisで記述して、-Ks オプションをつけて実行すればOK。
ruby -Ks test.rb
windows上で、ファイルをeucで書いて、
ruby -Ku test.rb
でOKだとおもったけど、エラーを起こす(^^;
うーん。なんで?
○ハッシュは何百個あっても、1回で見つけられるので高速である。
配列は一つ一つ見ていくしかないが、ハッシュはキーで捜せるので、高速に見つけられる。
○eachはrubyっぽい
each メソッドはruby独特。このメソッドを利用していると ruby っぽい。
○MS-DOSプロンプト便利コマンド
type [ファイル名]
ファイルの中身を閲覧できる。
○「Rubyの変数の型は一定である」
コマンドラインからデータを受け取るオブジェクト「ARGV」は文字列を扱う。
もし、ARGVで数値を扱う場合は、 ARGV[0].to_i とする必要がある。
※PHPは一定ではなく、代入されたデータにより、自動的に判断する。
○変数名、メソッド名はしっかりと考える!
読んで分かりやすいプログラムを書くため、変数名、メソッド名などは分かりやすく書くこと!
変数名を決めるのに、時間を惜しまないこと。
○プログラムは書くより、読む時間の方が圧倒的に長い!
読みやすいプログラムを書きましょう。
○良いプログラムをどんどん読もう!
良い小説を書く人は、良い小説をたくさん読んでいる、
良い音楽を書く人は、良い音楽をたくさん聴いているのと同じように、
良いプログラムを書く人は、良いプログラムをたくさん読んでいる!
○Ruby では [ if 0 ] は true である!
PHPでは、if(0) は false だが、rubyでは、true !
本日は、「たのしいRuby」の8章と9章。オブジェクト指向の部分でした。
PHPやPerlを利用してたときも、僕が過去に作成したものは、
「構造化手法」で作っていたんだなと理解できました。
本日の講義はレベルが高かったー。「こう書いたら、こうなる」と言うのは分かるけど、それを実際にどのように組み合わせて活用するのか、いまいちつかめません。。。
やっぱ、実際に色々とソースを書いて動かしてみないと、実感が沸きづらいですねー。
講義で気になったことをメモ。
○正規表現
/(.*)@(.*)/ =~ "mailaddress"
user = $1
domain = $2
p user #=> @マーク前
p domain #=> @マーク後
ポイント: $1, $2は特殊な変数。
○ハッシュのkeyを配列で返す
def
・
・
return [Hash].keys
end
Hashのkeyの部分だけを配列で返す。
○rdoc
rubyファイルを分析したhtmlを生成してくれる。

○メソッドの呼び出し制限について
・public
・private
・protected
の3種類。
「やさしいRuby」のP131の書き方を覚える。
○メソッドに演算子
Rubyはメソッドに演算子が書ける。
○エラー処理と例外
通常は、プログラムの例外処理は、if 文などを利用していたが、やはり「めんどくさい」ので、rubyにあるクラスを利用しましょう!
本日は、Rubyに元々ある便利クラスについてでした。
8章、9章よりは全然分かりやすかった!フムフム、なーるほどと言う感じで、けっこうスイスイ使い方自体は理解できた(と思う)。
PHPを使っていたころは、あまり「PHPに元々あるクラス」と言うものを意識して利用したことがないので、おそらくたくさん便利な物があったのだろうと思う。勿体無いことをした...。ま、これから利用すればよいのです。
ガンガン良いソースを見て、良いソースを書くことが良いと思う。
たのしいRubyの練習問題を少しずつでもしっかりと理解しながら解こう!1日2問は継続して解いてみよう。
本日の講義で気になったことをメモ。
○文字コードについて
日本語が利用できる文字コードは、大きく分けて4つある。
Shift_JIS, EUC-JP, ISO-2022-JP, UTF-8
だんだん UTF-8 が主流になりつつある!?
それは、UTF-8が Unicode と言う「新しい国際的な文字コード規格」を利用しているからである。
例えば、中国と日本では「日」と言う同じ漢字を利用しています。
でも、Shift_JISと中国の従来文字コードでは、同じ「日」と言う漢字に違う数値を割り振っているため、統一性がありません。それを、「日」と言う漢字は、同じだから同じ数値を割り当てましょう。と言うのがUnicodeである。
○ __FILE__ と $0
__FILE__ は、実行しているファイルを示す。
$0 は、実行したコマンドを示す。

○演算子はメソッドとしても利用できる。
前回のブログでも、少し触れたが、以下に実例を示す。

ポイントは↓の見方
c2 = c1 + 20
c2 ・・・ これは代入結果を入れる変数
c1 ・・・ これは、Testクラスのインスタンス(宣言されるとnumに10がセットされる)
+ ・・・ これがメソッド!
20 ・・・ これがメソッドの引数!(other)である。
一見すると、通常の足し算のようだが、全然見方が違うので注意!
これが、「Rubyでは演算子がメソッドで利用できる」と言うことである。
○irb 補足
irb は、 ; で改行を表すことができる。
○Rubyは大きな整数が扱える
CPUが32bitだと、32bit分の数値しか扱えないが、Rubyはメモリのある限り、大きな数値が扱える。
なので、 2の1000乗と言う大きな数値も扱える。
32bit CPUであれば、32bitで表現される整数が最も効率よく扱えるのは、
-2147483648~2147483647の範囲の整数(つまり32bit符号付きの表現範囲)。
○妙な結果のプログラム
a = 0.1 + 0.2
p a #=> 0.3
b = (a == 0.3)
p b #=> false
上記のプログラムは、なぜfalseと返すのだろうか?
答えは、「プログラムはなぜ動くのか」P51にあります。
↓は、実験結果。

0.1を100回足すと、10になると思いきや、ならないのである。
本日は、rubyコードを紙に印刷してのリーディングです。
phpやperlと役割の似たメソッドもありますが、分からないものが多く、調べて調べて調べて・・・コードを読みました。でも、この繰り返しが大切なんだと思います。
phpやperlのメソッドも「あまり使わないもの」は暗記していないので、「こんな機能あるかな?」と言う時にググったりして「ああ!コレコレ」となったり、「メソッド名は分かるけど、どう言う風に利用するんだっけ?」と言って、マニュアルを見たりしてますので、「よく使うメソッドは覚えるけど、使わないのは覚えてない」と言うのが現状。メソッドは大量にあるから、丸暗記よりは、発掘する能力とか、予測する能力、なければ作り出す能力が必要なのだと思う。コードをガンガン読んで行けばこのような能力も自然とついてくると願う。。
複雑そうに見えるコードもいざ解読し終わると、「けっこう単純なのね」となる事があって楽しい。
知らないメソッドがたくさんあるだけな場合が多い。
あとは、メソッドの使い方。
↓こんな使い方があった。
src = "test\n "
hoge = src.rstrip.split(/\r?\n/)
p hoge #=> ["test"]
注目は、2行目。
1---------------
src.rstrip.split(/\r?\n/)
2---------------
src.rstrip(/\r?\n/)
src.split(/\r?\n/)
---------------
1と2は同じ意味である。
1行にまとめてしまっているのが、スッキリしていて良い。
こんな使い方もできるんだな~と勉強になりました。
本日は、短い時間だったので、数個のメソッドしかみれなかったけど、リーディングをドンドン積み重ねて、rubyを使いこなそう!
本日の講義は、図書「なぜ、あなたはJavaでオブジェクト指向ができないのか」をベースに行いました。
図書はJavaで書いてあるので、Rubyに置き換えての講義です。
ジャンケンをするプログラムを作成。
最初は、構造化プログラミングをして、その後、クラスごとに役割を決めて、属性(インスタンス変数)、操作(メソッド)を決めてのオブジェクト指向プログラミング。構造化プログラミングとオブジェクト指向プログラミングを両方作成して違いを見るので、とっても分かりやすかった!
インスタンス、インスタンス変数、継承、スーパークラスとサブクラスの両方でinitializeを利用していたときの動き・・・等オブジェクト指向に関することがとっても分かりやすく理解できた!
「インスタンスごとに個別のインスタンス変数を持てる」と言うのが理解できたときが、とっても良かった。なるほどなるほど!って思った。
あと、ペアプログラミングは楽しい!話しながらやれるので楽しいし、問題解決が早い、相手のプログラミングは勉強にもなる。
以下は、ジャンケンを作成するプログラムからポイントをピックアップ!
○スーパークラスとサブクラスのinitializeの関係
------------------------
class Yamada < Player
def initialize(name)
super(name)
#↑サブクラスのinitializeが優先して実行されるので、
#super() で親クラスのinitializeを実行。
#super() をやらないと親クラスのinitializeは実行されない。
@name = name
@win_count = 0
end
・
・
・
end
-------------------------
○ペアプロ
XP(エクストリームプログラミング) の手法の一つ。
○プログラミングの3つのステップ
1.コンピューターに行わせたいことを理解する(要件定義)
↓
2.理解したことを説明できるレベルまで整理する(設計)
↓
3.コンピューターへ分かる言葉へ翻訳する(プログラミング)
○本日のまとめ
本日は、オブジェクト指向に大きく近づいた感じがする。これからドンドン経験を積んで、オブジェクト指向をバリバリ使いこなせるようになるぞ!
○本日のメソッド [ divmod ]
「たのしいRuby」 P165

xをyで割ったときの商と余りを、配列にして返します。
クラスやモジュールごとに、メソッドをテストするプログラムを作成する。まずは、このテストプログラムから書くのが現在の開発スタイル。テストプログラムを書く時間が増えるが、けっして開発時間が倍になるわけではない。バグが減り、信頼性の高いプログラムができる上に、割と開発が早い。
実際に書いてみた。
hogefuga.rb ←本番プログラム
--------------------------
class HogeFuga
def hoge(n)
if n < 10
x = 1 + n
return x
else
return "abc"
end
end
def fuga
return "def"
end
end
--------------------------
test_hogefuga.rb ←テストをするプログラム
--------------------------
require 'test/unit'
require 'hogefuga'
class Test_HogeFuga < Test::Unit::TestCase
def test_hoge
inst = HogeFuga.new
assert_equal(2, inst.hoge(1))
assert_equal(3, inst.hoge(2))
assert_equal(4, inst.hoge(3))
assert_equal(5, inst.hoge(4))
assert_equal(10, inst.hoge(9))
assert_equal("abc", inst.hoge(10))
end
def test_fuga
inst = HogeFuga.new
assert_equal("def", inst.fuga)
end
end
--------------------------
実行結果

細かいバグがなくなりそうで、いいなーと思う。
「テストケースは正常ルートと運用上起きそうな異常ルートのみで充分」
○Mock class(モッククラス)
※Mockは「模造品」という意味
Mock class は、例えばDBへ書き込むメソッドがあるとして、テストで本番のDBへ書き込まれても困るので、テストDBに書き込むなり、代わりに何か他のものを返すなりする為に用意するクラス!?
Mock classを利用するときは、もちろん require 'モッククラス' とする。
s = ["a","b","c"]
for i in 0..10
print s[i % 3],"\n"
end
↓↓
a
b
c
a
b
c
a
b
c
a
b
これは便利!

windows のコンソールで使う。
まず、
irb
と打つと ruby コマンドが打てるようになる。
↓たとえば、こんな感じに使う。
irb(main):025:0> require 'digest/sha1'
=> true
irb(main):026:0> Digest::SHA1.hexdigest("test")
=> "a94a8fe5ccb19ba61c4c0873d391e987982fbbd3"
irb(main):027:0>
windows にインストールする場合、One-Click Ruby Installer が楽です。
exeファイルをダブルクリックするだけ。環境変数の設定までやってくれます。
○RubyForge
http://rubyforge.org/frs/?group_id=167&release_id=6672

ローカルマシンで見ることが出来る。
$ gem_server
http://127.0.0.1:8808/
Rubyコード中にCのコードを埋め込めるRubyInlineを使って、ボトルネックとなっているメソッドを置き換える。
オオォォ
以下のようなコードがある。
---------------------------------
class Point
def hello
z = "test"
self
end
endp0 = Point.new
p p0.hello.class
#selfがあると => Point
#selfがないと => String
selfがあるとないとでは、大違いですね。
今日、
「selfがあるのとないのとでどう違うの?」
と言う質問をうけて即答できなかった・・・。Rubyの基礎が足りませんね・・・。
「たのしいRuby」を今週は読み込もうと思います。
self は「擬似変数」
擬似変数は変数のように参照することができますが、いずれも値を設定することはできません。
代入を行うとエラーになります。
● 擬似変数●通常の変数以外に擬似変数と呼ばれる特殊な変数があります。
self
現メソッドのオブジェクトそのもの
nil
NilClass?クラスの唯一のインスタンス
true
TrueClass?クラスの唯一のインスタンス。真の代表値
false
FalseClass?クラスの唯一のインスタンス。偽を表す
__FILE__
現在のソースファイル名を表す
__LINE__
現在のソースファイル中の行番号を表す
#!/usr/local/bin/ruby
require 'net/smtp'
require 'kconv'
backup_time = Time.now
server_name = "server_name"
hd_size = `df -h`
to = %w(hoge@hoge.com) # Array
subj = 'BACKUP REPORT(hogehoge.com)'
from = 'fuga' # for Header From part
body = <<-BODY
#{backup_time}
#{server_name}
#{hd_size}
BODY
sender = 'fugafuga'
subj = Kconv.tojis(subj)
subj = subj.split(//,1).pack('m'); subj = subj.chomp
from = Kconv.tojis(from)
from = from.split(//,1).pack('m'); from = from.chomp
tomany = to.join(',')
head = <<HEAD
Subject: =?ISO-2022-JP?B?#{subj}?=
To: #{tomany}
From: =?ISO-2022-JP?B?#{from}?=
Mime-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Type: Text/Plain; charset=iso-2022-jp
HEAD
src = head + "\n\n" + Kconv.tojis(body)
m = Net::SMTPSession.new(address = 'localhost', port = 25)
m.start()
m.sendmail(src, sender, to)
m.finish
Rubyドキュメント
memoです。
http://kiyoeri.gotdns.org/joomla/index.php?option=com_content&task=view&id=30&Itemid=2
# gem help commandGEM commands are:
build Build a gem from a gemspec
cert Adjust RubyGems certificate settings
check Check installed gems
cleanup Cleanup old versions of installed gems in the local repository
contents Display the contents of the installed gems
dependency Show the dependencies of an installed gem
environment Display RubyGems environmental information
help Provide help on the 'gem' command
install Install a gem into the local repository
list Display all gems whose name starts with STRING
query Query gem information in local or remote repositories
rdoc Generates RDoc for pre-installed gems
search Display all gems whose name contains STRING
specification Display gem specification (in yaml)
uninstall Uninstall a gem from the local repository
unpack Unpack an installed gem to the current directory
update Update the named gem (or all installed gems) in the local repository■使用頻度が高いと思われるコマンド
機能 コマンド
hogeをインストール gem install hoge
インストールされたパッケージ一覧 gem list
名前にfugaを含むインストール済みパッケージを探す gem search fuga
ネットワーク上のライブラリを探す gem search --remote fuga gem search -r fuga
パッケージfugaをアップデート gem update fuga
パッケージfugaの古いバージョンを削除 gem cleanup fuga
パッケージfagaの削除 gem uninstall fuga
gems自身をアップデート gem update --system
ヘルプ gem --help gem -h
コマンド一覧を表示 gem help commands
| Su | Mo | Tu | We | Th | Fr | Sa |
|---|---|---|---|---|---|---|
| 1 | 2 | |||||
| 3 | 4 | 5 | 6 | 7 | 8 | 9 |
| 10 | 11 | 12 | 13 | 14 | 15 | 16 |
| 17 | 18 | 19 | 20 | 21 | 22 | 23 |
| 24 | 25 | 26 | 27 | 28 | 29 | 30 |
ブログ「プログラマ 福重 伸太朗 ~基本へ帰ろう~」のカテゴリ「ruby」に投稿されたすべてのエントリーのアーカイブのページです。過去のものから新しいものへ順番に並んでいます。
前のカテゴリはpostgresqlです。
次のカテゴリはsubversionです。