Category:Home/tutorial/strategy (Total 3 items)
Categories - tutorial/strategy
Libraries
- 2008-06-14 (土)
- tutorial/strategy
fromhttp://www.nodebox.net/code/index.php/Libraries
NodeBoxは豊富な機能(例えば、Googleクエリーや画像の操作)を外部ライブラリをimportすることで拡張できる。
これらの全てのツールは単純な理由からNodeBoxから分離している。NodeBoxが全てを含んでいると、扱いづらく、複雑になるからである。
Libraries from the NodeBox site
NodeBoxのサイトには沢山の面白いライブラリがある。例えば、WordNethttp://www.nodebox.net/code/index.php/WordNet、
フォトショップのようなコマンドを提供するCore Image http://www.nodebox.net/code/index.php/Core_Image
ライブラリのリストはこちら
http://www.nodebox.net/code/index.php/Library
これらのライブラリを使うには、まず、コンピュータにダウンロードする。
そして、NodeBoxが探すことができる場所でファイルを置く必要がある。:
その場所は、NodeBoxのスクリプトと同じフォルダか、Application Supportフォルダ内(~/Library/Application Support/NodeBox/)である。
そして、ximport()コマンドを使ってライブラリをインポートする。
注意点として、 wordnet.py libraryとpywordnetフォルダ(どちらもWordNetのダウンロードから)はdictionary.pyスクリプト(我々が丁度作成した)と同じフォルダに入れることである。
Python libraries
NodeBoxで書いたスクリプトは実のところPythonスクリプトである。
MacにはデフォルトでPythonがインストールしてあり、NodeBoxのプロジェクトに全てのPythonライブラリにアクセスしたりインポートしたりできる。
Pythonのライブラリのリストはここhttp://docs.python.org/modindex.html
次のステートメントでスクリプトへライブラリコマンドをインポートできる。
variable = ximport("library")
例えば、Pythonライブラリのリストからrandomライブラリを見る時、randomライブラリがリストをランダムに再要求するshuffle()コマンドを持つことが見える。
このコマンドをNodeBoxプロジェクトで使うには:
list = [1, 2, 3, 4, 5]
rnd = ximport("random")
rnd.shuffle(list)
print list
>>> [3, 4, 1, 5, 2]
何のファイルもインストールする必要は無い。NodeBoxはPythonライブラリが何処にあるか知っている。
For techies: why the ximport() command?
我々はimportステートメントよりもximport()をより好む。
何故なら、何故全てのコマンドが(importではなく)括弧を持つかを説明するステップを持ち去るからである。
さらに、ximport()は描画するコンテクストを参照したライブラリへ、パスし、ライブラリがスクリーンにものを描画出来る。
しかし、標準のPythonライブラリの為に、まだ、import と from a import b も好みで使用できる。
- Comments (Close): 0
- TrackBack (Close): 0
Commands
- 2008-05-31 (土)
- tutorial/strategy
fromhttp://nodebox.net/code/index.php/Commands
NodeBoxリファレンスhttp://nodebox.net/code/index.php/Referenceの定義済みのコマンドとは別に、あなた自身でカスタムコマンドを定義できる。
コマンドを作成することは、スクリプトのある動作や断片を再利用するデザイン戦略である。
画像省略
例えば上の例では、花を描くための全ての動作(線と接続した10個のレッドーピンクの円)は、手軽なflower()コマンドにグループ化されている。
このコマンドは一回でも100回でも1000回でも呼び出せる。
花を描く方法を変更したければ、コードの1つの箇所を変更するだけである。
コマンドを定義することは、何度も使うことが出来る道具のセットを使って、道具箱を構成するのと同じである。
Command definition
シンプルな例として、独自に定義した header()コマンドを下記に記す。
def header(txt, x, y):
fill(1, 0, 0)
font("Dolly-Bold", 18)
text(txt, x, y)
コマンドの定義はdefで始める。続いてコマンドの名前(関連性のある名前を付けよ)、次いでパラメータのリストが来る。
行の最後に:コロンを付けるのを忘れないように。これは、続くインデントされたステートメントがそのコマンドであるということをNodeboxに伝えるためである。
Naming conventions:
- コマンドが何をするのかの記述となるような、シンプルで関連性のある名前を使え。
- 小文字とアンダースコアを使えlower_case_with_underscores。(imagesizeのような不可欠なコマンドは除く)
- コマンドがTrueかFalseを返すものなら頭にisを付けろ。: is_white, is_alive, is_big, ...
- 値を変化させて返すコマンドには頭に動詞を付けろ。: adjust_contrast, strip_tags, ...
Parameters
コマンド定義はそれ自身では実行されない。:
あなたが代りにNodeBoxに何かを教えている。 (例えば、headerが何か?)
コマンド定義はスクリプトのどこかで呼び出される必要がある。
これが、パラメータを入れさせる所である。:
header()の定義がどうtxt,x,yを使用するかに注意せよ。
これらは変数の定義のように使用される。
一度コマンドが呼び出され、txt,x,yに実際の値を与える。
header("Templating", 20, 40)
これでNodeboxは、header()で定義された全てのコードに、textへ"Templating",xへ20、yへ40が実行される。
Return value
NodeBox内のコマンドが返す値を持っており、変数を保持できることに注意。
例えば、textheight(txt, w) は表示されたtxtのパラグラフの高さを、幅と共に返す。
def paragraph(txt, x, y, w):
fill(0.2)
font("Dolly-Roman", 14)
text(txt, x, y, w)
return textheight(txt, w)
定義でのreturnステートメントは値を返す。
これは数値、文字列、リストなんででもできる。
returnステートメントは定義の最後にいつもくる。
Example
下の例では、2つのスクリプトとも同じ動作をする。
片方は上から下へプレーンに使用していて、片方はテンプレートを使用している。
実際には最初のコードの方が短い、しかし、2つでなく20個のパラグラフを書くことを想像せよ。
…フォントを定義して、カラーもまた定義して…結局ロボットに何か説明する別のロボットが欲しくなるだろう。
そのうえ、ヘッダのカラーや、水平マージンを変更するには2番目のスクリプトがはるかに簡単である。
なぜなら、header()の定義を変えるか、変数xの値を変えるかのただ一回で済むから。
1st:plain top-to-bottom scripting.
fill(1, 0, 0.25)
font("Dolly-Bold", 14)
txt = "Without templating"
text(txt, 20, 30, 200)
fill(0.2)
font("Dolly-Roman", 14)
txt = "Without templating, ..."
text(txt, 20, 50, 200)
fill(1, 0, 0.25)
font("Dolly-Bold", 14)
txt = "Messy"
text(txt, 20, 120, 200)
fill(0.2)
font("Dolly-Roman", 14)
txt = "This makes your script...."
text(txt, 20, 140, 200)
2nd:The same script with templates.
def header(txt, x, y):
fill(1, 0, 0.25)
font("Dolly-Bold", 14)
text(txt, x, y, outline=True)
return textheight(txt)
def paragraph(txt, x, y, w):
fill(0.2)
font("Dolly-Roman", 14)
text(txt, x, y, w, outline=True)
return textheight(txt, w)
x = 20
y = 30
w = 200
y += header("With templating", x, y)
txt = "With templating, ..."
y += paragraph(txt, x, y, w) + 10
y += header("Clean", x, y)
txt = "This keeps your script..."
paragraph(txt, x, y, w)
- Comments (Close): 0
- TrackBack (Close): 0
Repetition
- 2008-05-31 (土)
- tutorial/strategy
fromhttp://nodebox.net/code/index.php/Repetition
繰り返し処理(Repetition)はコンピュータが本当に良いということです。
決して退屈させないし、何重にも同じ処理を頼むことが出来るし、貴方が繰り返し処理を嫌いになる事はないであろう。
そしてまた、計算が速いです。
The for-loop
プログラミング中に、複数回同じ事を繰り返す時、一般的にfor-loop(for文によるループ)を呼び出す。
for-loopは指折りで数える手をセットするのに似ている。
しかし、手の数は無限であり、数える指も無限である。
ステートメントは以下である。:
for variable in list: do stuff
最後に:コロンを付けるのを忘れないこと!
The variable part
変数は好きなようにどんな名前も付けられる(Variablesの項で記述済み)。
変数は現在どの指を数えているか保持する。
一般的な名前はiである。
これは、基本的な数学でカウンタがiと命名されることの名残である。
これは短い文字で、長い歴史を持つ良いしきたりである。
The list part
Listパートは数字、もしくは属性のリストである。
各エレメントが連続してVariableパートへ割り当てられる。
for-loopは唯、指を数えない。それはどのようにでも望むようにカウントできるし、numbers, strings, colorsと、どんなものでもListに入れることが出来る。
for i in ["apple", "pear", "banana"]:
print i
>>> apple
>>> pear
>>> banana
一般的にリストとしてrange(n)コマンドを入れる。
これは0からnまでの数字のリストを返す。
for i in range(3):
print i
>>> 0
>>> 1
>>> 2
The do stuff part
do stuffパートは繰り返し実行される必要がある、NodeBoxコマンドである。
それらはfor-ステートメント文から空白かタブでインデントする。
スクリプトはここでループを「捕獲」し、連続的に変数に割り当てられたリストを使って、それぞれのエレメントがあるまで、実行され続ける。
もちろんそれぞれのループに変数を使用できることは素晴しい所です。
上の例のように、小さなループを持った時、全てのフルーツを通過し、それぞれのフルーツをプリントする。
print i は抽象的なコマンドで、NodeBoxはiをそれぞれのリスト内のエレメントに置き換えてループする。
ステートメント文の最後に:を付けるのを忘れないように!
For-loops and random()
for-loopとrandom()はうまく一緒に動作する。
例えば100個の輪を作って、ランダムな位置に配置できる。
この方法は、スクリプトを実行させる度に、異なった構成の輪になる。
この方法での簡単なプログラミング「スタイル」である。
for i in range(100):
x = random(HEIGHT)
y = random(WIDTH)
r = random(50, 100)
oval(x, y, r, r)
- Comments (Close): 0
- TrackBack (Close): 0
- Entries in this Category
- Tutorial
- Library
- Syndicate this site