カテゴリー
Ruby

クラスについて知ろう

この章ではクラスについて説明します。
今までのプログラムでは変数とメソッドを扱ってきましたが、クラスと言う機能を使うことで、多くの変数とメソッドを1つの機能体として働かせてデータを処理することが出来ます。
クラスとは物を作る設計図に例えられます。設計図は車や家や鉛筆をつくる場合に必要ですが、この設計図に当たるものがクラスです。
例えば車や家や鉛筆の中には色々な部品が含まれていますが、それらの部品には「状態」や「ふるまい」があります。
鉛筆であれば「状態」は鉛筆の形、芯、線の濃さなどで、「ふるまい」は線を引く、削るなどの動作です。
その「状態」や「ふるまい」をクラスと言う設計図に書いていきます。
「状態」を変数で書き、「ふるまい」をメソッドで書くことになります。
その「状態」や「ふるまい」に指示を出すのはオブジェクトの役割です。
例えば「線を消す」など具体的な指示をオブジェクトと言う司令塔から出します。
クラスの基本構文は以下の通りです。9 クラス名の初めの一文字目は大文字のアルファベットで書きます。
classとendの間に変数やメソッドなどを記述して、クラスの中身を作ります。
クラスはただの設計図なので、このクラスに指示を出す必要がありますが、それがオブジェクトです。9 〇引数は省略できます。
〇このオブジェクトはインスタンスとも呼ばれています。
ではクラスの例を見てみましょう。999 クラスの中に@ マークの付いている変数がありますが、これはインスタンス変数と呼ばれていまして、クラスの中で使われます。9 =>オブジェクトの基本構文は9と、説明しましたが、このオブジェクトを作成する過程でクラスの中のinitializeメソッドを自動的に呼び出してくれます。nyuukinメソッドやshukkinメソッドは自身で作ったメソッドですが、このinitializeメソッドはRubyであらかじめ定義されているメソッドです。
そしてこの9の中の引数100000がinitializeメソッドの引数(この例ではc)に入ります。
他の言語ではコンストラクタと呼ばれる機能です。
このようにinitializeメソッドを使ってインスタンス変数に値を設定することが出来ます。
また以下の通り、初めからインスタンス変数に値を設定することもできます。
その場合には9のように引数を省略できます。9 次に以下の箇所の説明をします。9 =>クラス内のメソッドにデータを渡すには9という形式で書きます。
そうするとクラス内のメソッドが実行されます。
最後にshowメソッドを出力するとnyuukinメソッドやshukkinメソッドで計算された結果が入っている@zandakaが返されますので、これをprintで出力しています。
結果は「91000」です。
次の例はinitializeメソッドの引数にデフォルト値を設定する例です。999 初期値を設定するときには以下のように9とデフォルト値を設定してください。
メソッドの章で説明した通り、メソッドにはあらかじめ値を設定することができます。9 このようにメソッドに引数を設定した時にはオブジェクトの引数をカラにしても、そのメソッドの引数の設定値が使用されます。
先ほども説明しましたが、もう一度クラスの中のメソッドを呼び出す方法について説明します。
この例ではクラスの中で3つのメソッドを定義しています。9 これらのメソッドを使用するためには9という構文で書きます(initializeメソッドだけはオブジェクトを作成過程で自動的に呼び出されるので、明示的にこの構文を使う必要はありません)。
この構文でメソッドにデータを入れていきます。この例では以下のように書いています。99 引数が無い場合にはshowメソッドのように省略することができます。9 これらのメソッドはオブジェクトからアクセスするのでインスタンスメソッドと言います。
今までのトップレベルのメソッドは9のようにメソッド名だけでメソッドを呼び出していましたが、オブジェクトから呼び出す場合は9で書くことを覚えておいてください。
次にインスタンス変数について説明します。
インスタンス変数はインスタンスメソッドからのみ参照できますので、メソッドを通してインスタンス変数の値を取得します。
ですので、この例ではすべてメソッドの中でインスタンス変数の値を足したり、引いたりしています。
では次の説明に進みます。
オブジェクトは1つだけではなく、次のように変数を変えていただくと何個でも作ることが出来ます。
例えばこの例ではbooksとbooks2の2つを作成しています。9 オブジェクトをたくさん作成してもインスタンス変数はオブジェクトごとに値が設定されますので、booksの@zandakaとbooks2の@zandakaの間には関係性はありません。
結果は以下の通りです。9
では次の例を見てみましょう。9999 では説明をしていきます。
initializeメソッドでインスタンス変数に値を設定することもできますし、setメソッド(メソッド名はsetを付けなくても構いません)を使っても値を設定することができます。
この例ではsetメソッドで設定した値でinitializeメソッドで設定した値を上書きしていますが、initializeメソッドで設定したデータよりsetメソッドで設定したデータの方が優先されます。
setメソッドだけで値を設定したい場合にはinitializeメソッドは書かなくても結構です。
ではsetメソッドについて説明します。
インスタンス変数に値をセットするためにはinitializeメソッドやsetメソッドを通常使用します。9 =>「set..」というのはインスタンス変数の値を設定する時に使います。
特に「set..」で書かなくてはならないという決まりがあるわけではありませんが、解りやすいので慣習になっています。
通常はインスタンス変数ごとにsetメソッドを書きます。

次はgetメソッドについて説明します。9 =>「get..」と言うのは値を呼び出し元に返す時に使います。
特に「get..」で書かなくてはならないと言う決まりがあるわけではありませんが、解りやすいので慣習になっています。
通常はインスタンス変数ごとにgetメソッドを書きます。
getメソッドは値を返すために作られるメソッドです。
結果は以下の通りです。9 しかし、インスタンス変数の数だけ、このようなメソッドを書くのは面倒に思いませんか?
そこでRubyにはそれを簡潔にする機能が備わっています。
次の例で説明します。99 では説明を始めます。
9と、書くことで例えば本来ならばsetNameメソッドとgetNameメソッドを2つ書かなくてはいけませんでしたが、9と書くだけでこれらの2つのメソッドと同じことを行わせることが出来ます。
この9の中の変数に値を設定するには9という構文で入れていきます。
この例では以下のように入れています。9 インスタンス変数の値を出力するには9という構文で記述します。
この例では以下の箇所です。9 では次の例に進みます。99 では説明を始めます。9 「attr_writer :変数名」は以下のようなsetメソッドと同じ役割があります。9 「attr_reader :変数名」は以下のようなgetメソッドと同じ役割があります。9 使い方は9と同じです。

カテゴリー
Perl

掲示板を作ろう

この章では掲示板の作成方法について説明します。
掲示板を作成するためにはフォームが必要です。
フォームとは会員登録でお名前、住所などを入力したことがあると思いますが、これがフォームです。
フォーム自体はHTMLで作るのですが、その入力データをCGIに引き渡す方法などを学習します。
入力データをCGIに引き渡す方法として、GET方式とPOST方式があります。
この送信方法の指定は、HTMLの入力フォーム上で以下の通り指定します。111 つまり、get方式はフォームの送信データがURLとして渡されると言うことです。
そのため送信する情報には制限が有り、最大で約2000文字位です。
1POST方式の場合はフォームに入力したデータはHTTPプロトコル(下の補足を参考にしてください)という通信の機能によりリクエストボディつまり本体部分に入力されてサーバに送られます。
POSTの場合は送る文字数に制限はありません。
1では例をみてみましょう。
長いプログラムですので、分割して書きますが1つのプログラムです。111111 ここまでが掲示板の骨格です。
ここから下のプログラムはすべてサブルーチンになりますので、上の骨格の部分から呼び出しています。11111111 上のプログラムを実行しますと以下のフォームが表示されます。
1では、具体的な説明を始めます。
1=> 「require」は外部のファイルをプログラム内に挿入するために使います。「jcode.pl」は 文字コードを変換してくれるライブラリです。
ライブラリとは 複数のサブルーチンをまとめたファイルのことを言います。
ライブラリを皆が使えるように無料で公開している人や団体がいるのですが、1もその内の1つです。
このファイルは以下のURLで手に入れることが出来ますので、このファイルの中身をコピーして、名前を「jcode.pl」にして、このCGI プログラムと同じフォルダに置いてください。1 この「jcode.pl」は何に使うかと言いますと
ユーザーがフォームに入力する文字は1つの文字コードで決められているわけはありませんので、この「jcode.pl」を使って、文字を自身で決めた文字コードに変換します。
この例の場合には1に統一したいので、この文字列に変換します。
変換の方法は後で説明しますが、1のように書いて、「jcode.pl」の中のサブルーチンを呼び出して変換します。

2
1=>insertサブルーチンはフォームから出力されたデータを受け取るサブルーチンです。
詳しくは後ほど説明します。
1=>このプログラムは「board.dat」に投稿された記事を記録していきますので、「board.dat」というファイルを作成してCGIプログラムと同じフォルダに入れてください。
もしファイルが存在しないなどの問題がある場合にはerrorサブルーチンが作動します。
errorサブルーチンの具体的な内容は後ほど説明します。
errorサブルーチンの呼び出しはopen関数とサブルーチンの間にorを入れて1のように書きます。
そして「<FILE>」でファイルの中身を読み込んで@infoに入れています。初めてのアクセス時には@infoはカラなので何も入っていません。
1=>これはHTMLのhiddenを利用した方法です。
1フォームからデータが送信されるとこのhiddenも送信されるので、このhiddenの値がkakuの時にwritefileサブルーチンを起動させます。
このサブルーチンはフォームから送信されたデータを「board.dat」に記録するサブルーチンです。
writefileサブルーチンの具体的な内容は後ほど説明します。
111=>action属性の値に1という箇所がありますが、このハッシュには実行しているパスを含むファイル名が代入されています。
「SCRIPT_NAME」は環境変数と呼ばれていて、1という構文でパスを含むファイル名が取得できます。
環境変数は他にも多数ありますが、例えば以下のような環境変数があります。
1「SCRIPT_NAME」は著者の例では1に相当します。
つまり、action属性の値にはどのファイルに送信するのかを書きますので、この例では投稿ボタンを押すと再び1に戻ることを意味します。
ではURLにファイルを指定して、実行してください。
1もし、「board.dat」が存在しないのならばファイルエラーと表示されます。
1これはerrorサブルーチンが作動した結果です。
1の他に2か所errorサブルーチンがありますが、これはファイルが開けなかったときに実行されます。
サブルーチンの呼び出し側の引数には1が入っていますが、これが1に代入されますので、エラーが起きた時には1と出力されます。
エラーが無ければ以下のフォームが表示されますので、フォームに名前などを入力して、投稿をクリックします。
11このinsertサブルーチンは簡単に説明するとフォームから送られてくるデータを以下のハッシュに入れる機能を持っています。
1ではinsertサブルーチについて説明します。
postで送られているのならばread関数の中の$subにフォームから送られてきたデータを代入します。
11read関数はファイルハンドルから指定したバイト数のデータを読み込み変数に代入します。
この例の場合のファイルハンドルはSTDINを指定してください。
ファイルハンドルは通常はこれまで使用してきたようなファイルに関連づけされたファイルハンドルですが、STDINはPOSTでデータを送るときに使われる特殊なファイルハンドルです。
1にはPOSTで送られてきたデータの文字数が代入されています。これは先ほど説明した環境変数です。
基本構文は1です。
1もしpostではなくgetで送られてきたのならば1に送られてきたデータが代入されているので、それを$subに代入します。
これも先ほどと同じで環境変数です。
1getで送られる場合にはデータは1に代入されていると覚えてください。
次に以下の箇所の説明をします。
1=>フォームからデータが送られるときには以下のようにフォームの
1を&で繋げた状態でデータが送られてきますが、このままでは配列に入れることが出来ませんので、splitで切断します。splitで切断する作業は2回行うのですが、初めに「&」で区切ったものを配列に入れます。
1@dfrには分割したものが以下のようにして入ります。
1さらにこの@dfrの中の要素を「=」で区切ります。1111111

例えばフォームに「近藤」と、入力して送るとします。1111

splitで分割した後にすることはURLエンコードして送られてきたものをURLデコードしなくてはいけません。
URLデコードはURLエンコードされたものを元に戻すことを言います。
URLデコードは以下の部分で行います。
1=>半角スペースを表す「+」を元の空白に戻すには1と書きます。
次に以下の箇所を説明します。1 111111次は以下の箇所の説明をします。1 1111次の箇所の説明をします。
11なぜこの作業を行うかと言いますとHTMLのタグをそのまま送信してしまうと掲示板などにいたずらされる可能性がありますので、それを防ぐために変換を行う必要があります。
1次に以下の箇所の説明をします。
1=>最後に$inputというハッシュに分解した$keyと$value」を入れています。
1では説明をしていきます。
「投稿」ボタンを押しているので、以下のhiddenが実行され、if文がTRUEになり、writefileサブルーチンが呼び出されます。
1writefileサブルーチンではフォームから送信されたデータと日付をファイルに書き込みます。
ではwritefileサブルーチンの説明を始めます。
1=>ここではフォームから送信されたコメントがカラの場合にはerrorサブルーチンが呼び出され1が出力されます。
カラを表現するには1のようにダブルクォートを続けて書きます。
$inputにはinsertサブルーチンで取得したデータがハッシュの形式で保存されていますので、ここでデータが入っているかどうかを確認しています。
次に以下の箇所の説明をします。
1=>ここでは localtime関数とtime関数を使って日付や時刻を取得しています。
1time関数をこのままの状態で使っても、ただ数字が並んでいるだけで意味が分かりませんので、 localtime 関数の引数にtime関数を入れますと我々が分かりやすい数値をリスト形式で取り出すことが出来ます。
以下の基本構文の左辺を見ると月や分などのリストになっていますが、time関数の経過秒が月、分などに変換します。
1曜日を日本語で得たい場合には自身で曜日の配列を作成して、曜日の入った変数の数値を添え字にして配列からデータを得ます。
111111=>ここではlocaltime関数で取得した変数に書式を付け加えています。
つまり指定した値、例えば$year,$monなどをsprintf関数で
書式指定文字通りに変換します。
基本構文は以下の通りです。
111例のように% とアルファベットの間に1など数字がありますが、これは桁数を指定しています。
「%4d」であれば4桁の整数を意味します。
「%02d」であれば先頭に0を付けた2桁の整数を意味します。
11111次の箇所の説明をします。
1=>unshiftは配列の古いデータの先頭にデータを追加します。
これは常に新しいデータが画面表示の上に来た方が読みやすいので、unshiftを使ってデータを上に配置するようにしています。
@infoには以下のデータを入れています。
11次に以下の箇所の説明をします。
1=>ここではファイルにデータを書き込んでいます。
ここまで終わりますと「board.dat」には以下のように書き込まれます。
11111以下の箇所で「board.dat」に入っているデータを画面に表示します。
11ファイルに入っているデータを取り出すのですが、ファイルにはタブ区切りでデータが入っているので、splitで区切ります。
区切られたデータはそれぞれ$date, $head, $name,$contentsに代入されるので、あとはprint文でそれぞれを出力します。
結果は次のようになります。1