くどいようですが、講義時間にwindows updateを行うのは止めてください。Networkが混む原因になりますから。
講義終了後(演習の時間)などに、空いている教室などを利用して実行してください。
僕は、必ず行っています。環境の統一という観点からも、受講者全員がwindows updateを行っていることが望ましいと思います。
皆さんのHome Page (前回の演習の結果)は、ここに公開されていますので、参照してみましょう。
なお、公開されている皆さんのPageのURLは、
http://www.media.cst.nihon-u.ac.jp/comp/g13xxxx/yyyyy.html
といった形ですxxxxは学籍番号、yyyyyはhtmlファイルの名前。
特に、yyyyyがindex (つまり、ファイル名がindex.html )の場合のURLは、
http://www.media.cst.nihon-u.ac.jp/comp/g13xxxx/
でも、参照可能となりますので、お確かめください。
先週Home Pageの公開方法について学んだわけですが、この方法では画像が公開できないという問題があります(2)。
そこで、今回は「他のPageで公開されている画像を自分のHome Pageで利用する」といこと(3)を説明します。
繰り返すようですが、以下の手法は、いわゆる「無料素材」を利用する場合に限ることに注意してください。
他の人が一般に公開している画像データを自分のPageで「無断流用」することは、「マナー違反」と理解されています。
URL ( a tagのhrefや、img tag srcの後ろに記述)は、大きく言って二つの形式があります。
http://?のようにhttp:の後ろに//で始まる場合。
この場合は、Internet上の一意な場所を意味しており、この形式であれば、どこからでも同じ意味で利用できる。
絶対形式でない場合で、これは、その記述( aやimg tag )のあるpageからの相対的な位置で表現する。
相対表現の場合、そのpageのURLの最後の/より後ろを削除し、更にその相対表現のhttp:以前を削除したもの(特になければ、そのままでよい)をつなげれば、その相対URLが指しているものの絶対URLを得ることができる。
例: hpのURLは、http://edu-gw2.math.cst.nihon-u.ac.jp/~kurino/comp/20021106/hp.html (絶対表現)であるが、この中にあるimg tag <img src="kkao01.gif" (相対表現)の絶対表現は、http://edu-gw2.math.cst.nihon-u.ac.jp/~kurino/comp/20021106/kkao01.gifとなる。
自分のHome Pageでも、
<img src="http://edu-gw2.math.cst.nihon-u.ac.jp/~kurino/comp/20021106/kkao01.gif"></img>
と書けば、このを参照表示させることができる。
一般に、自分の管理下にある情報は、相対表現で、そうでない場合は絶対表現が推奨されています。また、絵や図は、自分の管理下にあるものを利用することが望まれるので、結果的に相対表現になるものが多いようです。
しかし、今回の様に絵が置けない場合は、このような絶対表現による絵の参照でも構わないでしょう。
先週から始まったLispの演習の目標は、「プログラミングの初歩を学ぶ」ことです。
プログラミングというのは、「計算機に対して、自分の思い通りの振る舞いをさせるための命令の並びを記述すること」です(4)。
例えば、Lispで、「(+ 3 (* 4 5))」と記述して入力することは、(Lispを通じて..)計算機に対して、「3 + 4 × 5を計算しなさい」と命令していることになるわけです。
このように、計算機への命令を書くために使う言葉(この場合はLisp )のことをプログラミング言語と呼び、プログラミング言語で記述された命令列(この場合は「(+ 3 (* 4 5))」)をプログラムと呼ぶわけです。
自然言語(日本語や、英語.. )などと同様、プログラミング言語も様々存在( 2年次に設置されている「ソフトウェア概論」で学ぶFortran 90や、C言語、最近の流行では、JavaやC#など.. )します。
そして、特定のプログラミング言語で書かれたプログラムを与えると、それから計算機に何らかの動作をさせるための特別なプログラム(今回のlispを利用するためにはxlispを入手しました)を「プログラム処理系」と呼んでいます。
「プログラミングを学ぶ」ことは、結構大変です。なぜなら、一般に、「プログラミングを学ぶ」には、次のような三つのしかも比較的独立した内容を同時に学ぶ必要があるからです。
頭の中に描いた手順を計算機に伝えるには、何らかの形で、表現する(5)必要があります。
その表現方法は、予め、決められた規則に従っている必要があるわけで、その規則(一般の「言語」を学ぶのと同様)を学び、使いこなせる必要があります。
これはプログラミングとは直接関係ないのですが、計算機に対して、プログラムを与えたり、あるいは、プログラムの作成そのものも、計算機上で行うため、計算機が操作できなければなりません。
特に、プログラミングを行うには、それ固有の操作(例えば、処理系の操作方法)が必要なので、その操作方法も学ぶ必要があります。
つまり、「アルゴリズムを考える( =プログラミングの本質)」のほかに、多くの垣根が存在し、それが「プログラミングは難しい」という誤解(6)を招くわけです。
しかし、逆に、上記のような構造が分かれば、ある程度「手抜き」も可能です。つまり、本質的でない部分(プログラミング言語の習熟と、操作方法の習熟)は、サボっても良い(良く分からなくても、まあ、「できれば」良い)ということです。
そして、本質的なこと(アルゴリズムを考える=問題を解くための手順を考える)に、多少の時間を費やすべき(7)だということです。
プログラミングを行う流れは、以下のようになっています。
まずは、自分の作業が、上記の流れのどの部分に当たるか、また、その部分では何をすべきかを学ぶと良いでしょう。
プログラムの設計の基本は、「還元」です。つまり、「与えられた問題を解くには、どのような操作を行えばよいか」を考えるわけですが、いきなり「詳細」までを考えるのではなく、「数個のある程度まとまった操作に分解」します。
もし、その各操作が十分に計算機が実行できる操作ならそれで御仕舞ですが、そうでなければ、「更に、その操作を還元する」ということを繰り返すことによって、それが「最終的に計算機が実行できる形まで詳細化」するということです。
問題は、「何を基準に分割するか」です(8)。
考え方は色々ありますが、一つは、操作の組み合わせ方を考え、全体の構成が、「何をどう組み合わせるか?」と考える方法です。
具体的には、基本的な動作の組み合わせ方法が、以下の三つあるので、与えられた課題が、この三つのパターンのいずれかに当てはまるように考えると、結果的にその問題が「パターン」+「パターン成す部品」に分解されるということです。
前者の「パターン」は固定的(三つのうち一つ)なので、残りの「パターンを成す部品」を再度考えればよいわけです。
例えば、例として、nに12を掛けることを考えて見ましょう。逐次を使うのであれば、たとえばn × 12は、n × 3 × 4なので、最初に、3を掛ける、次に4を掛けるという二つの問題の逐次に分解されます。
分岐を利用するのであれば、nが偶数か奇数かで分けてみましょう。偶数の場合は、n/2 * 24を計算します。奇数の場合は、(n-1)/2 * 24 + 12を計算すればよいでしょう。
繰り返しであれば、まず、
n * 12 = n * 12 + 0
と考え、更に、これを
( n - 1 + 1 ) * 12 + ( 0 + 0 )
とし、これを
( n - 1 ) * 12 + ( 0 + 12 )
と考えます。
以下、「nから1を引きながら、そのたびに0に12を加える」という作業をn回繰り返せば、掛け算が実行できます。
同じ問題を解くにしても、解き方が異なるわけですが、いずれにせよ都合が良い方法で分解を行えばよいわけです。
ケーキを縦に切るか横に切るか、はたまた中心から外に向かって扇形に切るかによって、ケーキの一片の形は異なります。
その結果によって、切られた一片が更に、扱いやすくなるかどうかが決まります。
家では、もちろん、扇形に切りますが、そうしないと、子供たちがけんかをするからです。
lispを参照して、先週に引き続き、1章の演習問題( [演習問題1.x.y]とある問題)を全て解いてみてください。
今回もありません。
ただし、次週は、「lispの演習問題の結果」を提出していただく予定なので、そのつもりでいてください。