「ほっ」と。キャンペーン

<   2009年 07月 ( 16 )   > この月の画像一覧

記憶するのを楽しむ

管理人は記憶力が弱い。したがって、記憶を要するような知識は極力避けて通るようにしていた。そうして、参考書やウェブを見ればすぐに引き出せるようなものを記憶する必要は全くないなどとうそぶいていた。

受験時代はそういうわけにもいかなかったので、記憶法の本を読んだりしたが、鉛筆、バナナ、サッカーボールを記憶するのに、額に鉛筆が突き刺さり、鼻の穴にバナナが突っ込まれ、サッカーボールを喉に詰めているところをイメージするような記憶法をつかっていたら体がもたないと思ったのであっさりやめてしまった。

ところが、最近ワインの入門書を読んでいて、何回読んでもどうしてもブドウの種類の名前を覚えることができなかった。そこで、試しにシャルドネをシャルル一世が部下の肩を叩いて「どーね」と言っているというようにイメージ化し、シュナン・ブランを朱色のナンバープレートがぶらぶらとぶら下がっているとイメージ化してみたら忘れなくなった。

そんなやり方でブドウの種類の名前を覚えたら、ボルドーワインのブドウはカルベネ・ソービニヨンで渋みが強いが長期熟成のよい酒になるだとか、ブルゴーニュワインはピノ・ノワールだとかが覚えられるようになって、急にワインに親近感が湧いてきた。

先日も会合で赤ワインをのんだが、ブドウの種類がシラーとグルナッシュの配合だったので、フランスのローヌ地方のワインで、スパイシーな香りがしたのだろうなどと、ブドウの種類を核として結晶を作るように記憶が成長していくのが感じられる。

なかなか覚えられないものを記憶しようとするのは面倒だが、壁をひとつ突破してみると世界が開けるものだなと面白かった。
[PR]
by tnomura9 | 2009-07-30 18:02 | 考えるということ | Comments(0)

詰め将棋とコンピュータ

指し手の可能性の木構造から正解を見つけ出すという詰将棋の手順の構造がコンピュータ向きだなと思ってググってみたらあった。

コンピュータによる詰将棋の解法についてはTETSUさんの、詰将棋メモというサイトにまとめてあった。

これをみると、詰将棋を解くアルゴリズムについては、情報科学の分野で学問として取り組まれているらしい。現在はパソコンで11手詰めの問題を0.005秒で解くことができるようになっているらしい。こうなると、アルゴリズムについての興味だけでなく、詰将棋と同じような構造を持った問題に適用できれば十分に実用的になる。

数学の問題の解法については、詰将棋と同じようなパズル的な思考が要求されるものがある。実際、4色問題の解決にはコンピュータが活躍したらしい。

自分たちが身近に遭遇する問題を考える能力の中に、「コンピュータによる思考支援」が必須となる時代が来ているのかもしれない。複雑なシステムを扱うときには、「経営者の天才的なひらめき」を実行する前に、どのように効果を発揮するのかコンピュータによって検証するという手順も必要になってくるかもしれない。ただ、今度の金融バブルの崩壊のように、機械の答えを過信しても悲惨な状態になる可能性もあるが。

人間の直観力がすべてを解決できるわけではなく、また、コンピュータの計算が常に正しいわけでもない、その両者をバランスよく活用するためにはどうすればよいのかを真剣に考える時代になってきている気がする。要は差し迫った問題をどううまく解決するかということなのだから。

ちなみに、昭和42年に日立の10億円のコンピュータが36秒で解いた問題が、東公平 将棋雑話「電子計算機と将棋」に掲載してあったが、管理人には解けなかった。
[PR]
by tnomura9 | 2009-07-28 07:35 | 考えるということ | Comments(0)

五手詰

最近は将棋の五手詰を解くのを楽しんでいる。さすがに三手詰のようには解けないが、それでも解答を見つけ出すのにいくつかのポイントがあるのに気づいた。

一つは、王駒が脱出できない方法を探すこと。王駒がそこへ行くとどうしてもその後が詰まなくなってしまう場所がある。とにかく、その脱出点にだけには行かせないような方法を考えると正解が見えてくることがある。

二つ目は、最終的な詰みの形のイメージを作ってみること。問題図から想定される最終的な詰みの形の候補をイメージして、それに到達させるにはどのようにしたらよいかを考えると答えが見えてくるようだ。最終的な詰みの形がはっきりと見えたら、正解を見つけるのは比較的楽だ。

三つ目は、詰みの形にはキーになる駒があること。王駒を詰ませる場合には、直接的に王駒を攻撃する駒とそれをサポートする駒の二つが必要だ。重要なのは後のほうのサポートする駒のほうで、このキーになる駒は正解までにあまり動かないことが多い。このキーになる駒を発見できると、最終的な詰みの形のイメージが形作りやすくなる。

四つ目は似たような形でもちょっとの違いで詰んだり詰まなかったりする場合があること。たとえば、王駒の腹に飛車や竜を打つと決まりになることが多いが、似た形でも一桝空いているだけで詰まなくなってしまう。

五つ目は、取られてはいけない駒を守ること。王手をするときにキーになる駒が王駒や他の駒に取られてしまうことがある。絶対に取られてはいけない駒を守りながら王手をかけるにはどうすればよいかを考えると解答を思いつくことがある。飛車や角で王手をかけながら同時に自分の他の駒に紐をつけるというのはよく見るテクニックだ。

六つ目は、王手をかけた駒がすぐに取られてしまう様に見えても、二重王手なら取られないこと。二重王手をかけられると後手は王駒を逃がすしか方法がなくなる。また、外し王手も動かす駒で直接に王手をするわけではないので見逃しやすい。

七つ目は、他の駒に連絡しておらず孤立しているような駒で、あとの展開からどうしても取れない駒があること。先手側の駒で味方のどの駒にも連絡していないが、後手がそれを取ってしまうと次の先手の手ですぐに詰んでしまう場合がある。そのような駒は後手は取れないので、他の駒と連絡がついているのと同じになる。特にそのような駒で王手をかける可能性は除外して考えることが多いので注意が必要だ。

八つ目は、自分の駒や相手の駒が移動したスペースが重要になる場合を見逃さないこと。問題図からの変化を考えるとき、移動した駒のスペースを見落とすことがある。問題図のイメージが頭の中の変化図に干渉するためだろうが、あるべき空白を見落として解答にたどりつけない場合がある。

先手が自分の駒に連絡をつけながら王手をつないで詰む場合はあまり迷うことはないだろうが、そうでない場合が含まれているため詰め将棋がなかなか解けないのだろう。

全ての指し手の可能性が膨大なので、乾草の中の針を拾うように解答を見つけ出さなければならないのでどうしても選択肢の枝刈りをしなくてはならない。その時に常識的な方法だけを探していては詰将棋の正解にたどりつくことはできない。常識的な考えでは見落としてしまうようなトリックがあるからこそ、魔術でも見ているような正解の手順に驚きを感じるのだろう。

たとえそうであっても、枝刈りの際に何かのパターンを適用するというのは平凡な手でも名手でも同じことのような気がする。ただ、名手の場合は適用するパターンの種類と数が平凡な手よりもかなり多いのではないだろうか。詰将棋に上達するというのは、このような例外的なパターンに習熟するということなのではないかと思う。
[PR]
by tnomura9 | 2009-07-26 09:17 | 考えるということ | Comments(0)

雑学への恐れ

漫画『ソムリエール』を読んだら、急にワインのことが知りたくなって、関連の参考書を買った。

ワインを知るには、原料のブドウ別のワインの味を識別できるようにするのが近道だとか、どの土地で作られたのか、風味が、その地方の気候や土の性質や醸造法によっても変わってくることや、醸造家の人となりがワインの特質に強く反映することなど、総論的な話は面白かった。しかし、各地方のワイナリーなどの各論的な話になった時、お手上げになってしまった。覚えることがあまりに多くてとても短期間では理解できないのに気がついたからだ。

知りたいことはワイン以外にも山のようにあるのに、ワインを一通り知るのに膨大な時間と労力がいりそうな気がしてきたのが原因かもしれない。

しかし、思い返すと、ワイン以外にも同じような理由で放り出してしまったことが山のようにある。自分の知識がいずれも入門レベルで底が浅いのはそのためなのではないだろうか。

知識を習得するときにいつも頭に引っかかることがある。それは、この知識を学ぶことが何かの役に立つだろうかということだ。知識を習得するときの労力に見合う成果は得られるのだろうかということ。せっかく苦労して獲得した知識があっという間に陳腐になって役に立たない雑学になってしまうのではないかという恐れがもう一歩踏み込むのを引きとめてしまう。

それとは別に、一つのことを深く理解したいという欲求より、できるだけ広くいろいろなことを知って視野を広げておきたいという気持ちもそうさせるのかもしれない。一つのことを深く知ることによって、視野が狭く偏狭な考え方しかできなくなってしまうのではないかと思ってしまうのだ。だが、その結果が百科事典的な浅く表面的な理解にとどまることになってしまった。

いまさらだが、何か一つ深く学んでいくのもいいのではないかという気がしてきた。それが、何の役に立つというのでもなく、また、どれだけ深く学んでも結局は先人の足跡をたどるだけの旅でしかないかもしれないという侘しさにも耐えて、一つのことに時間を多く割くのもいいかもしれない。

生計を立てるために働くという重荷がそろそろ下ろせそうな時期になったので、無意味なことに時間を十分に使うという楽しみを味わってもいいのではないかという気がする。
[PR]
by tnomura9 | 2009-07-25 19:00 | 考えるということ | Comments(0)

内的な対話

テレビで人気の気象予報士が昼のトーク番組に出ていた。

もともとはファミレスの店員だったそうだが、その店が海辺にあったため、天気によって客数の変動が極端に大きかったそうだ。彼はそこで食材の発注を任されていたので、必死に天気予報を見て客足の予測をしなければならなかったのだが、その天気予報がよく外れるので発注の件で叱られることが多かったらしい。

それが嫌で、どうせなら自分で天気予報をしようと思いつき、気象予報士の勉強を始めたのだが、最初は全く何が書いてあるのかわからなかった。数の計算からして、小数点をどの位置につけたらよいのかも忘れていたからだ。そこで、書店で小学校4年生の計算ドリルを立ち読みすることからはじめて、中学数学、高校数学と勉強していったとのことだ。気象予報士の試験では高度の数学や物理の内容が試験に出るそうなので、小学校の算数から高等数学まで独学でやってのけたことになる。

おなじような経験は晩学をはじめた人から時々聞くことがある。学生の時にまるで分らなかった数学が不思議に理解できたという。子どもと違って大人になると、まったく理解できないものにぶつかってもどうすればそれを理解するための情報が得られるかを段取りできるからだろう。

高度に抽象的なものでも、結局はより簡単で具体的なものについての知識を積み重ねているだけなのだから、その積み重ねをやり直せばいい。こどもは、壁にぶつかったとき立ち往生してしまうが、大人は、どうやったらそこを突破するための条件を備えることができるかを考えることができるからだ。

目標とする知識が非常に高度な場合、それに到達するための知識の蓄積が大量になってしまう。この量に圧倒されてあきらめてしまうことが多いが、意欲が強くて手間を惜しまなければ、適切な段取りと根気があればかなりのものまで習得できるはずだ。

子供のときにはできなかった、不可能にも思える成果を大人になってから始めたら達成できたのはなぜだろうか。それは、子どもと違って大人は内的な対話ができるようになっているからだろう。理解しがたいものにぶつかったとき、どうすれば理解できるようになるだろうか、なにが不足しているのだろうか、何に似ているのだろうか、他と違う点は何だろうかなどと、心の中で対話をすることができるようになっている。

また、子どもと大人の違いは、そういう対話から思いついたことを実行してみる自由を持ち合わせているということだ。子供であれば書店に出かけるのにも移動の制限があるし、本を買うお金もない。大人の場合はそういうことは比較的簡単に行えるようになっている。

よく考えるというのは、このような内的な対話を十分に行い、それで思いついたことを実際に試行錯誤的に実行してみるということだろう。何か高度な知識を習得したいが、関連の書籍を読んでも何のことか分からないときは、少なくとも、どういう予備知識が必要で、どうやればそれを獲得できるかということくらいは大人として調査することが必要なのではないだろうか。
[PR]
by tnomura9 | 2009-07-23 03:14 | 考えるということ | Comments(0)

1chipMSX

懐かしいMSXをワンチップで実現した1chipMSXというのを見つけた。

FPGA(Field Programmable Gate Array)というプログラマブルロジックデバイスを使うと、パソコンを丸々ワンチップに収めることができるらしい。外部との接続も抵抗一本で調整できるそうだ。

能力と知識と時間があったら、そうとう面白い趣味がやれそうだ。管理人には無理だけど。

だれか手のひらサイズの1chipTK-80を作ってくれたら買いたいな。CPUはZ80のほうがいいかも。

実際に動くPC-8001 のミニチュアとかも魅力的。
[PR]
by tnomura9 | 2009-07-18 14:58 | 話のネタ | Comments(2)

GMC-4 1ビットORプログラム

GMC-4 の加減算と右シフト命令を使って、1ビットのOR演算をさせてみた。キーボードから、1と1を入力すると1が表示され、1と0または0と1なら1、0と0なら0が表示される。実用的な意味はなく、コンピュータに論理演算をやらせたかっただけ。OR演算の処理部分にJUMP命令を使っていないのでリロケータブルなプログラムになった。

00 0 (KA) #最初の数値をキーボードから入力しメモリ5F番地に入れる。
01 F 0 0 (JUMP 0 0)
04 1 (AO)
05 E 9 (CAL SHTS)
07 A F (TIY F)
09 4 (AM)
0A 0 (KA) #2番目の数値をキーボードから入力
0B F 0 A (JUMP 0 A)
0E 1 (AO)
0F E 9 (CAL SHTS)
11 6 (M+) #A = A + <5F>
12 4 (AM) <5F> = A
13 E 6 (CAL SIFT) #A = A / 2
15 A E (TIY E) #<5E> = A
17 4 (AM) 
18 6 (M+) #A = A + <5E> (A = A + A)
19 A F (TIY F) #<5F> = <5F> - A
1B 7 (M-)
1C 4 (AM) 
1D A E (TIY E) #A = <5E>
1F 5 (MA)
20 A F (TIY F) #A = A + <5F>
22 6 (M+)
23 1 (AO) #結果を表示
24 E 7 (CAL ENDS)
26 F 0 0 (JUMP 0 0)

GMC-4の改訂版が作られることはないかもしれないが、サブルーチンコールのE3が空いているようなので、ANDかORのビット論理操作を登録すれば、ビット反転のNOTは既にあるから、GMC-4を教育用にも使えるような気がする。NOTとANDかORがあれば他はプログラムで作ることができるから。なんといっても、書籍込みで2500円はうれしい。

GMC-4がなんで面白いかというと、メモリーやアドレスのビットを直接操作しているという感じがあるからだ。高級言語でプログラムしているときにはあまり感じられない機械を直接に動かしているという感覚が楽しいのだ。電子工作が苦手なので敬遠していたが、PICもやってみたくなってきた。
[PR]
by tnomura9 | 2009-07-17 07:39 | 話のネタ | Comments(0)

GMC-4 のビット操作

GMC-4 の演算は2進加算、減算、ビット反転(NOT)、右ビットシフトしかない。したがって、ビットマスクなどのビット演算がやりにくい。それでも、無理にビット演算をやらせてみた。

例1 データニブルのビット1の値を取り出す

00 0 (KA) #00~06まではキー入力のルーチン。入力された値はAレジスタに存在。
01 F 0 0 (JUMP 0 0)
04 1 (AO)
05 E 9 (CAL SHTS)
07 A F (TIY F) #メモリ5F番地をYレジスタで指定する。
09 4 (AM) Aレジスタの値を5F番地のメモリにコピー。
0A E 6 (CAL SIFT) #Aレジスタの値を右シフト
0C A E (TIY E) #メモリ5E番地をYレジスタで指定。
0E 4 (AM) #Aレジスタの値を5E番地にコピー。
0F 6 (M+) #A = A+<5E>。つまりAレジスタの値を2倍にする。
10 A F (TIY F) #メモリ5F番地をYレジスタで指定する。
12 7 (M-) #A = <5F> - A
13 1 (AO) #Aレジスタの値を表示
14 F 0 0 (JUMP 0 0) #ループの先頭へ戻る。

例2 データニブルのビット4の値を取り出す。

00 0 (KA) #00~06まではキー入力のルーチン。入力された値はAレジスタに存在。
01 F 0 0 (JUMP 0 0)
04 1 (AO)
05 E 9 (CAL SHTS)
07 A F (TIY F) #メモリ5F番地をYレジスタで指定する。
09 4 (AM) Aレジスタの値を5F番地のメモリにコピー。
0A 6 (M+) #A = A+<5F>。つまりAレジスタの値を2倍にする。
0B 3 3 (CY CY) #AレジスタとYレジスタの値の交換を2回するので何もしない。実行フラグを1にするため。
0D E 6 (CALL SIFT) #Aレジスタを右シフト。Aレジスタのビット4が0になる。
0F 7 (M-) #A = <5F> - A
10 1 (AO) #Aレジスタの値を表示
11 F 0 0 (JUMP 0 0) #ループの先頭へ戻る。

例3 データニブルのビット1の値のチェック

00 0 (KA) #00~06まではキー入力のルーチン。入力された値はAレジスタに存在。
01 F 0 0 (JUMP 0 0)
04 1 (AO)
05 E 9 (CAL SHTS)
07 E 6 (CAL SIFT) #Aレジスタの値を右シフト
09 E 9 (CAL SHTS) #ビット1が0の時ベルを鳴らす。
0A F 0 0 (JUMP 0 0)

例4 データニブルのビット4の値のチェック

00 0 (KA) #00~06まではキー入力のルーチン。入力された値はAレジスタに存在。
01 F 0 0 (JUMP 0 0)
04 1 (AO)
05 E 9 (CAL SHTS)
07 6 8 (M+ 8) #A = A+8
09 E 9 (CAL SHTS) #ビット4が1の時ベルを鳴らす。
0A F 0 0 (JUMP 0 0)

注意!! GMC-4 のCAL命令(E)は実行フラグが1のときだけ実行される。また、右シフトではビット1の値が0の時、実効ビットが1になる。GMCの仕様はやはりちょっと変な気がする。しかし、命令数が少ないのですぐに使えるようになる。GMC-4のようなマイコンに見せかけたエミュレータは便利だ。教育用の最少インストラクションで構成されたマイコンを同じような感じで作れば有用なような気がする。
[PR]
by tnomura9 | 2009-07-15 13:23 | 話のネタ | Comments(0)

GMC-4 4ビット足し算器

4ビット足し算器

4ビットの足し算を計算するプログラム。二つの数を16進キーボードから入力すると答えが表示される。

メイン
00 8 3 (TIA 3) #サブルーチンコールから戻るジャンプ命令のある下位アドレス(53番地にジャンプ命令がある。)
02 F 2 0 (JUMP 2 0) #サブルーチンコール。
05 A F (TIY F) #データ用メモリ(5F番地)をYレジスタで指定。
07 4 (AM) #Aレジスタのデータをメモリ(5F番地に)代入。
08 8 6 (TIA 6) #サブルーチンからのリターンのためのジャンプ命令を指定(56番地)。
0A F 2 0 (JUMP 2 0) #サブルーチンコール
0D A F (TIY F) #データ用メモリ(5F番地)を指定。さっき入力した値。
0F 6 (M+) #Aレジスタの値に5F番地のメモリの値を加算する。
10 1 (AO) #Aレジスタの値を表示。
11 E 7 (CAL ENDS) #エンド音を鳴らす。
13 F 0 0 (JUMP 0 0) #メインルーチンの最初にジャンプする。無限ループになる。

キー入力サブルーチン
20 A 2 (TIY 2) #ポインタの下位アドレスを指示。
22 4 (AM) #ポインタの下位アドレスにメインルーチンからAレジスタで渡された値をセット。
23 0 (KA) #キースキャン
24 F 2 3 (JUMP 2 3) #キー入力待ちのループへのジャンプ
27 1 (AO) #入力された数字を表示
28 E 9 (CALL SHTS) #キー入力音
2A F 5 0 (JUMP 5 0) #サブルーチンからリターン

ジャンプテーブル
50 F 5 0 (JUMP 5 0) #戻りアドレスへジャンプするためのポインタ。ジャンプ先はプログラムで書き換えられる。
53 F 0 5 (JUMP 0 5) #1回目のサブルーチン呼び出しの戻りアドレス。
56 F 0 D (JUMP 0 D) #2回目のサブルーチン呼び出しの戻りアドレス。

ビープ音がうるさいが、キー入力の時のチャタリング対策(なつかしい!)。また、プログラムの実行中にプログラムを書き換えるなど、化石になった技法が使えるのがうれしい。ひさしぶりにマイコンを堪能した。

このプログラムはデータのメモリへの読み書きと、アキュームレータとの演算の使用例が目的だ。GMC-4ではメモリの読み書きはYレジスタに入れたアドレスの下位ニブルで間接アドレッシングする読み書きだけだ。このため、プログラムで読み書き可能な領域は50~5F番地のみに制限されている。プログラムを置けるのは00~4F番地の80ニブル。

また、スタック操作やプログラムカウンタを操作する命令はないので、サブルーチンコールは使えない。アキュームレータのビット論理計算ができないので、マスクによるフラグのチェックなどはできなさそう。

機械語の仕様としては変則的だが、雰囲気を味わうことはできるし、いろいろな作業をさせることができる。また、どれくらいの規模の言語仕様であれば、普通にプログラムできるかという問題は興味深い。ARMのCPUのトランジスタは30000個くらいというから、言語の仕様が小さければICは作りやすくなる。プリンタでパーソナルICが作れる時代になれば、カスタムICを自分で作れるようになるので部品の組み立ての工程が激減する。また、究極の少量多品種の製造ができる。そういう時代になったら、小さい仕様で集積度の低いCPUパターンが活躍するかもしれない。

いずれにしてもGMC-4は触っているだけで楽しい。
[PR]
by tnomura9 | 2009-07-12 21:55 | 話のネタ | Comments(0)

GMC-4 でサブルーチンを使う

GMCにはCALL命令は規定のサブルーチンしか呼びだせない。

なんとかして、サブルーチンもどきが作れないかと工夫していたら、ジャンプするときに戻り番地を指定すればよいと思いついた。たとえば50番地に F 0 0 (JUMP 0 0)どダミーの命令を入れておいて、呼び出すときにアドレスを示す第2,第3ニブルを書き換えておけばよい。サブルーチンの処理が終了したときに、F 5 0 で50番地に飛べば、50番地には元のアドレスに戻るJUMP命令が書き込まれている。ところがこの方式だと、メモリーに戻り番地を書き込むのに10ニブル使ってしまう。全体で80ニブルしかないのに10ニブルも使ってしまっては意味がない。

そこで、50番地には53,56, 59番地へのダミーのジャンプ命令を書き込み、53,59,59番地に実際のアドレスに戻るジャンプ命令を書いておく。サブルーチンの呼び出し側では、53,56,59番地の下位ニブルの値を設定してサブルーチンへジャンプするようにした。これだと戻りアドレスの指定に2ニブルしか使わない。

実際のプログラムは次のようになる。

メイン
00 8 3 (TIA 3) #Aレジスタに戻り番地のジャンプ命令を入れた53番地の下位ニブルの値3を代入。
00 F 20 (JUMP 20) #サブルーチン20番地へジャンプ。

サブルーチン
20 A 2 (TIY 2) #リターン時にジャンプする50番地の下位アドレスの位置をYレジスタに入れる。
22 4 (AM) #52番地の値をAレジスタの値で置き換える。
23 E 9 (CAL SHTS) #ビープ音を鳴らす
25 8 5 (TIA 5) #タイマーの時間設定。
27 E C (CAL TIMR) #タイマーのサブルーチンを呼ぶ。
29 F 5 0 (JUMP 5 0) #リターン(50番地にJUMP)

ジャンプテーブル
50 F 5 0 (JUMP 5 0) #デフォールトのジャンプ先。サブルーチンで書き換えられる。
53 F 0 0 (JUMP 0 0) #実際の戻りアドレスへのジャンプ命令。この場合はメインの最初に戻ってしまうので無限ループになる。

スタックポインタやプログラムカウンタが操作できないと苦しいものがある。
[PR]
by tnomura9 | 2009-07-12 18:22 | 話のネタ | Comments(0)