高等学校情報B
情報B
[編集]問題解決とコンピュータの活用
[編集]高等学校情報Aでは基本的なコンピューターの使い方を学んだ。情報Bでは、より複雑なコンピューターの使用法を学ぶ。
コンピュータは与えられた命令を順番に実行することで動いている。この際、その命令の内容はコンピュータによっては吟味されず、仮にその内容が危険なものであっても、コンピュータはそれを実行する。 そのため、コンピュータに命令を与える時には、実行したい命令を正しい順番で与えることが重要である。
コンピュータによる情報処理の特徴
[編集]コンピュータでは様々な仕事をすることが出来る。しかし、全ての仕事がコンピュータに取って向いているわけではなく、中には、コンピュータに向いていない仕事もある。
コンピュータは本来計算を素早く行なうために作られたことから、非常に早く数値的な計算を行なうことが出来る。また、ネットワークを通じて情報を伝達することが出来るため、遠距離とのデータ通信を行なうことにも適している。
一方、コンピュータは"考える"ことができないため、新しい事柄を考え出すことは出来ない。また、コンピュータは映像や音楽を扱うことが出来るが、人間のように、映像や音楽に関するおおまかな雰囲気を伝えることは不得手である。しかし、技術の発展によって、よりあいまいな情報を扱うこともなされるようになって来ており、これらの分野はこれからの発展が待たれるところである。
コンピュータの仕組みと働き
[編集]コンピュータにおける情報の表し方
[編集]ここまでで何度かコンピュータが多様な情報を扱うことが出来ることを述べて来た。同時に、コンピュータは0と1で表わされる情報しか扱うことが出来ないことも述べて来た。このため、文字や数値などの情報を、コンピュータを用いて扱う方法が存在することは非常に不思議に思える。
ここでは、コンピュータを用いて文字や数値や映像などの情報を扱う方法についてまとめる。まず、数値について考える。コンピュータは0と1しか扱うことができない。しかし、0と1だけを用いてもそれらを複数並べることで、より大きな数を表わすことが出来る。実際に、0と1以外の数値を用いるためには、2つ以上の数値を用いることが必要となる。このような数値の数え方を、数学的には2進数と呼ぶ。2進数についての詳しい説明は高等学校情報Cの範囲である。2進数を用いるときには、10進数を用いるときと同様に、1の位が2進数の最大の数である1となった時に、更に1を加えるときには、桁上りが起こる。例えば、0の次は1であるが、1の次は、1の位が1であるため桁上りが起こり、次の数は10である。これはジュウではなく、イチゼロと読む。ここで、次の数は11であり、更に次の数は100である。このような手法を用いて、非常に大きい数も表わすことができる。2進数で表わされた数と、10進数で表わされた数の一般的な対応は、高等学校情報Cの範囲である。
ここまでは整数について考えて来た。一方、数値には小数で現われる数もある。これらは、コンピュータ上では常に有限の桁数を持った数値として表わされる。これは、コンピュータの記憶量が常に有限であるので、無限個の数で表わされる数値を扱うことは出来ないことによる。具体的には小数を、
の形に書き表す事が多い。ここで、aは、0から1までの有限の桁数の小数であり、bは、定まった定数であり、cは、元々の数の大きさを表わす数である。このとき、aを'仮数'、bを'指数'と呼ぶ。例えば、cを10とし、元々の数を5.24とすると、
となるので、仮数は524、指数は-1となる。これによって、上で述べた整数を扱う方法を用いて、小数を扱うことが出来るのである[1]。
ここまでで、コンピュータ上での数値の表わし方について述べて来た。ここからは、文字の表わし方について考える。文字にはラテンアルファベットやひらがな、かたかな、漢字などがあるが、コンピュータがこれらを区別できるようにするためには、これらにたがいに重複しない数値を与える必要がある。
仮にこのような当てはめがなされて、しかも、コンピュータに取って与えられた情報が文字であることが知らされていたなら、コンピュータはその情報を文字として扱うことが出来る。それぞれの文字にどのような数値があてはめられているかは、環境によって異なる。しかし、英語で用いられるアルファベットなどの基本的な文字については、これらはほぼ統一されている。一方、日本語の文字に対する数値は、環境によっており、統一されているとはいえないのが現状である。これらの異なった数値は、文字化けの原因となる。
文字化けの問題の解決策として様々な数値の当てはめ方の間を、移りかえる手法が必要となる。実際にどのような数値が当てはめられているかを調べる方法は、高等学校情報の範囲を超えるので、ここでは述べない。
次に、映像の記録の仕方を説明する。ある映像をコンピュータ上に取りこむときには、その映像は映像を細かい点ごとに区切って表わし、各点の色の情報を数値で表わすことによって表わされる。一般に、全ての光の色は、赤、緑、青の3色の光によって作りだすことが出来ることが知られている。そのため、各々の点について3つの数値を扱うことが、色のついた情報を扱う上で必要となる。一方、白と黒だけで表わされる画像については、黒だけを色として扱えばよいので、各々の点に関してただ1つの数値を扱えばよい。
各々の点に対する数値の上限は、各々の点に対する色数が何通りあるかを表わす数であり、この数が大きいほど、多くの色を作ることが出来、より元の映像に近い色彩で、映像を保存することが出来る。よく用いられる上限は、それぞれの赤緑青の色に対して256通りの色を与える手法であり、この時には合計で
だけの種類の色が出せることに対応する。
最後に、音に関する情報の扱い方について述べる。
音は、空気などの振動であり、音が聞こえている点での圧力の違いによって、音を表わすことが出来る。詳しくは、高等学校理科 物理Iを参照。マイクロフォンは、圧力の違いによって現われる波形を、電気的な波形に変換する機具であり、これを用いることで、音を、電気的な波形とすることが出来る。
このような波形は、そのままでは数値として扱うことは出来ないが、非常に短い時間間隔でそれらの波形の大きさを記録することで、元々の波形にごく近い波形を、数値情報として取りだすことが出来る。ただし、記録を行なう時間間隔と比べて、非常に速く変化する波形については、正しく波形を再現することは出来ない。
コンピュータにおける情報の処理
[編集]ここまでにもコンピュータが与えられた命令を順に実行していくことを述べた。ここでは、コンピュータが具体的にどのようにこれらの命令を実行するかを述べる。
コンピュータはCPUを含んでいるが、コンピュータが実行する命令は、全てCPUによって実行される。そのため、コンピュータに対する命令は、CPUの動作を制御することが目的となる。具体的には、CPUは、あるデジタルデータによって表わされる命令を受けつけて、それに対応する命令を実行するように作られている。このため、適切なデータをCPUに与えることで、CPUを思い通りに動かすことができるのである。詳細についてはw:CPU、w:機械語などを参照。
このとき、コンピュータを扱う人間は、CPUがどのような命令に対して、どのような動作を行なうかを、把握していなくてはならないように見える。ただし、実際には、そのような命令を出す作業自体を、コンピュータに代行させることができるため、コンピュータの利用者全てが、そのような命令を把握していなくてはいけないというわけではない。実際キーボード、マウスなどを用いてコンピュータに指示を与えることができるが、それらが具体的にどのような命令に対応するかは、コンピュータの構成、特にOSの機能によって異なる。
ここで、コンピュータのこの性質を用いて、コンピュータに行なわせることが出来る仕事を、具体的に述べる。
コンピュータが行なうことが出来る仕事として、古くから知られているものに、'並べ替え'と'探索'がある。並べ換えとは、ある条件に基づいて、与えられたデータの順番を並べかえる操作のことであり、探索とは、与えられたデータの中から、対応するデータを探しだす操作のことである。このように、コンピュータを用いて行なう作業のことを、アルゴリズムと呼ぶことがある。より高度なアルゴリズムについてはw:計算機科学などを参照。
まずは、探索について述べる。ここでは線形探索と呼ばれる手法について述べる。線形探索とは、複数のデータが与えられたときに、それらを順番に探しているデータと比較し、それと等しいデータを探すという探索法である。探しているデータが見つかったときには、見つかったという情報を返し、探しているデータと等しいものが無いときには、探索が失敗したという情報を与える。具体的にコンピュータに探索を行なわせる手法を述べる。
探索されるデータ群と、探すデータの種類は、CPUに与えることができるものとする。具体的な探索手順は次のようになる。
- データ群から、最初のデータを取る。
- 取ったデータと、探していたデータを比較する。等しいときには、4に進む。
- データ群から新しいデータを取り、2に戻る。新しいデータが無いなら、5に進む。
- 得られたデータが、探していたデータである。
- 探していたデータは与えられたデータ群には無いことがわかる。
ここで、コンピュータの命令は、基本的には与えられた順に行なわれるが、CPUに対するある命令は、命令が実行される順番を変化させることを注意しておく。上の例では2の中で、'4に進む'という手順があるが、これは、コンピュータの命令が、常に与えられた順になされるのなら、不可能である。
次に、並べ替えについて述べる。ここでは、w:選択ソートと呼ばれるアルゴリズムについて述べる。選択ソートとは、与えられたデータの中から最も大きいものを順番に見ていくことで探しだして、それを最初に持って来て、残ったものの中で同じ事をくり返すという方法である。小さい順に並べるには、これをデータの中から最も小さいものを取りだすという手順に入れ換えて、行なえばよい。選択ソートはデータの数が多いときには非効率であることが知られている。
より高速なソートについては、w:計算機科学、w:クイックソートなどを参照。 具体的な手順は、
- データの中で最も大きいものを探しだす。
- 探しだした最も大きいデータを取りだして、答えの列の最初に並べる。
- 残ったものに対して、同じ手順をくり返す。
というようになる。これは単純に見えるが、複数のデータの中から最大のものを探しだすことは、通常CPUの命令としては存在しない。そのため、このような手法も、CPUに対する命令として、作成しなくてはならない。具体的には、次の手順となる。
- 与えられたデータ群のうちの1つ分を記憶できる場所を、確保しておく。
- 与えられたデータ群の中から1つを取りだし、1で確保した場所に記憶する。
- データ群から1つのデータを取りだす。取りだすデータが無くなれば、5に進む。
- 3で取りだしたデータと記憶しておいたデータを比較する。記憶しておいたデータの方が大きければ、3へ戻る。取りだしたデータの方が大きければ、取り出したデータを確保しておいた場所に上書きし、3に戻る。
- 1で確保した場所に記憶されているデータが求めるデータである。
これらを適切な情況で呼び出せばよい。このように、ある汎用的に用いられる命令群を作成して、適宜呼び出して用いることが出来るとき、この命令群のことをサブルーチン(副命令)と呼ぶことがある。サブルーチンを呼び出すには、CPUの命令の実行順をかえる命令をうまく用いればよい。その詳細は、高等学校情報の範囲外なのでここでは述べない。w:計算機科学などを参照。
情報の表し方と処理手順の工夫の必要性
[編集]ここまでで簡単なアルゴリズムについて学んだ。ここからはコンピューターを用いて、実際に課題を解くことで、学習を進める。
まず、前章で述べたような、簡単な探索のアルゴリズムを、コンピュータに対する命令として与えることを考えてみる。ここで、コンピュータに対する命令が、最終的には CPUに対する命令に帰着することは常に正しい。しかし、CPUに対する命令をそのまま 書くことは、複雑な作業になることが多く、より専門的な知識が必要となる。
そのため、CPUに対する命令をより簡単に扱う方法が研究されて来た。ここでは特に、プログラミング言語を通した手法を用いて、コンピュータに対する命令を扱っていく。
まず、プログラミング言語の説明を行なう。プログラミング言語とは、本来数値として書かねばならないCPUへの命令を、より人間に取って分かりやすい表式で書き換える手法である。最も単純なプログラミング言語は、w:アセンブリ言語と呼ばれ、ほとんど全てのCPUに対して用いられる。これは、CPUに対する命令のそれぞれに適切な名前をつけ、それを書き連ねることで、CPUに対する命令を述べる手法である。もちろん、書かれた名前は何らかの手法で、CPUに対する対応する命令に置き換えねばならない。このような作業をするソフトウェアを、アセンブラと呼ぶ。アセンブラは、それぞれのCPUに対して1つずつ存在し、CPUごとに使いわける必要がある。
これは、非常に不便であるので、様々なCPUに対して同一の情報を用いる手法が研究された。現在では、多くのCPUが持っている機能を、人間に取って、分かりやすい方法で書く手法が確立されている。このような手法で用いられる技術を高級言語と呼び、高級言語を対応するCPUへの命令(機械語と呼ばれる)に変換するソフトウェアを、コンパイラと呼ぶ。コンパイラが出力する機械語は、CPUごとに変化させる必要がある。しかし、コンパイラに入力するファイル自体は、それぞれのCPU間で同じものを用いることが出来る場合も多い。
理論的なコンパイラでは、最終的に機械語を出力するということだけが定められており、どのような命令に対してどのような機械語を対応させるかということは、定められていない。そのため、使用者の好みや、歴史的事情などに応じて、様々な高級言語が作成されるに到った。現在主要な言語としては、開発用の言語として、C言語、C++、Javaなどがある。また、数値計算や科学計算の分野では、w:Fortranが広く用いられている。これらの言語は、非常に機能が豊富であり、コンパイラに対する細かい指示を出すことが出来るが、一方で、初心者にはやや分かりづらく、敬遠される向きがある。
実際には、言語を扱うという観点では、機械語に置き換えるのではなく、読み取った言語の内容をその場で実行するプログラムを作ることもできる。このように実行される高級言語をw:インタプリタ言語と呼び、用いられるプログラムをw:インタプリタと呼ぶ。'インタプリタ'は英単語 interpret '解釈する'から来ている。インタプリタは数が多く、よく用いられている言語も多い。
ここでは、簡単なアルゴリズムを扱う言語として、w:Pythonを扱う。Pythonは、インタプリタ言語の1つで、教育目的で作られた言語に源があるため、使いやすく、簡単であることが特徴としてあげられる。Pythonの詳細についてはw:Pythonなどを参照。また、インタプリタ言語には、古くからあるw:Perlや、日本人が作者であり、近年特に注目を集めているRubyなどがある。興味があれば、これらについても調べてみるとよいだろう。
ここでは、前章で述べた線形サーチに対するプログラムを考える。そのためには、Python言語を用いて、CPUに対する命令を発する手法について、簡単にまとめる必要がある。ここでは、サーチするデータを5つの整数とする。必要な手法は次の通りである。
- 値を記憶する。
- 2つの数値が等しいかどうか調べる。
- 数値を並べておいて、順番に取り寄せる。
- 結果を出力する。
などがある。これらについて、順番に扱う。
値をコンピュータ上に記憶する操作を、w:代入と呼ぶ。代入はほとんどあらゆる言語が提供する機能であり、機械語を用いても、それらの操作を行なうことが出来る。Pythonでは、代入を、
a = b
の構文によって行なう。ここで、aは、値が代入される記憶領域であり('変数'と呼ばれる)、bは、aに代入される値である。aは、単に記憶領域を区別するためだけに付けられた名称であるので、どのような名前を用いてもよい。ただし、実際には覚えた情報の意味を表わすような名前を付けた方が、プログラムの意味がより明白になる事が多い。
次に、2つの数値が等しいかどうかを調べる方法について述べる。Pythonでは、この操作は、
a == b
と書かれる。a, bは、それぞれ変数でも定数であってもよい。aとbが等しいときには、この式は、特別な値Trueを返す。一方、aとbが異なる時には、特別な値Falseを返す。ここで得た値は、上の式の結果によって、行なう行動を変えるときに、用いられる。このような操作のことを'条件分岐'と呼ぶ。実際にある条件を課して、その結果に応じて異なった手順を実行するには、
if (a): b
という構文を用いる。ここで、aは、条件として用いる式であり、bは、条件が満たされたときに実行される文である。より複雑な条件分岐も存在するが、ここでは扱わない。 ここで、これはPythonだけの特徴だが、bが2行以上にわたるときには、それらの前の空欄をそろえて書く必要がある。つまり、
if (a): b c d
とするのである。ここで、b, c, dは、異なった文である。これは、でき上がったプログラムを読みやすくする上でも重要な特徴である。
次に数値を並べておく方法について述べる。機械語においては、情報を記録する部分は通常w:メモリと呼ばれる。これは、コンピューターのパーツとしてのw:メモリと同じものであることもあるし、違うものであることもある。これは、現在のコンピューターが非常に多くのメモリを必要とするため、物理的なメモリ以外の記憶装置を用いて、物理的なメモリの代わりをさせるからである。
ここでは、それらを区別しないで、単にメモリと呼ぶ。メモリにはそれぞれの位置に番地が置かれており、それらの番地が続くようにデータを置くことで、それらが続いたデータとして、用いることが出来る。一方、このようなデータの置き方にはいくつかの欠点があり、より一般的なデータの置き方が必要となることもある。pythonでは、いくつかのデータを扱うときには、通常後者のより一般的な配置を用いている。しかし、実際のデータの配置は、自動的になされるので、利用者がそれを意識する事はない。実際にpythonで複数のデータを扱う時には、
[a, b, c]
などのような表式を用いる。ただし、a, b, cは、記憶したい情報の事で、ここでは、整数である。このような表式をw:リストと呼ぶ。これらの表式は、1つの変数に代入することが出来る。lという変数に代入するときには、
l = [a, b, c]
のように書く。リストに含まれるそれぞれの情報を扱うには、
l[i]
という式を用いる。ここで、iは整数で、情報が置かれている場所を表わす。ただし、これらの場所は、0から数える必要がある。0から数えるのは不思議に思えるが、多くのプログラミング言語でそうなっている。例えば、この場合では、
l[0]
は、aに等しい。
次に、並べたデータを順に見ていく手法を述べる。機械語を考えると、これは単に、データの数だけ比較をくり返し、それが終わったら全体を終わりにすればよい。重要なのは、データの数をあらかじめ与えておく事だけである。pythonでは、このようなくり返しは、
while (a): b
を用いてなされる。whileは、aがTrueの間、bの内容をくり返すという命令である。aの値が常にTrueである時には、この命令はbを無限回くり返すという命令になってしまう。そのため、bにおいて、aの内容を変化させるような書き方をすることが、基本的な 手法となる。
最後に結果の出力を行なう方法について述べる。結果の出力を行なうためには、結果を画面に映し出すような手法が必要である。pythonにもそのような命令が備わっており、
print a
とすればよい。ここでは、aは何らかの式である。
これらをまとめたプログラムに移る前に、やや高度な内容だが、プログラムの途中でそれ以降の命令の実行を取り止める命令を導入する。この命令は、
exit (0)
の形で書かれる。ただし、この命令は、命令を用いる前に、
from sys import exit
という文を書く必要がある。これは、import文と呼ばれる文だが、これについては詳しく説明しない。w:pythonなどを参照。
これらの結果を用いて、プログラムを書けばよい。与えられたデータが、
[1, 4, 3, 2, 5]
であり、探しているデータが2であったとすれば、
1: from sys import exit 2: data = [1, 4, 3, 2, 5] 3: looking_for_this= 2 4: i = 0 5: while (i < 5): 6: if (looking_for_this == data[i]): 7: print "I found this. The order of the number I need is" 8: print i 9: print "." 10: exit(0) 11: i = i + 1 12:print "I can't find that."
となる。ただし、先頭の数字は解説のためにつけたもので、実際のプログラムには現われない。
ここからはプログラムを順に見ていく。 1行目は、先ほど述べたimport文であるが、この文については詳しく扱わない。 2行目は、[1, ..., 5]で与えられるリストを、変数dataに代入 している。 3行目では、探している変数をlooking_for_this という変数に代入している。 4行目では、iというくり返しの条件に用いる変数に0を代入している。この値は、後にdataの数だけくり返しを行なうために必要となる。この数は、dataに代入されたリスト内の要素の数と、一致しなくてはいけない。実際には、変数data自身から、data内に含まれる要素の数を取得することも出来る。しかし、それが出来るかどうかは言語や、用いている環境による場合もあるので、ここでは考えない。 5行目が、くり返しの始まりである。この時条件文の中身は、iが0であることから、
0 < 5
となっており、0が5より小さいかどうかを調べている。これは'真'であるので、while内の文が実行される。そのことによって6行目が実行されるが、ここでは、if文を用いて、dataのi番目の要素が、探している量であるlooking_for_thisと等しいかどうかを調べている。ここでは、iが0の時には、data[0]が1であり、looking_for_thisが2であり、条件式は
1 == 2
となるが、これは1と2が等しいかどうかを調べている。これは'偽'であるので、if文の中身は実行されない。そのため、プログラムの実行は次に11行目へと移る。11行目の文は奇異に見えるかも知れないが、=が等しいことを表わす演算子ではなく、代入を表わす演算子であることを考える必要がある。更に、加法の演算子の優先度が、代入の演算子より高いことを考えると、11行目は、'変数iに、現在の変数iの値に1を足したものを代入せよ'という命令となる。結局、iの値に1を加えることに対応する。while文の範囲はここまでであるので、次に文の実行は、5行目に戻る。
ここで、再び、i < 5の比較を行なう。ここでは、さっきと違ってiは1であるが、依然としてiが5より小さいことは変わらないので、再びwhile文の中身が実行される。ここで、iが5になればこの条件式が'偽'となることから、このくり返しは、iが0,1,2,3,4の5回だけ実行されることが分かる。この5回は、リストに貯えた情報の数と一致しているため、ちょうど全ての情報を調べることができるのである。iが1の場合はdata[i]は4であるので、これも求める数ではない。再び、iが1だけ増える手順をくり返すのだが、iが3になったとき、
looking_for_this == data [i]
が'真'になる。ただし、要素の番号は0から数えることに注意。data[3]が2であり、data[4]が5である。このとき、7から10行目のif文の中身が実行される。7行目はprint文であり、書かれた内容を出力する。8行目も、print文だが、今度は、iの中に貯えられている値を出力する。ここで、print文の後に書かれている語の性質によって、print文の動作が変化していることに注意。実際にはこのために複雑な処理をしているが、それについては詳しく述べない。 9行目もprint文だが、これは文末のピリオドをつけるだけである。 10行目のexitは、プログラムの実行を停止する関数であるので、ここでプログラムの実行は止まる。結局探していたデータがdata[3]に保存されていたことがわかったわけである。
ここまでが、最も簡単な探索である線形探索の手順である。探索ではw:2分探索なども有名であるが、ここではそれについてはふれない。w:計算機科学などを参照。
問題のモデル化とコンピュータを活用した解決
[編集]この章では、コンピューターを用いて、簡単なプログラムを作ることを目的と する。その際、対象の性質に注目し、それらをコンピューターに解決させる 方法を考え出すことを、主要な目的とする。
この章には、'モデル化とシミュレーション'と、'情報の蓄積・管理とデータベースの活用' の2つの内容が存在する。どちらも実習を含む内容となっているが、実際には 両方の実習を行なう必要はなく、情況に応じて、片方を選択すればよい。 ただし、基本的な考えは、両方の分野について学習を行なうものとする。
モデル化とシミュレーション
[編集]- この節のコードにはバグがあります。探してみましょう。
ここでは、いくつかの簡単なプログラムを作成してみる。例として、
- 1から12までの数値を与えたとき、対応する月の英語名を返すプログラム
を作成する。ここでは引き続きpythonを用いるが、他の手法を用いてもよいものとする。
ある数値に対応して、月の名前を得るようなデータは、 上で述べたリストを用いると、
l[1] = 'January' l[2] = 'February' ... l[12] = 'December'
などとして表現することが出来る。これは、lの1番目や2番目に対して個別に代入を 行なっていることに対応する。ただし、実際にはこのような作業はより簡単に、
l = ['January', 'February', ..., 'December']
のように書くことが出来る。このような簡略化された書き方が出来るかどうかは、 インタプリタの性質によっており、様々な言語が作成される原因ともなっている。
次に、与えられた数値に対して対応する文字列を得るには、
print l[i]
とすればよい。ただし、iは対応する数値とする。後は、iを与える方法を 指定すればよい。単にiをプログラム中で指定するようにするなら、 単に代入を行なえばよい。
i = n
ただし、nは、1から12の整数である。
これらをまとめると、最終的に求めるプログラムは次のようになる。
l = ['January', 'February', ..., 'December'] i = 2 print l[i]
ただし、ここでは求めたい月の名前が、2月の名前であるものとした。 求めたい月の整数を、プログラムの外部から与える方法は、ここでは扱わない。
情報の蓄積・管理とデータベースの活用
[編集]ここでは、データベースソフトウェアの活用について述べる。 データベースソフトウェアは、情報を蓄積し、それを必要な時に取りだすことを、 専門に行なうソフトウェアである。データベースソフトウェアは、いくつかの 重要な用件を満たさなくてはならない。 これらの特性は'ACID特性'と呼ばれ、データベースの性質を議論する上で有用となる。 しかし、これらの性質はやや複雑なので、ここでは詳しくは述べない。詳細は、ACID特性を参照。
データベースソフトウェアはその性質上、主にデータを貯えることだけを専門にしており、 単独では、複雑なことは出来ないのが普通である。そのため、データベースから取りだした データを加工するために、上で用いたpythonのような言語が技術として用いられるので ある。この性質上、データベースソフトは'データを保存したり、取りだしたりことを専門に行なう 部分'と、'データを受け取り、加工し易いようにする'の2つの部分に分割されることが 多い。一般に、これらの機能を持ったプログラムは別々に作成され、お互いの間で通信を行なうことで、 目的を達するような設計となることが普通である。このようなソフトウェアを、一般にサーバクライアント型と呼ぶ。 ここでは、データの管理を行なう部分がサーバであり、データを利用者に 与える部分が、クライアントである。サーバは英単語server、 クライアントは英単語clientから来ている。
データベースソフトウェアは、種類によってそのデータの保存の仕方や、扱い方が異なっているのが
普通である。しかし、これらの扱い方が、少なくとも利用者の視点からは、全く同じに見える方が
望ましい。なぜなら、もしそうであるなら、あるデータベースのために作成した利用者の
ソフトウェアが、他のデータベースに対しても用いることが出来るからである。
一般に、各々のソフトウェアの間で、プログラムを共有できる性質を、互換性と呼ぶ。
このとき、データベースの利用者側のソフトウェアは、各々のデータベースソフトウェア間で
互換性があることが望ましい。
このような互換性は実際に存在し、利用者がデータを受け取るために用いる プログラムは標準化されている。ただし、利用者のプログラムを解釈するソフトウェア や、解釈したソフトウェアがサーバ部分と通信する方法は、標準化されておらず、高価で優れたソフトウェアは通信の安定性や速度などがよりよく考慮されており、差別化が行なわれている。
実際に、データベースを用いるために利用者が用いる言語は、SQLと呼ばれる。SQLは、Structured Query Language の略で、日本語では'構造化問い合わせ言語'と訳される。SQLの文法は、英語の文法に近く、修得は比較的簡単であるとされている。ただし、この言語を一般のアルゴリズムを作成するために用いることは困難であり、あくまで、データベースに要求を伝えるためだけに作られた言語であることには注意する必要がある。一般にSQLは、w:リレーショナルデータベースを用いるための言語である。リレーショナルデータベースとは、データとデータの関係を表の形で表わし、その表を用いて、データを蓄積する手法である。
この手法は直観的にわかりやすいため、現在のデータベースソフトウェアの構成法として広く用いられている。
ここでは、SQLを用いて、簡単なデータベースを作成してみる。ここでは、標準的な内容しか扱わないので、用いるデータベースはどのようなものでも構わないが、オープンソースソフトウェアとしてはMySQLやPostgreSQLが有名である。
ここでは、データベースソフトウェアが既に起動し、SQLを用いることで、 データの出し入れが出来る状態が整っているものとする。詳しい導入は付録を参照。
データベースで非常に重要なことは、表を適切な形に定義する事である。 一度定義した表の情報は、変更できるが、やや手順が面倒なので、 最初に定義するときには気を付けて定義を行なうことが望ましい。
テーブルを定義するSQLは、
CREATE TABLE name ( element type, element type, ...)
が基本である。ここで、nameは、表の名前であり、elementは、 それぞれの要素の名前である。typeは、それぞれのデータの 型を表わしている。型とは、それぞれのデータがどのようなものであるかを 表わす量であり、整数型、文字型などがある。ここではこの2つしか 用いない。
ここでは、商品番号と商品名のみからなる、簡単な表を考える。 このとき、表を作成するSQLは、
CREATE TABLE goods (num INTEGER, name CHAR (30) )
となる。ここで、INTEGERは、英語で'整数'という意味であり、 CHARは、character'文字'の略である。numとnameは、それぞれ商品の番号と、 商品名を表わす量である。
ここでは用いないが、作成した表を消去するには、
DROP TABLE name
というSQLが対応する。
実際に作成した表に、データを挿入するには、
INSERT INTO name VALUES (elem1, elem2, ... )
が用いられる。ここで、insert'挿入する'である。 ここでは、この文を3回用いて3つのデータを挿入する。
INSERT INTO goods VALUES (1, 'bread') INSERT INTO goods VALUES (2, 'humburger' ) INSERT INTO goods VALUES (3, 'peanut)
これで、goodsという名の表には3つのデータが挿入された。 ここまででデータの作成は終了である。一方、実際のデータベースの運用では データの挿入と読み出しが自由な順でなされるのが普通であることは注意が必要である。
作成したデータを読みだすには、SELECTという命令を用いる。SELECTの 用い方は複雑であるが、ここでは最も簡単な用い方だけを導入する。 nameという名の表から、elem1, elem2, ... などのデータを取りだしたいときには、
SELECT elem1, elem2, ... FROM name
というSQLを用いる。ただし、全ての情報を読みだしたいときには、 elem1 , ... を*に書き換えた文を用いる。例えば、上の例では、
SELECT name FROM goods
というSQLは、3つの商品名を返す。また、
SELECT * FROM goods
というSQLは、それぞれの商品の、商品番号と商品名を、組にして取りだすために 用いられる。ただし、SELECTは、情報を取りだす働きがあるが、取りだされたデータが 消える事はなく、単に情報が複製されることには注意が必要である。
SELECTには、更にWHEREや、ORDER BYを用いた表式があるので、ここで説明する。 WHEREは、
SELECT ... FROM ... WHERE 条件式
の形で用いられる。ここで、条件式とは、それぞれの要素に関して正しいか 間違いであるかが定まる量のことであり、条件式が正しい('真である'という) 時に、対応するデータを取りだし、条件式が正しくない('偽である'という) 時には、データを取りださない。条件式の性質は詳しくは扱わないが、 加法や減法なども用いることが出来る。例えば、
SELECT name FROM goods WHERE id = 3
は、'菓子パン'を返す。また、
SELECT name FROM goods WHERE id + 1 = 3
は、'サンドイッチ'を返す。最後にORDER BYは、
SELECT ... FROM ... ORDER BY ...
の形で用いられ、読みだされたデータの並べ換えをさせる効果がある。 例えば、
SELECT name FROM goods ORDER BY num
は、numが小さい順にデータを表示する。一方、numが大きい順に表示させたい時には、
SELECT name FROM goods ORDER BY num DESC
とDESCをつけてSQLを作成する必要がある。
ここまでで簡単なSQLを扱って来た。実際のデータベースを用いたプログラムでは、 取りだした情報を別の言語を用いて、加工することが普通である。データベースとの 接続の詳細は、複雑なのでここでは触れない。
情報社会を支える情報技術
[編集]情報化社会では、社会の構成員は大量の情報を処理することを日常的に行なう必要があるのだが、これは、それぞれの人間にとって負担の大きいことである。幸い、人間に取ってより扱いやすい形に情報を加工する手段についても研究が進んでおり、それらを用いることで、情報をより直観的で解りやすい手段で扱うことが出来る。この章では、そのような手法の説明と、それらを用いる際の注意点についてまとめる。
情報通信と計測・制御の技術
[編集]情報技術の発展は、様々な機器を用いて、人間の意思をコンピュータに伝達することを可能にして来た。古いコンピュータでは、情報を伝達する手段として、紙に穴をあけて0と1を表現する機具(パンチカード)を用いて、コンピュータへの情報伝達を行なっていた。
現在ではキーボードやマウスなどを用いて、情報を伝達することが出来る。また、例えば銀行のキャッシュディスペンサーなどでは、パネルに触れる事で、情報をコンピュータに伝えることが出来、利用者に取って非常に親切なシステムとなっている。これらの機器では、機器が読み取った入力を、その情報を元に、実際の制御を行なうコンピュータへと、情報を伝達する手段が問題となる。
実際には同様の問題は、あらゆるコンピュータの周辺機器に対して生じる。多くの計測機器、例えばキーボードは、受け取った情報をケーブルを用いて、電気的にCPUに送っている。信号を受け取ったCPUは、その信号に対して、所定の動作を行ない、その信号を受けいれるのである。このように、機器が信号を発してからそれに対応してそれを扱うCPUが動作する一連の動きを、割り込み、もしくは'ハードウェア割り込み'と呼ぶことがある。ここで、所定の動作とは計測機器とCPUの間の約束事として定めておく必要がある約束事であり、具体的には0と1をどのような仕方でくり返すか、などの情報である。
実際には、信号に対するCPUの動きは単純でない場合も多い。例えば、キーボードとCPUの通信の場合には、押されたキーによって異なった信号が送られて来るため、それぞれの信号と実際に受けいれる情報、例えば画面に表示される文字との間の対応を取る必要がある。また、CPUとハードディスクが情報の交換を行なうときには、ある一定程度の通信が行なわれることを確認してから、実際の書きこみや読み取りを行なうことが 多い。これは、情報交換の過程が時間のかかるものであるため、一度にいくらかの量をまとめて行なう方が都合がよいからである。このように、CPUと周辺機器との情報交換を行なう過程は複雑であるため、この作業を専門に行なうプログラムを作成し、機器への出力や、機器からの入力を整形させる場合が多い。特に、それがOSの機能として与えられるとき、そのようなプログラムをデバイスドライバと呼ぶことがある。
このように複雑な入力機器を用いるためには、ハードウェアとソフトウェアの両面で、 多くの努力が必要となることがわかる。ここでは最も単純な入力を用いて、 コンピュータによる制御の例を作成してみる。入出力をどのように扱うかはプログラミング言語によって異なっており、それらは言語の1つの特徴となる。解りやすい入出力があれば、言語は使い勝手のよいものと なる。pythonでは、最も簡単な入力は、raw_input() という関数で与えられる。これは、
s = raw_input()
の形で用いられ、キーボードから入力された文字列を、sに代入する働きをする。これを用いて、簡単なコマンド指定のためのプログラムを作ってみる。例えば、あるプログラムで実行したいことが複数あり、その中から利用者がどの作業を実際に行ないたいかを選ぶ必要があるとする。ここでは、それぞれの作業に1,2,3の番号をつける。このうちのどれを選択したいかを利用者に選択させることが、ここでの目的である。
ここでは、利用者の選択が、'1','2','3'のどれかであることを調べればよい。このような条件分岐は、以前出て来たif文に加えてelif文と、else文を用いる。これらの文は、
if (a): b elif (c): d else: e
の構文に従う。ここで、a, c は条件式であり、b, d, e は、それぞれ1つの文である。この文の意味は、やや複雑である。まずaが真であるかを調べ、真であったらbの文を実行する。そうでなかったときには、次にcが真であるかを調べ、真であったときにはdの文を実行する。それも偽であったときには、eの文の実行をするという手順になる。ここで、aの式が真であったときには、dとeの文は実行されないことに注意が必要である。実際には、elif文は必要に応じていくつでも連ねることが出来る。さらに、else文は省略しても構わない。
これを用いて、1, 2, 3 のどれかを選ぶためのプログラムを作ることが出来る。情報の入力部分は次のようになる。
print "Please give me one of 1, 2, 3." s = raw_input()
これはraw_input()を用いて情報を受け取るための文である。ただし、print文を1つつけて、何が求められているかを解りやすくした。受け取った情報から必要な作業がどれであるかを見出す部分は次のようになる。
if (s == '1'): print "I'll try job 1." elif (s == '2'): print "I'll try job 2." elif (s == '3'): print "I'll try job 3." else: print "I don't understand what you gave me."
プログラム中で、sは、先ほど受け取った利用者からの入力である。これが'1', '2', '3'のどれかであるかを確かめるために、先ほどのif - elif - else を用いている。それぞれのif文に対応する実行文は、ここでは、単に番号を表示するprint文である。しかし、実際により複雑な仕事を行なうときには、この部分に対応するサブルーチンをおいた方がよいだろう。Pythonでもサブルーチンを定義することが出来るが、ここではそれに関する説明は行なわない。w:Pythonなどを参照。また、利用者が入力した内容が1, 2, 3 のどれでもないときには、その内容に対応する作業が無いことを述べて、プログラムの実行を終えている。
情報技術における人間への配慮
[編集]情報技術を上手く用いることで、情報を処理することに関する人間の負担を減らすことが出来る。同時に、そのような技術を上手く用いることで、人間が行なう処理の間違いを検出したり、より使いやすい入力装置を作成することが出来る。
しかし、このようなプログラムを作成するには多くの時間が必要であり、価格として高価になる場合が多い。そのため、実際にどの程度の使い易さを要求するかは、プログラムの作成の段階で問題になることが多い。実際には要求を増やすほど、作成の時間もコストも増える傾向があるため、常に優れた情報技術が用いられるとは限らないことにも注意する必要がある。しかし、ヒューマンエラーの発生を減らすためにも、使い方が明快で解りやすい情報技術の作成は重要な役割を持つ。この分野については今後の発展が期待されるところである。
情報技術の進展が社会に及ぼす影響
[編集]現在ではハードウェアの面でも、ソフトウェアの面でも非常に多くの情報技術が開発されており、その数は現在でも増え続けている。これらは使いこなすことで我々の生活が便利になる可能性を秘めている一方、使い方を間違えば、我々の生活を大変な混乱に導く可能性も秘めている。実際的には、我々はコンピュータ技術の発展に常に注目し、それらを用いて実行できることを把握しておくことが望まれる。
付録
[編集]Pythonの導入
[編集]Pythonは有名なオープンソースソフトウェアであり、Python Software Foundation License遵守する限り、無償かつ無保証で使用することができます。
Pythonは、Unix、macOS、およびGNU/Linuxのさまざまなディストリビューションなどのオペレーティングシステムとともに配布されています。
Pythonがインストール済みか確認
[編集]Pythonがインストール済みか確認する方法は、ターミナル(コマンドプロンプト)を開いて、以下のコマンドを実行します。
$ python -V
または[2]
$ python3 -V
上記のコマンドの実行結果に、Pythonのバージョンが表示される場合、Pythonが既にインストールされていることを意味します。
Pythonのアップデート
[編集]バージョンの確認で、インストールされているPythonがサポート終了している場合はアップデートが必要です。
Pythonのアップデートを行う場合は、Pythonの公式サイトから新しいバージョンをダウンロードして、再インストールする必要があります。 また、パッケージ管理ツールを使用することでも、Pythonのアップデートができます。
Pythonのインストール
[編集]Pythonのインストール方法は以下の手順になります。
- Pythonの公式サイト( https://www.python.org/downloads/ )にアクセスし、最新版のPythonをダウンロードします。
- ダウンロードしたインストーラーを実行し、インストールを開始します。
- インストールウィザードに従い、インストール先などを選択し、インストールを完了します。
インストールが正常に終了したかを確認するために、ターミナル(コマンドプロンプト)を開いて、以下のコマンドを実行します。
$ python -V
または
$ python3 -V
上記のコマンドの実行結果に、Pythonのバージョンが表示される場合、インストールが正常に完了していることを意味します。