教育・子育て

ブレンダー クマさん飛び出て プログラむ うねるパイソン コサインの跡

倉田幸暢's icon'
  • 倉田幸暢
  • 2020/02/03 11:21

Blender(ブレンダー)

  クマさん飛び出て

    プログラむ

 うねるPython(パイソン)

   cosine(コサイン)の跡(あと)

             倉田幸暢

 

よいプログラマはよいコードを書く。偉大なプログラマはよいコードを借りてくる

(出典: Mike Gancarz(著者), 芳尾桂(監訳), (2001年), 「5.1 定理6:ソフトウェアの挺子を有効に活用する」, 「第5章 これこそ梃子の効果!」, 『UNIXという考え方 : その設計思想と哲学』, オーム社, 69ページ.)

 

  何かをうまくやるためには、それを愛していなければならない。ハッキングがあなたがやりたくてたまらないことである限りは、それがうまくできるようになる可能性が高いだろう。14歳の時に感じた、プログラミングに対するセンス・オブ・ワンダーを忘れないようにしよう。 

(出典: ポール・グレアム(Paul Graham)(著者), 川合史朗(監訳),  (2005年) , 「育てるには」, 「第16章 素晴らしきハッカー」(Great Hackers), 『ハッカーと画家 : コンピュータ時代の創造者たち』(Hackers & Painters: Big Ideas from the Computer Age), オーム社, 237ページ. )

 

抽象的な考え方を扱う人たちも、UNIXの考え方を学ぶことに利益を見出すだろう。ソフトウェア開発に使われるテクニックは、他分野にも応用できるものが多い。作家やグラフィックアーティスト、教師、講演者といった人々は、早い段階での試作や梃子の効果の活用といったUNIXのテクニックを、自分たちの分野においても見つけるかもしれない。 

(出典: Mike Gancarz(著者), 芳尾桂(監訳), (2001年), 「この本は誰の役に立つか」, 「序文」, 『UNIXという考え方 : その設計思想と哲学』, オーム社, ⅳ~ⅴページ.) 

 

はるか先生さんが主催されている、この下のリンクの記事の、「プログラミングについての記事を投稿しよう」という企画に参加させていただきます!(o≧ω≦)O

プログラミング記事にもれなく投げ銭 | ALIS 
https://alis.to/haruka/articles/KBXzeXWXZPxw

 

この記事では、このページの冒頭にあるGifアニメの画像の映像に映っているような3Dアニメーションをつくる、ということについてお話します。具体的には、「Blender(ブレンダー)という3Dソフトウェアのなかで、Python(パイソン)というプログラミング言語をつかって、3Dモデルに対して、自動的にアニメーションをつける」ということをするための方法について、お話していきます。

 

まえまえから、「Blenderのなかで、Pythonをつかって、3Dモデルを操作して、あんなことや、こんなことができるらしい」ということは、風のうわさで聞いたことがありました。ですが、「いつかやってみよう」という状態のまま、これまで試してみたことはありませんでした。

そんなときに、さきほどの企画のことを知り、「これはいい機会だから、いっちょやってみっか!」ということで、Blenderのなかで、Pythonをつかって3Dモデルを操作する実験をしてみました。

その過程で、プログラムがうまく動かなくなるたびに、自分が書いたコードにむかって、何度も、「なんでやねん!」を連発しながらも、なんとか、Pythonスクリプトをつかって、3Dモデルにたいして、この下のGifアニメ画像のようなかんじのアニメーションを自動でつけることができました。
(ちなみに、くまさんの3Dモデル(2Dモデル)も自作しました(笑)。)

そのPythonコードは、この下の画像に映っているようなコードです。

Content image

この上の画像のなかの、スクリプト(Pythonのプログラムコード)が書いてあるところの横幅をひろげて、コードを見やすくすると、この下の画像のようなかんじになります。

Content image

 

この下のPythonコードは、この上の画像に映っているコードと、おなじものです。

import bpy
from math import sin, cos, radians

for obj in bpy.data.collections['KumaCollection'].all_objects:
        
   for j in range( 0, 91, 5 ):
        
       for i in range( 0, 361, 5 ):
            
           obj.location = 15 * cos( radians( i + j ) ), 15 * sin( radians( i + j ) ), 4 * sin( radians( i * 6 + j ) )
           obj.keyframe_insert( data_path = "location", frame = i )

このコードは、ある人が、「BlenderのなかでのPythonコードの使い方」についてのYouTube動画のなかで解説してくださっていたコードを、ほぼそのままコピーしてつかっています。ですので、ぼく自身は、まだ、このコードのことを、なんとなくしか理解していません。(ちなみに、その「ある人」というのは、「Creative Space」というYouTubeチャンネルを運営されている、インドにお住まいの方です。)

このコードのなかでは、どうやら、サイン(sine)、コサイン(cosine)などの、三角関数がつかわれているようです。学生のころは、「サイン(sine)、コサイン(cosine)なんて、いったい、どんなときにつかうんだろう?」とおもっていたものでしたが、人生なにが起こるかわからないものです。

「ある数学的な知識が、どのような目的のために、どんなふうにつかわれているものなのか?」ということが、よくわからない場合は、その数学的な知識をまなんでも、実感がわかず、「腑に落ちない」ので、その知識はあまり、あたまにはいってこないだろうとおもいます。 

その一方で、こうした、「3D空間のなかでの、3Dアニメーションづくりのために、数学的な知識をうまくつかう」という場合のように、「ある数学的な知識が、どのような目的のために必要になるものなのか?」という、「数学的な知識の使いみち」がはっきりわかる場合であれば、数学的な知識を、けっこうすんなりと、まなぶことができるんじゃないかな、とおもいます。 

そんなこんなで、こうした機会に、3Dアニメーションづくりをとおして、数学的なことをまなんでみると、世界観がひろがっておもしろいかもしれないとおもいました。(くまさんの3Dモデルが、3Dアニメーションとして、実際に動き出すようすを目にしながらであれば、よりたのしく、数学がまなべるかもしれません(笑)。)

 

Content image

PythonコードでくまさんをアニメーションさせるBlenderファイルのダウンロードURLと、使いかた

ちなみに、さきほど冒頭でご覧いただいた、「くまさんの3Dモデル(2Dモデル)がうねうねぐるぐる動くアニメーション」のBlenderファイル(拡張子が「.blend」のファイル)は、この下のURLからダウンロードしていただくことができます。

Blender_Python_script_PoppinKuma_20200203_001.blend 
https://drive.google.com/file/d/1lCuSjF5Ac17wHqdTOqhWlc8tR78SpZaQ/view?usp=sharing

3DソフトのBlender(バージョン2.81以降)があれば、この「.blend」ファイルをつかって、冒頭でご覧いただいたくまさんアニメーションをご覧いただくことができます。もし興味があればどうぞ。

ちなみに、Blender(ブレンダー)は、オープンソースのソフトウェアなので、誰でも自由に無料でつかうことができます。最近では、映画などを手がける大手の制作スタジオなどでも、Blenderがつかわれるようになってきています。そのように、プロの現場でもつかわれているように、Blenderは、有料の3Dソフトウェアにも劣らないほどの機能をそなえているすてきツールであり、すてきソフトウェア(略して、「すてきウェア」(笑))です。

Blenderの公式サイト
blender.org - Home of the Blender project - Free and Open 3D Creation Software 
https://www.blender.org/

 

このBlenderファイル(拡張子が「.blend」のファイル)の使い方は、下記の文章のようなかんじです。(この下の動画の映像に映っているような手順で、操作してください。)

(Blenderの画面の表記: 英語版)
Blender Python クマさん アニメーション Blenderファイル blendファイルの使い方動画 UI英語版 - YouTube 
https://www.youtube.com/watch?v=HSuVrQKWZ1Y

 

(Blenderの画面の表記: 日本語版)
Blender Python クマさん アニメーション Blenderファイル blendファイルの使い方動画 UI日本語版 - YouTube 
https://www.youtube.com/watch?v=5Z_3h2kyzFM

 

まず、Blenderのウィンドウの上部に並んでいるタブのなかの、「Scripting」(スクリプティング)と書かれているタブを選択してください。すると、Pythonコードが書かれている画面が表示されます。その画面のなかの、Pythonコードが書かれているところの上部に並んでいる項目のなかの、いちばん右側にある「Run Script」(「スクリプト実行」)と書かれているボタンを押すと、Pythonコードが実行されて、くまさんの3Dモデル(2Dモデル)に対して、自動的にアニメーションがつけられます。

それができたら、Blenderのウィンドウの上部に並んでいるタブのなかの、「Animation」(アニメーション)と書かれているタブや、「Layout」(レイアウト)と書かれているタブなどを選択してください。そして、そのタブの画面のなかの、タイムライン(数字が横に並んでいる横長のところ)を操作して、アニメーションを再生してみてください。すると、さきほど、Pythonコードで自動的につけられたアニメーションが再生されます。

 

Content image

元ネタのチュートリアル動画のご紹介

今回、さきほどのPythonコードをつくるにあたって、参考にさせていただいた(というよりも、ほとんど、そのままのコードをつかわせていただいた)のは、この下の、「Creative Space」というYouTubeチャンネルの解説動画でした。この動画は、Blenderのなかで、Pythonをつかって3Dモデルを操作する方法について解説してくれている、チュートリアル動画です。

Satisfying animation in blender 2.8 with python scripting - YouTube 
https://www.youtube.com/watch?v=WDYPL3IZYdA

 

ちなみに、下記に列挙したのは、この上の動画のなかの、それぞれの時点のところで実行されているPythonコードです。

 

2:00時点のところで実行されているPythonコード)
https://www.youtube.com/watch?v=WDYPL3IZYdA&start=120

import bpy
from math import sin, cos, radians

for i in range( 0, 361, 10 ):

   bpy.ops.mesh.primitive_cube_add( location = ( 10 * cos( radians( i ) ), 10 * sin( radians( i ) ), 0 ) )

 

2:45時点のところで実行されているPythonコード)
https://www.youtube.com/watch?v=WDYPL3IZYdA&start=165

import bpy
from math import sin, cos, radians

for i in range( 0, 361, 10 ):

   bpy.ops.mesh.primitive_cube_add( location = ( 0, i/10, 4 * sin( radians( i ) ) ) )

 

3:30時点のところで実行されているPythonコード)
https://www.youtube.com/watch?v=WDYPL3IZYdA&start=210

import bpy
from math import sin, cos, radians

for i in range( 0, 361, 10 ):

   bpy.ops.mesh.primitive_cube_add( location = ( 15 * cos( radians( i ) ), 15 * sin( radians( i ) ), 4 * sin( radians( i ) ) ) )

 

3:41時点のところで実行されているPythonコード)
https://www.youtube.com/watch?v=WDYPL3IZYdA&start=221

import bpy
from math import sin, cos, radians

for i in range( 0, 361, 10 ):

   bpy.ops.mesh.primitive_cube_add( location = ( 15 * cos( radians( i ) ), 15 * sin( radians( i ) ), 4 * sin( radians( i * 2 ) ) ) )

 

3:49時点のところで実行されているPythonコード)
https://www.youtube.com/watch?v=WDYPL3IZYdA&start=229

import bpy
from math import sin, cos, radians

for i in range( 0, 361, 10 ):

   bpy.ops.mesh.primitive_cube_add( location = ( 15 * cos( radians( i ) ), 15 * sin( radians( i ) ), 4 * sin( radians( i * 3 ) ) ) )

 

3:57時点のところで実行されているPythonコード)
https://www.youtube.com/watch?v=WDYPL3IZYdA&start=237

import bpy
from math import sin, cos, radians

for i in range( 0, 361, 10 ):

   bpy.ops.mesh.primitive_cube_add( location = ( 15 * cos( radians( i ) ), 15 * sin( radians( i ) ), 4 * sin( radians( i * 6 ) ) ) )

 

4:07時点のところで実行されているPythonコード)
https://www.youtube.com/watch?v=WDYPL3IZYdA&start=247

import bpy
from math import sin, cos, radians

for i in range( 0, 361, 5 ):

   bpy.ops.mesh.primitive_cube_add( location = ( 15 * cos( radians( i ) ), 15 * sin( radians( i ) ), 4 * sin( radians( i * 6 ) ) ) )

 

5:20時点のところで実行されているPythonコード)
https://www.youtube.com/watch?v=WDYPL3IZYdA&start=320

import bpy
from math import sin, cos, radians

for i in range( 0, 361, 5 ):

   #bpy.ops.mesh.primitive_cube_add( location = ( 15 * cos( radians( i ) ), 15 * sin( radians( i ) ), 4 * sin( radians( i * 6 ) ) ) )
   obj = bpy.context.object
   obj.location = 15 * cos( radians( i ) ), 15 * sin( radians( i ) ), 4 * sin( radians( i * 6 ) )
   obj.keyframe_insert( data_path = "location", frame = i )

 

6:35時点のところで実行されているPythonコード)
https://www.youtube.com/watch?v=WDYPL3IZYdA&start=395

import bpy
from math import sin, cos, radians

for j in range( 0, 91, 5 ):
   bpy.ops.mesh.primitive_cube_add()
   for i in range( 0, 361, 5 ):

   #bpy.ops.mesh.primitive_cube_add( location = ( 15 * cos( radians( i ) ), 15 * sin( radians( i ) ), 4 * sin( radians( i * 6 ) ) ) )
       obj = bpy.context.object
       obj.location = 15 * cos( radians( i + j ) ), 15 * sin( radians( i + j ) ), 4 * sin( radians( i * 6 + j ) )
       obj.keyframe_insert( data_path = "location", frame = i )

 

6:48時点のところで実行されているPythonコード)
https://www.youtube.com/watch?v=WDYPL3IZYdA&start=408

import bpy
from math import sin, cos, radians

for j in range( 0, 91, 5 ):
   bpy.ops.mesh.primitive_uv_sphere_add()
   for i in range( 0, 361, 5 ):

   #bpy.ops.mesh.primitive_cube_add( location = ( 15 * cos( radians( i ) ), 15 * sin( radians( i ) ), 4 * sin( radians( i * 6 ) ) ) )
       obj = bpy.context.object 
       obj.location = 15 * cos( radians( i + j ) ), 15 * sin( radians( i + j ) ), 4 * sin( radians( i * 6 + j ) )
       obj.keyframe_insert( data_path = "location", frame = i )

 

Content image

コードを改造して、アニメーションさせる対象として、Collection内のすべてのオブジェクトを指定する

さきほど紹介した「Blenderのなかで、Pythonをつかって3Dモデルを操作する方法について解説してくれている、チュートリアル動画」のおかげで、ひとつの「オブジェクト」に対してアニメーションをつける方法についての、おおよそのことはなんとなくわかりました。

ですが、ぼくとしては、Blenderのなかの「Collection」(コレクション)のなかにはいっている複数の「オブジェクト」のすべてに、おなじアニメーションをつけたいとおもっていました。そうすることで、ある特定の「Collection」(コレクション)のなかにはいっている「オブジェクト」のすべてを、連動させて動かしたいな、とおもったのです。

(※Blenderのなかの「Collection」(コレクション)というのは、複数の3Dモデル(オブジェクト)をいれておく「箱」のようなものです。たとえるなら、パソコンのなかの「ファイル」をいれておく「フォルダ」のようなものです。)

この下の画像では、右側には、緑色のペンのかたちをしているアイコンが複数あります。これらのアイコンのひとつひとつが、「オブジェクト」です(厳密にはちがうかもしれませんが、たぶん、そう言っても間違いではないだろうとおもいます(汗))。これらの複数のオブジェクトが、「KumaCollection」という名前の「Collection」(コレクション)のなかにはいっているのがおわかりいただけるかとおもいます。この「KumaCollection」のなかにはいっているオブジェクトのすべてを、おなじアニメーションで、連動させて動かしたい、という次第なのです。

Content image

それを実現するためには、さきほどのPythonコードのなかの、アニメーションをつける対象を設定している部分を書き換えて、アニメーションをつける対象を、「ひとつのオブジェクト」から、「ある特定の「Collection」(コレクション)のなかにはいっている複数のオブジェクトのすべて」に、変更する必要があります。

これを実現するための記述の方法をさがすのに、すこし手間取りました。ですが、最終的に、フォーラムのサイトで、ぼくの疑問とおなじ、どんぴしゃな質問をしている人と、それに対して回答してくれている人を見つけることができました。

その質問というのは、ズバリ、「How to select all objects of a known collection with python」(Pythonをつかって、ある特定の「Collection」のなかにはいっている、すべてのオブジェクトを指定するにはどうしたいいのでしょうか?)というようなかんじの質問でした。この下のURLのページが、その質問と回答が掲載されているページです。

How to select all objects of a known collection with python - Coding / Python Support - Blender Artists Community 
https://blenderartists.org/t/how-to-select-all-objects-of-a-known-collection-with-python/1195742

このページで、回答者の人が教えてくれていたPythonコードは、つぎのようなものでした。

for obj in bpy.data.collections['MonkeyCollect'].all_objects: 
   obj.select_set(True)

このコードを応用することで、なんとか、「Pythonコードをつかって、ある特定の「Collection」(コレクション)のなかにはいっている複数のオブジェクトのすべてに対して、自動でアニメーションをつける」ということを実現することができるコードを、つくることができました。

そうして、さきほども上のほうで紹介した、つぎのようなコードをつくることができました。このPythonコードを実行することで、ねらっていたとおり、ある特定の「Collection」のなかにはいっているオブジェクトのすべてを、連動して動かすことができました。

(この下のコードでは、アニメーションをつける対象として指定する「Collection」として、「KumaCollection」という名前をつけた「Collection」を指定しています。)

import bpy
from math import sin, cos, radians

for obj in bpy.data.collections['KumaCollection'].all_objects:
        
   for j in range( 0, 91, 5 ):
        
       for i in range( 0, 361, 5 ):
            
           obj.location = 15 * cos( radians( i + j ) ), 15 * sin( radians( i + j ) ), 4 * sin( radians( i * 6 + j ) )
           obj.keyframe_insert( data_path = "location", frame = i )

この上のPythonコードを実行することで、めでたく、「KumaCollection」という名前の「Collection」(コレクション)のなかにはいっているオブジェクトのすべてを、おなじアニメーションで、連動させて動かす、ということができました。

下記のGifアニメの画像の映像が、そのPythonコードがうまく動作した結果のアニメーションのようすです。

 

Content image

「この記事を書こう」とおもったきっかけも、セレンディピティです☆

ちなみに、この記事を書こうとおもったきっかけとしては、今回の「プログラミングについての記事を投稿しよう」という企画にかかわる、いろいろな方々のプログラミングについての記事を読ませていただいたことで、影響を受けたからでもあります。 

この下のリンクの、katakotoさんの記事では、カナダで、"Hello, World!"の代わりにモナーがつかわれているという衝撃の事実を知り、さらに、「ライザップにコミットしてからデべそをプッシュする」という、空前絶後で前人未到なGithubの使い方に度肝をぬかれました(笑)。 
o(≧∇≦)/" 

"Hello, World!"はもう古い!🇨🇦のプログラマは三歩歩いてまずモナを出力する | ALIS 
https://alis.to/katakoto/articles/3bNnpJzvVLr8

 

また、この下のリンクの、こすもすさんの記事では、「ALISを通して新しい世界が広がっていく」という、ALISコミュニティのすてきセレンディピティ効果についてのお話を聞いて、胸がじーんと熱くなったりしました。 

ALISでの素敵な出会いでプログラミングを始めてみたら! | ALIS 
https://alis.to/Cosmos/articles/3ld5rJMqgnAQ

 

そんなこんなで、こうした、いろいろな方々のプログラミングについての記事を読ませていただいたことも、今回、この記事を書こうとおもった理由のなかのすくなくない部分を占めています。 

 

Content image

【余談】プログラミングについての本で語られている言葉を紹介します

これは余談なのですが、ぼくは、たまにプログラムを書くことがあるていどで、「プロの」プログラマーではありません。ですが、プログラミングや、プログラマーさんには、昔からあこがれがあって、プログラミングについての本も何冊か読んだりしていました。

そうした、プログラミングについての本のなかには、「これ、いいなぁ」とおもう言葉がたくさんあって、そこからいろいろなことを、まなばせていただきました。

今回は、せっかくの機会ですので、そうした言葉のなかから、いくつかの言葉を紹介させていただきたいとおもいます。なにかのご参考までに。
 

よいプログラマはよいコードを書く。偉大なプログラマはよいコードを借りてくる 
 ソフトウェアを大量に書く一番よい方法は、借りてくることだ。ソフトウェアを借りるということは、他人のモジュールやプログラム、設定ファイルを自分のアプリケーションで使うということだ。自分の仕事に他人の成果を取り込むことで、先人の努力を活かし、コードの有用性を一段と高めることができる。先人のソフトウェアは、より多くのアプリケーションに活かされてより価値のある存在となるし、取り込んだソフトウェアも、投資が少なくてすむ分だけ相対的に大きな収入を生み出すことになり、どちらにとっても好ましい状況となる。 
〔中略〕
 あるソフトウェア技術者のことを思い出す。とても一流とはいえないプログラマで、「紙袋から抜け出すプログラムも書けない」とからかわれていたものだ。しかし、小さなプログラムをいくつもつなぎ今わせるコツを心得ていた。おそらく、一つとして自分で書いたものはなかっただろう。やることは1日中コンピュータの前にすわって、システムのディレクトリの中から使えそうなルーチンを釣り上げ、それらをつなぎ合わせてプログラムを完成させるといったことだった。きっと、コードを書くのを神に禁止されていたのだ。しかし、傑出したソフトウェア技術者として上層部に認められるようになるまでに時間はかからなかった。プロジェクトをスケジュール通りに予算の範囲内で完成させることができる、頼れるプログラマというわけだ。同僚にもほとんど気付かれていなかったのだが、実のところ彼自身は、基本的なソートルーチンさえ満足に書くことはできなかった。それにもかかわらず、使用できるリソースを徹底的に利用して彼は大変な成功を収めたのだった。 

(出典: Mike Gancarz(著者), 芳尾桂(監訳), (2001年), 「よいプログラマはよいコードを書く。偉大なプログラマはよいコードを借りてくる」, 「5.1 定理6:ソフトウェアの挺子を有効に活用する」, 「第5章 これこそ梃子の効果!」, 『UNIXという考え方 : その設計思想と哲学』, オーム社, 69~71ページ.)

 

本書タイトルの達人 *2 という言葉はラテン語の pragmaticus―実務上の熟達した―これ自身はギリシャ語の「行うこと」を表す πραττειν から来ています。 

 プログラミングとは技芸です。その最も純粋な部分では、あなた(あるいはあなたのユーザー)がやりたいことをコンピュータに伝えるための作業といえます。そして、プログラマーであるあなたは、聞き手、アドバイザー、翻訳者、独裁者と自身の役割を演じ分けるのです。とらえどころのない要求をつかみ、その要求の表現手段を模索することによって単なる機械が正しい仕事を行えるようにするのです。〔中略〕つまり、あなたは毎日小さな奇跡を起こしながら作業を進めるのです。 

〔中略〕 

*2 訳注:原題は“The Pragmatic Programmer”であり、“pragmatic”は「実践的」といった意味があります。 

(出典: アンドリュー・ハント(著者), デビッド・トーマス(著者), 村上雅章(翻訳), (2000年), 「まえがき」, 『達人プログラマー : システム開発の職人から名匠への道』(旧版), ピアソン・エデュケーション, ⅺページ.) 

 

偉大なプログラムは、追いつめられた人間が書く。あるアプリケーションを書かなければいけないとして、「それが実用的でなくてはならず」「どうやればできるか知っているエキスパートがまわりにおらず」、「それを『正しく』やる時間がない」とき、一片のすばらしいソフトウェアが書かれる可能性が非常に高くなる。 

(出典: Mike Gancarz(著者), 芳尾桂(監訳), (2001年), 「第1章 UNIXの考え方 : たくさんの登場人物たち」, 『UNIXという考え方 : その設計思想と哲学』, オーム社, 6ページ.)

 

 本書においては、技術的詳細の多くは省略した。これらはUNIXの実装によって異なるからだ。その代わりに、UNIXの考え方とは設計の方法論であるという点に重きを置いた。それは、個々の実装によって異なる性質のものではなく、より高い次元で定義された一般的なアプローチなのだ。 
 本書を通じてできるだけ口語体を用いるようにした。技術用語を駆使した重厚な学術誌を好む人もいるが、多くの人は、楽しみながら有益な情報を得られる「知は楽しみなり」的なアプローチのほうを好むだろう。これも、実はUNIXの文化に含まれているアプローチの一つだ。 UNIXコミュニティには、一風変わったユーモアのセンスが常について回っている。このセンスは、オリジナルのUNIXドキュメントにも含まれているし、UNIXのネットワークコミュニティにも見かけることができる。おそらくこれは、UNIXの開発者たちが仕事を楽しんだからに違いない。 

(出典: Mike Gancarz(著者), 芳尾桂(監訳), (2001年), 「序文」, 『UNIXという考え方 : その設計思想と哲学』, オーム社, ⅵ~ⅶページ.) 

 

 常人と達人プログラマーとの違いは何でしょうか?それは、問題に対するアプローチとその解決手段についての考え方、スタイル、哲学であると言っていいでしょう。達人プログラマーは、眼前の問題を考えるだけでなく、常にその問題をより大きな背景の中で捉え、常により大きな問題について気づこうとするのです。要するに、大きな背景を捉えること無しに、達人足り得る方法はありませんし、知的な解決、見識のある決定を行う方法もありえないのです。 

(出典: アンドリュー・ハント(著者), デビッド・トーマス(著者), 村上雅章(翻訳), (2000年), 「第1章 達人の哲学」, 『達人プログラマー : システム開発の職人から名匠への道』(旧版), ピアソン・エデュケーション, 1ページ.) 

 

この下の箇条書きの項目は、『UNIXという考え方』という本のなかで語られている、プログラマーにとっての重要な「定理」を箇条書きに列挙したものです。これらの考え方は、プログラミング以外のほかの知的生産をおこなううえでも、参考になることがたくさんあるのではないかなとおもいます。

「UNIXの考え方(定理)」

1. スモール・イズ・ビューティフル(小さいものは美しい) 
2. 一つのプログラムには一つのことをうまくやらせる 
3. できるだけ早く試作する 
4. 効率より移植性を優先する
5. 数値データはASCIIフラットファイルに保存する
6. ソフトウェアを梃子(てこ)として使う
7. シェルスクリプトによって梃子の効果と移植性を高める
8. 過度の対話的インタフェースを避ける
9. すべてのプログラムをフィルタとして設計する


「いくらか重要度の低い10の小定理」

1. 好みに応じて自分で環境を調整できるようにする 
2. オペレーティングシステムのカーネルを小さく軽くする 
3. 小文字を使い、短かく 
4. 木を守る 
5. 沈黙は金 
6. 同時に考える 
7. 部分の総和は全体よりも大きい 
8. 90パーセントの解を目指す 
9. 劣るほうが優れている 
10. 階層的に考える 

(参考文献: Mike Gancarz(著者), 芳尾桂(監訳), (2001年), 「1.1 UNIXの考え方 : 簡単なまとめ」, 「第1章 UNIXの考え方 : たくさんの登場人物たち」, 『UNIXという考え方 : その設計思想と哲学』, オーム社, 8~12ページ.)

以上、なにかのご参考までに。m(_ _)m

 

Content image

【余談】ポピパ! ピポパ! ポピパパピポパー!

「あたしも見つけたんだ
 キラキラドキドキすること

 できるかどうかわかんないけど・・・
 ドキドキしてる

 ・・・有咲!バンドやろう!」

戸山香澄の言葉, 「第2話 やっちゃった!」, 『BanG Dream!』より) 

 

これもまたまた余談なのですが、この上の画像の画面に映っている2Dキャラクターは、BlenderのGrease Pencil(グリースペンシル)の機能をつかって、2Dのキャラクターをつくってみるこころみのひとつとして、ぼくが実験的につくってみた試作品です。(ちなみに、このキャラクターは、あとで紹介するアニメ作品の登場人物です。)

この上の画像の画面の2Dキャラクターの絵が、Grease Pencil(グリースペンシル)の線をつかって、どんなふうにつくられているのか、ということがわかりやすいような画面表示にすると、この下の画面のようなかんじになります。

こんなふうに、なにやらいろいろな線(Grease Pencilの線)が集まって、この2Dキャラクターの絵ができているらしい、ということがおわかりいただけるかとおもいます。

ちなみに、上の画面に写っている2Dキャラクターは、ミニアニメ『ガルパ☆ピコ』の主人公の戸山香澄というキャラクターです。(くわしくは、この下の動画をご参照ください。)

【公式】アニメ『BanG Dream! ガルパ☆ピコ』1〜9話【バンドリ!】4/26(日)まで期間限定イッキ見配信! - YouTube 
https://www.youtube.com/watch?v=h8umFXSyAUU

ミニアニメ「BanG Dream! ガルパ☆ピコ」主題歌「ピコっと!パピっと!!ガルパ☆ピコ!!!」 - YouTube 
https://www.youtube.com/watch?v=V6PBBVeYcHk

ゆくゆくは、Blenderでこんなかんじのキャラクターをつくって、うごかして、アニメーションをつくってみたないな、とおもっています。

そのときは、もっとワンダフルなPythonコードをつかいこなせるようになって、そのコードをアニメづくりにいかしたいなとおもいます。
(o≧ω≦)O

 

Content image

 

Content image
Content image

 

 

 

 

「これ好奇のかけらなり、となむ語り伝へたるとや。」  

 

倉田幸暢
https://wisdommingle.com/

Supporter profile iconSupporter profile iconSupporter profile iconSupporter profile iconSupporter profile icon
Article tip 5人がサポートしています
獲得ALIS: Article like 64.45 ALIS Article tip 148.10 ALIS
倉田幸暢's icon'
  • 倉田幸暢
  • @yukinobukurata
たくさんの人が、目を輝かせて生きている社会は、きっと、いい社会なのだろうとおもいます。https://wisdommingle.com/memorandum-of-intent/

投稿者の人気記事
コメントする
コメントする
こちらもおすすめ!
Eye catch
クリプト

Bitcoinの価値の源泉は、PoWによる電気代ではなくて"競争原理"だった。

Like token Tip token
159.32 ALIS
Eye catch
他カテゴリ

機械学習を体験してみよう!(難易度低)

Like token Tip token
124.82 ALIS
Eye catch
クリプト

Bitcoin史 〜0.00076ドルから6万ドルへの歩み〜

Like token Tip token
947.13 ALIS
Eye catch
他カテゴリ

警察官が一人で戦ったらどのくらいの強さなの?『柔道編』 【元警察官が本音で回答】

Like token Tip token
114.82 ALIS
Eye catch
教育・子育て

【科学(化学)】進化に必要だった猛毒のガス~酸素~

Like token Tip token
25.63 ALIS
Eye catch
他カテゴリ

テレビ番組で登録商標が「言えない」のか考察してみる

Like token Tip token
26.20 ALIS
Eye catch
他カテゴリ

ALISのシステム概観

Like token Tip token
5.00 ALIS
Eye catch
他カテゴリ

BCAAは本当に必要なのか?徹底的調査

Like token Tip token
1.20 ALIS
Eye catch
他カテゴリ

防犯意識 マーキング 下書き供養④

Like token Tip token
24.07 ALIS
Eye catch
他カテゴリ

京都のきーひん、神戸のこーへん

Like token Tip token
12.10 ALIS
Eye catch
クリプト

約2年間ブロックチェ-ンゲームをして

Like token Tip token
61.20 ALIS
Eye catch
クリプト

ジョークコインとして出発したDogecoin(ドージコイン)の誕生から現在まで。注目される非証券性🐶

Like token Tip token
38.31 ALIS