roy > naoya > 基礎プログラミングI > (10)楽しいプログラムを作ろう
(10) 楽しいプログラムを作ろう
[1] 自由製作課題について
前期の授業も終盤に入り、4月当初では想像できないような難しいプログラムを書くことができるようになった。最後に、これまで学んだことを踏まえて自由に題材を選んでプログラムを作成してみよう。一人では負担が大きいので5名程度のグループを作り、アイデアを出し合いながら分担して作業を進めよう。
作成するもの
- プログラム(必ず2つ以上作成)
- 理由(1):プログラムが1つだと得意な人が任されることになり、作業量の偏りが生じやすい
 - 理由(2):プログラムが1つだとグループ内の得意な人1~2名の力量により結果が決まってしまう
 - 理由(3):プログラムが1つだと複数の案が出た時に却下される案が多くなる
 
 - Webページ(プログラムの説明書やプログラム本体を掲載)
 - プレゼンテーションファイル(発表時に使用)
 
自由課題のグループ
これまでに獲得をした得点に基づき、各グループの戦力が同じになるように調整しています。
| 1 | 2 | 3 | 
|---|---|---|
| 
菅生 琢斗 須藤 誠真 布施 秀人 吉藤 瑠星  | 
大森 颯真 清原 永遠 庄司 斐 桝村 美結 丸田 ゆき  | 
須藤 拓馬 石井 塁 佐々木 海星 天童 大将 丸山 正太郎  | 
| 4 | 5 | |
| 
井上 稚菜 酒井 章吾 伊藤 翔太 坂内 仁美  | 
本山 颯人 栗田 佳也 進藤 朱希也 菅原 綾乃 山下 紗枝  | 
 | 
題材設定
グループ課題は諸君の実力を公(おおやけ)にアピールできるよう公開しやすい題材を選ぶ形式とする。以下の各部門から好きなものを選んで課題作成する。
-  地域活性部門
      
何か地域を盛り上げる助けになるもの
 -  福祉部門
      
不自由を克服する人を支援するものなど
 -  役立ち情報部門
      
知りたい人にとってしっかり役立つ情報を提供するもの
 -  シミュレーション部門
      
実世界でのできごとを計算機上で仮想的に実験するもの
 -  教育部門
      
何かを学習する人の強力な助けになるもの
 -  ビジュアル部門
      
効果的な視覚情報を多数用意した凝った作りのもの
 -  エンターテイメント部門
      
大人から子供まで幅広く楽しめるもの
 
他チームの作品を評価するときに、その作品がエントリした部門のテーマに則しているかも大きく加味する。
過去の自由製作課題
参考までに過去の自由製作課題の例を示す。
- 2022年度(春学期)自由製作課題
 - 2021年度(春学期)自由製作課題
 - 2020年度(春学期)自由製作課題
 - 2019年度(秋学期)合同成果発表会
 - 2019年度(秋学期)自由製作課題
 - 2019年度(春学期)自由製作課題
 - 2018年度(秋学期)合同成果発表会
 - 2018年度(秋学期)自由製作課題
 - 2018年度(春学期)自由製作課題
 - 2017年度(秋学期)合同成果発表会
 - 2017年度(春学期)自由製作課題
 - 2016年度(秋学期)合同成果発表会
 - 2016年度(秋学期)自由製作課題
 - 2016年度(春学期)自由製作課題
 - 2015年度(秋学期)合同成果発表会
 - 2015年度(秋学期)自由製作課題
 - 2015年度(春学期)自由製作課題
 - 2014年度(後期)合同成果発表会
 - 2014年度(後期)自由製作課題
 - 2014年度(前期)自由製作課題
 - 2013年度(後期)合同成果発表会
 - 2013年度(後期)自由製作課題
 - 2013年度(前期)自由製作課題
 - 2012年度(後期)合同成果発表会
 - 2012年度(後期)自由製作課題
 - 2012年度(前期)自由製作課題
 - 2011年度(前期)自由製作課題
 - 2010年度(後期)自由製作課題
 - 2010年度(前期)自由製作課題
 
[2] 今後の予定
- 10回目
 - 楽しいプログラムを作るためのテクニック
 - 自由課題グループ分け
 - グループ名の決定
 - 役割分担の決定
 - 作成するプログラム案を考える
 - 11回目
 - trr
 - 作成するプログラムの決定
 - Webページの構成の決定
 - プログラムおよびWebページの作成を開始
 - 12回目
 - プログラムの完成
 - Webページの完成
 - 発表方法の検討
 - 発表練習
 - 13回目
 - 自由課題発表会
 
[3] 役割分担について
役割分担と作業スケジュールを相談しよう。役割は以下の様なものがあるだろう。準備期間中に何もすることがない人が出てこないよう、各自の役割を明確にしておこう。
授業以外の時間に集まって作業を行う可能性もあるため、連絡が取り合えるようにしておくとよい。後で、連絡が取れなくなって困ることがないようにしておくこと。
準備期間の役割(例)
- プログラム作成
 - Webページ作成
 - 素材(Webページ・プログラム)作成(GIMP)
 - プレゼンテーションファイル作成
 
当日の役割(例)
- 発表役
 - タイムキーパー
 - コンピュータ操作役
 
[4] 作成するプログラムについて
例えば以下のようなプログラムが考えられる。面白いものや実用的なものを作ってみよう。
- 4択クイズ
 - ロールプレイングゲーム
 - 30秒あてゲーム
 - 対戦型ゲーム
 - 一番安い送料を調べるプログラム
 - 占い
 - 心理テスト
 
ただし、占いや心理テストはいい加減に作ってしまうと面白みが薄れる一方、診断の根拠を何らかの資料に求めると著作権の問題が発生してしまう。また、構造も単純なため、半年間学んだ集大成のプログラムとしては達成感に欠ける。あくまでも最終手段と考えておこう。
なお、最終的に公開することを考え、以下の点に留意しよう。
- 操作方法をわかりやすくする:ユーザ≠プログラム作成者であるため、初めて実行した人でも操作方法がわかりやすいことが望ましい。例えば、実行直後にprint"好きな数字を入力してください\n"とすると、何をするプログラムであるのか、何のために数字を入力しなければならないのかがわからない。ただし、余りにも細かく説明しすぎると、読むのが煩わしくなってしまう。プログラム作成担当でないグループ内の他のメンバに意見を求めると良い。
 - プログラムの構造をわかりやすくする:どこでどのような処理をしているのかについてコメントを残しておくと良い。複数人で協力して作成する場合、他人が書いたプログラムを理解するためには時間がかかることがある。また、よく出来たプログラムの場合、次年度以降の自由課題作成において参考にされる可能性もある。せっかく作ったプログラムであるため、将来的に活用してもらえるよう、構造をわかりやすくしておこう。
 - 協力して作成する:例えばクイズを作る場合、一人で問題を考えると20問程度が限界かもしれない。しかし、全員で考えれば100問以上の問題を作ることも出来る。毎回同じ問題が同じ順番で出題されるプログラムは1~2回しか実行してもらえないが、プールした100問の問題からランダムに10問出題するようなプログラムであれば、何度でも楽しむことができる。せっかく作るのであるから、多くの人に繰り返し実行してもらえるようなものを作ろう。
 - 技術レベルの高いプログラムを作成する:これまで学んできたことを活かし、技術的にもレベルの高いものを作成しよう。例えば、恋愛シミュレーションゲームを作る場合、プログラム自体はif文だけで書けてしまうので、後述するポップアップ画像の表示やプログレスバーなどを組み込んで見ると良い。
 
[5] プロジェクトマネジメント
グループワークの方法
グループワークを効果的に進める方法を確認しておこう
プロジェクトとは
限られた予算の中で1回限りで行われる、目標に対して成果の求められる作業をさす。人材育成強化科目にある「プロジェクト型応用演習」もプロジェクトに位置付けられる。
プロジェクトの制約条件は対象範囲(スコープ)、納期(タイム)、予算(コスト)の3つ。やるべきこと(スコープ)が決まっていなければ、効率的に作業ができないし、成果物が仕上がっても納期の遅れや予算の超過があれば、プロジェクトとしては失敗になる。これら3つの条件をバランスよく満たしていく必要がある。
ここでは、プロジェクトマネジメントの要素である「スコープマネジメント」と「タイムマネジメント」を取り上げ、限られた期間で最大限のパフォーマンスを発揮する方法を考える。
スコープマネジメント
スコープ=範囲である。成果物として何を仕上げればよいのかを明確にしたものがスコープであり、成果物を仕上げるために必要な作業を明確に定義することがスコープマネジメントとなる。
今回の成果物は「プログラム」「Webページ」「プレゼンテーション」である。ただ、プログラムとはいっても実際にはもっと細かく分類することができる。例えば温泉検索プログラムであれば、以下のような分割が可能である。
- プログラムの構想(誰に対して何を提供することで、何の解決を目指すのか。例えば、本学学生に対して大学を起点として1時間以内で行くことができる温泉に関する情報を提供することで、日々の疲れを癒してもらう)
 - 要件の定義(実行した時に何ができるプログラムなのかを明確に定める。例えば、大学から1時間以内に行くことができる温泉23か所について、住所と交通アクセス、距離、温泉までの諸省時間、温泉の写真、泉質、効能、料金、おすすめポイントを表示するプログラムを作る。これを受けて収集する情報等を定義する)
 - ソフトウェア要件の定義(収集した情報のテキストファイルへの書き方や、検索方法、結果表示方法等のプログラムとして実装する際の具体的な方法)
 - 温泉に関する情報収集
 - プログラムのコーディング
 - テスト(ホワイトボックス、ブラックボックステスト)
 - デモ版のプログラム(必要であれば)(育成ゲームのように結果がランダムに決まるものは、仕込みのプログラムを作っておくと説明しやすい))
 
Webページやプレゼンテーションについても、それぞれ作成する上でやらなければならないことを明確にする。これ以上分割できないところまで分割したそれぞれの作業をワークパッケージと呼ぶ。スコープマネジメントではワークパッケージの作成を通して、さぎょの洗い出しを行っていく。
タイムマネジメント
スコープマネジメントにより、作業の洗い出しができたら、それぞれの業務を誰がいつまでに行うかを定めなければならない。作業の順番も考える必要がある。特定の人に作業が集中しないようにするために、ガントチャートを作成するとよい。

ガントチャートは具体的な作業内容を縦軸に、横軸に日付を入れて、各作業をどのようなスケジュールで実施するのかを図示したものである。このスケジュールに遅れないように作業を進めていこう。また、ガントチャートを作成することで、特定の学生に作業が集中していないかを確認することができる。
[6] Webページの構成
作成したプログラムを実施してもらうためには
- 目を引くようなページデザイン
 - 面白そうな(役に立ちそうな)プログラムの説明
 
がほしい。少なくとも以下の項目は書くようにしよう。また、ページのデザインは昨年までの自由課題のページを参考にしてみよう。
架空の自由課題のページも参考にしてみること。
- メンバー紹介:メンバーの名前や役割分担。各自のページ(1年生のときに作成したもの)へのハイパーリンク
 - 説明:プログラム名やプログラムの概要、保存方法、実行方法、遊び方、著作権の表記など
 - プログラム:プログラム自体も~/public_html/におき、ダウンロードできるようにする
 
プログラム名・プログラムの概要
何をするプログラムだかわからないままに実行する人はいない。何ができるのかというのはまさにプログラムの売りになる点である。ゲームであれば難易度が数段階に分かれていることが売りになるかもしれないし、実用的なプログラムでは細かな設定ができる点が売りになるかもしれない。淡々と機能を説明するのが良いのか楽しさを前面に出すのが良いのかは、作成するプログラムによって変わってくる。実際にプログラムを公開しているページを確認し、参考にしてみよう。
保存方法・実行方法
これまで、この授業を受けてきた人であれば詳しく説明しなくてもわかるため、これらは不要と感じるかもしれない。しかし、Webページにプログラムを掲載するということは、(学内のみに制限されているが)誰でも自由に閲覧することができる。プログラムを実行したことのない1年生が、2年生になるとどのようなプログラムを作ることが出来るのかを確認しているかもしれない。こうした点を踏まえ、誰でも保存して実行できるよう詳しく説明しておこう。
遊び方
実行しても、どのように操作をすればよいのかわからないプログラムでは、積極的に使ってみようとは思ってもらえない。プログラムを作成する際にprintメソッドなどで説明を盛り込むことも重要であるが、「遊び方」(取扱説明書)のページを作ることも考えるべきである。プログラム内に表示されるメッセージはその時しか見ることが出来ないが、Webページに記載しておけば、実行しながら随時確認することができる。懇切丁寧な説明は不要だが、最低限知っておいて欲しいことを書いておくとよい。
著作権
プログラムの著作権は作成者に帰属する。プログラムをダウンロードした人は著作権を取得できるわけではない。著作権を保有する作成者は、作成したプログラムについて改変(内容を書き換えること)や再配布(ダウンロードしたプログラムを第三者に配布すること)の可否、免責事項(このプログラムを使用して生じたいかなる損害に対しても作成者は責任を負わないというようなこと)などを定めることができる。現在では、OpenOfficeやFirefoxなど、プログラムのソースを公開し、誰でも改変、再配布が認められたオープンソースが普及してきている。今回作成するプログラムも営利を目的としたものではないため、改変や再配布など厳しく制限しないようにしよう。
ページのデザイン
背景と文字色のコントラストを考え読みづらくならないようにすること、文字を小さくしすぎないようにすること、重要な点を強調することなどに加えてページのデザインにもこだわってみよう。野暮ったいページであれば、読んでみようと思わないかもしれない。プログラムの中味だけでなく、Webページの見栄えでも勝負しよう。
[7] プレゼンテーションファイルの構成
14回目の授業では、作成したプログラムの発表会を行う。プレゼンテーションを上手に行うことは、出来栄えの良いプログラムを作るのと同じくらい重要である。いくら素晴らしいものが出来上がっていても、聞くに堪えない発表であれば、聞き手は話を聞かずに他のことを始めてしまうだろう。発表時間は10分間とするが、聞き手の10分間を無駄にすることがないよう時間を有効に活用しよう。
そのためには、行き当たりばったりで発表するのではなく、発表の流れを決めておく必要がある。また、単に口頭で発表するだけでは重要なところがわかりづらいし、音声情報は時間的に保存ができないので、聞き手がWebページに注意を向けた際に聞き逃してしまう可能性がある。プレゼンテーションソフトでスライドを作成しておくと、発表者は重要な点を言い忘れることなく発表することができ、聞き手は聞き逃してもスライドを確認して内容を把握することができる。
以下が発表内容になるだろうが、これらの項目の順番や内容は各グループで自由に決めてよい。社会に出れば大学卒の皆さんはプレゼンテーションをできることが当然だと思われる。「もう少ししっかり準備していればよかった」とならないよう、この機会を有効に活用しよう。
- チーム名の由来
 - メンバー紹介
 - プログラムの概要
 - プログラム作成理由
 - 使い方・遊び方
 - セールスポイント
 
[8] 乱数の発生(rand)
[9] 少し間を空ける(sleep)
[10] 時刻を取得する(Time.now)
[11] 大きな文字を出す(systemを用いたbannerコマンド)
[12] ポップアップで画像を表示(systemを用いたdisplayコマンド)
[13] 文字色変更・画面操作(\e[Xm)
[14] 配列に関するTips
[15] プログレスバーを作る
[16] 文字列操作
[17] プログラムからFirefoxを起動
Firefoxを起動する場合、ktermで以下のように入力する。
sime{c1xxxxx}% firefox &[Return]
Firefoxを起動して公益大のホームページを表示する場合は次のように入力する。
sime{c1xxxxx}% firefox http://www.koeki-u.ac.jp &[Return]
Rubyプログラムから直接Firefoxを起動するためにはsystemコマンドを使えばよいので、次のように書けばよい。
#!/usr/koeki/bin/ruby # -*- coding: utf-8 -*- system 'firefox http://www.koeki-u.ac.jp &'
[18] 出席課題
決定したグループのメンバー、グループ名、役割分担、プログラムの案など決まったところまでメールで報告する。
これに加えて、ガントチャートを作成し、各自が何の作業を行うのかを記入し、役割分担を明確にする。少なくとも来週までの1週間分について、ガントチャートを作成する。作業の分担に偏りがないように配慮する(何らかの事情で今週は忙しいということもあるので、自由課題期間全体で各自の作業のバランスが取れていればよい)。
授業終了時までに提出。出席点は2点。提出要領は下記の通り。
- 提出先:naoya@e.koeki-u.ac.jp
 - メールのSubject:ruby10
 - 本文の構成:1行目で学籍番号、氏名を記載する。2行目以降でメンバーの学籍番号と氏名を記載する。