Pythonでなんか作ってみる
Amebaでブログを始めよう!
1 | 2 | 3 | 4 | 5 | 最初次のページへ >>

NodeBox(3)

どうも動画が変換に失敗してしまって貼れないけど、跳ねてます。

NodeBoxを動かせる人はコピペして試してみてください。

こんどは、線をゴムみたいにしてみた。

ゴムジャンプ

ベジェ曲線の制御にだいぶ手間取ったけど、Wikipediaで定義を調べて風呂の中で考えたら、
制御点をボールの深さの4/3のところに置けばいいと分かってなんとかなった。


speed(15)
size(160,160)

def setup():
global height,hv
height = 0.0
hv = 0.0

def draw():
global height,hv
# Move the canvas a bit.
oval(65,height,30,30)
if height >= 70:
depth = height-70
hv -= depth/10
biyon(depth)
else:
hv += 1.5
nomal()
height += hv

def nomal():
stroke(0.2)
strokewidth(2)
line(0, 100, 160, 100)

def biyon(h):
y = 100+h/0.75
x = 80
nofill()
stroke(0.2)
strokewidth(2)
autoclosepath(False)
beginpath(0,100)
curveto(x, y, 160-x, y, 160, 100)
endpath()


あと、高さの更新タイミングと線の引くタイミングを間違って
なかなか位置取りが合わなかったのはご愛嬌。





NodeBox(2)

別にネタらしいネタもないので、しばらくNodeBox遊びが続くと思います。

前回の黒丸を跳ねさせます。

コードは以下

speed(15)
size(160,120)

def setup():
global height,hv
height = 0.0
hv = 0.0

def draw():
global height,hv
# Move the canvas a bit.
oval(60,height,30,30)
hv += 1.5
height += hv
if height >= 70:
hv = -hv
height = 70
stroke(0.2)
strokewidth(2)
line(0, 100, 160, 100)



黒丸跳ねた

QuickTime形式で書き出せたんですが、アメブロに貼る方法がわかりません。

NodeBox(1)

NodeBoxというのを見つけた。
詳しくは、正確には2chのPythonのお勉強スレでのpydevcampで紹介されていたんだけど。

pydevcampの動画

Pythonでお絵描きするソフト、と私は捉えていますが、ほんとのところはどうなんでしょう?
なつかしのNxx-BASICで絵を描くプログラムを書いていた頃を思い出したんですが。
もちろん、Pythonなんで癒し度も抜群です。

とりあえず、丸を描いてみました。

黒丸

関数の再定義をエディタで行う関数

IPythonはPythonのインタラクティブモードとシェルを合わせたような便利な機能。
WindowsでもLinuxでもPythonを使ってテキスト処理が容易く出来る。
しかし所詮シェルなので、この上で関数定義などして間違って記述したときに訂正して再定義するのが面倒なんだよね。

↑キーでキー入力のヒストリーが表示されるけど、defから始まって最終行までを一つ一つ再入力しなければならない。かといって、エディタでファイルを開いてモジュールを定義するのも面倒だし、使い捨て関数の場合そのファイルを消すのを忘れないようにしないといけない。

というわけで、Historyに残った関数定義を一時ファイルに吐き出し、エディタで編集させた後、インタラクティブに戻ったときに関数を再定義するという関数を考えた。
インタラクティブモードから直接使うことしか考えていないので、別の関数から呼び出したら誤動作すると思う。

以下のように使う。

In [1]: def abc(s):
...: print s+'abc'
...:
In [2]: abc(0)
---------------------------------------------------------------------------
TypeError: unsupported operand type(s) for +: 'int' and 'str'
In [3]: import ptools
In [4]: ptools.editfunc(In[1])
In [5]: abc(0)
0abc



ソースコード。

import os,re,sys,tempfile

def editfunc(funcstr):
m = re.match(r'^def +([a-zA-Z_]\w*) *\(.*\) *:',funcstr)
if not m:
raise ValueError(funcstr)
funcname = m.group(1)
fd,fname = tempfile.mkstemp(suffix='.py')
os.write(fd,funcstr)
os.close(fd)
os.system('vim %s' % fname)
execfile(fname, sys._getframe().f_back.f_globals)
os.remove(fname)


ここではvimをエディタに使うことにしているけど、お好みに応じてどうぞ。

癒し系言語

Pythonは自分にとって癒しだったりする。
グダグダになって仕事がどうでもよくなったりしたとき、Pythonでコードを書いていると「癒される~」って感じる。
これは、Pythonでの書き方が↓みたいになるからだと思う。

1.まず動くものを書く→とくにIPythonとかで書きなぐる
2.繰り返し使うために関数化したりする
3.ファイルに落としてモジュール化する
4.ベタベタな書き方(重複コードとか)のところを、関数分割したりイテレータ化したりする

これを進めていくうちに、どんどんコードが改善されていっているのがわかって満足感が湧くからだと思う。C言語とかJavaとかって改善進めようとしても途中で(難しさで)手が止まってしまって結局不満になってしまうことが多い気がするが、Pythonではあまり無い。
もちろん、改善できなくてそのまま捨てるコードもいっぱいあるんだけど。

よく、IPython上で関数を定義して、それを編集するのに苦労したので、IPythonの履歴をvimで開いて編集後、その関数を再定義する関数を書いたけど、会社で書いたのでここに貼るのはまた今度・・・。



祝1年放置

っていうか15ヶ月放置か。

前回、ブログのタイトルを変更したときも、1年放置したんだなと考えると、自分の執筆意欲の周期性が垣間見えてくるね。

この間、vimからPythonのコードを直接実行する方法をググってたら、自分の記事が引っかかって役立った。

昔の自分に感謝。


デジカメのデータを移す

写真を分類するのも面倒なので撮影日のディレクトリを作成してまとめていたのだが今までは手作業だった。
ちょっとPythonでスクリプトを書けば済むだけだとは思っていたのだけど、面倒なので着手せず。

それを遂に思い立って書いた。


import os,shutil,glob,time
from stat import *

src_dir = os.path.join('J:\\','DCIM','100RICOH')
dst_dir = os.path.join('D:\\','Media','Photo')
print "%s -> %s" % (src_dir,dst_dir)
files = glob.glob(os.path.join(src_dir,'*'))

for x in files:
dir_name = os.path.join(dst_dir,
time.strftime('%Y%m%d',time.gmtime(os.stat(x)[ST_CTIME])))
if not os.path.isdir(dir_name):
os.mkdir(dir_name)
shutil.copy(x,dir_name)

ドキュメントを読みつつ、対話環境で実験しつつ、書いたら30分で出来た。
さっさと書いて置けばよかった...orz

先頭から2文字ずつ取る

16進ダンプデータを変換するスクリプトを書いていて、
色々邪魔な文字を削除した後の任意の長さの16進数データを得たとする。
0123456789abcdef

これから、
[0x01,0x23,0x45,0x67,0x89,0xab,0xcd,0xef]

というリストを得たい。
そんなとき書いたスクリプトがこれでした。

def bytelist(s):
result = []
for idx in range(0,len(s),2):
result.append(int('0x'+s[idx:idx+2],16))
return result

for x in bytelist('0123456789abcdef'):
print "%s " % hex(x),

しかし、もっとエレガントに書けないかとおもって、工夫したのがこれ。

def bytelist(s):
result = []
for a,b in zip(s[0::2],s[1::2]):
result.append(int('0x%s%s' % (a,b),16))
return result

len()やidxなどの変数や概念が無くなった所がPythonっぽくっていいと思ったのだが、
これを動かそうとしていた環境がPython2.2しか入っていなくて、結局元に戻した。

Pythonのジェネレータで四角いらせんを書くのに反応した

西尾泰和さんのブログの「Pythonのジェネレータで四角いらせんを書く」に反応してみた。
Pythonの短めのコードを見ると、ついつい自分ならこう書き直す、みたいに反応出来ちゃうのがいいね。

最初はPythonらしく短くならないかと思ったんだけど、なんかいじくりまわしているうちに、これってタートルグラフィクスじゃねーのって思って、それっぽくなおしてみました。

def squareSpiral():
class turtle:
x, y = 0, 0
dx, dy = 1, 0
def right(self):
self.dx, self.dy = -self.dy, self.dx
def forward(self,n):
for i in xrange(n):
self.x += self.dx
self.y += self.dy
yield self.x, self.y

width = 0
t = turtle()
yield t.x, t.y
while True:
width += 1
for i in xrange(2):
for x,y in t.forward(width):
yield x,y
t.right()

g = squareSpiral()
for i in range(10):print g.next()



なんかアルゴリズムも変わってしまって元々の意図(「アルゴリズムを確認するためにPythonでわかりやすく書いてからJavaで書く」という趣旨)なんか跡形もなくなっている気がしますが。

流行にのってvimに

なんか最近記事を書こうとする度にメンテナンスだったりするんですが。

えーと、Python使いとして流行を追ってエディタをvimにしてみました。
実際は、gvimになりますが、とりあえず、本家版に香り屋版の起動スクリプトを合わせた感じで。
意外に設定方法をネットから収集出来ず苦労したけど、vimからそのままPythonコードを実行するコマンドを書けるようにはなった。

python import vim
command Py python exec('\n'.join(vim.current.buffer))

これを_vimrcに書いた。
1 | 2 | 3 | 4 | 5 | 最初次のページへ >>