ファイルの入出力に関して

ファイルの読み出しも、書き出しも、 open -- end を用いればよかった。 open の引数にあるモードで、指定すればよい。


open("ファイル名","モード") do |変数|ファイル名と何を行うかのモード設定
変数に対する処理
end                                       

モードには、 r, r+, w, w+, a, a+ の 6 つのうちのどれかを指定する。

既知のデータを使いたいとき r 読みこみ専用、読み出しはファイルの先頭から
追加注文も含めることのできる注文請書を作りたいとき r+ 書き込み可能で、読み出し書き込みは先頭から
レシートなど、新しく書き込むファイルを用意したいとき w 新規書き込み専用、書き込みは上書きで先頭から
前回のポイント分を読み込み、今回の購入分から発生するポイントを加えたいとき w+ 読みこみ可能だが、書き込みは上書きで先頭から
購入取り引き台帳などを作成するとき a 書き込み専用、ファイルが存在していれば続きから書きはじめる
銀行の ATM で出納記録を作成するとき a+ 読みこみ可能、ファイルが存在していれば続きから書きはじめる

ファイルに書き込んだり読み出していると考えられる電子ゲームを挙げ、 Ruby でならどのように作ることができるか推測せよ。

HTML ファイルとの連動

HTML ファイルを Ruby 言語で書く方法について学んだ。

  1. まずは Ruby 言語できちんと書く
  2. HTML 文書に出力したら、Kterm で確認
  3. 最後にブラウザで確認

データの読みこませを自動にし、データの書き込みが自動的に行われる仕組みは、 いくつかある。

ファイルに書き込んだり読み出していると考えられるオンラインの仕組みを挙げ、 Ruby 言語でどのように作り、似たようなものを作ることができるか推測せよ。

全てができ上がったあとに、飾りとして CSS ファイルを読みこませたりする。

じゃんけん

じゃんけんをするプログラムを作ってみよう。 adv_rsp.rb :


#!/usr/koeki/bin/ruby
#coding:euc-jp

srand
s=rand(3)

hand=["ぐー","ちょき","ぱー"]

STDERR.print("じゃんけんぽん!(0: ぐー,1: ちょき,2: ぱー) :")
t = gets.chomp.to_i

printf("あなたは %s でした \n", hand[t])
printf("わたしは %s でした。\n", hand[s])

srand は乱数を適当に取り出して並べておく。 rand(3)srand でもらった値から計算し、 0, 1, 2 を無作為 random に取り出す。 hand[0], hand[1], hand[2] にはそれぞれじゃんけんの手が入っている。

千鳥足の表示

酔っぱらいが千鳥足で歩くときのシミュレーション。 adv_rwalk.rb:


#!/usr/koeki/bin/ruby
#coding:euc-jp

srand 乱数を使う

x = 1010 列目から始まる

i = 0
while i < 2020 歩進む
y = 1 - 2 * rand(2)rand(2) は 0 か 1 なので y は 1 か -1 x += y 乱数により位置がずれる print(" " * x) 空白を x の値ぶん繰り返す printf("x\n") 足跡 i += 1
end

乱数を与えて結果をシュミレーションする実験は、実際に化学や物理で使われている。 このシュミレーション実験方法はモンテカルロ法と呼ばれる。

かかった時間を調べる

今度は adv_timeup.rb をつくろう。


#!/usr/koeki/bin/ruby
#coding: euc-jp


l = "koeki"
letter = l.split(//)   # split(//) で 1 文字ずつ配列にしまう

#letter = ["k","o","e","k","i"]

STDERR.print("どれだけ早く打てるかな\t")
STDERR.printf("%s\n", letter)

start = Time.now.to_i

i = 0
while i < letter.length 
printf("\v%s:", letter[i]) input = gets.chomp if input == letter[i]
stop = Time.now.to_i STDERR.print("\t正解\n") i += 1
end
end printf("かかった時間 %d 杪!\n", stop - start)

Time.now で現在時刻を取り出す。数値化するには to_i method を用いる。 \t はすきまを空ける Escape Sequence であった。 \v は縦にすきまを空ける Escape Sequence である。

split(//) で文字列を配列にしまう。

バナー

文字を目立たせるのにはコマンド banner をプログラムで用いるとよい。

%banner "welcome!"

これをプログラム内に仕込んでみよう。 adv_banner.rb:


#!/usr/koeki/bin/ruby
#coding:euc-jp

print(`banner "koeki univ"`)

コマンドを `` back quotation で囲むことにより、コマンドの実行結果を print 文で出力する。 アルファベットのみで日本語は出力しない

色をつけよう

文字に色をつける場合には escape sequence を用いる。 adv_color.rb:


#!/usr/koeki/bin/ruby
#coding:euc-jp

i = 0
while i < 8
printf("%c[%dm 文字の色が変わります \n",0x1b,30+i) i += 1
end j = 0 while j < 8
printf("%c[%d;%dm 背景に色がつきます \n",0x1b,40+j,37-j) j += 1
end printf("%c[%d;%dm 太字に変わります \n",0x1b,0,1)

文字の色は 2 進法で 0b11110 から始まり、赤 Red 、緑 Green 、青 Blue ごとに 0b1, 0b10, 0b100 を割り当てて加えている。また、背景色は 0b101000 から始まる。 二つを同時に変更するときには ; をつける。Esc-[ が文字に効果を与える escape sequence (文字コード 0x1b) である。


0x1b[色番号m文字色か背景の変化
0x1b[背景番号;色番号m背景と文字色の変化
 色番号は 30 番台, 背景は 40 番台

8 色の背景や文字を使ってカラフルなアートに挑戦してみよう。
8 色アートその 1 8 色アートその 2

例えば、書き出すプログラム を参考に、作ってみよう。このプログラムではフォントも書いておいた。

背景を変更するには

背景の色を変えるには

%xsetroot -solid 色

Kterm の色を変えて Kterm を出すには

%kterm -bg 背景 -fg 文字 &

が使えるので、system を使ってプログラムに仕込んでもよい。例:


system("xsetroot -solid red")
system("kterm -bg green -fg white")

少し間を空ける

sleep を使うと秒を指定して停止することができる。 adv_sleep.rb:


#!/usr/koeki/bin/ruby
#coding:euc-jp

print("うと" * 3)
print("...\n" * 3)

sleep 3

print("はっ!\n")

この場合は 3 秒停止する。

  • print("文字列" * 回数)文字列を繰り返して表示する
  • sleep 杪数指定された杪数の間は実行しない

作品を作ろう

無償のソフトウェアを開発し、ホームページに置いておき、 皆に使ってもらおう。 自分の発信した情報(この場合はプログラム) が使用したユーザから感想や意見を受けることが標準になりつつある。 制作者はその反応を受け、改良を加え、よりよい製品を提供する。

ソフトウェアの開発

ソフトウェアには、アイディアが必要である。日常で困っていることを発見し、 解決する。便利そうなもの、楽しそうなものを思いつき、 具体的に中身を詰めていく作業も必要である。 まずは、 ゴールを設定すると、 ソフトウェアの第一作 (プロトタイプ) を作ることができる。

ゴールに使う条件から、変数を何にするか設定する。

どこを売り込むかポイントを抑える

目的が何であるかをはっきりさせたら、 売り込むときにもその点を十分強調する。 サービスは消費者にとって、なくてもよいものに過ぎない。 はっきりした売り文句でなければ消費者は手を出さない。 売り込むときには、誠実に。 製品と売り文句を違えて売り込むことを詐欺 という。

企画書の作成 plan.txt

企業などでは、プログラムを書く前に、 提案書 を提出する。 また、プログラムを書いてからも、 社内プレゼンテーションなどのために、 さらに 企画書 を提出する。 この企画書が通ると、具体的に製品化される。 内容は、題名、目次、作成した理由、 プログラムを使用することにより発生するメリット、 それをささえる技術について、 最後に最終目標あるいは今後の課題について書く。

データを読み出して書き込む仕組み

今までの知識を総動員すると、 例えば次のような作品を作ることができる。

  • 新幹線の券売機。
  • 作品, 借りている人, 貸し出し日のデータなどを検索する仕組み。 レンタルビデオ屋, 図書館, カーシェアなど
  • 旅行したい場所を指定し、お勧めをホームページに出力する仕組み。
  • 買った商品リストのデータを読みこませ、おすすめの品物を表示する HTML 文書。
  • 携帯電話の番号を登録させる。使いたいときに検索し、電話をかける仕組み。
  • メールなどで寄せられた商品に関する感想を一覧で載せる仕組み。
  • 招待状などの差し込み印刷。

作品を作るのに必要なこと

作りたいものが決定したら、まずは最もシンプルな動作を選ぶ。 その動作を表現する最もシンプルなバージョンを作る。 これをテストモデルという。

シンプルな動作を組み合わせて、より複雑なものを作成する。 締切があるので、できるところまでで完成という形になるよう、 常に区切りをつけたプログラムを作成し、 新しいプログラムはそれを複製してはじめるとよい。

データを計算するには

データは分析しなければ集めた意味がない。 計算機に計算を実行させ、その結果から分析を行う。

データの切り出し

while -- end の中で、 データを項目別に分類し、 $1, $2 ... などと指定する。 数値だけを知りたいときにはそのまま使うこともできるが、 数値以外の情報も合わせて調べるには、配列にしまっておくと便利であった。

計算方法の例

平均を求めるならば、和を代入する変数とデータの行数を数える変数を用意し、 データの行数を数え終ったあとで


while データをとってくる
if データの分解の条件
和 += $分解した () の位置 データを数える変数 += 1
end
end 和 / データを数える変数

最大 (最小) を求めるには、配列にしまい、仮の最大 (最小) を設定し、 次の 1 行と比較して交換する方法を使った。

広告用ホームページ

具体的に広告用ホームページを作る際、技術的なことを確認しておこう。 ホームページの directory の下に、広告用ホームページの directory を作る。 ここにプログラムと広告をしまう。

%mkdir ˜/public_html/adv
% cd ˜/public_html/adv

作成したプログラムは ˜/Ruby で作った場合、 広告ホームページの directory まで持ってこなければ、公開されない。

%cp ˜/Ruby/プログラム.rb ~/public_html/adv

トップページ (˜/public_html/index.html) には、 広告ページへのリンクを張る。 偶然に訪れた訪問者が顧客となる可能性があり、 ビジネスチャンスとなりうるためである。バナーの作り方は次週以降学んでいくので、 今週はリンクのみとする。



<p><a href="./adv/index.html">リンクであることを知らせる説明</a></p>

あるいは



<p><a href="/˜ユーザ ID/adv/index.html">リンクであることを知らせる説明</a></p>

とすると、リンクからたどることができるようになる。

広告ページに必要な項目は こちら

ソフトウェアの公開時の条項

広告ホームページ directory ˜/public_html/adv は、 このようになるはずである。

%ls  ˜/public_html/adv
00readmeプログラム.rbindex.htmlplan.txt

また、ホームページ自身 ˜/public_html/adv/index.html には必ず以下のリンクを含む。



<p><a href="プログラム.rb">プログラムダウンロード</a></p>
<p><a href="plan.txt">企画書</a></p>
<p><a href="00readme">取り扱い説明書</a></p>

最低、プログラム本体、広告ホームページ、 取り扱い説明書が必要である。 その他に画像やデータファイルなどがあれば、 それらも含まれていなければならない。

今回は個人プロジェクトなので、企画書は本来不要であるが、 次回以降チームとして企画立案を行う際に必要であるので、 企画書も書く。 来週以降、企画書をあわせて 4 つのファイルが展示会場に展示され、 優秀な学生にはボーナス得点がつく。

取り扱い説明書

取り扱い説明書 00readme は、テキスト形式で書き、 プログラム名、概要、ダウンロード方法と遊び方、 著作権と免責事項および連絡先が書かれているものである。 雛型はこちら

名前判断

占いというものがいかにいい加減なものであるか、見ておこう。 adv_fortune.rb


#!/usr/koeki/bin/ruby

STDERR.print("おなまえ: ")
name = gets.chomp

i = 0  # 愛を数える
j = 0  # 美を数える
k = 0  # 芸を数える
l = 0  # 楽を数える

n = 0
while n < name.length 
m = name.slice(n) # 名前を 1 文字ずつ切り出す no = m.ord # ord で文字列を 10 進数表示 r = no % 10 if r > 8
i += 1
elsif r > 6
j += 1
elsif r > 3
k += 1
else
l += 1
end n += 1
end print("\n--- 診断結果 ---\n\n") print("美: \t") printf("*" * i) printf("\n") print("愛: \t") printf("*" * j) printf("\n") print("芸: \t") printf("*" * k) printf("\n") print("楽: \t") printf("*" * l) printf("\n")

単に文字コードの末尾の数だけで判断されている。 いかに占いには根拠がないかということを知ってほしい。

広告において主張しておくべきこと

広告ページ ˜/public_html/adv/index.html (ブラウザでは http://roy/˜ユーザID/adv/ ) には、引き込ませる内容が必要である。その項目は以下のとおり。

  • 題名
  • 作った理由
  • ソフトウェアを使うことの利点や楽しみ
  • ダウンロードするリンク先
  • 使用方法
  • 公開に際する条件と連絡先

また、配布するにあたって、広告ページ内には、 作品プログラム、企画書、取り扱い説明書 がリンクされている必要がある。

本学内のみの公開で無償ではあるが、 作成者自身にプログラムに対する著作権がある。 作成者は利用者に許可を与えたり免責事項を課すことができる。 例えば、 改変してもよいのか、無断使用・引用をしてよいのか、などである。 今回はオープンソースを作るので、 後輩のために入手、実行、改変、再配布可能とすべきである。

Web ページに関しては 1 年の授業の「Webページ作成の基礎」 なども復習しておくとよいだろう。

新聞広告などのチラシを分析し、 どのような情報が書かれているか考えよ。

公開内容についてさらにくわしく

参加してくれた人は誰?

ファイルを共通な directory /tmp にしまっておき、 誰でも書き込めるようにしてみよう。adv_logfile.


#!/usr/koeki/bin/ruby

if FileTest.exist?("/tmp/message.dat") 
FileTest.writable?("/tmp/message.dat") ファイルがかき込みできるなら true print("一言メッセージを書き込んでね: \n") message = gets.chomp open("/tmp/message.dat", "a") do |msg|
msg.printf("%s: %s\n", `whoami`.chomp, message)
end printf("ファイルに書きこんだよ\n") printf("メッセージを見るには cat /tmp/message.dat してね\n")
else printf("ファイルを作ったよ\n")
system("touch /tmp/message.dat") system("ls -l /tmp/message.dat") File.chmod(0100666, "/tmp/message.dat") ファイルを chmod +w する system("ls -l /tmp/message.dat") print("一言メッセージを書き込んでね: \n") message = gets.chomp open("/tmp/message.dat", "w") do |msg|
msg.printf("%s: %s\n", `whoami`.chomp, message)
end
end

whoami コマンドは使用しているユーザ名を知るためのコマンドである。

ファイルの取り扱い

FileFileTest は、ファイルの存在および状態について知ることができる method である。

system は、コマンドを実行するときに使用する。 使わせるファイルは、 chmod g+w するのを忘れないこと。

コンペティションについて

次週、各自の商品の企画展示を行う。企画展示とは、 該当ホームページから各自のブース(広告ホームページ) にリンクを張ることである。

また、見学者として公式開催期間中 (6 月末まで) に閲覧し、 部門ごとに各 1 -- 2 名を推薦してもらう(SNS を活用)。 この推薦書を送ることにより、 見学者には得点が入る。また、広告側には質問や意見を述べることができる。 意見をもらった広告主は、その意見や質問を引用し、 どのように解決したかについての報告書を送ることにより、 広告主に得点が入る。見学者には TA も含まれる。

部門は、広告ホームページ、企画書、本体(実用プログラム部門、ゲーム部門) の 4 つとなる。見学者はプログラムを実際に体験し、 企画書からプログラムがその企画通りになっているかどうか、 広告ホームページがプログラムの内容がよくわかるようになっているかどうか審査し、 それぞれの部門で推薦する。

部門はゲーム部門と実用部門。 例年ゲーム部門はネタがかぶるなど問題が発生するので、 リスクをおかしてでも作りたい場合は、 とびきりいいものにすること。 実用部門は、 実際に使われているしくみを、 プログラムに利用したものを作ると人気が上がるようである。

それぞれの宛先は次週以降公開する。 得点の高かったものについては、 ボーナス得点 が与えられる。