« 2006年07月 | メイン | 2006年09月 »

2006年08月 アーカイブ

2006年08月01日

オブジェクト指向が分かってきた!?

本日の講義は、図書「なぜ、あなたは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で割ったときの商と余りを、配列にして返します。

メタ構文変数

何気なく利用している変数 hoge foo などはメタ構文変数と呼ばれるらしい・・・。hoge にもしっかりと使う理由があったのね。。。

2006年08月02日

本日のメソッド【 modulo 】

x.modulo(y)
「 x % y 」と同じです。

2006年08月03日

Thumbs.db

Windowsの画像ファイルがあるフォルダを開くと作成される「 Thumbs.db 」と言うファイル。

↓コチラ
http://arena.nikkeibp.co.jp/qa/20060208/115301/
によると、「このファイルには、画像の入ったフォルダを開いたときに表示される“縮小画像”が保存されています。あらかじめ縮小画像を作っておくことで、画面表示を速くするというわけです。」と書いてあります。

もし「 Thumbs.db 」を作成したくない場合は、
「フォルダオプション」で「縮小版をキャッシュしない」をチェックすればOK。

本日のメソッド【 remainder 】

x.remainder(y)
xをyで割った余りを返します。得られる値の符号は「x」の符号に一致します。

[ たのしいRuby P165 ]

2006年08月04日

本日のメソッド【数値演算メソッド(Mathモジュール)】

○Mathモジュール
三角関数や対数関数など、よく使う数値演算のためのメソッドは、Mathモジュールから提供されます。

※Mathモジュールで提供されるメソッド
PI 円周率(3.141592...)
sin(x) 正弦関数(xはラジアン)
cos(x) 余弦関数(xはラジアン)
tan(x) 正接関数(xはラジアン)
など。

[ たのしいRuby P166 ]

2006年08月06日

今のパソコンに"Bドライブ"がない理由

↓こういうことらしい
http://gigazine.net/index.php?/news/comments/20060805_drive_b/

2006年08月07日

本日の講義【モデリング】

本日は、「モデリング」を行いました。

プログラミングの流れの中で、
----------
1.コンピュータに行わせたいことを理解する。
  ↓
2.理解したことを説明できるレベルまで整理する
  ↓
3.コンピュータにわかる言葉へ翻訳する
----------

2.番目をオブジェクト指向で行うことが「モデリング」と言う作業のようです。

それで、オブジェクト指向のモデリングを行うための記述・図法「UML」を学びました。
実質的な業界標準。これが書ければ世界中のプログラマに通用する!

10個ある図法の中から、本日は「クラス図(概念や静的なクラス間相互関係を表現)」をやりました。
クラス図は何度かチラ見たことはあるのですが、それを実際に作成したことはありませんでした。
「なるほど!オブジェクト指向はこのように設計するのかー」ととっても楽しくなりました。
※本日風邪気味だったため、ちょっと元気がありませんでした・・・。

何より「シンプルでわかりやすい!」と言うのが大切なようです。

本日、実際に書いてみましたが、ちょっと慣れが必要なようです。
ガンガンとモデリングが頭の中で生成できるようになりたいです。
ドンドン経験を積むべし!と言うところでしょう。
絶対マスターするぞ!

本日のメソッド【 数値型の変換( to_f , to_i , round , ceil , floor ) 】

本日は【数値型の変換】のメソッドです。

【to_f】
IntegerオブジェクトをFloatオブジェクトに変換します。
【to_i】
FloatオブジェクトをIntegerオブジェクトに変換します。また、文字列から数値へ変換することもできます。
【round】
小数点以下を四捨五入するにはroundメソッドを利用します。
【ceil】
レシーバよりも大きくて最も小さい整数を返します。
【floor】
レシーバよりも小さくて最も大きい整数を返します。

to_i_etc.gif

2006年08月10日

数え上げ【Integerクラス times】

Rubyらしいメソッド。

[ たのしいRuby P 171 ]

InstantRails

本日は、次回の講義で利用する[ InstantRails ]をインストール。

Apacheも、MySQLもインストールしてあったので、
既存のApacheは起動しない。
既存のMySQLはアンインストール。(あんまり利用しないので)
これで、InstantRails付属のApacheとMySQLを利用する。

インストールは、すんなり。と言うか、ダウンロードして、InstantRails.exe をダブルクリックしただけ。
それで、http://localhost/ を見たら coming soon! と表示されました。

Apache の httpd.conf を見たら、いろいろと自動的に設定されていました。さすがインスタント!
PHPもMySQL、Rails もすぐ使える感じですね。

InstantRailsのスペック
Apache : Apache/1.3.33
PHP : 4.3.11RC1-dev
Ruby : 1.8.4
mysql : 3.23.49

rubyとmysqlにPathを通しました。
明日色々といじってみることとします。

2006年08月11日

ユニットテスト / テスト駆動開発

クラスやモジュールごとに、メソッドをテストするプログラムを作成する。まずは、このテストプログラムから書くのが現在の開発スタイル。テストプログラムを書く時間が増えるが、けっして開発時間が倍になるわけではない。バグが減り、信頼性の高いプログラムができる上に、割と開発が早い。

実際に書いてみた。

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 'モッククラス' とする。

ユースケース

ユースケースとは、
「ユーザがソフトウェアをどのように利用するかというシナリオを文章として記述しています(このシナリオをユースケースと呼びます)。ソフトウェアを文章で表す事」

仕様はいつも悩みます。。
仕様を決定する段階では、ユースケースを書くことをやってみよう!

[ なぜ、あなたはJavaでオブジェクト指向開発ができないのか P136 ]

ユースケースからクラスを抽出する際の注意!

○ユースケースからクラスを抽出するさいの注意!
クラスとは「人物」に限らない。「役割」さえ持っていれば、必ずしも人物である必要はない。

○名詞抽出法
ユースケースからクラスを抽出する方法のひとつ。名詞を抽出して、クラスになりそうなものを選択する。

[ なぜ、あなたはJavaでオブジェクト指向開発ができないのか P137 ]

クラスを抽出したら、クラスの関連性を洗い出す!

クラスの関係性を洗い出す理由は、
「それぞれのオブジェクトがどのようにメッセージを送りあうのか、考えやすくなる」

それにより、
・どのクラスからどのクラスへメッセージを送るのか
・どのようなメッセージを送るのか
・メッセージを受け取った結果、どのように振舞うのか
を知る。
このようなつながりを、オブジェクト指向では「関連」と呼ぶ。


○関連を分かりやすくするために図に表す

[ なぜ、あなたはJavaでオブジェクト指向開発ができないのか P140~P143 ]

オブジェクト指向の世界 != 現実世界

「オブジェクト指向は現実世界における私たちの認識を、できるだけそのまま表現できるようにしたもの」と説明されています。
しかし、(ばば抜きプログラムの)手札クラスのように、現実にはありえない操作を持たせています。
オブジェクト指向で重要なのは、あくまでも役割を明確に分担することなので、現実世界でありうるかどうかは気にする必要がない。
「同じ数のカードを探すのは手札の役割」と決めたため、手札は「ただのカードの集まり」ではなく、「賢い手札」になっています。そのため、プレイヤーは「同じ数のカードを教えてください」と手札にお願いするだけでよいのです。

[ なぜ、あなたはJavaでオブジェクト指向開発ができないのか P145~146 ]

各クラスの属性を洗い出す

属性とは、「インスタンスごとに用意されるべき要素」

○ポイント
・他のクラスからの操作によって影響を受けるオブジェクト固有の状態
・他のクラスから必要とされるオブジェクト固有の情報
・外部に影響しない属性は不要である(不要な属性が大量に出てしまうため)


うーん。属性(インスタンス変数)だと、プレイヤーの名前とか考えてしまうけど、違うのね。。。

% を利用した便利術

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

これは便利!

2shinsuu_amari.gif

2006年08月21日

RDB入門

本日の講義はRDBMS (Relational Database Management System)を行いました。RDBMSはRDBやDB略す場合もあります。

RDBは過去にpostgresを利用したことがありますので、本日の講義内容は理解しやすかったです。



○RDBの概要


******
RDBは情報システムの要であり、RDBに蓄えられた情報は、その企業・団体の資産である。
******
RDBは多くの場合、大切な情報が入っているので、情報漏洩などもってのほか!SQL文を覚えるのも大切だけど、セキュリティ体制も万全にして、もしもの時のためにバックアップはしっかりとらないとですね!



○RDB概要 - 歴史


******
1969年、IBMのE. F. Codd博士がRDMSに関する論文を発表。
******
E. F. Codd博士・・・最初に考えた人は偉大です。。



○RDB概要 - 商用製品


******
Oracle, DB2 (IBM), SQLserver(MS)
******
上記が3代有料RDB。値段が高いです。。。安心を買うか買わないかでしょうか。。



○RDB概要 - オープンソース製品


******
MySQL, PostgreSQL。基本的に無料 。利用の仕方によっては、有料になるものもあるので注意。サポートなし。ただし、有償サポートを行う会社もある
******

上記が2代無料RDB。上記以外は、あまり聴かないですね。。

******
※メモ:オープンソースとライセンス形態
・GPL -- Linux,gcc >> 組込んだ・改良したソフトはGPLになり、ソースの公開を義務付けられる。
・LGPL -- OpenOffice >> 改良したソフトはGPLになるが、非ソースコード(コマンド、ライブラリー)を組み込んだソフトはGPLにはならない。
・BSD -- Apache,Mozilla,Ruby … >> 基本的にソース公開義務なし、無償で使える。
・GPLと有償の併用 -- MySQL >> MySQLは、GPLを選ばなければ有償 (ただし例外あり) 。http://www.s-style.co.jp/about_mysql/mysql_license.php
******

GNU 一般公衆利用許諾契約書 バージョン2
http://www.opensource.jp/gpl/gpl.ja.txt

つまり、MySQLを利用したアプリケーションなら、ソースコードを公開しないと有料ってことなんですね。。。



○RDB概要 ? 標準


******
・RDB操作で使う SQL言語は ISOで標準化されている。
・ただし、各RDBとも独自のSQLや機能を持っている。
・また、標準を部分的に満たしてないRDBもある。
・RDBを操作する API (ライブラリ)は各RDB毎に違う。
・統一的なAPIもいくつかある。ODBC(MS)、JDBC(Java), DBI(Perl,Ruby)

******

RDBごとに独自の書き方がある。それを統一してくれるAPIがある。
よくフレームワークとかで、統一できるのは統一してくれるAPIを利用しているからなのだろうか?



○RDBの原理 - テーブル


******
全てのデータを2次元のテーブル(表)に格納する。DBへの操作は行単位で行われる。
******



○RDBの原理 - リレーション


******
複雑な構造は表と表のリレーションで表現する
******

重複するデータは避けるべきだ!これが正規化!



○RDB技術 - 格納できるデータの型


現在は画像などのバイナリーデータも格納できる。



○RDB技術 - null の扱い


******
RDBにはカラムに値の入ってない状態をNULL として扱います。
NULLは’’(空の文字列)とは違い、特別な扱い(対象外)となります。

******

NULLは【対象外】になるので注意!



○RDB技術- インデックス


******
・インデックスはB-Treeがよく使われ、N個のデータに対し平均logN回の検索でデータを選択出来る。
・B-Treeはソートされたようなデータなのでソートも高速に行われる。
・インデックスを付けるとその分ディスクや更新処理時間が増加する。
・カラムの値に重複が多い場合は高速化されない。

******

インデックスを設定したからといって、必ず高速化するとは限らない。



○RDB技術- ユーザー管理


******
・RDBを操作するには、あらかじめ登録されたユーザーでログインする必要がある。
・ログイン時にはパスワード等の認証を設定できる。
・各ユーザーには、権限(アクセス出来るテーブル、操作)を細かく設定できる。
・ほとんどのRDBにはスーパーユーザーがある。

******

MySQLのスーパーユーザーは「root」。必ずパスワードを設定しよう!



○RDB技術- トランザクション


******
複数の更新中に失敗が起きた場合、全ての更新を無かった事にし、DBの一貫性を保つ。
また、トランザクションを実行しているプロセス以外からの参照アクセスは更新前の値を戻し、更新アクセスは待たされる。

******

銀行のシステムでこれがなかったら、大変ですね。。。
postgresで利用したことがあるので、概念は大丈夫。



○RDB技術-レプリケーション


******
・複数のサーバーに同じテーブルを置き、内容がいつも一致するようにする仕掛け。
・負荷分散、バックアップ等の為に行われる。

******

MySQLはレプリケーションが優れているらしい。postgresはレプリケーションが貧弱らしい。
これは大規模なシステムでは必須ですね!



○SQL 文


******
データ操作 (DML)
select : データの取り出し
insert : データの作成
update : データの更新
delete : データの削除
データ定義 (DDL)
create table : テーブルの作成
create index : インデックスの作成
drop table : テーブルの削除
alter table : テーブルの変更
grant : ユーザの登録・権限設定
・・・

******

postgresとMySQLは似ているが、違う部分も多々あるので、しっかり覚えよう!



○RubyでのDBプログラミング


******
・MySQLライブラリー
 MySQL専用プログラムになる
・DBI
 MySQL以外でも使えるように作れる
・ActiveRecord
 Railsの一部だが、DB処理のみでも使える
 SQL文を書かずにテーブルに対応したクラス(ActiveRecord)を操作する事で、DB処理が書ける

******

今回の実習では、シンプルにMySQLライブラリーを使用。

require 'mysql'

db = Mysql.init

db.connect("localhost","test1u","test1p","test1")
result = db.query("select no,pos,name,goal from player") # SQL文の実行
result.each { |no, pos, name, goal| # 結果の取出し
print no, " ", pos, " ", name, " ", goal, "\n"
}

数え上げ【Integerクラス upto】

from.upto(to){|i| ...}

fromからtoに達するまでにiに減算しながら繰り返します。fromがtoより小さければ一度も繰り返しません。

2006年08月

Sun Mon Tue Wed Thu Fri Sat
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 31

Map

About 2006年08月

2006年08月にブログ「プログラマ 福重 伸太朗 ~基本へ帰ろう~」に投稿されたすべてのエントリーです。過去のものから新しいものへ順番に並んでいます。

前のアーカイブは2006年07月です。

次のアーカイブは2006年09月です。

他にも多くのエントリーがあります。メインページアーカイブページも見てください。