Pythonの最近のブログ記事



ちょいとSCPでファイルを取ってきたり、置いたりしないといけなかったので。


Pexpect


Pexpectというライブラリを利用。


コマンドを自動化できる。一番良いのはpasswordを聞かれるのを自動で答えてくれること。


SCP

SCPのサンプルコード。らくちん。



import pexpect

SERVER = "www.rokujyouhitoma.com"
USER = "rokujyouhitoma"
SOMEDIR = "~"
PASSWORD = "bar_password"
UPLOADDIR = "baz_dir"

if __name__ == "__main__":
scp = pexpect.spawn('scp -r %s@%s:%s %s' % (USER, SERVER, SOMEDIR, UPLOADDIR))
scp.expect('.ssword:*')
scp.sendline(PASSWORD)
scp.interact()

ま、問題はこんな危険なコードが流失したらだなぁー。


SSH

同様にSSHのサンプルコードを。



import pexpect

SERVER = "www.rokujyouhitoma.com"
USER = "rokujyouhitoma"
PASSWORD = "bar_password"

if __name__ == "__main__":
foo = pexpect.spawn('ssh %s@%s' % (USER, SERVER))
foo.expect('.*ssword:')
scp.sendline(PASSWORD)
foo.interact()


重要なことなのでもう一度。危険だから、使い方には注意して下さい。



ま、あれだな。引数でパスワードを取るように変えるしか考えつかないけど・・・。


追記


「pitを使えばパスワードを隠蔽化できるよ」ってTwitterで教えてもらいました。後で試す。


公式



参考




JavaScriptでカリー化


私の第一言語であるJavaScriptでカリー化を試してみる。


JavaScriptはお師匠のJavascriptシェルで実行すると楽ちん。



例題はWikipediaのカリー化を参考にしよう。



関数 f がhttp://upload.wikimedia.org/math/9/3/6/936d3616ae1788839acf2cbb7228fad2.pngの形のとき、f をカリー化したものを g とすると、g はhttp://upload.wikimedia.org/math/8/6/7/8678d9a38b70c18ff730a4326baf87b9.pngの形を取る。非カリー化(uncurrying)とは、これの逆の変換である。


カリー化とは直感的には「引数を幾つか固定すると、残った引数の関数が得られる」ということである。たとえば、除算の関数http://upload.wikimedia.org/math/8/b/0/8b012fa4da01406236b0b0a5cb959a03.pngをカリー化したものを cdiv とし、inv = cdiv(1) とすると、inv は新しい関数となり、http://upload.wikimedia.org/math/d/2/0/d201da20452ac22a913f0debbcdd4dc4.png 、つまり引数の逆数を返す関数になる。


http://ja.wikipedia.org/wiki/%E3%82%AB%E3%83%AA%E3%83%BC%E5%8C%96

実際に書いてみた。

例題を実直にdiv関数を書くとこんな感じ。



var div = function(x,y){
return x / y;
};
alert(div(2, 1));//2

2つ目の例を落とし込むとこんな感じ。



var inv = function(x){
return function(y){
return x / y;
};
};

var cdiv = inv(10);//inv(10)のfunctionを変数cdivにbindする

alert(cdiv(1));//10
alert(cdiv(2));//5

var cdiv = inv(2);//inv(2)のfunctionを変数cdivにbindする
alert(cdiv(1));//2
alert(cdiv(2));//1

alert(inv(10)(2));//5
alert(inv(10)(5));//2


書いて分かったけど、高階関数の一種なのね。なるほど。


乗法してみた

もう少し書いてみる。次は乗法。



var multiplication_curry = function(x){
return function(y){
return x * y;
};
};

//実行例1
var first = multiplication_curry(1);
var second = multiplication_curry(2);
var third = multiplication_curry(3);
alert(first(second((third(4)))));//24
//first(second((third(4))))
//first(second((3 * 4)))
//first(second((12)))
//first(2 * 12)
//first(24)
//1 * 24
//24

//実行例2: 実行例1とは当然等価。
alert(multiplication_curry(1)(multiplication_curry(2)(multiplication_curry(3)(4))));//24
//multiplication_curry(1)(multiplication_curry(2)(3 * 4))
//multiplication_curry(1)(multiplication_curry(2)(12))
//multiplication_curry(1)(2 * 12))
//multiplication_curry(1)(24))
//1 * 24
//24

展開式も書いてみた。


JavaScriptでこの書き方好きだけど、他人のコードをリバースエンジニアリングするのは勘弁。



Pythonでカリー化


乗法を第2言語のPythonで書いてみる。



multiplication_curry = lambda x: lambda y: x * y

print(multiplication_curry(1)(multiplication_curry(2)(multiplication_curry(3)(4))))#24

lamda式を使う。return文がないので綺麗に書けた。


Gaucheでカリー化


ついでにGaucheでもカリー化。



(define (multiplication_curry x)
(lambda (y) (* x y)))

((multiplication_curry 1)
((multiplication_curry 2)
((multiplication_curry 3)
4)))
;;24

大体理解した。



別件の疑問


JavaScriptの関数定義の際、変数に無名関数を束縛する書き方と関数を定義する書き方どっちが主流なんだろう??


変数に無名関数を束縛する書き方例


var div = function(x,y){
return x / y;
};


関数の定義


function div(x,y){
return x / y;
}


個人的には前者の変数に無名関数を束縛する書き方なのだけれど...どっちが良いのだろうか...??




まとめ



  1. カリー化を実戦で使うところってどこだ?

  2. やっぱりプログラミング言語はファーストクラスオブジェクトじゃないと♪



参考


id:m-hiyamaさんのブログを読んでて興味を持ちました。


檜山正幸のキマイラ飼育記


例題はWikipediaからの引用です。


Wikipedia カリー化


実行とテストにはお師匠のJavascriptシェルを利用しました。


Javascriptシェル




EclipseプラグインのPyDevで、GAE/Pyの開発環境を構築する。


環境



  • Mac OS 10.5.8

  • jre1.5.0_20

  • python2.5.4

  • GoogleAppEngineLaunchar1.2.7

  • Eclipse3.5.1

  • PyDev1.4.6


はじめに


そもそも、Mac OS 10.5にはjre1.5系とpython2.5系がインストールされてるのでOK。


EclipseとPyDevは別の件で構築済み。


GoogleAppEngineLauncharも以前試しに使ってみたのでインストール済み。



Eclipseでのプロジェクト立ち上げ、ライブラリとの関連付け。


プロジェクトの立ち上げ。


Eclipseで、



File => New => Other => Pydev => Pydev Google App Engine Project

からGAEプロジェクトを立ち上げる。


Google App Engine Directoryを聞かれるので、答える。自分の環境だと下記のパス。



/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine

ライブラリとの関連付け。


作成したプロジェクトを試験用のサーバーで動かせるようにするGoogleAppEngineへのパスを通す。


作成したプロジェクトの



Properties => PyDev - PYTHONPATH => External Libraries => Add source folder

から下記4つのパスをそれぞれ追加する。



/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine
/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/lib/django
/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/lib/webob
/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/lib/yaml

試しに試験用サーバーで動かしてみる。


Pydev Google App Engine Projectでプロジェクトを作成したなら、<プロジェクト名>/srcにサンプルソースが作成されているはずなので、


作成したプロジェクトの、



Run As => Run Configuration

において、


Main => Main Moduleに下記を追加



/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/dev_appserver.py

Arguments => Program argumentsに下記を追加。



${project_loc}/src --port=8080

そして、Run。http://localhost:8080/にアクセスすると表示されるはず。


参考


下記を参考にしました。



さて、


Google App Engineのドキュメントを読み込むかな。


ところでなのですが、Pythonに関して中級者向けの書籍ってないのかな..??オライリーのはじめてのPythonの次に読む書籍が見当たらない。


オンラインドキュメントが充実してるから不要なのだろうか?



今度他のエンジニアに聞いてみる。


Tracのプラグインに関して調べたので、備忘録としてまとめとく。

**ほげにっき
id:digoさんのhatena diary
http://d.hatena.ne.jp/digo/searchdiary?word=*[TracScrumHalf]

**気の向くままに・・・ Trac Plugin - IRequestFilter
http://syo.cocolog-nifty.com/freely/2008/09/trac-plugin---i.html



getパラメータの処理調べてたんだけどプラグインでインストールできるまではOK。

あとは、本機能の実装。



画像認識の必要があったので、OpneCVをPythonから利用するための下準備。



例のごとく備忘録です。


opencvとpythonバインディングのインストール



yum -y install opencv opencv-devel opencv-python

確認

Pythonインタプリタでopencvモジュールを試しに読み込む。



Python 2.5.2 (r252:60911, Sep 30 2008, 15:41:38)
[GCC 4.3.2 20080917 (Red Hat 4.3.2-4)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import opencv
>>>

よし。モジュールは読み込めた。



公式


opencv.jp


参考


OpenCVのLinuxへのインストール


Python + OpenCVでウェブ上の画像を表示する




最近私が作ったPythonプログラムをフローズンバイナリにするツールをまとめてく。



py2exe


Windows向けの.exeファイルを作成する。


Macでの実行は想定されておらず、Windowsでのみ動作する。



  • Latest:0.6.9。

  • Python2.6,2.7対応(2.7ってあったけ...py2exeの公式にはある...?)。3.0非対応(?)。

  • Tkinterを利用したモジュールを一つのexeにするとエラーで落ちる...要注意(オプション名はbundle_files)。


参考


cx_Freeze



  • py2exe同様、Windows向けの.exeファイルを作成する。

  • Latest:4.0.1。

  • Python2.6対応。3.0非対応(?)。

  • Fedora9向けRPMあり。ソースコード配布ありなので、Mac(Unix)でも容易に使えそう。


参考


PyInstaller



  • .exeファイルを作成する。

  • Latest:1.3

  • Python1.5~2.4対応。2.5,2.6,3.0は非対応。


参考


1.4からはPython2.6に対応するようで、パッチは用意済みだそう。




最近Tkinter使ってます。id:rokujyouhitomaです。



簡単なGUIを作るのに適してるTkinterですが、弱点が。なんと...表部品(テーブル部品)がない!!



まさか表部品の実装をしなければいけないのだろうか...。



調べて分かったのですが...正確に言うと、TkinterにないのではなくTkにないです。


でさらに調べたところ、sourcefoge.netに公開されてました^^


環境


Mac OS 10.5


インストール


インストールはmake, make installとmacportsがある。


./configure, make, make install

sourcefoge.netに公開されているので早速入れる。



$ curl -O http://nchc.dl.sourceforge.net/sourceforge/tktable/Tktable2.10.tar.gz
$ tar zxvf Tktable2.10.tar.gz

$ cd Tktable2.10

$ ./configure
$ make
# make install

完了!


macports


$ sudo port install tktable

入ったか確認。


直接tclコマンドを叩く。



$ tclsh
$ package require Tktable

正しければ、



$ 2.9

と表示される。


正しくなければ、



$ can't find package Tktable

と表示される。


補足:終了はexit


Pythonで利用する。


解凍したTktable2.10.tar.gzの中にPython用のモジュールが入ってます。


デモは、


demos/tktable.py


f:id:rokujyouhitoma:20090515175613p:image


ライブラリは、


library/tktable.py


試しに実行。


import tktable
table = tktable.Table(rows=5, cols = 5)
table.pack()

実行結果

こんな感じで表になります。


f:id:rokujyouhitoma:20090515180241p:image


入力もできちゃったり。


f:id:rokujyouhitoma:20090515180422p:image



これで、開発が進む。実装するのは楽しそうだけどしんどいもんね...


参考


公式


その他



最近業務でTkinter使ってるのでメモ書きと陥ったところ。


そもそもTkinterって何よ?


TkinterはPythonの標準モジュールで、Tk/Tclをラップしてるモジュール。


TkはGUIツールキット(Tool Kit)の一種でSun Microsystemsが開発していたライブラリ。


環境



  • Mac OS 10.5

  • Python2.6.2


wmに引っかかった...


自身の知識不足でひっかかった所は、ウィンドウのアイコンに.icoを設定しようと考えていた。


調べたところwm_iconbitmapというメソッドを発見。このメソッドに.icoへのファイルパスを設定。


実行したところ...



return self.tk.call('wm', 'iconbitmap', self._w, bitmap)
_tkinter.TclError: bitmap "star.ico" not defined


エラーがでる。


調べた結果...



> I know that in a normal windows python Tkinter app you would use:


>


> root.wm_iconbitmap("/Icons for App/Windows.ico")


>


> to make an icon in the title bar. However, when you do that in mac OSX you


> can't see it. I am not sure if it is because the x - and+ are on the left


> side, or because it just doesn't support MacOSX. Looking at other programs


> none of them have it either. I am just wondering is it possible to put an


> icon in the top title bar.


>


... [show rest of quote]


No, OS X doesn't support this, as far as I know.



あちゃー。Macはサポート外ですが...残念。


という事で、下記に修正し完了。



import sys

if sys.platform == "win32":
root.wm_iconbitmap("star.ico")


細かな所だけど、Macでも設定したいな...


参考


トップレベルのウィンドウの制御 トップレベルのウィンドウ


Re: Icon on title bar in macOSX




使ってるMacBookProには標準でPython2.5.1が載ってる。


この2.5系と共存する形で2.6系,3000系を入れたかったので方法を模索。


MacPortsで入れるのが良いみたい。


環境



  • Mac OS 10.5

  • MacPortsがインストールされている事。


Python2.6のインストール


下記を実行。



$ sudo port install python26


このインストールが完了しても標準の2.5.1が起動する(リンクの関係かな?)ので、


複数のPythonを切り替えることができるpython_selectをインストールする。


python_selectのインストール



$ sudo port install python_select


python_selectを使う。


実際にpython_selectを使う。


まずは、切り替える事ができるPythonを確認。



$ python_select -l
Available versions:
current none python25 python25-apple python26


次に切り替えたいバージョンを選択。



$ sudo python_select python26


オプションとか。


$ python_select
usage: python_select [-n] [-d] [-r] [-h] [-v] version

-n Show commands to do selection but do not execute them.
-d Show debug messages during execution
-h Display this help info.
-r Skip test for necessary rights.
-v Display version of python_select.
-l List available options for version.
-s Show the currently selected versio



これでMacで複数のPythonを使いやすくなった♪




参考




追記


windowsの切り替え方法があったら教えて下さい>_<




Pythonで描画できないかなぁと考えたところ、「そういえばturtleってライブラリがあったな」という訳で使ってみる。


turtleモジュール


Python2.5から標準ライブラリに入って、Tkinterを利用しているグラフィカルライブラリ。


詳細は、PYJUGの日本語ライブラリリファレンスを参照のこと。20.4 turtle -- Tkのためのタートルグラフィックス


注意が必要なのは、Python2.5系とPython2.6系、3.0系に含まれるモジュールが結構異なる事。


環境



  • Python2.6.2

  • Mac OS 10.5


使ってみた。


円を書く。


import turtle

if __name__ == '__main__':
t = turtle.Turtle()
t.circle(50, 180)
t.circle(-50, 180)
t.circle(-100)
turtle.exitonclick()


実行結果


D


模様を書いてみる(追)


import turtle

def main(count, xy):
t= turtle.Turtle()
for x in range(5):
wave_down(t, count, xy)
t.forward(xy[0] + xy[1])
wave_up(t, count, xy)
t.forward(xy[0] + xy[1])
turtle.exitonclick()

def wave_down(obj, count, xy):
for x in range(count):
obj.forward(xy[0])
obj.right(90)
obj.forward(xy[1])
obj.right(90)
obj.forward(xy[0])
obj.left(90)
obj.forward(xy[1])
obj.left(90)

def wave_up(obj, count, xy):
for x in range(count):
obj.forward(xy[0])
obj.left(90)
obj.forward(xy[1])
obj.left(90)
obj.forward(xy[0])
obj.right(90)
obj.forward(xy[1])
obj.right(90)

if __name__ == '__main__':
main(10, [20,5])


実行結果

f:id:rokujyouhitoma:20090506220350p:image



参考




結構面白いことできそうだから、続けて触ってみる。


あわせて読みたい

  • あわせて読みたいブログパーツ

Lingr java-ja

ウェブページ

Powered by Movable Type 4.1