日本でハリウッドVFXを制作! 「経産省アイディアボックス」 結果:  
●まとめエントリはこちら ●FAQ ●お問い合わせは左のメールフォームから

2009年2月27日金曜日

TinTin Link

日本では[タンタン]でしられているコミックの映画化が進行中。
公開予定は2011年
3Dらしいので、今年後半か来年には、プロダクションで仕事が始まるのではないかと思う。
このチャンスをものにするためにも、いまがんばっておきたい。

---------------------------
Links
---------------------------

The Tintin movie .com

wiki

3d realms (掲示板 2009年2月)

The Tin Tin blog

Tintin moive.org
2007/5/18 wetaとdreamworksについて

TinTin に関係することはこのページをアップデートし続ける予定。
横の[リンク]にある[my Tintin Links]からこのページへ跳べます。

--------------------
News Updated
--------------------
Mar 02, 2009
モーションキャプチャーの撮影は二月から(Dec07,2008 Kathleen Kennedyへのインタビュー)
1月に撮影にはいるというニュースもあったので、どちらにしてももう始まっていると思われる。


Mar03,2009
Wetaのホームページをみてみたら、「Tintin」が「-in production」となっており、
Weta Workshopの項目は「ArtDirection」,「Design」、Weta Digitalは、「Visual Effects」となっていた。

どうやらLAではなく、NZのWetaでエフェクツは作られるようだ。
ひょっとしたらLAにも一部の仕事は流れてくるのかもしれないが、
そういえば先月ぐらい、Wetaが大量に人を募集していたので珍しいなと思っていたら
おそらくこのためだったのだろう。

現在は「Avatar」で忙しいはずだし、Tintinと同じ2011年には、「The Hobbit」も控えているので、
人だが大量に必要なのだろう。
ひょっとしたら数年に一回あるかないかの大募集??
いま、Wetaに採用されれば数年は仕事がありそうだ。
ちゃんとやっておけば、このチャンスを物に出来たかもしれないのになと悔やまれる。

Mar03,2009
WetaがTintinのためにLAベースのモーションビルダー・アーティストを急募。(Feb05,2009)
応募者は十分な技術を持ち、大量のデータを処理するチームで楽に働くことができる必要がある。
モーション・キャプチャーのデータを完成させ仮想空間に入れる作業。
バーチャル・カメラのためにモーション・モンタージュの開発。
(ストーリー・ツールを使った経験があれば採用においてプラスになる)
レンダリングされたメディア(シーケンスファイルやmovなどのムービーファイルと思われる)を作り、チェックする。

これは、二月からスピルバーグ監督のもと撮影されたモーキャプデータの作業だろう。
LAで撮影されるので、それをLAでクリーンアップして「ラッシュ」のようなものを作るのだろう。
これがWetaに送られて、仕上げとなるのかどうか、そこまではわからないが、
初期作業に重要な役割となることは確かだ。
なんとかLAでも、VFXなどの作業が行われて欲しいものだ。

論理演算 (9)

会社のエンジニアに、「フリップフロップって勉強しておいた方がいい?」と聞いてみた。
彼はプログラムもするし、かなり詳しいので、当然「したほうがいい」と言うと思っていたら、
「フリップフロップって何?」

「...。いや、論理回路の..。」

「ああ、あれね。そういえば学生のころ習ったな。いやそれ以来、みたこともない」

「....。いらないってことね...。」

結論からいうと、プログラムをするために必須ではないということか。
もちろん、論理演算をおぼえたり、その応用をならうには良いと思うが、
回路の設計をしたりするのでも内限り、使われることのない知識なのかもしれない。

使われることのない知識をならうのは時間の無駄だ。
でももし、習うことで論理演算に対する理解が深まり、それが後の勉強を楽にしてくれるなら
やっておいたほうがいい。

いったいどっちなんだろう。

就職活動 (1)

二日ほど前から大手D社がたくさん人を募集していた。
経験二年からと比較的ゆるいので、ステップアップにはとても良いかも。
知り合いにたのんで応募することにしたので、至急デモリールをアップデート中。
ちょっと遠方なので通うのは大変そう。

R社は、まだ返事こなかったので、これまた知り合いに頼んで人事の状況をきいてもらうことにした。
また、うちの会社もそろそろ新しい仕事がとれそうな気配。

先行きが見えないが、ステップアップするには、ここで迷わずD社を選んで、今の会社から出るべきか。

2009年2月25日水曜日

論理演算 (8)

論理演算をしっかり理解しておくことが、プログラミングを習得するためには不可欠であるとわかった以上、しっかり勉強したいと思う。

いろんなホームページをみてみると、論理演算の説明では、AND,OR,NOT の簡単な定義を説明し、真理値表をみせ、実際にプログラムの例をひとつか二つみせて終わる。
もう少し踏み込んだ物では、フリップフロップなど、論理演算子の組み合わせ方をさぐっている。


応用できるようになるためには、もう一歩踏み込む必要があるように感じる。

論理演算子ではなく、論理学や、記号論理学を学ぶ必要があるのかもしれない。
AND,OR,NOTの概念をもっと深いところから理解する必要があるのかもしれない。

現実的にみると哲学者になろうとしているわけでも、数学者になろうとしているわけでもないので、
論理演算の基礎知識を勉強し、応用についてたくさん学ぶのがいいのかもしれない。

勉強の過程では、よい例もあるし、よくない例もあるだろうが、
そこは、あまり細かな矛盾をみつけて、こだわりすぎると時間がかかってしょうがないので、
ある程度の矛盾は、受け入れるか無視し、そこでの文脈がほんらい 言いたいことだけにフォーカスをあわせる必要がある。

おそらくこの方法でいけるだろう。

フリップフロップなど、基本的な論理演算の応用は、
勉強しておいた方がよい。

2009年2月24日火曜日

メモ: 生産消費者

角川だけじゃない、YouTube“違法”動画の収益化 個人ビデオ+BGMの公認も

MAD動画など、違法動画に対するYoutubeの取り組みについての記事。

MADはユーザーが自分の楽しみのためにつくったもの。
(もちろん受けねらいでつくられてもいるが、収入目的ではない)

いままではその素材の著作権の関係から、削除されたたり、圧力がかかったりと
好意的にはうけとられてこなかった。

それを前向きにとらえ、さらにそれを収入に役立てようというのが、ここでのポイントだと思う。

そこで思い出したのが、アルビン・トフラーのいう「生産消費者」。
自分で満足するために財やサービスを作り出す人、これからの経済において主役となる。

トフラーがここでふれている未来は将来起こるというよりも、すでにはじまっている。
これは良い例ではないかと思う。

--------------------
アークランプ: 富の未来

これからの時代の流れで経済の主役となる存在である。

「生産消費者」とは、販売や交換のためではなく、
自分で使うか満足を得るために財やサービスを作り出す人

目に見える経済と目にみえない経済という2つの経済をあわせたときにはじめて、
本書でいう「富を生み出す体制」になる。
このような視点をもつと、新しい事実が明らかになる。
金銭経済は劇的に拡大する勢いにある。
そして、非金銭経済での活動が金銭経済に与える影響は、ますます大きくなっていく。
生産消費者は功績を認められていないが、今後の経済に貢献する英雄なのである。

NHK「第3の波」 アルビン・トフラー 未来への提言 【前編】




NHK「第3の波」 アルビン・トフラー 未来への提言 【後編】

論理演算 (7) なぜAND、OR、NOTの三つだけ?

論理演算にはAND,OR,NOTの3つしかないのはなぜか?


「真の哲学体系を求めて Ver.2」というサイトの「他者の論理学」に詳しい説明がある。



まずは基本的な演算記号について

 第3節 論理学においての文と接続詞
こうした文を論理学では、たとえば、
p、q、r、s、t 
などのような記号にしています。
この記号同士の関係を見ようとするのが論理学です。

しかし、こうした記号だけでは、何も始まりません。
私たちは、たったひとつの文だけで何かを表現しようとはしません。
文と文をつなげることで、さまざまな表現を可能にしています。

 たとえばこんな場合です。
   p  → マッチ棒をする。
   q  → マッチ棒に火がつく。

 一般的にマッチをすればマッチ棒に火がつきます。

ただ文だけでは、こうした文と文の関係が扱えません。

文と文をつなげる接続詞に相当するものがどうしてもなくてはいけません。

論理学を真に論理学たらしめているのは、文と文をつなぐ働きを見ようとするところなのです。


こうした文と文をつなぐ接続詞として、論理学では、基本的に以下のものだけを認めています。
「~でない」「かつ」「または」「~ならば」
論理学では、基本的に上記の四つしか接続詞として使用しません。

なぜ、論理学においては上記のものしか接続詞として認めないのか、不思議に思ったことはありませんか。


ここでは、「ならば」を含めているので4つという事になっているが、論理演算でなく、論理学だと4つになるのか、そのへんは今は追求せず、先へ進むことにする。


--------------------
第4節 論理学とさまざまな接続詞
なぜ、論理学においては、「しかし」という接続詞がないのでしょうか。

  私は安いものがほしい。かつ私は価値あるものがほしい。

この場合、価値あるだけではだめです。安いだけでもだめです。
安くて、しかも価値あるものでなくてはいけないのです。
このように”かつ”という接続詞においては、前の文と後の文がどうしても必要になります。

そうです。”しかし”もまったく同じです。
このように前の文と後の文が同時に当てはまって初めて意味を持つという点はまったく同じです。

すなわち、論理学においては、”しかし”も”かつ”も同じ接続詞の仲間として考えられているのです。
”かつ”と”しかし”では、意味が違うのに、なぜこのようなことになるのでしょうか。

論理学では、ただ文が真であるか、偽であるか、そして接続詞を加えると、そうした真とか偽がどのように変化していくかを見る学問です。
言語の辞書的意味にまで深く立ち入って見ているわけではありません。
働きの形式が同様なものとして考えられるならば、ひとつにくくってしまうのです。
このことで、”しかし”が”かつ”の中に含まれてしまっているのです。

このように、ある接続詞の前の文と後の文が同時になりたたなくては意味をなさないような接続詞はすべて、この”かつ”と同様な働きをするものとして一括されてしまっているのです。

また、ある接続詞の前の文と後の文のどちらか一方だけ、意味をなしていれば、意味をなす接続詞は、すべて”または”と同様な働きをするものとして一括されてしまっているのです。

このように、一般的に言語には接続詞がいろいろありますが、そうした接続詞も結局、~でない、かつ、または、~ならばの四つのうちのどれかにあてはまってしまうということなのです。


このサイトは論理学の基礎を学ぶにはとてもよい。
わかりやすく説明されている。
http://www6.plala.or.jp/swansong/000008tetugakumokuji.html

論理演算 (6) 命題

論理学に関する記述を読んでいると「命題」と言う言葉は避けて通れない。
そこで、今回は「命題」を調べてみた。

まず由来だが、

「命題」は、英語で「proposition(提案、問題、主張という意味がある)」。
「持ち出す、提案する、推薦する、申し込む、計画する」という意味の名詞。
 動詞「propose」からくる。
「propose」の語源は、「中フランス語proposer(pro-前に+poser置く)」。
「前に置く」という意味である。

日本語の「命題」は西周(にし・あまね)によって作られた訳語で、
Yahoo!知恵袋」の回答によると、その由来は

「命」とは主君の意図を言葉にして発することです。
今回は「言葉にする」というところに主眼があるのだと思います。
私の推測でしかありませんが、主語と述語とが結びついてできたある事態(「題」)を、真か偽か判断できる形で言葉に直す(「命」)ということで、「命題」と名づけられたのではないでしょうか。



さて、「命題」の定義は、

命題(wiki):意味に不明瞭なところがない文章の事。

命題(Yahoo!知恵袋)
主語と述語とを備え、真か偽か判断することのできる文のこと。
また、判断したことを言葉にしたものを指します。
要するにあいまいでない文のことです。
そのため、疑問文(……であるか)、命令文(……せよ)、様相文(……であるかもしれない)などはこれに含まれません。

蛇足だが命題の解釈で注意すべき事がWikiに述べられている。
誤解されがちだが、命題そのものに真偽が割り振られているわけではない。

また 知識の積み木 (カテゴリー論) には、主語と述語との関連もかかれている。
命題とは、主語と述語で形成されるが、主語は特定の個物を指示するだけであるため、実質的な命題の意義は、様々な存在規定をあらわし固有性と付帯性に分類される述語(第二実体)で明確化、決定される。
よって、知識の実質は述語にあるといえる。

この「主語と述語で明確に表される文章」(=命題)をいかにに記号化するか
それについてよりわかりやすくまとめてあったのが以下のページの「1.基本原則」のところ

プログラミングの概念に基づく記号による抽象言語について」:
「私は人です」は、集合の記号を用いて書き換えると、
実は”私⊂人”という状態をそのまま形式的に置き換えたものであるということがわかる。

余談だがここにも「集合」の考え方がでてきており、いろんなところで相互に関係しているんだなとわかる。 

たとえば「A」という命題があるとき、それは「集合A」ということができる。
上記の例でいえば、「私」という要素をふくむ「人集合」である。


この主語と述語の関係は以下のページにも詳しく説明してある。
第7節 述語論理学における主語と述語
この記号のFとは、盲導犬ということです。(a)というのは盲導犬であるこの犬をさしています。
そして、このFが述語になり、(a)が主語になります。
 どういったものが述語になり、どのようなものが主語になるのでrしょうか。
一般的には、述語のほうが、主語よりも範囲が大きいものを選択します。

盲導犬(この犬)= F(a)
とは、この犬は盲導犬ですという文を記号化したものなのです。


では、命題がどのように論理演算とかかわってくるのか、wikiの「命題論理」をみてみた。

命題論理において問題になるのは、個々の命題の「意味」よりも命題を「かつ」「ならば」などの論理演算子で関係づけたときにどんな推論ができるか、ということである。



複数の命題を関係づけたものを「複合命題」とか「命題の合成」という。

数学の論理

いくつかの命題から別な命題を作ることを命題の合成という。


ここではじめて、論理演算の記号が関係してくる。

例をあげて、具体的に見ると

P:命題1
Q:命題2
P∪Q:合成された命題

とうことになる。

注意すべきなのは、「P∪Q」のような表現を「命題」というのだと思っていたが、これは「複合命題」である。


ところで論理演算の基本はAND,OR,NOTの3つしかない。
なぜ、この三つだけなのだろう?

すべての論理はこの三つで説明がつくということだとは思うが、本当にそうなのか?

2009年2月23日月曜日

論理演算 (5) 「論理演算」は「計算」??

「演算」の定義には「数値計算」と「論理演算」が含まれる。
しかし、「四則演算」は「計算」であるとわかるが、
「論理演算」が「計算」であるといわれてもなかなか、ピンとこない。

おそらく「計算」の定義が明確には、わかっていないからだろう。
すこしそのあたりを調べてみたい。


--------------------
計算(大辞林 第二版より):
(1)数量を数えること。
(2)結果や展開を予測すること。。
「雨の降ることまでは―してなかった」「相手の反対を―に入れる」
(3)〔数〕 数や式を演算の法則に従って、結果を出したり式の変形を実行すること。

定義(3)は「演算」が定義に含まれていて堂々めぐりになるので、ここでは考慮しない。

「四則演算」はまさに「数を数えること」である。
数を数えるとは、複数の物があるときに、最初の数「1」に次の物の数「1」を足していき、必要なだけ、次々と「1」を足していくことである。
コンピュータでは、引き算、かけ算、割り算も二進数をつかって、すべて足し算によって答えを導き出している。
コンピュータでなくても、普通にかけ算「2x3」は「2+2+2」で求めることができ、まさに数を数えることである。

この定義は、納得できるし、理解しやすい。
問題はもうひとつのほうだ。

定義(2)は、「予測すること」とある。
予測とは、将来なにがおきるか想像すること。
その作業をステップごとに考えると、
1)ある事例をとりあげる。
2)そこに含まれる要素間の関係をみつける。
3)現在、目の前にある要素を、その関係にあてはめる。
4)それが、どのような答えになるか考える。
という手順を踏む。

「要素間の関係」とは「法則(一定の条件のもとで、必ず成立する事物相互の関係)」のことである。

これが「計算」の定義なのか??
いまひとつわかったようでわからない。
定義(1)は、狭義の定義(2)ではないだろうか?


--------------------
次にWikiを見てみる。

計算(wikiより):
与えられた入力に対して、あらかじめ決められた所定の "手続き" に従って演繹することである。


「演繹」の定義が、いまひとつなので調べてみる。

「演繹」とは:、
●一般的・普遍的な前提からより個別的・特殊的な結論を得る推論方法である。(wiki)

●諸前提から論理の規則にしたがって必然的に結論を導き出すこと。
普通、一般的原理から特殊な原理や事実を導くことをいう。(大辞林)



簡単に言うと、「一般的な前提から個別的な結論を出す。」こと。かな...。 (^^;)


もうすこしWikiを読んでみると、「演繹の代表例として三段論法がある。」
ということなので「三段論法」をしらべてみた。

--------------------

三段論法とは、

三段論法は「大前提」「小前提」「結論」の三つの命題がある。
「大前提」に法則的に導き出される一般的な原理を置き、「小前提」に目前の具体的な事実を置き、「結論」を導き出す。以下に三段論法の例を示す。

大前提:すべての人間は死すべきものである。
小前提:ソクラテスは人間である。
結論: ゆえにソクラテスは死すべきものである。


先ほどの計算の定義(2)で考えたことによく似ている。
考えたことが全く違っていたわけでもないようだ。
もう一度この三段論法にしたがって、計算のステップをまとめてみる。

1)一般的な原理(大前提)
2)目前の具体的な事実(小前提)
3)結論を出す。


四則演算「二つの数から新たな数を決定する規則を一般化したもの」である。

1)この「規則を一般化したもの」は「大前提」にあたり、「+」「-」「×」「÷」で表される。
2)そして具体的に今計算のためにつかわれる数字が「小前提」となる。
3)結果的に、「結論」を導き出すことが「計算」ということになる。


かなり自分にとって哲学的でわからないことだらけなので、間違っている部分もあるだろうが、
まるっきり外れてはいないだろう。


「論理的な思考にそって、何かを扱い結論を出す」ことが「計算」ならば、
「扱うもの」がなんであろうと「計算」ということになる。

物の量を抽象化した物が数字で、それを扱うのが「計算」
その数字をさらに抽象化しアルファベットで表したものが代数で、その式を扱うのも「計算」
抽象化した概念を扱い、論理の原理を記号化し、それによって論理的な思考をするのも「計算」

よって、論理演算も四則演算も「計算」ということになる。

メモ:ストーリーボードの練習

よいアーティストになるには、

ショットの見せ方やエフェクトのアニメーションなども、具体的イメージできないといけない。

具体的にはシーンに合わせたストーリーボードを書くとか。
シーン自体をストーリーボードで書くとかして、
イメージをイラスト化できるようにする。

それを3Dにすれば、なおいい。

プログラミング学習の問題と対策

<プログラミングの学習を始める目的>
スクリプトにかかわらず初心者がプログラミングの勉強を始める目的は、
「もっといろんなことができるようになりたい」という理由からだ。

それに、最初は何もわからないから、
「プログラミングによって何ができるのか知りたい」ということも理由だろう。

--------------------
<問題1:目的が失われる>

勉強を始めると、基本的なコマンドや文法、たとえば分岐命令や変数から勉強していく。
でもこういった基本事項だけで、「プログラミングをすると言う行為」がどのように自分の仕事に役立つのかわかりにくい。

なんとなく、繰り返しの作業をやってくれたり、自動で処理できれば「便利そうだ」とは感じるが
通常のテキストには、応用例が少なく、またあったとしても習ってもいない事柄がたくさんあって、理解できない。

実際に自分の作業で、○○を出来るようにしたいと思っても、プログラムは一つ二つのコマンドでは簡潔せず、複数のコマンド、関数そして、ちゃんとした文法など、知っておくべきことがもっとたくさんある。

「自分がこうしたい」という具体的な例がすぐに思い浮かぶ人はいいが、
「プログラムにできること」がわかり、「自分の仕事」に結びつくようになるまでにやることが多すぎて、目的を見失い、興味を失ってしまう。


--------------------
<問題2:応用力がきたえられない>
だれがIf文をつかって「この変数の値は10です」と表示するプログラムを作りたいと思うだろうか?
そしてこの例から、何かプログラミングの可能性を感じられるだろうか?

比較演算子を使うことで、自動的に比較できるんだなとはわかるが、それをどのように応用できるかを考える前に次のステップに進み新たなことを学び始める。
多くのテキストは、その応用性をきたえることには、あまりページが割かれていない。
せいぜいそこでならったことの例が一つ二つあるぐらいだ。

このために、初級レベルの学習過程では、新しい知識をどんどん吸収することばかりに、時間が割かれ、創造力を使うチャンスがあまりなく、自分の仕事にどのように結びつけることができるかわからないまま勉強が進んでいく。

そして、ある程度知識を詰め込んだら、「では、自分でプログラム作ってみよう!」ということになる。そこまでにひとつひとつならったことをどのように応用すべきか真剣に考えて来た人ややりたいことが明確な人ならそれでいいだろう。

しかし、「プログラミングに何ができるのか知りたい」という動機で勉強しているのなら、「いきなりいわれても。。。。」となってしまう。
習ったことを自分の仕事に関係づけて、何に、どのように応用して良いかわかない。

応用力をつけるために、いままで推奨されていることは、
1)例の中にあるコマンドや、数値を少しかえて応用してみる。(応用力は、少しだけ求められる)
2)他の人のつくったプログラムを読む。(多くの場合、数ステップ上の作業であり、知らないコマンドや関数がたくさんでてきてそれを理解するのにも時間がかかる)
3)とにかく、ヘルプとにらめっこしながら、たくさんプログラムを作る。

といったことで、「即座に解決できる物ではない」というのが通説だ。


--------------------
<プログラミング作業を分析してみた>
プログラミングの学習を行っている間に、限界にとらわれず、想像を自由にふくらませ、応用力を高めることはできないか?

プログラミングの実際の作業は
0)アイデア
1)実作業に何がつかえるかをみつける。
2)実作業を分析し
3)アルゴリズムを考え
4)プログラミングし、(ここではコーディングのステップのこと)
5)デバッグする。
6)それを使う。
という過程を通る。


いろいろなコマンド、関数、文法を間違えることなくつかえるような細かなルールを身につけることは、実はデバッグのステップで主に必要とされることのではないかと思う。

「プログラミングで何ができるのか知りたい」という段階では、デバッグにわずらわされていると、自由に発想をふくらませることができなくなる。


「プログラミングに何ができるのか?」、「自分の仕事にどのように生かせるのか?」それらを知るには、
何かを習っている、そのときに生まれてくる発想を大切にしなくてはならない。

その段階では自信はなく、「このように使えるのではないか?」「こうできるのではないか?」というアイデアにすぎない。

それを実際に、使えるようになったときまで細かに覚えておくことは難しいし、
そのときの感情的なフィーリングは失われる。
(それを文章化することで、将来のためにそのアイデアを残しておくことはできる。)

そもそも、そのアイデアを表に出して検討しないと、「プログラミングで何ができるのか?」を知ることは出来ないと思う。

実現するには、それを実作業にあてはめ、使えるかどうか確認することが不可欠だし、それがプログラミングの応用力というものだと思う。

それには、実作業に「何がつかえるか」をみつけ、
実作業の分析をし、アルゴリズムを考える必要がある。
それは最終的には一つ一つのコマンドや関数、変数レベルにまで落とし込めるが、最初は概略でもよいと思う。

そのあとにプログラミングとデバッグの作業がくる。

プログラミングをするには、たしかにプログラミングとデバッグができなくては、ちゃんと動くプログラムは作れない。
しかしプログラムを作るために発想し、ラフなアルゴリズムを考えるという作業は、プログラミングとデバッグができなくても、可能だ

エラーがおこるかどうかは、この時点ではあまり関係ないとも言える。

もちろん、通常はプログラミングの過程でエラーがあるなら、アルゴリズムを考えるレベルまで戻ることもあるが、ここではラフなアルゴリズムを考えるところまでのとどめる。


--------------------
<解決策>
どのようなことができるか考えてみた。
大切なのは、初心者レベルで
「プログラムに何ができるのか」を知ることであり、
「アルゴリズムを考える力」(応用力)を身につけることだ。

勉強している間にひらめいたアイデアを書く。
実作業でどのような「プログラム/スクリプト」を使うことができるか考えてでてきたアイデアを書いておく。
いま習っていることが、実作業にどのように役に立つか考えて書き留める。
完璧には無理でも実作業をプログラミング的に分析して、考える。
フローチャートを作って、アルゴリズムを考える

といったことは可能だが、実際に簡単なMelスクリプトを作るときにフローチャートまで書く人はそれほどいないだろう。


そこでプログラミングの勉強中に、もっと簡単にできるようにと考えたのが、以下のような方法だ。

if (A<10)>
スフィアを右へ移動する。
}

と言う風にプログラムの中で、自分のやりたいことをそのまま書いてしまう方法。

目的とすることをそのままプログラム内に書いてしまうので、なんとなく目的にあったプログラムを書いた気分が味わえる。w

スフィアのどのアトリビュートをどの軸上でどのぐらい移動するかという
「具体的で細かなこと」は考えない。
それはもっと細かなアルゴリズムで、プログラミング言語に自分をあわせる姿勢であり、自分の発想を失わないようにする姿勢ではない。

これはある意味、数学やプログラムにおける「抽象的な記号論的おきかえ」
を利用したものだ。

もちろん文法的にはエラーになる。

しかし、どうせ習ってもいないコマンドや関数をヘルプとにらめっこしながら書いていってもエラーは起きる可能性が高い。 

それにそれを直すのはデバッグの作業で、
「プログラムで何ができるのか」をみつける作業ではない。


これは自分が分析し、みつけたアルゴリズムを、具体的なプログラミング内のどこに位置づけるかという練習になる。
何より、知識が不足していても発想を妨げない。
「文法」、「初心者」と言った規制にとらわれず、「アルゴリズム」も自分にあったレベルでよい。

自由に自分の考えを展開できる。

習ったことが増えてくれば、できるところは、ちゃんと書くようにすればよい。

他にも
「パーティクルが煙のように舞い上がる。」
「雨が、はじかれる」
「車が爆発する」
「おもしろいメッセージを出す」
「赤い色が点滅する」
というふうにいろんな表現が可能だ。


どのようにおおまかな表現でもよい。
そのとき生まれた発想を大切にすればよい。

必要ならあとで、さらにこまかなアルゴリズムにかみ砕いていけばよい。



これを記述するのに、コメント「//」を使うと、
あとで、どの位置にその記述内容がくるべきかを見つけるのに注意がとられて創造性にストップをかけてしまう。
また本当のコメントと混同してしまうことも考えられるのでコメント//を使わないことにした。

2月24日追記:

コン基礎の教え方の宝庫(7) 堅苦しいアルゴリズム研修を盛り上げる

ITエンジニアがアルゴリズムを考える場面が、大きく分けて2つあることも説明しておきましょう。
1つは、プログラムのアルゴリズムを考えることです。
もう1つは、業務のアルゴリズムを考えることです。

「ラフなアルゴリズム」という書き方をしていたが、「業務のアルゴリズム」という風にいいなおしたほうがより適切な表現かもしれない。
自分の業務(CG)を考えながらプログラミングをするということだから。


2009年2月22日日曜日

ハーフライフ実写版

カナダのポスプロが技術と市場性のテストをかねて、つくったショートフィルム。
現在はPart1のみだが、すでにPart2まで制作されているとか。

CMをメインでやっているプロダクションで現在は映画もやっているらしい。
さすがにカットや、編集やCGの技術力は高く、全体としてまとまっている。

あえていうなら、カメラの動きに落ち着きがないので、自分の感覚では、CMぽさを感じてしまう。
「ボーンアルティメイタム」のように手持ちカメラの手法を全体に使った映画もあるが、そこまでのアクション性を感じないので、どこかでもう少し落ち着いたカメラの動きがあれば、静と動のアクセントができたような気がする。



CGは、よくできているが、クォリティーは、TVっぽい。
おそらくレンダーファームの不足、クオリティーをつめるための時間の不足などもあるのだとおもわれるが、いまひとつ実写となじみ切れていないような感じ。
ゲームのプリレンダー・ムービーのような感じだ。

ゲームマシンはもっていないので、ハーフライフはやったことがないが、もし映画になるならみてみたいと思った。

論理演算 (4) 重要事項

ここでMayaヘルプ「値の検証と比較を行う」を再度見直してみた。

ここの表では、
「比較演算子」には「評価」
「論理演算子」には「Trueになる条件」
という項目がそれぞれある。

これは前回の「論理演算(2)AND/OR」で少し紹介した、

Electronic Journal1671号(ブール代数とクロード・シャノン)の説明における「C」にあたる。

第1は「AND演算」です。
「A AND B = C」という数式について考えます。
これは「~かつ~」という意味になります。
論理学的な言葉でいうと、「Aが正しくかつBも正しいときだけ、Cも正しい」ということになります。


第2は「OR演算」です。
これは「~または~」という意味になります。
同じ数式について考えると、「AかBのどちらかが正しければCは正しい」ということになります。


ここであえて、この点を強調したのは、
通常、論理演算を考えるとき、AとBの結果と考える。
実は結果としてCの状態が変化したり変化しなかっりするだけで、
A,B,Cはいつもそこに存在している。


比較演算子や論理演算子を使うときに、結果Cについては頭で推測するだけで、
わざわざプログラムの中に書いたりはしない。(変数へ結果を代入することはあるかもしれない)
眼にはみえないが、存在しており、プログラムの実行には大きな影響をあたえるにもかかわらずである。

デバッグにおいて、重要なことだと思うが、
それらの演算子を使うとき、かならずその結果がTrueかFalseで存在している
ということを忘れないようにしたい。

できればちゃんとその結果を紙にでも書いて、しっかり確認することで、プログラミング作業において、
自分がその演算で今何をやっているのか、
結果がどうなるのか
をしっかり把握しておくことができる。

--------------------
「if...else」の説明にあるMelの例で考えてみる。
(ここでは変数に代入しプリント文は簡略化してある。)

---------------
$x = 20
if ($x > 10) {
print("It's greater than 10!");
}
---------------
これによりPrint文が実行されることになる。

ここで比較演算子の式に注目すると

$x > 10


20 > 10
である。

文章にすると「20は10より大きい」
そしてこの評価は「True」である。

それによりIF文がTrueとうことで、括弧内の
print文が実行されることになる。


もし、評価がTrueであるかどうかを明確にしないと、
いろいろなことが推測の上で考えなくてはならなくなり、
考えることが増える。
この場合は単純なのでそれほどでもないが、もっと複雑なスクリプトでは
混乱を招くことになるだろう。

2009年2月21日土曜日

論理演算 (3) なぜANDは論理「和」ではないのか? その2

昨日は、ANDとORについてそれぞれ以下のことがわかった。

(OR/論理和)
それは計算式においては、二進数の足し算であらわされる

(AND/論理積)
計算式ではかけ算(積)で表現される値と一致する。


これについて、「スピッツとメンボーズと八神健の集合住宅」というホームページの
「C言語プログラミング教室」から「ビッド演算」というページにさらっとかかれていた。
(論理積(AND)と論理和(OR)について述べてあるところ。)

AND/論理積: (&演算子の作用は,代数演算の積と似ていますね)
OR/論理和: (|演算子の作用は,代数演算の和とにてますね。ただし,1|1が1となるところだけが異なります。)

ネット上で、ANDやORについて調べると大体このあたりの説明は省略されていることが多くてすっかり忘れていたが、以前、論理回路の勉強を本でしたときは、そのような説明があったように思う。

論理演算 (2) なぜANDは論理「和」ではないのか?

論理演算を勉強していると、不思議に思うのが
ANDが「論理」で、ORが「論理」となっていること。

逆じゃないのか?と思う。
特にANDはどう考えても自分の感覚では「AND」=「プラス」、すなわち「論理和」である。


こんなことを考えるのは自分一人かと思っていたら
若干ポイントは違うが、同じような疑問を持った人がいた。

2つの条件PとQがあったときに‥
Pに当てはまるグループと、Qに当てはまるグループの
両方合わせたグループを、PとQの「論理和」と言います。
「P or Q」とか「P または Q」と表現します。

自然言語の場合は‥ and を使うような気がします。例をあげると
英語だと"Ladies and Gentlemen"。
日本語だと「Pの皆さま ならびに Qの皆さま」。
(アジャイル日記 and/or より)


wikiでも「論理和」の説明で日常会話の言葉との違いにふれている。

二つの命題 P, Q に対する論理和を P ∨ Q と書き、「P または Q」と読む。
後述のように、日常会話における「または」とは意味が異なるので注意が必要である。

日常会話において「または」と言った場合、排他的論理和を意味する場合が多い。
例えば、レストランにおいて「コーヒーまたは紅茶が付きます」と言えば、
通常どちらか一方のみであることを意味する。


--------------------
やっぱり変?? 「OR」は「+」? なんで?

論理式を表現する記号として、+(プラス、またはオア)や・(ドット、またアンド)を用います。
第3章 論理関数(その1)

ややこしいのでまとめてみた。
「AND」/ 「論理積(Logical conjunction(結合))」 「・」 「積集合(Intersection)」
-----------------------------------------------------------------------------------------
「OR」/ 「論理和(Logical disjunction(分離、離接))」 「+」  「和集合(Union)」

(ANDの記号は「*」のほうが適切な気もするが、数学でも基本的に積は「・」が使われるらしい。)

どうやら英語から日本語への翻訳課程での違いではなく
英語でも記号表記に食い違いが見られる。
(すでに「AND」は「+」ではなくなっている。)

この食い違いは、
日本語だと、
AND - 論理積
OR - 論理和

でみられるが、
英語では、その部分には食い違いはなく、「積集合」「和集合」の部分で、はじめて違いが表れる。

もしかしたらそこに謎を解くかぎがあるのかもしれないが、そこはさておき、
とりあえず、いまある疑問。

疑問1) 「なぜANDなのに「論理積」なのか?」
疑問2) 「なぜORなのに「論理和」なのか?」

AND=「論理和」=「+」
とうことならすべてすっきり!納得!!なのだが...。



--------------------
英語と日本語?

英語で見ると「AND」は「論理積」を意味する「Logical Conjunction(結合)」であり、
意味的な違いはみられない。
でも「積集合」の英語は
「Intersection(交点、共通集合)」と食い違いが出てくる。

要するに「AND」=Logical Conjunction 
<-> Intersection、 「・」
という対応になっている。

「OR」でも同様に、「OR」=
「Logical disjunction(分離、離接)」と意味的に一致するが、
「和集合」の英語は「Union(結合、和合)」という具合に食い違う。


Wikiでそれぞれの定義を見ると、
論理積(AND)」は 「数理論理学において論理積(ろんりせき)とは(以下略)」
積集合」は 「数学において、集合族の積集合(以下略)」
(注
数理論理学とは、論理を数学によって研究する学問である。記号論理学とも言う。(wiki)

というふうに、その定義する学問の領域がことなっている。
「AND」「Logical Conjunction(結合)」は記号論理学の範疇であり、
「Intersection(積集合)」は数学の範疇である。

ようするに対象とする物は同じでも、
それを分析する学問の範疇がちがい、見る角度が違うことで、
違う名前になってしまったのだろうか。


また、おそらく日本にこの論理演算が輸入されたときには、
すでに、「Logical Conjunction」は「Intersection」と同意ということで、記号も「・」が使われていたはず。
英語から日本語に訳すときに、直訳するよりもこの点に留意して「論理積」と意訳されたのかもしれない。

このことは「論理和」にもあてはまる。

結果的に日本人になじみのない「AND」と「OR」という英単語が一人歩きするだけですみ、
日本人にとって、混乱が少なくなかったかもしれない。

以上は、言葉上の違いの原因を探った物で、
ANDの記号が「・」を使い、ORの記号が「+」
を使う理由は、未だに不明だ。


--------------------

AND、「積集合」

与えられた集合の集まり全てに共通に含まれているような要素を全て集めることにより得られる集合のことである。(wiki)

たとえば、与えられた集合が「A」と「B」とすると、「Aと(AND)Bの両方に含まれる要素からなる集合」
ということである。

これは、二進数の計算結果
0x0=0
0x1=0
1x0=0
1x1=1
と一致する。

ここで、Electronic Journal1671号(ブール代数とクロード・シャノンの説明を引用したい。
第1は「AND演算」です。
 「A AND B = C」という数式について考えます。
これは「~かつ~」という意味になります。
論理学的な言葉でいうと、「Aが正しくかつBも正しいときだけ、Cも正しい」ということになります。

よくある「AND」の説明は「AかつB」という説明しかないが、
この説明には「C」という要素がふくまれている。
ANDは演算なので、使えばかならずその結果がある。
そのことを思い出させてくれる、よい説明だと思う。
そして「論理学的には」、このような説明になると言っている。

ようするに「AND」というのは、論理学における英文章からきていて
それを数学的に表現すると「積集合」になり、
その両者をあわせた論理数学では、ANDは論理演算的「積」になるということではないか?


--------------------

和集合(wiki)
二つ以上の集合の集まりに対して、それらのいずれか少なくとも一つに含まれているような要素を全て集めることにより得られる集合のことである。

これは、Aまたは(OR)Bのどちらかに含まれる要素からなっている集合」とういことである。

二つの集合が交わているところでは、AまたはBのどちらかをとるので「OR」といえる。

これを二進数の式で表すと
0+0=0
0+1=1
1+0=1
1+1=1
となる。

論理和では1+1=1と論理演算独自のルールにしたがった「和」である。


ここで、先ほどのElectronic Journal1671号(ブール代数とクロード・シャノン)をみると

第2は「OR演算」です。
これは「~または~」という意味になります。
同じ数式について考えると、「AかBのどちらかが正しければCは正しい」ということになります。


「OR」は「どちらか」という意味で、文章で表現すると上記のように「か」で合っている。
ただWikiでも述べられているが、文章の「か」は、どちらかひとつにみを選択することを意味する。

日常会話において「または」と言った場合、排他的論理和を意味する場合が多い。
例えば、レストランにおいて「コーヒーまたは紅茶が付きます」と言えば、
通常どちらか一方のみであることを意味する。


しかし、上記の説明はそのすべての矛盾を解決している。
「OR(または)」の使い方はそのままで、「C」が正しい(True)ということを意味する。
ようするに論理的な文章では、「OR」の使い方は間違っていない。
ただそれをそのまま記号的に論理演算の名称としたのはWikiにもあるように矛盾を連想させ、
適切でなかったかもしれない。




--------------------
自分なりに考え見たが、疑問に対しての答えは、以下の結論となった。
(2月21日に改訂したので改訂後を「新」とし、改訂前を「旧」とした。)

疑問1) 「なぜANDなのに「論理積」なのか?」
疑問2) 「なぜORなのに「論理和」なのか?」

答え(新):
AND、ORはその論理を文章であらわしたとき 意味はあっている。

その論理は、二進計算での「積」と「和」の結果と一致する。
ただし「和」については論理演算独自のルールがあるので、論理積、論理和という言葉 になる。

集合として考えたときに、「AND」は交点(Intersection)、「OR」は結合(Union)である。
「AND」はともかく「OR」は「+」と表現しても意味的に問題はない。


結論として、「AND」は論理を文章表現したときのその文章に含まれる単語で、
論理演算で表現するときには「論理積」となり同じ現象を異なる学問の分野で違った表現をしているために違う言葉となっている。
簡単に言うと、それぞれの単語は、異なる学問分野での表現の違いからきている。
意味的には同じ物を示している。


答え(旧):
要はそれぞれの言葉、記号を使うときの着眼点が違っているとういこと。
同じ事を表現しようとしているのだが、どこに着目するかで、異なる表現となってしまっている。


いろいろな論理演算の説明では、
こういったことばの定義の微妙なくい違いが説明されていないため、
細かな違和感がかさなり論理演算の理解がしづらくなっているような気がする。
それがプログラミングを習得するための敷居を高くする一因になっているのかもしれない。

論理演算 (1)

今日からしばらく、論理演算について勉強していくことにした。

プログラミングでは条件分岐が核となるということを以前につきとめたが、
(あくまで持論であり真偽は不明)
その中で、演算子は重要な役割をはたす。

Mayaヘルプの「値の検証と比較を行う」にMelで使われる演算子が表になっているが、
そこでも「論理演算子」がその一部となっている。

また先日の調べもののとき、見つけた「ITpro 5分で覚えるIT基礎の基礎
でも言われているように論理演算の習得はプログラミングにおいて必須のようだからだ。

プログラミング言語をマスターするには,論理演算を理解する必要があります。
論理演算が分からなければプログラムを作成できない,と言っても過言ではないでしょう。


Gihyo.jpの「はじめMath!Javaでコンピュータ数学」で
この論理の数学を学ぶことについて、もう少しその重要性を説明していた。


なぜプログラマが論理の数学を学ぶ必要があるのでしょう。
それは,論理の数学がプログラムの構造・動作を決定したり改善するのに役立つからです。

プログラムの骨組みとは論理構造です。
論理の数学は,理にかなって無駄がなく,美しいプログラムの骨組みをつくるために役立つのです。


--------------------
まず、細かなことを追求していく前に、論理演算の概略をつかんでおこうと思う。

論理演算と四則演算の大きな違いは,
論理演算が2進数の1けた(=1ビット)を対象としていることと,
演算結果が決してけた上がりしないことです。

論理演算は,2進数の1けたを対象として演算結果がけた上がりしないのですから,
0または1だけを演算し,その結果も0または1のいずれかになります。

複数けたの2進数で論理演算を行うこともできます。
ただし,論理演算はけた上がりをしないのですから,
複数けたの論理演算とは,1ビットごとの論理演算を複数同時に行っているのに過ぎません。


ここで重要なのは、
「論理演算は二進数の一桁を対象とした演算で、桁上がりしない。」
ということである。

ただしこれは、純粋にその計算を見た場合の最小単位で起きることであり、
おそらく実際のプログラム内では、もっと異なる対象を演算しているようにみえると思う。


つづけて「第二回 AND,OR,XOR,NOTの意味と使い方の総整理」をみてみた。

コンピュータは,あらゆるデータを数値で表します。

それなら,コンピュータは数値に対する四則演算だけができれれば十分なように思えます。
ところが実際には,そうではありません。

コンピュータは,本来なら数値でないデータも数値で表すからです。
このようなデータを演算する場合には,論理演算が大いに役に立ちます。

例えば,赤色と青色を混ぜ合わせて紫色というデータを得るには,赤色と青色でOR演算を行うことになります。
個々の論理演算の用途は一つに決まっているわけではありません。


そしてこのページのまとめは以下の通りだが、
それぞれの詳しい説明は一度このページを読んだほうがいい。

AND演算は「かつ」を表すもので,データをマスクするために使います。
OR演算は「または」を表すもので,データをセットするために使います。
XOR演算は「排他」を表すもので,データを部分的に反転するために使います。
NOT演算は「否定」を表すもので,データを全体的に反転するために使います。


第五回 真と偽の論理演算」ではさらに使い方についての説明があった。

If文の「もしも○○なら」の部分に複数のチェック条件を置くこともできます。

この場合には,個々のチェック条件を論理演算でつなぎます。

リスト3は,「もしも入力した値が100より大きくかつ 200より小さいなら,
メッセージ・ボックスを表示する」というプログラムです。
ここでは,And演算が使われています。

この場合には,個々のチェック条件の真偽に対して論理演算が行われるのです。
If a > 100 And a <>
「もしもa > 100というチェックの結果が真で,かつ,a <>
という意味です。


ここで、1ビットの計算を行うという点においては、具体的な演算だが、
最後の例ではA and Bのような、抽象的な概念を演算対象としている。

こういった抽象的概念への応用がほかにももっとあるなら
それを学習した方が、プログラミングには役に立つのではないか?


--------------------
メモ:

このページには、「比較演算」に関することで重要なこともかかれていた。

a > 100やa <>
意識していないプログラマが多いのですが,比較演算も演算の一種なのですから,
必ず演算結果の値を返します。
比較演算の結果は,真または偽のいずれかになります。

2009年2月20日金曜日

リンク

良いサイトがみつかった。

高校数学について、とてもわかりやすく説明してあり、
将来、いろいろなプログラミングの基礎となる数学を学ぶには良さそうである。


大学数学へのかけ橋!


ここにある本の第一章(pdf)を拾い読みしてみた。

pg5
なお,デカルトは数を表すのに,先ほど見たように,
文字 a, b, c などを用い,
文字によって数の演算を表現しました。
文字を使うと,特定の数でなく,どんな数でも表すことができます。
したがって,それらに共通する基本的な計算規則を明らかにし,
数の性質や方程式の解法を組織的に研究することが可能になりました。

これは「変数」の定義にもあてはまるのではないかと思う。。

また、ブール代数の例などを挙げ、

数学は,記号や数の意味を柔軟に解釈すれば,幅広い応用が可能になる(pg22) 

としている。
まさにプログラミングでは、記号に対しての柔軟な解釈がなされ幅広い応用がされている。

考えてみると、高度なプログラミングを行うようになると数学の知識は不可欠。
どこかで数学の基礎を勉強し直すことが必要になるだろう。

ちょっと脇道にそれるが、数学の基礎についての他のホームページを
上記サイトのリンクからたどってみた。


数学の散策路

ここで「数学トレッキング」というページにいろいろな数学の基礎知識がわかりやすく説明されている。
まず、そのなかの「26_数学は抽象化の学問」を読んでみた。

以下に、いくつかおもしろそうな記述を抜粋してみる。

しかし”3”は”さん”を表す記号であって”さん”そのものではありません
本が3冊,犬が3匹,人が3人…,から本・犬・人の固有の概念を取り去れば,
3と言う共通したものが残ります。これが抽象化です。

ところが中学校になると文字が登場致します。
「数に代わるもの」いわゆる「代数」です。
この文字は「数をさらに抽象化」したものです。
例えば,(-2)×(-3)=2×3,(-4)×(-5)=4×5を抽象化すれば(-a)×(-b)=a×bになります。
数字での計算はできるが文字になるととたんにわからなくなる人が多いのも,抽象化が一歩進むためです。

なるほど、そうだったのか。
たしかに抽象化して具体性がなくなることで、なにがいいたいのか把握しずらくなってくる。
そしてさらに記号(例:∧ ∈ ∩ f ≒)が増えていき、その定義付けがはっきりしていないと
そこで混乱が始まり、数学離れがはじまるのだろう。

プログラミングでは、
この記号と、関数、それを扱う文法、など決まりだらけ、そしてほぼすべてが抽象化されている。
初心者で、そういった抽象化を扱うことになれていない人は、とっつきにくくなるのも
当然かと思う。


また、演算についてものべているページがあった。
32.数学の出発は演算から

「演算」と言うと誰もが思い浮かべるのは加減乗除の四則演算でしょう。
数学で言う演算はもっともっと広いものです。
原則的には「あるものにある操作をすること」はすべて演算になります

ただし何でも演算になるわけではありません。
「あるものに同じ条件で同じ操作をしたとき,いつも同じ結果が(原則として)ただひとつだけ決まる」と言う約束があります。

このホームページには
「論理」の散歩道というページもある。
論理学を勉強し直すときには是非よんでみたい。

就職活動 (2)

D社の知り合いを頼ったみたが、現在進行中のプロジェクトでは人がたりていて、募集しているのはT***2だが、そちらもHoudiniアーティストしか募集していないという。
D社ではMayaはモデリングにしか使わないとか。。。。

2009年2月19日木曜日

演算子 (番外編1) 写像

「演算」、「四則演算」、「二項演算」とかの用語をWikiなどで調べていると「写像(mapping)」ということばに頻繁に出くわす。

すぐにそのリンクへ飛んで、その説明を読んでみるが、
いろんな数学的な記号がでてきて、すぐにリタイア。

ちゃんと理解するのは難しそうだったので、いままでスルーしてきたが
「演算」の定義にも深く関係している。

それに、
写像は集合とともに現代数学の基礎となる道具の一つである。
現代数学のほとんどが、集合と写像の言葉で書かれているといっても良いほどである。
wiki)


ということなので、そろそろ、本腰を上げてしらべておいたほうがよさそうだ。

写像とは「像を写す」ことつまり鏡のようなものですね。
代表的なものが、狭い意味の写像の、関数ですね。
2X+5という写像は、たとえばX=3という点を11というところに写し出す鏡です。
(Yahoo知恵袋「写像」とは

Xからyへの変換を考えます。
この操作を写像と呼びます。
ここで、yが実数や複素数なら、
この写像を、関数と呼びます。
はてなQuestion


ここで思いがけずひろいものがあった。
写像の説明はまさに「関数」だ。

これは数学の「関数」の説明だが、
x (input) → 機能f (function) → y (output)
という説明は、プログラミングの「関数」でも同じだ。
(「関数」はCやJavaでも出てくるが、Mayaでもcos、angleなどの関数がある。)


また、「写像」は「集合」を扱うことでもあるらしい。

写像(しゃぞう、mapping, map)とは、二つの集合が与えられたときに、
一方の集合の各元に対し一つずつ、他方の集合の元を指定して結びつける対応関係のことである。
wiki)

確かブール代数でも集合を扱うので、なんらかの関連があるだろうし、
コンピュータとの理論的な親和性も高いことが考えられる。


おもしろいのが、写像は英語では「Mappingもしくはmap」であるということ。

これをUVマッピングのしくみで考えてみた。
UVマッピングでは、まず画像があり、
そこにUVと呼ばれるオブジェクトの展開図がある。
UVと実際のオブジェクトのサーフェイスは位置情報が一対一で対応している。
結果として、オブジェクト上の対応した一にもとの画像が表示される。

元の画像を「集合A」
オブジェクト上に表示された画像を「集合B」
とするとUVレイアウトは、その対応関係を示しているので、「写像」ということができる。
まさに目に見える「写像」である。

演算子 (2) その定義

今日は「演算子(operator)」の定義と語源を探ってみた。

まず「演算子」の意味。

各種の演算をあらわす記号のことである。(wiki)

コンピュータプログラミングにおいて、演算内容を指示する記号などのこと。
演算の対象となる値や変数などは「被演算子」または「オペランド(operand)」という。
(e-Words)

以上で、演算を表す記号と言うことはわかったので、もう少し踏み込んでみたい。


--------------------
「演算子」は「演算」+「子」の二つの言葉から出来ている。

まず、「子」だが、

小さな塊、一単位の意味でも用いられる。
粒子・分子・原子・陽子・電子などがそれ。
(用語・"子"という字

「子」というのは、「演算子、」「識別子」などのように、
ある性質を持った部分文字列のことでしょう。(教えてgoo


「子」は、一単位としてカウントできる一群の文字列ということらしい。
演算を表す最小限の文字列、それが演算子ということでいいだろう。


--------------------
次に「演算(operation)」の定義は:

演算とは、加算や減算、比較といった計算処理のことである。
四則演算(加算・減算・乗算・除算)・比較演算・論理演算などが演算に含まれる。
演算はコンピューターの五大機能のひとつとして数え上げられる。
IT用語辞典バイナリ


実はwikiで調べると「演算」は「算法」へ転送されてしまう。
そして意味は、

1. 計算機科学の分野でアルゴリズムの訳語として用いられる。

ということでアルゴリズムと言うことになってしまっている。

このページの下の方に「命名について」という項目があり補足がされている。

「算法」は「計算の規則」あるいは「計算の方法」を連想させ、「演算」は「計算を演ずるという行為」を連想させ、ともに「写像」としての「算法の概念」を連想させにくい。

意味的には同じだが言葉自体は、若干イメージのわきにくい言葉になっているようだ。

ここで、「演ずる」とは当然ながら「劇などをおこなう」ことではなく、

(2)ある役割をつとめる。はたす
三省堂提供「大辞林 第二版」

「演」という漢字の由来は、
「水+寅(まっすぐのびる)」の会意兼形声文字で,引くまたはのびるの意。
 演説の演は長く引き延ばして説明すること。
はらきんHP 漢字の由来

というふうに、「演」とは「何かをのばす」ことからきて、「時間をかけてなにかをする」ことに用いられているようだ。

そこから考えると「計算を時間をかけて行う」これが演算の意味ということでよいだろう。

ちなみに「算」の由来は
:「竹+目(算木=数え棒?)+廾(両手)の会意兼形声」で、竹でできた算木を両手で数えるさま


--------------------
こうしてみていくと
「演算子」とは、「計算」という行為を表現する最小単位ということになる。

1+1=2だと「演算子」は「+」と「=」だ。
(もっと正確に言うと、「+」は算術演算子、「=」は関係演算子 とうことになる。)


「1」と「2」は、数字であり、それだけでは計算は意味しない。
「+」記号は、それだけで、足し合わせるという「計算」を表現している。

ようするに「+」記号は「計算」という行為を表現する最小の単位ということになる。


「演算子」には、上記の「算術演算子」、「関係演算子」に加え、「論理演算子」がある。
それぞれの詳細はまた別の機会に調べてみたい。

ちなみにMayaのヘルプでは「関係演算子」が「比較演算子」と表記されている。


またプログラムと数学では「演算子」の種類やルールに若干の違いがある。

独自の演算子。(例:if-elsを意味する「?:」演算子。割り算の余りを求める「%」演算子)
数学とは表記が異なる。(例:平等を表す「==」演算子)
数学より機能が拡張してる。(例:「+」演算子で二つの文字列を連結。)
数学とは機能が異なる。(例:「=」で代入)


最後にITproで見つけた記事より:
コンピュータの世界では,計算のことを演算と呼びます。
コンピュータにできる演算の種類には,
数学の加減乗除の四則演算の他にもいくつかの種類があります。

その中でも,いかにもコンピュータらしく,かつ,よく使われるのが論理演算です。
Basic,C言語,Javaなど,何らかのプログラミング言語をマスターするには,
論理演算を理解する必要があります。
論理演算が分からなければプログラムを作成できない,と言っても過言ではないでしょう。

ということだ。
確かにコンピュータは、引き算でさえ、回路的には論理演算で行われており、
論理演算は、その基本的な部分だけでなく、広く応用されていると思う。

論理演算をぜひマスターできるように頑張ろう。

比較演算子 (2) :メモ

比較演算子のヘルプについて

(5 == 10) 5 は 10 と等しい
(5 != 10) 5 は 10 と等しくない
(5 <> 10) 5 は 10 より大きい
(5 >= 10) 5 は 10 以上である
(5 <= 10) 5 は 10 以下である

右辺が、基準値。
左辺は比較する値。

「基準」:物事の判断の基礎となる標準。

演算子 (1) 「=」

比較演算子の下記4つは、二つの記号が組み合わされている。
== != >= <= 「=」に「!」や「<」、「>」の記号が加わって、二つ一組で新たな意味を生み出している。 「=」は単体ではどのような意味があるのかを明確にすれば比較演算子の理解も深まると思って 「=」を調べてみることにした。 プログラムでは「=」記号は、「代入」を意味する。 数学では両辺が「等しい」という意味をもった「記号」である。 プログラムの入門書では、「=」には数学の「等しい」という意味ではなく、代入を表す「記号」という説明がされている。 しかし、本当に「等しい」という意味は完全に失われているのだろうか?
コンピュータ工学は数学から発展してきて、しかも同じ記号をつかっているのに、
オリジナルの意味を完全に失っているとういことがありえるのか?

完全に異なる定義なのに同じ記号を使っているのは、混乱を招く。
「代入」しか意味がないのであれば「←」といった記号を使った方が混乱は少ない。
(APL(Aプログラミング言語)ではそうらしい)

同じ記号を使っている限り、その底辺にながれる意味は、オリジナルの「等しい」ではないのか?
また、同じ記号が「代入」で使われているのは、そのオリジナルの意味を失いたくないからではないのか?


まずは、wikiで「等号」をしらべてみた。

歴史から見ると
ロバート・レコードという数学者によって1557年に発明された記号と言うことになっている。

それについてもう少しくわしくのべているページがあった。
計算記号の話
ブログ コンセントの穴: 平行線

ロバートは「世の中で平行線ほど等しいものはない」と考えてこの記号を考案した。
同じ角度で同じ方向を向いている平行線。
角度が違う二つの線は進むにつれて近づいていくことはあるが交わった後は必ず離れていく。
お互いの距離はどんどん遠ざかる。
でも、平行線はその間隔を絶対に広げない。
同じ方向を向いているのだから。
世の中にこれほど等しいものはない。


これらを読んでみると、数学では「左辺と右辺が等しいことを示す」ということで使われているが、
もともと「=」記号自体は純粋に「等しい」を意味している。


プログラミングの「代入」においては注意すべき点がある。
数学における「変数」は、同一式内においては右辺にあっても左辺にあっても同じ値と考えられているが、プログラミングでは同一になるとはかぎらない。

たとえば、
a=a+1
ここで、両辺の変数「a」は同じ物を意味しているわけではないということ。

ようするに、プログラミングにおいて、この式は
b=a+1
といいかえることもできる。

「変数a」は、右辺、左辺で、独立しており関連性はない。
右辺の「a」を仮に「5」としても左辺は「5」になるとは限らない。
これは数式のルールとは異なっている。


これが原因で「数学のイコールとは違う」と説明されるのではないだろうか?

プログラミングと数学では、
右辺と左辺で使われる変数(記号)について解釈の違いがある。


ここで、簡単にまとめると、プログラミングにおける「=」は、
1)左辺と右辺の「価値が等しい」ことを意味する。
2)左辺と右辺で使われる変数記号は独立しており、同じ文字(記号)であっても値に同一性はない

b=a+1
でもう一度みてみると
左辺「b」と右辺「a+1」は「価値が等しい」ので、
左辺「b」の中身は「a+1」でなくてはならない。

結果的に「代入」が実行されたことになる。


ついでに「代入」を調べると、wikiでは、
1. 数学における代入。式や関数に含まれる文字や変数を、数や他の文字や式で置き換えること。
2. プログラミングにおいて変数とデータ値を関連づけること。変数 (プログラミング)を参照。



「代入」についていろいろと調べようとしたけど、話が哲学的になりすぎて、自分の知識と知恵ではとても処理しきれないのと、今回は「=」が主題なので今日はここまで。

メモ:
左辺値と右辺値について
数学の左辺、右辺の定義とはことなる。

「=」を使う代入式は
「(左辺)は(右辺)である。」という表現にかえることができる。
これは左辺と右辺が同一の意味を持っているということになる。


「代入」とは、ある内容を別の形態で表現すること。
記号論で言う「記号」の定義でもある。

2009年2月18日水曜日

時間設定変更

ブログの設定で、時間を「太平洋時間」に変更したので、これで投稿時の正確な時間が表示されるようになった。
後で読み返すときに、どのぐらいの時間に勉強してたかわかるのでこのほうが良い。

Bloggerの時間設定には「昭和基地」という選択もあった。
それを選ぶ人はそれほど多くはいないとは思うが、「昭和基地」が選択肢に含まれるほどにまでにコンピュータとインターネットが普及したということだろう。
時代の移り変わりを感じる。

就職活動

前回のI社は面接までいったものの、結果としてダメだったが。
D社の知り合いをたよりに、リクルート部門に推薦していただけることになった。
ただ、通勤時間が長いので、もうひとつのD社も知り合いをたよりに応募してみようかと思っている。

相互リンク

タケチューさんのブログ「CGトラッキング」に相互リンクしていただきました。
タケチューさん、ありがとうございました&よろしくお願いします。

2009年2月17日火曜日

比較演算子 (1)

最近、Melのヘルプを少しづつよみすすめているが、
今日は、プログラミングの要、条件分岐の重要な要素である「比較演算子」を理解するためにいろいろと調べてみた。

比較演算子は、
式と演算子 (Lesson4) によると
変数や式の値を比較して条件式を作り、その結果により処理をかえる。
条件式は、条件が成り立つかどうかboolean型の値(「真(true)」または「偽(false)」)で返す。

というふうに、
変数もしくは、式、数値をその両辺におき、その値を比較する。

そしてその演算子に応じた結果をTrueか、Falseで返してくる。




Mayaのヘルプで、比較演算子 の表をみると
(5 != 10)  5 は 10 と等しくない  true
という説明がある。

ここで一番左の部分は「エクスプレッション」という項目名になっているが、これは「式」という意味である。
Expression(式)(wiki)




さてMayaヘルプの表では、「!=」は「等しくない」と簡潔に説明されているが、
「!」は論理演算の「NOT(否定)」を意味し、「論理演算子」の項目にもある。

これは、C言語,Perl,Javaなどと同じ表記である。
ちなみにVBAやPascalでは、「<>」と表記される

否定(ひてい)とは、命題の真と偽を反転する論理演算である。
否定は英語で Not であるが、Invert とも言われ論理演算ではインバージョン(Inversion)、論理回路では Not 回路やインバータ回路(Inverter)とも呼ばれ入力に対して出力が反転する。


http://www.monmon-dance.com/c/c_3.html
真である被演算数を偽、
偽である被演算数を真
にする。


よって、「!=」は「イコールの反転」=「イコールでない」を意味することとなる。

言葉の定義

言葉の定義の重要性について少し調べてみた。

定義(三省堂 大辞林)

ある概念の内容やある言葉の意味を他の概念や言葉と区別できるように明確に限定すること。
また、その限定。

明確さにかけていると、勉強が進むにつれて、それが雪だるま式にふくらんでいったり、
まるでバランスのずれた自動車のタイヤのように、がたがたし始める。
「明確な限定」をすることが重要だと思った。


言葉の定義方法


まず、
1. なにに属するか分類を書く。
2. 所属する分類の中のほかの物と区別する情報を書く。

注意点
* 定義される言葉より難しい言葉を用いて定義を書かない。
* 定義では、それがなにでないかを書いてはいけない。
* 意味に幅があるならば、幅を明確に示さねばならない。
* 定義の中の全ての語が辞書のなかで定義されていなければならない

辞書や、Wikiなどでもこれらすべてを満足する定義はなかなかないかもしれない。
しかも、「難しい言葉」というのは個々人でそのレベルがことなる。
ただ自分がもとめているのは初心者向けで、わかりやすく平易なものである。



赤木かん子さんの調べ学習のすすめかた
まず百科事典で言葉を定義

専門書は基礎知識がないと太刀打(たちう)ちできません。
ではどうすればいいのかというと、何かを調べなさい、といわれたら、まっさきに引かなくてはいけないのは百科事典なのです。
(中略)
そうしてもうひとつ、ここんとこ、これが重要(じゅうよう)ですが、リポートを書く、ということは、誰かにそのことを説明する、ということです。
(中略)
言葉にすることを、言語化(げんごか)する、といいますが、言語化するにはその言葉を定義(ていぎ)すればいいわけで、定義が載(の)っているものが、百科事典、国語辞典、漢字字典なのです。

これは定義の説明というよりも、勉強のやり方を説明したものだが、なかなか参考になる。
それに、今回Wikiを読む機会がふえたことで、百科辞典の重要性も実感できた。
またブログに文字として、書き出すと言うことは、たとえ誰かに読まれることを最大の目的としていなくても、自分の中で曖昧だった定義をみなおし、明確にするために役に立つ。





変数とはなにか (10)

昨日の調査結果について、いろいろと考えてみたが、
結論としては自分自身、「変数」という言葉の定義があいまいであった。

そのため、さもすごい発見であったかのように書いてあるが、
本当に「変数」という言葉が明確に定義できている人からみれば、
ちんぷんかんぷんで、要領を得ない話になっているのではないかと思う。

「変数」と「配列変数」は違う定義をもつ。
それが混同してしまっていた。
最初から「変数」という言葉の定義が明確になっていれば、このような混同は起こらなかっただろうし、
勉強ももっとスムースに進んだだろう。

変数とはなにか (9):

「変数」という言葉自体を調べてみた。


変数(数学)

通常は定数に対する言葉であると解され、値が変化するものであるとみなされる。正確に述べれば、変数には、それが現れる文脈ごとに必ず、その変数の変域あるいは定義域などと呼ばれる、変数が値としてとりうるもの(その変数への代入が許されるもの)の範囲を示す集合が決まっているということである。

このような見方が正当なのかどうかはわからないが、上記の数学的意味での「変数」の説明を、プログラミングにおける「変数」にも当てはめて考えてみた。

Mayaで一番広範囲な定義域は、

整数(int)
浮動小数点数(float)
文字列(string)

の3種類となる。

ここで気がついたことだが、
「配列」、「ベクトル(浮動小数点数3つ)」、「行列」=(イコール)「変数」ではない。

たしかに「配列型変数」なので変数の一種だが、「変数」の二文字だけで表現できるプリミティブな意味での「変数」ではない。

いままでは、「変数」も「配列」も「ベクトル」も「行列」もほぼ同一レベルの情報として記憶しようとしていたので、なんとなく混乱している感じがあったが、これで整理ができた。

(読んでいる人は何を当たり前のことを小難しく考えてるんだとあきれてしまうかもしれないが。。。)

自分にとってこれは重要だ。
:(プリミティブな意味での)「変数」は「整数、浮動小数点数、文字列」の定義域のうちどれかになる。

変数において一番最初に集中して頭にたたき込んでおくべき事は、
「変数」「配列」「ベクトル」
といったことではなく、

「変数」は値が一つだけで、必ず「整数、浮動小数点数、文字列」のどれかになる

ということだと思う。

「配列」「ベクトル」というのはその次にくる概念だ。
学ぶべき情報としての重要性では、これは、もっと後になる。


自分がいいたいことをまとめられたのか、どうかわからないがとりあえず、
ここに書き留めておいてまた後ほどみなおしたい。


プログラミングにおける変数とは
変数(wiki):
プログラムのソースコードにおいて、扱われるデータを一定期間記憶し必要なときに利用できるようにするために、データに固有の名前を与えたものである。

ちなみに数学における変数は
数学、特に解析学において変数とは、未知あるいは不定の数・対象を表す文字記号のことである。


コンピュータにおける「変数」は、変数の名前自体は「不定の数、文字」をあらわす記号である。
その中にあるデータが代入されると、ここで数学の変数の意味である「未知あるいは不定の数」という定義とはことなり、どちらかというと定数のようになる。
しかしながら、同じ変数にさらに異なる値のデータを代入することができる。
それにより変数内の値は変動すると言える。

プログラミングにおける変数は、
1)ある数値または、文字を表しており、それが最後まで変化しない。
2)ある数値または、文字を表しており、それが途中で変化する。
の二種類のパターンがある。
「変数」と呼ばれるからといって、かならずしも「変化」するわけではない。

これがプログラム初心者に混乱を引き起こしているように思う。

変化しない変数は、プログラムの中で最初に値が代入されたら、それがいじられることなく、
必要なだけ何度でもそのプログラム内で使われる。

変化する変数はプログラミングの中で、最初に値が代入されてから、
後ほど、状況に応じて新たな値が代入される。
それは小さなサイクルの中で頻繁に上書きされ続けることもある。
例)for next 文 で、i=i+1,if文で、if a<10

2009年2月16日月曜日

初心者向けの問題

参考になるブログがあったので、メモ

304 Not Modified
私が初心者プログラマを脱出できなかった理由

プログラマの技術力=自分で書いたコードの量×他人の書いたコードを読んだ量

なるほど、そういうものかもしれない。「+」ではなく「x」とかかれているので、他人のコードを読むこともこれから頑張っていきたい。

最初にぶつかった壁は「何を作ったら良いのだろう?」ってことだったんです。
今更ながらに[これはひどい]と思いますが、お題を出してくれるってすごくありがたいのです。
お題も初心者でも作れる簡単なものから、ちょっと敷居の高いギーク向けのものまで作っていけばユーザの幅も広がりますし。

何より、一つのお題(目的)に対して複数のソースコードを読めるってのはプログラミング好きにはたまらないことだと思うんです。

これは、合意。
なんか、設問があると、しかもその設問をといていけば自然とステップアップして実力もついていくようなものがあるといいのになと思う。

↓Melではないけど、共通点もあるので、応用できるかも。

初心者のプログラミング体験記
PHP基礎問題集

PHP練習問題集

仕事

今日は、President Day で休日だったが、明日から会社の仕事がないので、一週間の休みとなる。
もし、仕事があれば電話をくれることになってはいるが、怪しい。
今週は、ずっと子育てで終わるのか???

新しいデモリールでも作るか。。。

知識

ハードウエア、論理回路、コンピュータの歴史、アーキテクチャー。

上記は、今回調べていることでも、「コンピュータが何か」を明確にするために勉強したときにも含まれていた主題だ。

今回いろいろ調べているときに、これらの題目は大学の「情報処理」課程に含まれていることがわかった。

どうやら、手探りで探してきたことだが方向は間違いではなかったようだ。
本当の意味でコンピュータを知ろうとするなら、そういったことを学ぶことが必要となってくるのは、当然だろう。

知れば知るほど、いろいろな人の知恵がよりあつまって現代のコンピュータができていることがわかる。
また、不思議と似たようなアイデアを同じ時代に、別の場所、別の環境、別の人間が思いついたりもしている。
人間の知恵をしぼって、機械を使おうと必死になればたどりつく場所は同じなのかもしれない。
数年前にしらべたときに「コンピュータはシミュレーション・マシンである。」または、「予測するための機械である」もしくは、「公式処理マシン」というのが自分の結論であった。

弾道計算からはじまった機械計算の歴史だが、様々な数値を公式にあてはめて、結果を出す。
(これは機械が無くてもできることだが、)目的は、ある条件下でどのような弾道を描くかを予測することであった。
コンピュータは、そこから発展していろいろなことができるようになったが、
基本的に、ある事象の公式をみつけ、それを機械的に処理しある状況下の再現をすること
すなわちシミュレーションが主体であることにはかわりなかった。
ここでのシミュレーションとは、かなり広い範囲の意味を含み、1+1=2というものもシミューレーションの範疇に含めている。
画像処理でも、ドットがある条件下で、どの位置にきてどの色になるか、それを公式に従い、シミュレートしているという考えだった。

コンピュータは、基本的に存在しない公式を処理することはできないので、存在する公式を使うか、公式を発見することが必要となる。
そこがコンピュータの限界であり、人間と機械の役割分担の境界線でもある。

この結論は、今、チューリングの理論を読んでみて、間違いではなかったと思う。

ただ、「公式」というより「アルゴリズム」という表現にしたほうがふさわしい。
今の知識でそれを説明すると、「アルゴリズムを処理するマシン」ということだ。

ただそれらのことにいきついたものの、表面をざっとなぞっただけで、ひとつひとつをちゃんと身につけるまで学習したわけではないので、とても大学で学んだ人のような深い知識はもっていない。

ただ自分の疑問がすっきり解決できる程度であればそれでよいと思っている。

2009年2月15日日曜日

変数とはなにか (8): チューリングマシン その2

チューリングマシンは何を示したのか

チューリングが示したかったのは、あらゆる数学の問題を自動的に解くことができる「究極のアルゴリズム」は存在しない、ということだったのだ。
もしそのような「究極のアルゴリズム」が存在すれば、もう数学者はいらない。
アルゴリズムに従って機械的な作業を続けるだけで、数学の問題は次々と解けることになるのだから。


ここから思ったのは、数学にかぎらず、宇宙の真理さえ、コンピュータでとけてしまう。
思い出したのが、映画「The Hitchhiker's Guide to the Galaxy」に出てくる「この宇宙の時空で二番目に優れた」コンピュータ「ディープソート」。
(ディープソートは750万年かかって生命、宇宙、そして万物についての(究極の疑問の)答え「42」を出す。)


なにかプログラミングしようとするなら、具体的に「何を処理させたいのか」というアイデアがなければ、先へすすまない。
そしてアルゴリズムを人間がまず考え、答えにたどり着くことを証明しておかなくては、ならない。
コンピュータは自動的にアルゴリズムを考えたり、アルゴリズムの間違いをみつけてはくれないからだ。

今回は数年前に勉強したときよりもインターネットから集められる情報が増えていたので、もう一歩踏み込むことができた。

「変数」という概念をプログラミングで用いるようになったのはなぜか?
その原点を探ってきて、コンピュータの歴史をたどっていった。
ソフトウエアからハードウエア、ハードウエアから思考論理へとさかのぼってきた。
それは思考論理があり、それをハードウエアに実装し、そしえてソフトウエアが発展してきたからである。

「変数」というものが、コンピュータのハードウエア設計での「メモリ」からはじまり、そのはたらきを記号論的にあつかえるようにしてきたのではないかと思っていたが
それ以前に、思考に関する考察、論理があり、そこからハードウエアがうまれてきているという経緯があることがわかった。
そしてその論理段階では、ブール代数とチューリングマシンが大きな役割を果たしている。
そこで、メモリや変数にかんするものをあつかっているのは、チューリングマシンであり、ブール代数ではないと思う。

また年表で見ると、下のようになるが
1822年 階差機関
1837年 解析機関に関する初の記述
1854年 ブール代数
1936年 チューリングマシンの論文

バベッジの解析機関ではそれよりも昔にもかかわらず、メモリという概念、変数という概念がつかわれている。

チューリングも指摘しているように、電子だからというわけでメモリが必要だったわけではない。
メモリが必要だったのは、数学的な思考の過程で必要なのである。

チューリングとバベッジの共通点は、どちらもその思考の過程を単純化し、すべての思考の共通点をみつけようとしたことだ。

チューリングの理論をしらべ、そこを探っていくことは、バベッジの考えを探ることにもなるのだと思う。
ただ、論理回路以前のものなので、数学的な思考には、メモリが欠かせないことがわかる。





メモリを結びつけて考えるのは、なんとなくずれがあるような気がする。
もちろん、メモリ内の場所を示していると言うこと以外にも、いろいろと結びつきはあるのだが、

変数とはなにか (7): チューリングマシン その1


今回はチューリングマシンに絞ってみた。
題材が「変数とは何か」のはずが「コンピューターとは何か」に変わってしまっている。(^^;)


コンピュータ偉人伝

アラン・チューリング 
難解な数学論文に初めて出現したコンピュータ

シャノンとほぼ同じ時期にチューリングマシンがうまれた。


アラン・チューリング(wiki)
チューリングマシンは現在のコンピュータを先取りした概念で、今日から見ればコンピュータを抽象化したものであるともいえる。
この論文でチューリングはまず、チューリングマシンを適切に設計すれば、いかなるアルゴリズムもチューリングマシンで実行可能である事を証明した。


すべてのアルゴリズムを実行可能にするには、チューリングマシンにある機能が必要だと言うことになる。
ということは、アルゴリズムには、「メモリ」と部品は不可欠ということと考えて良いのかもしれない。
普通のコンピュータはチューリングマシンほど単純ではないかもしれないが、
アルゴリズムを細かくかみ砕いてけばチューリングマシンで実行可能な状態におとしこまなくてはいけない。


生物アルゴリズム:生命は計算できるか第5回
ここにはチューリングマシンと最初のコンピュータについてもうすこし詳しく書いてある。
原典は、「2000年12月~2001年6月の間に月刊アスキーに連載された、 『生命は計算できるか? チューリングへの旅』(著者:星野 力:ほしの つとむ)」

第一章、計算手
チューリングマシンこそコンピュータの定義そのものである。
大数学者ヒルベルトは,誰もが納得する単純な理屈から数学全体を導き出そう(公理主義という)と呼びかけていた。そのためには数学者がやっているメンタルな作業とは何なのか,数学者の心の中をモデル化しないといけない。それがチューリングの思考の原点だった。

コンピュータの歴史をみてくるとブール代数を中心とし、数学的思考に深く関係していることはわかっていたつもりだが、チューリングの思想の原点もそうだったのかと納得。
このページには、もっとチューリングマシンのテープとオートマトン部を人間の計算中の状態との類似性を説明してある。
チューリングマシンを理解する上でもわかりやすい説明だ。

ある人が紙と鉛筆をもって何かを計算しようとしている場面を想像してほしい。
「計算している人」とは英語でコンピュータ(Computer:計算手)と言う。
運転している人をドライバ(Driver:運転手)というのと同じだ。
当時(1934年頃),今われわれが持っているような「コンピュータ」はまだ出現していなかったことに注意してほしい。

 計算している人(計算手,数学者)の心理状況はどうなっているのだろう?
まず計算手は紙の上の注目点にかかれている記号(一目で読み取れる範囲内にあれば複数の記号群でもいい)を読み,その記号に従って自分の「心の状態」を変え,それと同時にある記号を紙に書き,目を隣へ移す。
または同じ場所に目を留めておく。
これを繰り返して,ある結果がでたときに「やった!」という心の状態になって計算を終える。
もちろんいつまでも悩んで堂々巡りをして計算が終わらないこともある。
心の中には,有限個の状態とその間を移り変わる(遷移する)ときの方法(手順)が入っている。
この手順は有限の長さだろう。
なぜなら無限に長い手順は頭に入らないから。これが人間がやっている計算だ。
計算というと数字を扱うものと思われがちだが,相手は記号でも式でも定理でもいい。




チューリング・テスト再考

途中まで拾い読みをしただけなので、あとでじっくり読んでみたいが、
チューリングテストの論文を解説を含めてかいてあっておもしろい。
DigitalComputerのところでデジタル計算機について説明がされている。

デジタル計算機は、
1:記憶装置(store)、
2:実行ユニット(Executive unit)、
3:制御装置(Control)
の3つの部分から成り立ち、これによって、記憶装置に与えられた命令表に従って処理を行っていく。
処理内容は、演算、入出力、分岐、条件判断などである。

デジタル計算機は、これまで述べてきた原理によって作ることが可能であり、また実際にそのように作られてきたのだということ

デジタル計算機に命令表を与える作業、つまりプログラミングについては、次のように述べている。
機械に複雑な操作を行う人間計算機の行動を真似させたいときには、
計算機である人にどのように行っているのかを尋ねたうえで、
その回答を命令表の形に翻訳しなければならない。

命令表を組み立てることは通常は「プログラミング」と呼ばれている。
「機械が操作Aを実行するようにプログラムする」というのは、
機械が操作Aを行うように適切な命令表を機械に入力するということである。

バベッジの分析機関がすべてメカニカルなものだった(つまり電気的/電子的ではなかった)という事実は、我々の中にある思い込み(=電気的でなければならないということ)を取り除くのに役立つだろう。

すべてのデジタル計算機はある意味で等価である以上、我々は、電気を使用するということは理論的には全く重要なことではないということが分かる。

…。電気を用いるという特徴は、(デジタル計算機と神経系との)極めて表面的な類似でしかない。もしデジタル計算機と神経系との間の類似性を見いだしたいのであれば、我々は、(両者の)機能の数学的なアナロジー(類似性)を検討するべきである。

(以下略)



計算する機械と知性


アランチューリングの論文の日本語訳

変数とはなにか (6)

今回いろいろ調べた中であらたな収穫だったのが「クロードシャノン」である。
前々から、思っていたが、「変数」という概念もふくめ、コンピューターというのは何らかの意味、操作を
特定の記号や装置、信号におきかえている。
これは「記号論的」だとおもっていたが、その考えはまるっきりはずれているわけでもなかった。
シャノンは、「リレーとスイッチ回路の記号論的解析」という論文を書いている。


コンピュータ偉人伝
クロード・シャノン

スイッチの開閉と記号論理における真偽が見事に対応し、スイッチの直列接続はANDに、並列接続はORに対応する。
このことで、単に計算だけでなく、あらゆる論理演算がコンピュータで可能であることが示された。
翌年この論文が公刊されると影響力はものすごく、いままで10進法に基づいて設計されていた計算機の回路は、以後2進法に基づいて設計されるようになった。


まさに、ブール代数(論理演算)が、実際の物理的回路と結びついた瞬間であり、
二進法が使われるようになった起源でもある。
たしかにブール代数はすごいが、それだけでは、コンピュータの回路を設計したことにはならない。




裁判で最初と認められた コンピューター
アタナソフ・ベリー・コンピューター

コンピューター開発初期、一番問題となったのはメモリの確保でした。
また裁判では最初のコンピュータとして認められたということだが、
ツーゼのZ2にはすでに機械式のメモリが組み込まれていた。


アタナソフ&ベリー・コンピュータ
(wiki)

ABC は現代のコンピュータでも使われている3つのアイデアを最初に実装していた。
1. 二進数を使って数値やデータを表す。
2. 機械的なもの(歯車や機械的なスイッチ)を使わず、全て電子的に計算を行う。
3. 計算をする部分とメモリを分離する。
アタナソフ&ベリー・コンピュータは、それ以前の計算機械からは大きな前進であったが、プログラム内蔵式コンピュータではなかった。


コンラート・ツーゼ(wiki)
ツーゼのZ3は1941年で、 ABCコンピュータよりも前である。
Z3 は二進法による計算機であり、ループが使用可能なプログラムを組むことができた
メモリと計算装置は電話機用のリレーを使っている。


コンピュータ(wiki)

チューリングマシンは非常に素直に動作する。チューリングマシンは命令とデータをメモリから取り出す (fetch)。取り出した命令を実行し、内部状態を変更し、結果をメモリに格納し、次の命令を取り出す。「停止」の命令に遭遇するまでこの手順が繰り返される。

ツーゼがZ1をベースに演算部がリレー、記憶部が機械式のテスト用の計算機Z2を作成。


ジョン・アタナソフ(wiki)
ABC
また、コンデンサによるメモリを備えていて、原理的には今日のDRAMメモリと同じである。

2009年2月14日土曜日

変数とはなにか (5)

今回も時間がないので、調べた物のメモ

第4回・プログラミングの歴史(4)・変数名
変数について、すこし詳しく説明してある。


ハードウエア的にメモリの起源を追求すると、チューリングマシンか、バベッジの解析機関にいきつく。

松岡正剛の千夜千冊
『バベッジのコンピュータ』新戸雅章


「解析エンジン」がどういうものであったかというと、バベッジ自身の解説でこうなっていた。二つの装置で組合わさっているのである。
 1・演算の対象となる変数と、他の演算の結果として得られたすべての数値が蓄えられるストア(記憶)部。
 2・演算のおこなわれる数値がたえず送りこまれていくミル(作業)部。
 3・この二つの部門を補助する修正部と、二組の演算カードと変数カード。
 二組の演算カードと変数カードがパンチカードとその読み取りにあたっている。つまりプログラムにあたる。これにもとづいて計算作業部門が動き、それがストア(記憶)されていく。


解析機関(wiki)
解析機関の記憶領域はいわばレジスタであり、個別に指定できるがアドレスで指定するという概念がなかった。
そのため、当然ながらプログラム内蔵という概念も無ければ、プログラムをデータとして扱って書き換えるという概念も(基本的には)存在しない。


コンピュータ偉人伝
チャールズ・バベッジ


解析エンジン構想は、パンチカードによるプログラミング入力、ストア部と呼ばれる記憶装置、ミル部と呼ばれる演算装置、カード穿孔機、印刷装置などの入出力装置があり、現代のコンピュータの構成とほとんど同じである。
特に 演算機能と記憶機能を分離した点と、 プログラミングという発想を取り入れた点が今日高く評価されている。

2009年2月13日金曜日

変数とはなにか (4)

変数についてもうすこし調べてみたが、
時間がなくてまとめきれなかったので、今回はメモ。


本当に初心者の人に捧げるコンピューター入門
高級言語って何が高級?
「変数というと例えば関数や方程式のXとかYを思い出しますね。」
「XとかYは適当な数が入れられる記号のことでした。」
「コンピューターの高級言語における変数もほとんど似たような物だと思っていただいて結構です。」
「ただその実体は、メモリーのあるアドレスのことなのです。」

これを読むと変数はメモリの位置を表す物=アドレスである。
ここからすると、メモリというハードウエアの構造に関連する。
コンピュータアーキテクチャについて調べてみないと「変数」の起源は明確にならないような気がする。
ハードウエアの制限からメモリを使用するという考えがうまれ、メモリを使うとう考え方が、変数の概念を生み出したのではないかという推測。


コンピュータを設計しよう!

「レジスタを使用することによって全てのタイミングをクロック単位で扱うことができます。」

ここに説明されているようにレジスタは加算器などを構成する各回路がタイミングを合わせてちゃんとした結果が出せるように一役買っている。


コンピュータの動作原理


これは、最近のコンピュータの基本動作を説明している。
レジスタは高速な時間の中で使われていることがわかる。

命令からデータ、アドレスそれぞれすべてがレジスタにいったん納められ使われるタイミングを計っている。それがすべてではないとは思うが、レジスタがタイミング合わせのために使われていることがわかる。


-- 基礎から学ぶコンピュータ -- 《第十六号》  CPU の中身

アキュムレータマシン、レジスタマシン、スタックマシンが簡潔にわかりやすく説明してある。
アキュームレータマシンをみると、計算は基本的に累算されることで行われる。

マイコミジャーナル コンピュータアーキテクチャの話
単純な構造のコンピュータ - アキュムレータマシン


アキュームレータマシンの詳細をわかりやすくせつめいしてあるPDFファイル
アキュームレータマシンの実装(1)pdf
元ネタはここ、他にも「加減算器の実装」などおもしろそうなものがある。

計算機論理回路 減算器

かけ算も割り算も引き算も二進数の足し算によって行われる。
引き算でさえ、補数を足し算するというやり方で行われる。
それによって、回路は加算器だけで事足りる。
このしくみを考えた人はすごいと思う。
二進数だけで計算しようとして考え出したのか、それとも最初から二進数で計算する機械に実装する
目的で考え出されたのかはわからないが。


ハードウェアの基礎知識 
かけ算や割り算がどのようなしくみで計算されるのかここをよむとわかりやすい。
このページは論理素子からアニメーションの図入りで説明があり、とてもわかりやすい。
何度も足し算が繰り返される。
この繰り返すときには、その直前の計算の答えをひきつぐので、そこにレジスタが必要なことがわかる。




フォンノイマン方式(ストアド)は、
命令もメモリに格納して、命令自体をデータとして扱い、変更することが
できるというアイデアだった。

これが、論理回路に計算をさせるのに必要だったレジスタの誕生から、
メモリを拡張して利用していく時代へと進化するきっかけとなったのか、?



こういった、本当に根本部分での操作にメモリが不可欠なことは理解できる。
それがどのように高級言語の変数にまでつながってくるのか?

2009年2月12日木曜日

If文の重要性 (2)

if文に関する続き。

if文に関する項目を読んでいると「制御構造」という言葉がでてくる。
なんとなくはわかるが、明確ではないのでwikiで調べてみた。

「(前略)制御構文(せいぎょこうぶん)とは命令の実行順を通常の逐次実行以外の順番に変化させる命令である。」

プログラムは、通常は順次実行されるが、
制御構文は、「その順番を変えてしまう命令」だと言っている。

If文は、仮定した条件にあてはまるか、あてはまらないかを判断し、
続けて、その結果に従ったプログラムが続けて実行されることとなる。
そしてそれは条件によって分岐した数だけ違う種類の物が必要になる。

1)条件に沿う場合に実行されるコード
2)条件に沿わない場合に実行されるコード
の二種類を考えておく必要がある。
どちらのケースもひとつのIf文に対しては、それぞれ一つづつ必要である。

前回調べたとき、「条件」とは、「なにかを実行するときに、必要な事柄」という意味だった。
それに従い上記を言い換えると

1)そのコードが実行されるには、特定の事柄を「満たす」ことが必要とされる。
2)そのコードが実行されるには、特定の事柄を「満たさない」ことが必要とされる。

言いたいことは、
a)条件を考えるとき、必ずそれを「満たす」場合と「満たさない」場合の二通りがある。
b)よって、条件式がでてきたら、毎回その両方の結果に沿ったプログラムも書く必要がある。



ちなみにIf文では条件をもとに「判断する。」とか「判断させる」という説明が普通よく見られるし、
自分もその言葉を使う。

しかしながら、機械(コンピュータ)が「判断している」のではない。

プログラムを作るとき、「人間が判断している」のである。
まず、人が判断し、その結果に応じた処理をあらかじめ考えて記述しておく。

それなくして、コンピュータが判断することはあり得ない。



これから先の課題としては、

条件文とは、ある仮定を満たす時に、その後に続くコード(プログラム)を実行する。
そのコードを実行するにはこの確定していない物事=[仮定]=「条件」が必ずなくてはならない。

プログラミングにおいて
「条件」が先にあって、それから実行すべきプログラムを考えるのか。
「実行すべきプログラム」が先にあって、後からその「条件」を考えるのか。
それともその両方が混在しているのか、もしそのあたりを明確にできるとしたら、これからプログラミングをしていく上で思考する順序を決める助けになるだろう。

If文の重要性

プログラムでは、通常、1行目から順番に最後の行まで、順時実行していくことになる。
昔のBasicでいえば、1行から行番号順に実行していくということになる。

if文は、これにどう関係してくるのか?

if(もし)という言葉を辞書で調べてみると
<もし>:
 (1)(「ば」「たら」「なら」などの語と呼応して)確定していない物事、事実に反する物事を仮定して次に述べる物事の条件とする意を表す。

 (2)(下に疑問や推量の意を表す語を伴い)確実ではないが、十分にあり得る事態を想定する気持ちを表す。

現実には確定していない物事を[仮定]する。= <もし>

そして、それを実行すべきコードの[条件]としている。


ちなみに[条件]の意味は、
<条件>:
(1)物事を決定したり約束したりするときに、前提あるいは制約となる事柄。

(2)物事の成立あるいは実現に必要な事柄。ある事態を引き起こす原因。

なにかを実行するときに、必要な事柄。= <条件>


以上をまとめると
ある仮定を満たす時に、その後に続くコード(プログラム)を実行する。

そのコードを実行するにはこの確定していない物事=[仮定]が必ずなくてはならない。


そしてif文では、
その[仮定]を[関係演算子]と[論理演算子]だけで表現する。

ということは、この二つだけをマスターしてしまえば、理論的には、
プログラムで使われるすべての[条件]の特徴と限界を把握したことになるのではないか。

余計な考えや、なにが条件かわからずぐるぐると深みにはまることを避け、
ストレートにアルゴリズムを見つけることができるようになるのではないか。


条件式は、スイッチの働きをしているように思う。
というよりもスイッチというのは、よほど「条件」という概念を表すのに適したものなのだろう。
コンピュータのしくみはハードウエアからはじまり、どこまでいっても、
この連鎖(何かが何かのトリガーになる)からは逃れられないようだ。

話がそれたが、[何が条件か]を見抜き、それを[条件式であらわす]ことができる力は
プログラミングにおいて、とても重要だと感じる。
ここに重点をおいて早い内にマスターしておくことで、
回り道を避け、はやくプログラムのコツをマスターできるのではないかと思う。


このあたりについて、なにか裏付けとなるものがないか、
「条件式 と プログラム」というキーワードで検索してみた。

Lets try HSP lesson6:条件式
「プログラミングをするときの最低限覚えて置かなきゃいけないことのもう1つに条件式があります。
「これも知らないとプログラミングができないのでしっかり覚えておきましょう。」

Eclipseではじめるプログラミング(4) 
「 プログラムにおいて処理の流れを制御するには、条件をどのように指定するかということが重要になってきます。


このように「条件」というのはプログラムの基本であり、とても重要だということは少なくとも二人の方が指摘している。


上記、二つ目のサイトは、「処理の流れを制御」と書かれている。
以前、フローについていろいろと調べたとき、[フロー]と[スイッチ]の概念は、
コンピュータのハードウエアからはじまり、ソフトウエアまで、どこまでもついてくるなと感じた。


フローとは、
水やビー玉が高いところから低いところへ流れていくようなもの。
ドミノ倒しのように次々とたおれていくもの。
そのA地点からB地点へ流れる過程で、こまかく分岐し、相互にまた雑ざり合ったりを繰り返す。
次にどちらへすすむのかをコントロールする。それがフロー制御。

このたとえで、注意すべき点は、「流れ」というものはいったん流れ始めると後戻りはできない、先へすすむのみであるということ。(ループは後戻りではなく回転。後戻りとは逆流のこと)
そしてその流れは、早い流れであり、「分岐」と「混ざり合い」は、たくさんのものが並行して同時に発生する。

前もってプランをたてておかないと、特定の結果を出すように流すのはむずかしい。

そういった「分岐」と「混ざり合い」をコントロールし、流れをコントロールする作業が、プログラミングということだと考えるのはいいすぎだろうか。

いや、きっと合っているに違いない。
もし間違えていたとしても後で修正すればよいこと、
まずは、
「関係演算子」と「論理演算子」をマスターすること、そしてIf文を使いこなせるようになること。
これがすべてのプログラミング言語学習に共通するする、第一ステップであり、
人間の言語の学習と異なるポイントだ。