%#DVIPDF dvipdfmx -f index.txt
\documentclass{jbook}
\addtolength{\topmargin}{-2cm}
\addtolength{\textheight}{4cm}
\addtolength{\textwidth}{2cm}
\addtolength{\oddsidemargin}{-1cm}
\addtolength{\evensidemargin}{-1cm}
%\usepackage{listings}
%\usepackage{graphicx}
\usepackage[dvipdfmx]{graphicx}
\usepackage{listings, jlisting}
\usepackage{ascmac}
\makeatletter
\def\maketitle{%
  \null
  \thispagestyle{empty}%
  \vfill
  \begin{center}\leavevmode
    \normalfont
    {\LARGE \@title\par}%
    \vskip 1cm
    {\Large \@author\par}%
    \vskip 1cm
    {\Large \@date\par}%
  \end{center}%
  \vfill
  \null
  \@thanks%\vfil\null
  \cleardoublepage
  }
\makeatother

\title{Ruby等を用いたプログラミング教室の手引}
\author{亀谷千香子}
\date{令和元年○月○日}



\usepackage{url}	% required for `\url' (yatex added)

\begin{document}
\maketitle

\tableofcontents



\chapter{手引作成の目的}

この手引の作成は平成30年度から東北公益文科大学(以下本学)の文部科学省「私立大学ブランディング事業」の1つで行った小学5、6年生向けプログラミング教室の「Rubyてらこった」の活動を基準としている。実際にRubyなどを用いたプログラミング教室を企画し、運営していくのに役立つ手引をとして利用してもらうことを目的としている。そのために、企画するうえでの計画の立て方、プログラミング教室を通して身につけてほしい力、小学生に教える範囲の決め方などを述べている。運営では、教えるために必要な役割、授業の準備、教えるための方法を述べている。また、\ref{teian}章ではRubyてらこったの活動をふまえての企画、運営を提案として1例を挙げている。




\chapter{プログラミング教室の企画}
プログラミング教室の企画では、主にプログラミング教室を行うために必要なこと、計画の立て方などについて明らかにしていく。必要なことについては活動をする人の知識や能力について述べている。計画の立て方では、役割の分担や日程、小学生に教える範囲の決め方について述べている。

\section{プログラミング教室の企画、運営を行うために必要なこと}

プログラミング教室の活動を行う時に必要で必要なこととして「知識」「教える能力」「発想力」「時間管理能力」「伝える力」4つが必要であるのではないかと考える。その理由としては、以下の通りである。



\section{知識}
 

本学では2年次に1年間必修科目の基礎プログラミングという必修科目でプログラミング言語のRubyを用いたプログラミングを学ぶ。1年間で学ぶ内容は以下の内容である\cite{naiyou}。プログラミング教室で実際に教える時は小学生の質問に対して分かりやすく教えることができるのが前提になっている。そのために、ただ内容を理解しているだけではなく、自分なりに考えて教えられる程度に理解していなければならない。

\begin{description}
\item[計算システムの基本操作と概念]\mbox{}\\ 
基本的なコマンド(コンピュータに特定の機能の実行を指示する命令)操作・Unix(osの一つ)について学ぶ。

\item[Rubyの基礎]\mbox{}\\ 
プログラミング言語のRubyについて・Rubyプログラミングの作成方法を学ぶ。

\item[変数・演算子・制御構造]\mbox{}\\ 
変数とは「値」を入れる「箱」のようなものである。変数を使い方学ぶ。

演算子ではRubyで加減乗除などの数値計算を行うための表現方法を学ぶ。

制御構造ではプログラムは通常上から下へ一直線に解釈実行される流れを変える方法を学ぶ。
\item[メソッド]\mbox{}\\ 
メソッドではあらかじめ決められた(複雑な)処理を行なってくれるものについて学ぶ。
\item[配列]\mbox{}\\ 
配列では複数の値をまとめて保持するもので多くのデータを処理する方法を学ぶ。
\item[パターンマッチング【正規表現】]\mbox{}\\ 
正規表現では検索するときに、そのデータに含まれている文字列のパターンを汎用的に指定する方法を学ぶ。
\item[ファイルの入出力]\mbox{}\\
ファイルの入出力ではRubyプログラム起動時に引数を何も指定しないと端末(キーボード)から、引数にファイルを指定した場合はそのファイルから1行ずつ内容を読み込む方法を学ぶ。
\item[計算機の内部構造]\mbox{}\\  
計算機の内部構造では2進数、16進数、文字コードについて学ぶ。
\item[ハッシュ]\mbox{}\\ 
ハッシュでは任意の値に任意の値を結び付ける方法を学ぶ。
\item[ハッシュと配列を組み合わせた繰り返し処理]\mbox{}\\ 
ハッシュと配列を組み合わせた繰り返し処理では多くの数のデータを配列を利用することで、多くのデータを処理することができる方法を学ぶ。
\item[再帰]\mbox{}\\ 
再帰ではハノイの塔のような再帰処理の方法を学ぶ。
 
\item[CGI]\mbox{}\\ 
CGIではHTML文書内にあるデータ入力窓とそれらを受け渡すスクリプト名を書いておき、ボタンを押すとそのスクリプトに入力値が渡るようなしくみを学ぶ。

\end{description}
 \section{教える能力}

 小学生の一人一人理解している部分、キーボードの操作の速度などが違うため、それぞれに合わせて教える必要がある。小学生とコミュニケーションを取りながら分かりやすく教えることは難しいことである。Rubyてらこったに参加している学生は、小学生と関わること、教えることが比較的に得意な学生を優先的に募集した。例えば、教職課程を履修している学生、学習支援サークルとして小中学生に学習を教えている学生、2年次の必修の基礎プログラミングのティーチングアシスタント(以下TA)をしている学生などである。

\section{発想力}

発想力では、どうしたら小学生がプログラムを楽しく、分かりやすく学んでもらうことができるのかをイメージしてアイディアを出す必要がある。例えば、誰かが授業で使う資料を見せてきた時にこうしたらもっと良くなるなど意見を1つ出すだけでも分かりやすさというのが変わってくる。また、小学生の質問に対してどうしたら分かりやすく伝わるかなど考える必要がある。

\section{時間管理能力}

業務で割り振られたものを完璧に締め切りまでで完成させるためには、どのくらいの準備時間がかかるのかというこを意識しなければならない。締め切りで提出すればいいという意識で作業をすると良い物ができない。そのために、ただ作業をするのではなく、他のメンバーから確認してもらい改善、修正する時間を作るということが必要になってくる。作成物の修正の時間のことを考えて余裕をもって作成をしなければならなので逆算をして物事を考えてくる必要がある。また、作業以外にも他にしなければならないことがあると考えられるため時間の管理というのを意識していくことが大切になる。
 
\section{伝える力}

ここで使う伝える力とは、正確に相手に伝えるということを意味している。どの業務も自分一人だけで作業できることは少ない。そのため、メンバーで協力、分担しながら作業を進めていくことのほうが多い。そのためどの作業がどこまでできているのかなど具体的にメンバーに伝えるということは大切である。




\section{プログラミング教室を行う目的と参加した小学生に身につけたい力}
プログラミング教室を行う目的とプログラミング教室を通して身につけたい力について述べていく。

\subsection{Rubyてらこったと活動の目的}
昨年度から大学のブランディング事業の一つの地域資源を活用する人材育成の研究としてプログラミング言語のRubyを用いたプログラミング教室の企画・運営を行ってきている\cite{terakotta}。目的は、庄内地方を中心とした地域の若者達に情報技術を教え、情報社会を生き抜くために必要な力を身につけていくことである。小学生のうちからプログラミング言語Rubyを用いた本格的なプログラミングを学ぶ機会を提供したいと考えているためである。小学生でも対象は小学5、6年生にした。その理由としては、キーボード入力、操作の関係からアルファベットを習い終わっている方が良いと考えたためである。

授業は全5回行い大学生が教える。また、小学生1人に対して大学生が1人でサポートできるような体制になっている。授業内容は比較的に簡単な内容であり、授業を通して簡単なゲームプログラムを作成できるように内容を組み立てた。

\subsection{授業を通して身につけたい力}
小学生のプログラミング教育で身につけたい力として「知識及び技能」、「思考力、判断力、表現力等」、「学びに向かう力、人間性等」が述べられている\cite{terakotta}。
その3つの力に追加してRubyてらこったで身につけてほしい力についても述べる。

\begin{description}
 \item[知識及び技能]\mbox{}\\ 
生活でコンピュータが活用されていくことや、問題の解決には必要な手順があること
 \item[思考力、判断力、表現力等]\mbox{}\\
発達の段階に即してプログラミング的思考力を育成すること
 \item[学びに向かう力、人間性等]\mbox{}\\
発達段階に即して、コンピュータの働き、よりよい人生や社会づくりに生かそうとする態度を涵養すること


\end{description}
この項目に加えRubyてらこったで身につけたい力は以下の通りである。
\begin{description}

 \item[工夫する力]\mbox{}\\
授業で使うサンプルのプログラムを自分で考えて、工夫をして、他の人とは違うプログラムをつくれるようになること
 \item[伝える力]\mbox{}\\ 
伝える力としては、2つの意味がある。1つ目は、自分の作成したプログラムの発表を通して工夫し点、頑張った点など伝えられるようになれること

2つ目は、周りの人が作成したプログラムの発表を聞いて感想など伝えられるようになること


\end{description}

\subsection{教える範囲}
教える範囲としては小学生が比較的に理解しやすいところであり、例えばクイズ、くじ引きのゲームを自分の力で考えられるようにするために必要なものを教える範囲とした。
\begin{description}
 \item[出力メソッド (print, printf, puts)]\mbox{}\\ 
アスキーアートのように入力したものをそのまま出力させるために必要と判断した。

\item[文章処理メソッド(gets, chomp)]\mbox{}\\
キーボードに打ち込んだ値を文字列として取得するゲームプログラミングを作るときに必要と判断した。

\item[制御構造(while, if, elsif, else)]\mbox{}\\
レジスタープログラムなどの入力したものを繰り返しの処理を行うときに必要と判断した。
また、クイズの結果の判定や条件で繰り返しを行うために使うため必要であると判断した。
 \item[配列及び乱数(srand, rand)]\mbox{}\\
2つを組み合わせてクイズ問題を用意して乱数で選ばせたり、ジャンケンの手の内をランダムに出したりするために使うので必要と判断した。

 \item[sleep関数(sleep)]\mbox{}\\
プログラムを時間を指定して一時停止することができるので小学生が楽しむことができるのではないかと判断した。


\end{description}



\section{授業・日程}
小学生に教える順番、授業時間の設定、開催日時について述べる。

\subsection{教える順番と教える時間}
基本的な操作から徐々に難しい内容になるよう教える順番を設定している。また、5回目で自由に作成し、発表できるようなプログラムを作成できるように組み立てた。

教える時間は1回の授業で2時間としている。小学生が集中して授業ができるように大体45分から50分ぐらい授業をしたら約15分位の長めの休憩を入れるようにした。
\begin{table}[h]
  \begin{center}

    \caption{授業内容}

    \begin{tabular}{|l|l|l|} \hline
         アイテム &内容&作成プログラム  \\ \hline \hline
      1回目 & 基本操作& 画面出力  自己紹介プログラム \\
      2回目 & ループ  &繰り返し処理のプログラム \\
      3回目 & 配列  &データ処理のプログラム  \\
      4回目 & 条件分岐 &条件のあるプログラム  \\
      5回目 & まとめ &習ったことを応用してプログラムを作成  \\ \hline
    \end{tabular}
  
  \label{tab:price}
  \end{center}
\end{table}




\subsection{各小学校のとの調整}
地域の小学生に参加してもらうために各小学校に資料を配布する。資料には、何をするのか、日程、問い合わせ先、申し込み方法などの内容をまとめる。資料配布では教育委員会、小学校に開催するプログラミング教室の内容日程など説明する。
\subsection{開催日程}

小学生がプログラミング教室に参加しやすくするために学校が基本休みである土曜日、日曜日に開催日程を設定した。また、全5回の授業に参加してほしいことから学校行事の地区運動会、習い事の大会などが被らないように開始日を決めた。


\chapter{運営}
企画した内容を実際にどのような流れで運営していくのかを運営方法、必要な道具、授業準備の点から述べていく。


\section{運営方法}
運営では、主な役割、業務内容、ミーティング方法について述べる。

\subsection{役割関係の明確化}
活動をする時に、スムーズに作業ができるように役割を明確にする必要がある。Rubyてらこったでの主な役割は図\ref{sosiki}の中で説明する。

\begin{figure}[h]
  \begin{center}
 \includegraphics[width=8cm]{sosiki.pdf}
\caption{役割}
\label{sosiki} 
 \end{center}

\end{figure}

\begin{description}
 \item[リーダー]\mbox{}\\
リーダーの役割は全体的に計画、作業の進行状況などを把握、ミーティングを仕切ることをする。全体の計画では、いつまでに何をするのかを明確にする。明確にしたらグループ全員で内容を吟味する時間、内容修正する時間などを含め逆算し、作業の締め切りを決める。その時に、締め切りを決めてそのままにするのではなく作成を頼んだ人に対して、締め切りの何日か前に中間成果物を見せてもらうようにするなどして作業の進み具合を把握する。


   ミーティングミーティングを仕切るときは何を話し合うのか決めておき、あらかじめメンバーに伝える。作成した成果物に対して全員からどうしたらもっと良くなるのかを意見をもらう時間にする。修正したものをいつまでに共有するか決める。また、業務の割り振りなどもする。業務の割り振りでは、メンバーの話を聞き、それをふまえて的確に割り振る必要がある。ミーティングの流れは図\ref{jyunbi}で説明する。

\begin{figure}[h]
  \begin{center}
 \includegraphics[width=10cm]{jyunbi.pdf}
\caption{ミーティング方法}
\label{jyunbi} 
 \end{center}

\end{figure}
  \item[授業担当]\mbox{}\\
業務は以下のようなものがある。
\begin{itemize}
\item 教材作成

担当の授業で使用する教材を作成する。教材としては、スライド、サンプルプログラムなどである。詳しくは\ref{jyugyo}で述べる
\item 模擬授業

実際の授業を想定し、タイムテーブルを確認しながら行う。自分では分かりやすく教えているつもりでも相手には分かりにくい部分などは気づきにくいので、多くの人から意見をもらう機会を作る
\item 授業

小学生の様子(操作はできているか、指示が伝わっているか)を見ながら分かりやすく丁寧にを意識して授業を行う

\end{itemize}
 \item[各授業のアシスタント]\mbox{}\\ 
小学生一人に対して一人のアシスタントをつける。業務は以下の内容である。
\begin{itemize}
\item 小学生が分からない所の説明

授業の内容が難しかったり、分からなかった場合ににサポートしている小学生に合わせて教えることをする

\item 操作の補助

キーボード操作が遅い場合がある。その時に、キーボードの位置を教えたり、コマンドを教えたりする
\end{itemize}


 \item[タイムキーパー]\mbox{}\\ 
タイムキーパーは、各授業のタイムテーブルに合わせて授業担当者に時間を伝える。そのため、授業の進み具合など確認して授業が円滑に進むようにサポートする。時間に余裕がある時は、プログラム作成の時間や発表時間などにするなど休憩中に打ち合わせする。反対に、時間が思ったよりも足りない時は、変更する部分など提案してなるべく時間内で授業が終わるように考えて動く必要がある。

 \item[連絡係]\mbox{}\\ 
連絡係は参加する保護者の方にメールで連絡を取ることをする。はじめに送ったメールに対して返信してもらい連絡が取れることを確認する。にメールで連絡をするので誰が読んでも正確に伝わる内容を速くお知らせすることを意識して業務をする必要がある。また、メールで質問が来た時も対応をする。

\end{description}


\section{必要な道具}
授業で使う道具は以下のようなものを用意した。

\begin{table}[h]
  \begin{center}

    \caption{必要な道具一覧}

    \begin{tabular}{|l|l|} \hline
      アイテム &用途  \\ \hline \hline
      パソコン & 小学生の操作用、授業用、スライド用のため使用 \\
      USB & 作成したプログラムを記録するため使用   \\
      教科書 & 授業の内容を確認すため使用 \\
      ノート & 必要なことを書くために使用 \\
      ホワイトボード & プログラムを作成する前に使用 \\
     マグネット & プログラムの作成する前に使用 \\
      アルファベット対応表 & キーボードのアルファベットを確認のため使用 \\ \hline
    \end{tabular}
  
  \label{tab:price}
  \end{center}
\end{table}

\subsection{パソコン}
パソコンは小学生用、授業用、スライド用の3種類使用した。小学生用と授業用のOSはNetBSDである。
NetBSDとはオープンソースのオペレーティングシステムである。
\begin{itemize}
\item 小学生用

授業中のプログラムを作成、Webページからプログラムをダウンロードするために使用
\item 授業用

小学生の使用しているパソコンと同じであるためどのように操作するのか小学生に分かりやすくするため使用

\item スライド用

スライド用を用意することで画面の切り替えすることができるためスムーズに内容の説明ができる

\end{itemize}


\subsection{USBメモリ}
今回は16GB以上の容量を持つ高速なメモリにOSと教材に使用するソフトウェア一式をインストールし、USBメモリから起動して授業用環境として使用できるようにした。

\subsection{教科書}
授業内容に合わせて、学生らで作成した。オリジナルのイラストや分かりやすい図などを取り入れ、興味が沸くような内容にすることを心がけた。また、語句の説明なども小学生でも分かるようにした。内容は以下のようなものである。


\begin{description}
 \item[プログラミングとは]\mbox{}\\ 
プログラミングとは何か、Rubyとは何かを説明する

 \item[ファイル、ディレクトリ]\mbox{}\\
ファイルとディレクトリの説明をする

小学生でも分かるようにファイルは、絵を書く時の紙でディレクトリは紙をしまっておく場所というようにした

 \item[print, puts, getsについて]\mbox{}\\ 
画面出力の方法、キーボードから入力させる方法をまとめた
 \item[whileについて]\mbox{}\\ 
ループについて学ぶ
 \item[配列、乱数]\mbox{}\\ 
配列を使ってランダムに取り出す方法をまとめた
 \item[if, elsif, elseについて]\mbox{}\\ 
条件分岐をさせる方法、if, elsif, elseの違いについて図を用いて分かりやすくした
 \item[プログラムを工夫するためのメソッドについて]\mbox{}\\ 
プログラムを出力させるときに文字が変化したり、時間をおいて表示させたりするものをまとめた
 \item[コマンド集]\mbox{}\\ 
プログラムの作成時などに覚えておくと便利なコマンドをまとめて書いておき、分からない時にすぐに確認できるようにした
\end{description}






\subsection{ノート}
初回の授業で配布し、小学生が学んだことや気づいたこと、ポイントなどをこまめに書き込めるように用意した。授業内では、ノートに書く場面があれば先
生が指示を促し小学生がノートを書く時間を設けた。


\subsection{ホワイトボード}
ホワイトボードにプログラムを書いてから PC
にプログラムを打ち込んだ方がわかりやすいと
考え、用意した。また、小学生がホワイトボー
ドに書きながらプログラムを組んで行くことで
理解を深める目的で使った。
\subsection{マグネット}
その授業の内容で勉強する新しいことや大切な
ものをマグネットにした。それらを貼るだけで
よいようにし、記憶しやすくするために作った。
これらを授業内でホワイトボードに貼りながら
作業を進めていった。例を挙げると、
「 while 」と
「 end 」などのセットで扱うものに関しては、セッ
トで先にマグネットをホワイトボードに貼り付
けてからプログラムを組み立てるなどの工夫を
した。あらかじめ用意されているものを使用し
たため、間違いの減少や作業時間の削減にも繋
がった。

\subsection{アルファベット対応表}
小学5、6年生はアルファベットを習い終えているが大文字小文字を理解するために作成し配布した。キーボードでは大文字表記になっているため「 l( エル ) 」と「 i( アイ ) 」や「 h( エイチ ) 」と「 n( エヌ ) 」などが間違いやすかった。




\section{授業準備}\label{jyugyo}
授業の準備では授業を行うまでの流れを述べていく。

\subsection{内容の吟味}
%\begin{itemize}
% \item 1回分の内容確認
% \item プログラムを楽しくするような工夫

%\end{itemize}
授業での内容をミーティングなどで話し合い内容を確認する。教える内容では、小学生でも分かりやすく学ぶことができるものを中心にしている。そのため、小学生にとって内容が難しすぎないか、変数などのイメージ図はどうするかなど話し合う。1回分の授業で教える内容が多くなり過ぎないか、教えるプログラムは分かりやすいか、プログラム作成の時間が十分に取れるかなどを考える。教える内容が多くなりすぎないかという基準については模擬授業をしてみたり、各授業での小学生の理解度を見たりして内容を決めた。プログラムについては\ref{puro}で述べる。


\subsection{教える体制}
授業の担当者1人、タイムキーパーが1人、授業アシスタントは参加する小学生の人数と同じようになるような体制にした。1対1で教える体制にしたのは、授業に追いつけない部分をサポートできるようにするためである。授業が進む速度に対して、小学生が理解する速度に差が発生することがあった。その際には、随時授業の合間に時間をとり、小学生が理解する速度に合わせて授業を展開していく形を心がけた。

\subsection{使うプログラム}\label{puro}

授業用サンプルのプログラムは授業の内容のポイントを抑えたものにした。
\subsection{1回目のプログラム}
画面出力のprint,putsを使ったプログラムを作成している。このプログラムでは、printとputsの違いを理解してもらうために両方使用した。画面に出力される””部分の文字を変更する。速く操作ができる小学生にはprintまたはputを増やして好きな文字を書き込ませて変えるようにした。

%\begin{lstlisting}[basicstyle=\ttfamily\footnotesize, frame=single]
 %\begin{screen}
\begin{lstlisting}[basicstyle=\ttfamily\footnotesize, frame=single]
#!/usr/koeki/bin/ruby
# -*- coding: utf-8 -*-

print "名前\n"
print "学校名\n"
puts "好きな食べ物"
puts "好きな動物"
 \end{lstlisting}
 %\end{screen}
\subsection{2回目のプログラム}
変数、whileのループをつかったプログラムをしている。gets.chompを最初に追加して所持金を入力させたり、最後の合計に1.08をかけて消費税込みの金額をだしたりなど変えることができる。

%\begin{lstlisting}[basicstyle=\ttfamily\footnotesize, frame=single]
\begin{lstlisting}[basicstyle=\ttfamily\footnotesize, frame=single]
#!/usr/bin/env ruby
# -*- coding: utf-8 -*-

puts "スーパーのレジ買ったものの値段を入れてね。(100 円→100 と入力しよう)"
memo = 0

while true
print "値段は? (終わりたい時は q を押してね)"
nedan = gets.chomp

if nedan == "q"
break
end

memo += nedan.to_i
printf("今の合計は %d 円だよ \n",memo)
end
printf("今回の合計は %d 円です。お買い上げありがとうございました! \n",memo)
%\end{verbatim}
 \end{lstlisting}
\subsection{3回目のプログラム}
配列と乱数を組み込んだプログラムをサンプルにした。この配列の部分をグー、チョキ、パーに変えるとジャンケンプログラムに変えることができる。
%\begin{verbatim}
%\begin{lstlisting}[basicstyle=\ttfamily\footnotesize, frame=single]
\begin{lstlisting}[basicstyle=\ttfamily\footnotesize, frame=single]
#!/usr/bin/env ruby
# -*- coding: utf-8 -*-

kuji = ["1等","2等","3等","4等","ハズレ"]
print("なにがでるかな〜？")

puts("....")

sleep(1)
srand()
nani =rand(5)
printf("あなたは%sでした！\n",kuji[nani])
%\end{verbatim}
 \end{lstlisting}
\subsection{1回目のプログラム}
条件分岐のifをつかいクイズプログラムをサンプルにした。クイズの問題文を変えるだけではなく選択肢を増やしたり、回答によって違うものを画面出力できるように変えることができる。
%\begin{verbatim}
%\begin{lstlisting}[basicstyle=\ttfamily\footnotesize, frame=single]
\begin{lstlisting}[basicstyle=\ttfamily\footnotesize, frame=single]
#!/uer/bin/env ruby
# coding: utf-8

puts"今の元号はなんでしょうか？"

puts"1:平成"
puts"2:令和"
puts"3:昭和"

print"答えを入力:"
kotae = gets.to_i

sleep(1)

if kotae == 1 then
  puts"惜しい！ハズレだよ！"
elsif kotae == 2 then
  puts"正解だよ！読み方はわかるかな？？"
elsif kotae == 3 then
  puts"ザンネン！ハズレだよ！"
else
  puts"その番号はないよ！！"
end
%\end{verbatim}
 \end{lstlisting}
\subsection{5回目のプログラム}
今まで学んだことをいれたプログラムをサンプルにした。
%\begin{verbatim}
%\begin{lstlisting}[basicstyle=\ttfamily\footnotesize, frame=single]
\begin{lstlisting}[basicstyle=\ttfamily\footnotesize, frame=single]
#!/usr/bin/env ruby

puts"コンピュータとじゃんけんをしよう!"
puts"5回中3回勝てればクリアだよ!"
sleep(3)
puts""
print"それじゃ GAME START\n"
puts""

win = 0
kaisuu = 1
janken = ["だしてないよー", "グー", "チョキ", "パー"]

while kaisuu <= 5
  sleep(2)
  puts""
  printf("%d回目!(あなたの勝利数:%d)\n", kaisuu, win)
  puts""
  print"じゃんけん!(グーなら「1」チョキなら「2」パーなら「3」を押してね): "
  while true
    you = gets.to_i
    if you >= 4
        you = 0
    end
    com = rand(3) + 1
    printf("ぽん!(あなたは「%s」でコンピュータは「%s」)\n", 
 janken[you], janken[com])
    sleep(1)
    if (you==1&&com==2) || (you==2&&com==3) || (you==3&&com==1)
      puts"あなたの勝ち!"
      win += 1
      kaisuu += 1
      break
    elsif (you==1&&com==3) || (you==2&&com==1) || (you==3&&com==2)
      puts"あなたの負け!"
      kaisuu += 1
      break
    elsif you == com
      print"あいこで(グーなら「1」チョキなら「2」パーなら「3」を押してね): "
      redo
    else
      puts"なにもだしてないからあなたの負け!"
      kaisuu += 1
      break
    end
  end
end

sleep(3)
printf("あなたの勝利数は「%d 回」\n", win)
sleep(3)

if win >= 3
  puts"おめでとう!"
  sleep(2)
  puts"+-------------------------------------------------+"
  system 'banner YOU WIN!!'
  puts"+-------------------------------------------------+"
else
  puts"残念..."
  sleep(2)
  puts"+------------------------------------------------+\n"
  system 'banner GAME OVER'
  puts"+------------------------------------------------+\n"
end
 \end{lstlisting}



\subsection{スライド}
授業で使うスライドはあくまでも授業の副教材であることを意識する。スライドに書く内容は図、重要な部分だけにする。するとポイントなどが小学生にも分かりやすく伝えることができる。
%\begin{itemize}
% \item 文字を少なく
% \item イメージ図をいれる

%\end{itemize}
\subsection{模擬授業}

模擬授業では授業担当者が実際の授業を想定して行う。主に見るポイントとして以下のようなものを確認する
\begin{itemize}
 \item 教え方が分かりやすいか(プログラムの説明など)
 \item ノートを取る部分の確認
 \item スライドが見やすいか(スライドの配色、文字が多すぎないか)
 \item 時間配分(プログラムの作成時間があるか、時間が無くなったらどこを省いて説明するか)
\end{itemize}
\subsection{他の機関との調整}
資料配布のために募集期間、締め切りなどの時間を考える。日程が決まったら大学から教育委員会に連絡をとり、教育委員会から各小学校に資料を配布してもらった。その後に各小学校の先生から小学生に資料を配布してもらった。
\chapter{授業をするための方法}
授業では当日の準備作業、授業の流れ、プログラムの発表方法について述べていく。

\section{当日の準備・確認事項}
当日は、授業がスムーズに進めることができるように授業が始まる1時間ぐらい早く集合し準備する。まず、備品のホワイトボード、ペン、マグネット、パソコンの設置などをする。パソコンの設置では、ネットワークが繋がるかを試す。その後、授業のおおまかな流れを確認する。

\section{授業の流れ}
授業の流れは以下の通りである。
\begin{enumerate}
 \item 前回の授業の復習

前回の授業で学んだ内容のポイントを復習する。
 \item タイピング練習 

タイピング練習では、授業で使う英単語を3回ずつ練習する時間をとる。例えば、1回目の授業であれば、print, putsなどである。速く入力が終わった人には、5回など入力する回数を増やすようにした。
\item 内容の説明

内容の説明では、授業で新しく学ぶことを説明する。重要なポイントは、メモをとる時間を作る。
 \item サンプルプログラム

サンプルプログラムは、新しく学ぶ内容を使う。最初にどのようなプログラムなのか実行させる時間にする。
 \item サンプルプログラムの説明

4のサンプルプログラムがどうしてそのような動きをするのか説明する時間をつくる。
 \item 休憩

長めの休憩をとる。休憩の間には、小学校の話し、習い事、趣味など小学生とコミュニケーションを取る。
 \item プログラム作成

プログラムの作成では、学んだ内容を使い自分で考えて作成してもらう。作成の時は、ホワイトボードにマグネットを貼ったり、ペンで書いたりしてからパソコンに入力する。イメージ通りにプログラムが作れない時は、アシスタントがサポート、説明をする。サポート、説明で重要なのは、考えてもらい理解してもらうということだ。

\includegraphics{jisyaku.jpg}



 \item 作成したプログラム発表

作成したプログラムは、発表する時間をつくる。発表方法はみんなの前で作成したプログラムを実行し発表する方法と他の人が作成したプログラムを実行してみる方法の2つである。
次の\ref{happyou}で詳しく述べる。
\end{enumerate}

\section{プログラム発表について}\label{happyou}
授業で作成したプログラムを発表する機会を設けた。その理由としては、自分の作成したものを発表し伝える力を身につけること、他の人の発表、プログラムの良さなどを考えることをしたいと考えたからである。
授業で行った発表方法は2つある。その方法は以下の通りである。

\begin{description}
 \item[みんなの前で発表する]\mbox{}\\
みんなの前で発表する。最初に作成したプログラムの難しかった点、頑張った所など話してもらう。プロジェクターに映し、作成プログラム実行をして発表する方法である。発表する時に何を話せばいいのか困ってしまう小学生もいるのであらかじめ話してほしい項目を提示すると困った様子が見られなかった。
 \item[他の人のプログラムを実行する]\mbox{}\\
他の人のプログラムを実行して作品を見る方法では、実際に実行できるので工夫している部分など気づくことが多い。実行してみた感想などお互いに伝えることができる。

\end{description}

\section{授業後のミーティング}
授業後に約30分ほどのミーティングをする。まずはじめに、授業の担当者から良かった点、悪かった点を先に話してもらう。悪かった点についてはメンバーから改善策、意見をもらう。そのあとに、授業のアシスタントから参加した小学生の様子、理解度についての意見をもらう。その後に次回までの授業の改善点、対応策、準備しなければならないことなどを話し合う。

\chapter{授業を受講した小学生の感想}
1回目から5回目まで授業後にアンケート(授業で楽しかったこと、難しかったこと)をとった。以下の表はそのまとめである。

\begin{table}[h]
  \begin{center}

    \caption{楽しかったこと}

    \begin{tabular}{|l|l|} \hline
      回数 & 内容  \\ \hline \hline
      1回目 & パソコンの操作、コマンド操作、自己紹介プログラムを発表したこと、大学生と話しをしたこと \\ \hline
      2回目 & キーボードの操作、みんなが作成したプログラムを実行すること、大学生と話をしたこと \\ \hline
      3回目 & みんなが作成したプログラムを実行すること \\ \hline
      4回目 & プログラムの作成、大学生と話しをしたこと  \\ \hline
      5回目 & オリジナルのプログラムを作成したこと  \\ \hline
    \end{tabular}
  
  \label{tab:price}
  \end{center}
\end{table}


\begin{table}[h]
  \begin{center}

    \caption{難しかったこと}

    \begin{tabular}{|l|l|} \hline
      回数 & 内容  \\ \hline \hline
      1回目 & パソコンの操作、自己紹介 \\ \hline
      2回目 &  break、ループが難しかった、プログラムを改造すること\\ \hline
      3回目 & 乱数をでランダムに取り出すこと、自由にプログラミングを作ること\\ \hline
      4回目 & if,elsif,eleseの使い方が難しかった、プログラムを改造すること \\ \hline
      5回目 & 変数が多くなりすぎて難しかった、オリジナルのプログラムを作成すること \\ \hline
    \end{tabular}
  
  \label{tab:price}
  \end{center}
\end{table}


\section{楽しいと感じる部分}
楽しいと感じた部分として発表が楽しかったという意見が多かった。発表を聞き、他の参加者のプログラムを動かしてみるのが新たな発見があり楽しかったのだと考える。

また、大学生と話しをするのが楽しかったという意見があった。プログラムを作成する時間や休憩の時間など多くの場面で話す機会があったのは良かったと考える。
\section{難しいと感じる部分}

操作の部分ではキーボードの操作が難しいと感想に書いていた。パソコンをあまり使わない小学生にとってキーボードを使い入力するには、どこに入力したい文字、数字があるのか探しながら打つので思ったよりも時間がかかるため難しく感じたのだと考える。

プログラムの内容では変数の部分が難しかったという感想が多かった。2回目から5回目にかけて難しいプログラムを作成していくとに、変数が徐々に増えていく。そのため、何をどの変数にしたか確認しながらプログラムを作成するため難しく感じたのだと考える。

\section{参加した小学生が作成したプログラム}
全5回の授業を通し学んだこと使用して小学生が作成したプログラムは以下のようなものである。このプログラムはlatterという配列の中に入っている"グラードン","カイオーガ","レシラム","キュレム"の4つをどのくらいの時間で入力できるかというプログラムである。
%\begin{verbatim}
%\begin{lstlisting}[basicstyle=\ttfamily\footnotesize, frame=single]
\begin{lstlisting}[basicstyle=\ttfamily\footnotesize, frame=single]
#!/usr/koeki/bin/ruby
# -*- coding:utf-8 -*-

letter = ["グラードン","カイオーガ","レシラム","キュレム"]

print("どれだけ早くポケモンを打てるかな\t")
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)
%\end{verbatim}
 \end{lstlisting}
\chapter{教えるための要点}
この章では主に実際に小学生にプログラミングを教えるための注意点をまとめている。
\section{教える上で注意すること}
授業担当者と授業アシスタントの両方の視点から述べていく。
\subsection{授業担当者}

授業担当者は、小学生に教えるということで内容を噛み砕いて教えることが重要になってくる。授業は基本的に操作など全員一緒に進んでいくため常に小学生の顔を見るようにする。すると操作が終わっているのか、まだ作業の途中なのかなど確認することができる。進み具合をみて、かなり遅れている場合はアシスタントに頼んでサポートしてもらう。授業中は、ただ話すのではなく、常に問いかけたり、手を上げてもらったりと反応を見るようにする。話を聞く、ノートを取る、ホワイトボードに書き込む、プログラムを作成するなど指示をしっかり出して、何をするのか明確にすることが大切である。
\subsection{授業アシスタント者}

授業アシスタント者は操作、授業で理解できなかった部分の説明など個人に合わせてサポートしていく。教える小学生に対して目線を合わせて教えていくことが大切である。難しい内容でも分かりやすい言葉を使って教える。プログラム作成の時は、全てサポートするのではなく考えてもらう時間を大切にしていく必要がある。操作が遅くて焦ってしまう小学生がいた場合は、声をかけて、ゆっくりでも大丈夫なことを伝えて、確実に操作してもらうようにする。
\subsection{小学生の理解度に合わせる}
一人一人授業の内容の理解度、操作速度などは違う。そのため一人ひとりに合わせた教え方をしなければならない。
\begin{itemize}
 \item 理解が早い小学生

理解が早い小学生には、サンプルのプログラムを改造してもらうということをして何もしていない時間をなくすようにした。最初にどの部分を変えると良いのかヒントを出しながら少しずつ教えていった。
\item 操作が遅い小学生

操作が遅いと追いついていかなければと焦ってしまう小学生がいる。そのときは、どこまでできているのか確認し、話しかけながら操作のサポートをする必要がある。
\end{itemize}

\section{その他}
その他として授業が計画通りにいかなかった場合、参加者が来れなくなった場合、パソコンが調子悪くなった場合の対応を述べる。
\subsection{授業の内容が予定より進まなかった場合}

どこのを中心に教えるのかということを考える。説明に時間がかかりすぎてしまったときは、次の授業でどのぐらいの時間で説明するかのと打ち合わせをして教える範囲を全て5回で終わらせるようにする。
\subsection{参加者が来れなくなった場合}

全5回の授業で1つどこかの回の授業に参加できなかった場合は次回の授業の30分前に来てもらい簡単な授業を受けてもらい、その後次の授業に参加してもらった。すると、次の授業においていかれることなく参加してもらうことができた。

\subsection{利用しているパソコンの調子が悪くなった時}
インターネットを使いWebページを見る時に無線lANではうまく繋がらない場合があった。そのときは、有線で接続をした。次の授業からは予備のパソコンを使い対応をした。


\chapter{実際に行うための一例}\label{teian}
Rubyてらこったの活動のを通して良かった部分、悪かった部分があった。そのことを踏まえて企画、運営を円滑に行うための提案をする。プログラミング教室を企画から開催するまでの大まかな流れ、内容をまとめる。詳しい部分は前の章を参考にすると良い。

\section{企画}
企画ではこのような流れで役割、教える範囲などを決めた。
\begin{enumerate}
 \item 活動するメンバーを集める

活動をするにあたってどのようなメンバーが必要か考え集める。

 \item 役割を決める1

役割では、リーダーや必要な業務の責任者を決める
 \item プログラム教室の目的を明確にする

プログラミング教室を通して小学生に何を学んで欲しいのか、身につけた力などを考える。

 \item 教える範囲を決める

教える範囲は小学生でも理解しやすい内容、最終的に小学生にどのようなプログラムを自分で考え作成できるようになってもらうのかを決める。
 \item 役割を決める2

各回の授業担当者とアシスタントなどを決める
\item 授業のについて決める

教える範囲をどの順番で教えていくか考える。それぞれの授業で教えるイメージ図についてなどを決める。
 \item 日程について決める

日程は全5回の授業であるため小学生が参加しやすい日程を考えて組み立てる。
 \item 資料の配布について決める
資料を作成したら配布する範囲、方法など決める。

\end{enumerate}

\section{運営}

運営の流れは以下の通りである。
\begin{enumerate}
 \item 役割決め

運営が始まると外部の人と連絡が取ることが多くなるため連絡をして日程調整などをする役割が必要になってくる。

 \item 必要な道具の決定

授業をするときにパソコン以外にもどのような道具があったら良いか考え作成をする。Rubyてらこったの場合は、プログラムを作成前にホワイトボードにプログラムを書いてもらうことでプログラムを作成するときのミスを防ぐように工夫した。

 \item 教える体制を決める

小学生の分かりやすく教えるための体制(アシスタントの人数など)を決める。

 \item 内容の吟味

内容の吟味では授業担当者が考えてきた授業の構成、教える内容、タイムテーブルなどを話し合い決める。

 \item サンプルプログラムを決める

サンプルプログラムは、学ぶ内容を含み改造しやすいものにする。
\item 模擬授業

模擬授業では、実際の授業を想定して、作成したタイムテーブルをもとに授業をする。小学生役の人が授業を体験し改善点などの意見を出しあう。模擬授業は上手くいくまで何回も繰り返す。
 



\end{enumerate}


\section{広報関係提案}
広報関係では大学から教育員会に資料を持っていた。その後教育委員会から各小学校へポスターを配布した。ポスターには以下のような内容をまとめる。
\begin{itemize}
\item 内容

何をするのか分かるような説明
\item プログラミングとは何か

プログラミングが分からない場合があるのか説明
\item 日程

いつから開催なのか、授業回数
\item 参加条件

誰を対象としているのか
\item 時間

授業は何時から何時までなのか
\item 場所

どこで開催するのか、地図などがあると分かりやすい
\item 問い合わせ先

問い合わせしたい時のメールアドレス
\item 申し込み方法

どの手段で申し込みをすればいいのか
\item 申し込み締め切り

いつまで申し込みをすればいいのか

\end{itemize}

\section{ミーティング}
ミーティングでは情報共有が大切になってくる。ミーティングで何かをはじめて準備するのでなはく、あらかじめ作成したものに意見をもらったり改善策を練ったりと全員で決めたり話すことだけに絞ることで効率的に進めることができる。

\section{申し込み方法の提案}

申し込み方法で情報、確認が確実なのは、申し込みをWebで行い、参加者が決定
後に電話でやり取りするのが良い方法だと考える。その理由としては、Webでお
fこなうことで必要な情報を残すことができる。また、参加する人に電話をするこ
とでWeb申し込みの内容を直接確認することができ、迅速かつ臨機応変に対応でき
るからである。


\section{授業}
授業では、分かりやすく丁寧ということを意識する。小学生の反応、操作の進み具合などを確認して教える速度を調整する。アシスタントは、小学生が途中で困らないように声をかけながらサポートする。

\section{授業後のミーティング}
授業後のミーティングは、授業担当者、アシスタント、タイムキーパーなど全員が授業を振り返る時間にする。悪かった部分に対しては、改善策を考えるようにする。
\begin{thebibliography}{99}
    \bibitem{naiyou} 広瀬雄二.「Ruby プログラミング基礎講座」,技術評論社,2006,p312
             \bibitem{monbu}  文部科学省. ''小学校プログラミング教育の手引(第二版)''. \url{http://www.mext.go.jp/component/a_menu/education/micro_detail/__icsFiles/afieldfile/2018/11/06/1403162_02_1.pdf}, (参照日2019-5-24).
　　　　　

             \bibitem{terakotta}  大石桃菜 佐々木大器 山口円馨 .''東北公益文科大学における小学生向けプログラミング教室「Rubyてらこった」の取り組み''.文部科学省 私立大学研究ブランディング事業 日本遺産を誇る山形県庄内地方を基盤とした地域文化とＩＴ技術の融合による伝承環境研究の展開（平成29年度～平成33年度)p50-54 .
　　　　　             


　\end{thebibliography}

\end{document}

