第 10 回 CGI ことおぼえ レポート課題 氏名: 土門千里 学籍番号: c1111122 語学クラス: 英語5 コース: 政策マネジメント 1. 筆記問題 A. pstore は、第三者も書き込むことが出来るように設定、また、他の directory の中身を破壊、改変されたくないときに使う directory である。また、cgiruby の下に作ること二より、CGI を動かすことが出来る。 この directory を作成することにより、他の directory に第三者が書き込み、 改変、または削除が出来ないようにすることが可能である。 第三者による書き込みは、データベースにしまわれるためにデータとして保存さ れ、出力することも可能である。データベースに第三者が入力したものをデータ としてしまうことが出来るのは、Hash の仕組みを利用しているからである。 また、web 上で入力されたデータが CGI 変数 としてデータベースにしまわれる。 ・require 'pstore' -- これにより、受け取ったデータをためる宣言をすることになる。 ・PStore 変数 = PStore.new("データベース.db") -- これにより、データベース.db というデータベースを作成することが出来る。 このデータベースに第三者により入力されたデータがしまわれる。 ・PStore 変数.transaction do CGI 変数 に入っているものを表示させる命令文 end -- 第三者によって入力されたデータを読み込んで出力させる。 データベースからデータを引っ張ってくる。 2. A. 問題 a と c を選択した。 URL: http://roy/~c111112/rubycgi/r2_cgi_best.html a. 買い物プログラム URL: http://roy/~c111112/rubycgi/r2_cgi_bought.html 1) 考えた設定 入力したデータ(お客さんの名前)、選択したデータ(日付や商品) がレシートと して出力され、その日に店に来店した顧客の情報を書き込むプログラム。 2-1) 作成した html 文章 買い物プログラム

買い物プログラム

# プログラムr2_cgi_bought.rb によって # 入力されたデータが処理される。

このプログラムは、商品をいくつか選択するとレシートを出力します。

下の商品から選択し、"OK" をクリックしてください。

商品を選択後、注文された商品内容を確認するページへ移動します。


日付: # ドロップダウンメニューの終わり # ドロップダウンメニューの終わり


氏名:

# 名前を記入するテキストエリア

商品


# データを送信するボタン # データをリセットするボタン

2-2) 作成したプログラム #!/usr/bin/env ruby #coding: euc-jp require 'cgi' # CGI を使う宣言 account = CGI.new(:accept_charset => "EUC-JP") # 日本語で入力されたデータを受け取る # account は CGI 変数にあたる print("Content-type: text/html; charset=EUC-JP\n\n") # 日本語でデータを出力する goods = Array.new # goods の配列を作る goods[0] = account["goods_a"] # 商品A goods[1] = account["goods_b"] # 商品B goods[2] = account["goods_c"] # 商品C goods[3] = account["goods_d"] # 商品D goods[4] = account["goods_e"] # 商品E month = account["m"] # 何月であるか day = account["d"] # 何日であるか customer = account["name"] # お客さんの名前 print("\n") # html 文を print 文で書く print("\n") print("買い物プログラム\n") print("\n") print("\n") print("

買い物プログラム

\n") print("

お買上げありがとうございます。

\n") print("

またのご利用をお待ちしております。

\n") print("
\n") printf("

2012年 %s %s

\n", month, day) # 日付を出力する printf("

%s様

\n", customer) # お客さんの名前を出力する print("
\n") print("\n") for bought in goods # goods の中から選んだ商品を探す printf("", bought) # 選択した商品を出力する end # for の終了 print("
%s
\n") print("
\n") print("

レシートを出力しました。

\n") print("\n") print("\n") open("./mydb/sales.dat", "a+") do |sales| # sales.dat へデータを追加的に書き込む sales.printf("2012年 %s %s\n", month, day) # 日付を出力する sales.printf("%s様\n", customer) # お客さんの名前を出力する sales.print("--------------------------\n") sales.print("\n") end # open の終了 open("./mydb/receipt.dat", "w") do |receipt| # receipt.dat へデータを書き込む receipt.print("ご利用いただきありがとうございます。\n") receipt.print("\n") receipt.printf("▼2012年 %s %s\n", month, day) # 日付を出力する receipt.printf("%s様\n", customer) # お客さんの名前を出力する for bought in goods # goods の中から選んだ商品を探す receipt.printf("%s\n", bought) # 選んだ商品を出力する end # for の終了 receipt.print("またのご利用お待ちしております。\n") end # open の終了 3) プログラム実行結果 a-1) ウェブ上での実行結果 買い物プログラム

買い物プログラム

お買上げありがとうございます。

またのご利用をお待ちしております。


2012年 1月 1日

るびお様


商品A
商品B
商品C

レシートを出力しました。

a-2) ウェブ上での実行結果 買い物プログラム

買い物プログラム

お買上げありがとうございます。

またのご利用をお待ちしております。


2012年 1月 1日

るび様


商品D
商品E

レシートを出力しました。

b) sales.dat への出力結果 2012年 1月 1日 1111様 -------------------------- 2012年 1月 1日 るびお様 -------------------------- 2012年 1月 1日 るび様 -------------------------- c-1) receipt.dat への出力結果 ご利用いただきありがとうございます。 ▼2012年 1月 1日 るびお様 商品A 商品B 商品C またのご利用お待ちしております。 c-2) receipt.dat への出力結果 ご利用いただきありがとうございます。 ▼2012年 1月 1日 るび様 商品D 商品E またのご利用お待ちしております。 4) 考察 選んだ商品のみが結果画面に出力され、入力した名前のデータ、選択した日付の データもきちんと表示されていたため、プログラムは正しく動いているといえる。 また、レシートにも選択した商品データ、入力された名前、日付のデータが出力 されていたため、正しく動いているといえる。 顧客情報に関しては、追加的に顧客の名前と日付が出力されて行ったため、これ も正しく動いているといえる。 改善点としては、商品名だけではなく商品それぞれに値段を与え、合計金額を計 算して出力するという部分を追加することであると考える。 c. 家計簿プログラム URL: http://roy/~c111112/rubycgi/r2_cgi_account.html 1) 考えた設定 入力されたデータを元に、現在の残高を計算するプログラム。 2-1) 作成した html 文章 家計簿プログラム

家計簿プログラム

# 入力されたデータは r2_cgi_account.rb で処理される

このプログラムは、入力された金額データを元に残金を計算するプログラムです。

計算結果を家計簿に出力します。


日付: # プルダウンメニューの終わり # プルダウンメニューの終わり


収入

金額 : # 収入金額を入力するテキストエリア 備考 :

# 内訳を入力するテキストエリア

支出

金額 : # 支出金額を入力するテキストエリア 備考 :

# 内訳を入力するテキストエリア

# 入力されたデータを送信する # データをリセットする

2-2) 作成したプログラム #!/usr/bin/env ruby #coding: euc-jp require 'cgi' # CGI を使う宣言 hk = CGI.new(:accept_charset => "EUC-JP") # 日本語で入力されたデータを受け取る # hk は CGI 変数にあたる print("Content-type: text/html; charset=EUC-JP\n\n") # 日本語でデータを出力する m = hk["month"] # 今月は何月であるか d = hk["day"] # 今日は何日であるか ic = hk["income"].to_i # 収入の金額 n_i = hk["note_i"] # 収入の備考欄 ex = hk["expense"].to_i # 支出の金額 n_e = hk["note_e"] # 支出の備考欄 print("\n") # html 文を print 文で書く print("\n") print("家計簿プログラム\n") print("\n") print("\n") print("

家計簿プログラム

\n") print("

今回の収入と支出の金額です。

\n") print("
\n") printf("

2012年 %s %s

\n", m, d) # 日付を出力する print("

収入

\n") printf("

金額 : %d 円

\n", ic) # 収入の金額 printf("

内訳 : %s

\n", n_i) # 収入の内訳 print("

支出

\n") printf("

金額 : %d 円

\n", ex) # 支出の金額 printf("

内訳 : %s

\n", n_e) # 支出の内訳 print("
\n") print("\n") print("\n") open("./mydb/hk.dat", "a+") do |hk| # housekeeping.dat へデータを書き込む hk.printf("2012年 %s %s\n", m, d) # 日付を出力 hk.print("収入\n") hk.printf("金額 : %d 円\n", ic) # 収入の金額 hk.printf("内訳 : %s\n", n_i) # 収入の内訳 hk.print("支出\n") hk.printf("金額 : %d 円\n", ex) # 支出の金額 hk.printf("内訳 : %s\n", n_e) # 支出の内訳 hk.print("\n") hk.printf("残金 : %d 円\n", ic -ex) # 残高の表示 hk.print("--------------------------\n") hk.print("\n") end # open の終了 3) プログラム実行結果 a-1) ウェブ上での実行結果 家計簿プログラム

家計簿プログラム

今回の収入と支出の金額です。


2012年 3月 8日

収入

金額 : 1000 円

内訳 : 小遣い

支出

金額 : 200 円

内訳 : おかしを購入


a-2) ウェブ上での実行結果 家計簿プログラム

家計簿プログラム

今回の収入と支出の金額です。


2012年 4月 15日

収入

金額 : 5000 円

内訳 : 小遣い

支出

金額 : 1200 円

内訳 : CDを購入


b) 家計簿への出力結果 2012年 3月 8日 収入 金額 : 1000 円 内訳 : 小遣い 支出 金額 : 200 円 内訳 : おかしを購入 残金 : 800 円 -------------------------- 2012年 4月 15日 収入 金額 : 5000 円 内訳 : 小遣い 支出 金額 : 1200 円 内訳 : CDを購入 残金 : 3800 円 -------------------------- 4) 考察 入力した金額データ、内訳データともに正しく表示されていたためプログラムは 正しく動いていると言える。 また、家計簿への出力、残金の計算も正しく計算、表示されていたため正しく動 いていると言える。 改善点としては、入力できるデータに限りがあるところであり、while -true の ようにユーザーが自分で入力を辞めるまで入力しつづけることが出来るものにで きるようにチャレンジしたい。 B. 今回は前回とは違うフォントを試してみました。 URL: http://roy/~c111112/adv2/ 3. 感想 佐々木勇汰 さんの 後期の最高傑作へ移動するページ http://roy/~c111073/rubycgi/order_input_c111073.html 最初はどのような作品か分からなかったが、データを入力してから学籍番号を入 れることによって、その人の後期最高傑作のページへと移動することが出来る作 品であることが分かった。 学籍番号をいれることによって、http://roy.e.koeki-u.ac.jp/~学籍番号/adv2/ の URL の学籍番号に当たる部分にデータを出力させて、URL を出力する作品で あり、学籍番号を入れるだけで様々な人の作品を見ることが出来る面白い作品で あると感じた。 4. 参考文献 西村 まどか 基礎プログラミング II 第 10 回 (CGI ことおぼえ) より 「CGI で使うことのできるデータベース」 http://roy/~madoka/2012/r2/10/r2_10_01_theme_01_pstore.html 西村 まどか 基礎プログラミング II 第 10 回 (CGI ことおぼえ) より 「プログラム部分について」 http://roy/~madoka/2012/r2/10/r2_10_02_theme_02_program.html 西村 まどか 基礎プログラミング II 第 8 回 (CGI ことはじめ) より 「試作品のエラーを探せ」 http://roy/~madoka/2012/r2/08/r2_08_14_theme_12_tryanderror.html