| 2010-06-25
(*)
|
# 最小二乗法 |
|
最小二乗法をちょっと利用したくなって、確か ScientificPython でやったことがあったよな、という微かな記憶を頼りに「最小二乗法 ScientificPython」でぐぐったら、4 件しかでてこなかった。
「ScientificPython least square」で約 2,990 件。
まあ、世界的にも少数派なのかもしれない。
(他の皆は何を使っているのだろう)
というわけで、メモを残しておこう。
まずは from Scientific.Functions.LeastSquares import * としておいて、
一番簡単な直線の当て嵌めは
>>> polynomialLeastSquaresFit((1, 1), [(x1, y1), (x2, y2), (x3, y3)])
とやればいい。
最初の引数の (1, 1) は初期値なので別の値でもいいが、二つの数字のタプルを与えることで直線の指定になっている。
つまり、関数名から判るように多項式の当て嵌め関数なので、三つにすれば二次式、四つにすれば三次式で当て嵌めてくれる。
さらに自由度の高い関数が leastSquaresFit で、パラメータのシーケンスと変数で決められる関数を引数に渡して、そのパラメータを最適に決めてくれる。
もっとも、少しやるとしょっちゅう「非正則行列が出た」とかいうエラーに遭遇することが経験できると思う。
つまり、あまり自動化することは向いていない。
ということで、久しぶりに ScientificPython をインストールしたというお話(…あれ?)。
|
|
posted at 00:34:24
#
|
|
| |
| 2010-06-22
(*)
|
# pdf2png |
|
pdf のファイルを画像に落とさなければならなくて、ImageMagick 辺りに何かあるのではと思ったけど(USE flag が足りないからか)無かった。
仕方がないので、ぐぐってみた。
pdf2png -- using Quartz to convert PDF to PNG という5年前のブログが引っかかった。
どうでもいいが、懐かしさすら覚えるページ構成と色使いは紛れもなく PyDS だ、と思ったらそもそも pycs.net のページだった。
それはさておき、そこに pdf2png プログラムが置いてある。
OS X の API を利用した Python プログラムだという。
ほほう。
早速実行すると、問題なく png ファイルができあがる(向きが思っていたのと違うがそれはすぐに何とかできる)。
が、「CGPDFDocumentGetMediaBox なんて obsolete な API 使ってっとパフォーマンスも落ちるしさあ、やめてくんない? 頼むから CGPDFPageGetBoxRect 使ってよ」(意訳)という文句を吐くので、少し寄り道して将来の禍根を断つことにする。
と大きなことを言った割に、ぐぐって見つけた Pythonmac-SIG のこのメールに書いてある通りに、2ヶ所書き直すだけで終了。
実に容易い。
|
|
posted at 22:41:20
#
|
|
| |
| 2010-04-18
(*)
|
# heap.sort() maintains heap invariant |
|
「heap.sort() はヒープを不変に保ちます」と訳されていたが、考えてみるとおかしい。
ソートして不変だったらソートされているわけだが、そんなに都合の良いことは起こっていない。
英訳の際に(相互に関連した)二つの間違いがあったのだと推測する。
一つめ、maintain は keep と違って目的語の状態を補語として付け加える構文が無いことを見落とした。
もう一つ、invariant を形容詞だと思った。
maintain の使い方は、ネイティヴならざる身としては辞書に頼るしかないが、どの辞書にも補語を受け付ける構文は出てこない。
だからここで invariant を形容詞だと思うことはできないはずである。
ところが invariant という語形は良くある形容詞のもので、名詞なら invariance じゃないかと思ってしまう。
実際形容詞としての用法の方が一般的だろう。
が、計算機科学で(というか元々数学用語として) invariant を不変式・不変条件などの意味で使う。
invariance としてしまうと不変性とかそんな意味になって文意が違ってくる。
ということで、heap invariant はこの2語で「ヒープ不変式」と訳すべきで、実際のところリスト(配列)に要素を格納する順番の不等式が問題の文の少し上で与えられていて、これを指していると解釈できる。
ということで「heap.sort() はヒープ不変式を保ちます」と(2.6の翻訳では(協力者は常に募集中))直しておいた。
翻訳でなく自分で書くなら「heap.sort() はヒープ不変式を崩しません」とか書くかもしれないけど、そこまで自分勝手に文を変えるのも悪いかなと遠慮した。
|
|
posted at 16:15:12
#
|
|
| |
| 2009-12-21
(*)
|
# install-elisp |
|
twitter で install-elisp という、emacs lisp のプログラムをインストールする emacs lisp プログラムに触れていた人がいた(作者っぽい)。
それをインストールする ebuild を書いた。
install-elisp が取ってきたプログラムをインストールする場所は自分で決められるのだが、~/.emacs.d/ に入れるようにサンプルが書いてあったのでその通りにした。
そして、そのことに安堵感を覚える自分がいる。
なぜか。
ホームディレクトリの下はパッケージ管理していないものが置いてあっても自己責任である。
たとえ依存関係を解決してくれなくても、そういうもの、と思うだけである。
翻って、常々気持ち悪いと思う Python の easy_install は、基本的に /usr/lib の下にある site-packages にファイルを置こうとする。
これがいけない(ということに、今回思い至った)。
easy_install のような仕組みは個人的なパッケージ導入に留まっていればいいのであって、システムとしてのパッケージ管理と競合するべきではない。
勿論、依存関係はどこに入れようと同じであるから、機能として重なる部分はあるのでそこは API などで提供して上げるのはいいと思う。
しかし、システムとして提供するものをインストールするのは、他人の領分を侵す行為であると思うのだ。
Windows にパッケージ管理が存在しないのは別問題なので、それは別途対処していただきたい。
|
|
posted at 20:50:24
#
|
|
| |
| 2009-04-25
(*)
|
# PyDS を Python 2.6 に対応させる |
|
騙し騙し使いつづけている PyDS だが、Python 2.6 では起動すらしなくなった。PyDS が動きません。メタクラスに渡すものが間違っているとか何とか、ssl モジュールで死ぬ。 と Python 2.6 すら時期尚早 に書いた通り。
具体的にトレースバックを晒すと、
Traceback (most recent call last):
File "/Users/tetsushi/Gentoo26/usr/bin/pyds-start", line 34, in <module>
import PyDS.Server
File "/Users/tetsushi/Gentoo26/usr/lib/python2.6/site-packages/PyDS/Server.py", line 45, in <module>
import PyDS.Tool
File "/Users/tetsushi/Gentoo26/usr/lib/python2.6/site-packages/PyDS/Tool.py", line 50, in <module>
import PyDS.StructuredText
File "/Users/tetsushi/Gentoo26/usr/lib/python2.6/site-packages/PyDS/StructuredText.py", line 43, in <module>
import PyDS.docpytils
File "/Users/tetsushi/Gentoo26/usr/lib/python2.6/site-packages/PyDS/docpytils.py", line 2, in <module>
from urllib2 import urlopen, URLError
File "/Users/tetsushi/Gentoo26/usr/lib/python2.6/urllib2.py", line 92, in <module>
import httplib
File "/Users/tetsushi/Gentoo26/usr/lib/python2.6/httplib.py", line 1054, in <module>
import ssl
File "/Users/tetsushi/Gentoo26/usr/lib/python2.6/ssl.py", line 81, in <module>
class SSLSocket (socket):
TypeError: Error when calling the metaclass bases
function() argument 1 must be code, not str
標準モジュールで死なれて、しかもメッセージがメタクラスの呼び出し方が悪い、というようなもの。
手の出しようが思い浮かばない。
まあしかし、将来それも遠くない将来 Python 2.6 に移行するとき、PyDS だけは 2.5 でないと動かないというのは困る。
手掛かりを探してググった。
引っ掛かった中にあったのが、
TypeError: ssl() argument 1 must be _socket.socket, not _socketobject -> Solution
という2005年のメール。
timeoutsocket はもういらないんだ、と解決が謳われている。
timeoutsocket? そういえば使っていたぞ。
ということで、Server.py の import timeoutsocket を無くして、代わりに socket でタイムアウトを設定する。
(もしかすると、もっとユーザー側のところでタイムアウトが設定できるようになっていたかもしれないが、ともかく応急手当)
このポストがアップロードされれば、とりあえず使えるということにはなるだろう。
|
|
posted at 22:30:40
#
|
|
| |
| 2009-04-16
(*)
|
# みんなで正誤表 |
|
随分前から nifty の方で 勝手に正誤表 というのを作っていたりしたのだが、自分で書いているだけより他人にも作ってもらえるようにした方がいい、とは思っていた。
具体化しないままだったのだが、今回 Google App Engine を使って みんなで正誤表 というサイトを立ち上げた。
是非使ってみてほしい。
|
|
posted at 20:01:20
#
|
|
| |
| 2009-04-11
(*)
|
# GAE Hack-a-thon |
|
参加してきた。
当初、というか前回打ち合わせ時にはストレージ的なものをやるということにしていたのだが、gaedav の存在を知ってほぼモチベーションを失ってしまった。
ということで、急遽、remote_api グループに参加した。
どこから手を着けたらいいか判らない状態からだったので、午前中はほぼ公式の文書を読むだけで終わり、午後に書いたのもモデルクラスからローダーを生成するというスクリプトだけ。
最初は dir(model_class) から Property を引っ張り出して並べていたが、バルクで突っ込む用の csv と順番が食い違ってしまう、という問題があった。
inspect とかで何とかするのか、などとほざいていたら csv の先頭行にデータ名を書くという現実的な案を出してくれたので、それを実装した。
(良く考えれば inspect より ast とかの方がどうせ使わないにしろまだましな発想だ。)
その間に他のメンバーが実際にデータをアップロードしたり削除したりという部分を作ったので、そこそこ使えるものになった。
一日があっという間だ。
|
|
posted at 21:11:44
#
|
|
| |
| 2009-04-06
(*)
|
# GAE Hack-a-thon (事前ミーティング) |
|
珍しくイベントに参加してみることにした。
今日はその事前ミーティング。
ということで、渋谷のセルリアンタワーにある Google オフィスに行ってきた。
|
|
posted at 23:49:36
#
|
|
| |
| 2009-03-28
(*)
|
# 変更のためのパーミッションがありません。 |
|
昔作った django のアプリケーションを 1.0.2 で動かそうとした。
admin インターフェイスがほぼ全てという代物で、
移行作業が要る。
admin を import するようにして立ち上げてログインしたら
「変更のためのパーミッションがありません。」
と。
パーミッションの設定なんてあったかな。
実際は urls.py に
admin.autodiscover()
と書かなければいけないという説明を見落していたためだったようだ。
|
|
posted at 21:28:48
#
|
|
| |
| 2009-01-21
(*)
|
# 良く似た題名の2冊 |
|
ときどきの雑記帖で知ったが工学社から「はじめてのPython3」が出るそうだ。
オライリーからは「初めてのPython 第3版」も2月に出るという。
ところで「はじめてのPython」は名前が紛らわしいと叩かれるが、あれは工学社が「はじめての」でシリーズ化している中の一冊として著者にはどうしようもなかったはずで、あまりに責められることに同情を禁じ得ない。
追記(2009-01-22,2009-01-29):
中身についてもいろいろある、というご指摘をいただきました。
が、そこは、読んでない読んだはずだけど記憶に残っていないのでコメントを控えます。
(出版前に著者以外の人がチェックする、というシステムはないんですかねえ。)
|
|
posted at 07:51:44
#
|
|
| |
| 2009-01-19
(*)
|
# jinja2 |
|
Python2.6 の和訳レポジトリを持ってきて、make html したら ImportError になった。
jinja2 というモジュールがない、と。
さっき jinja 持って来たよ(svn で自動取得)と思ったが、jinja と jinja2 は別物なのだ、きっと。
いつものごとく ecopy で prefix に dev-python/jinja2 をインストールしたら、通った。
ML では何かエラーで止まるとか何とか言っていたように思ったが。
|
|
posted at 23:51:44
#
|
|
| |
| 2008-12-12
(*)
|
# dvcs と eselect |
|
mercurial で管理している Python のパッケージがある。
仮に hoge だとしよう。
あるとき、少し手の込んだ変更を試したい、と思い隣に clone して huga とした。
ところが、Python のパッケージ名としては依然として hoge を使いたいのである。
そこで、元々の hoge を hogehoge として、hoge は huga へのシンボリックリンクとした。
そんなとき、hoge のユーザーがパッチをくれた。
もちろん実体が huga である現在の hoge も元の hoge のクローンから派生しているのだからそこでマージすることはできる。
しかし、huga の変更が生きるかどうか判らないので、やはり元の hoge にパッチを当てて確認するのが筋だろう。
そこで、hoge のシンボリックリンクを hogehoge に張り替えた。
こんなことを繰り返すことになったとしよう。
そのうち、クローンも増え始める。
状況の細部を無視すると、していることは「複数バージョン」をシンボリックリンクで「切り替える」ことだ。
それはどこかで聞いたことがあるシナリオだ。
eselect だ。
Gentoo を使っていない人のために説明すると、eselect とは元々 gcc だの binutils だの emacs だのの複数バージョンをインストールして使い分けたい人のために用意されている機構である。
昔はそういう要望に各パッケージが適当に対応していたが、その内インターフェイスを統一しようということになって出てきたもの、だと思う。
ということで、hoge.eselect ファイルを作る。
Gentoo のツールらしく、eselect ファイルも基本的に bash スクリプトである。
/usr/share/eselect/modules にいくつかファイルがあるので、真似をすれば大して難しくない。
そして作った hoge.eselect を /usr/share/eselect/modules に置く。
と、こんな感じで使える。
% eselect hoge show
Current target of hoge:
huga
% eselect hoge list
Available hoge targets:
[1] hogehoge
[2] huga *
% eselect hoge set 1
Switching hoge to hogehoge ...
%
まとめ: dvcs のクローンリポジトリを eselect で切り替えることができる。
他の人はどうやってこういう切り替えを実現しているのだろう。
特に Gentoo 以外の人は
(多分似たような目的のツールがあるのだろうとは思うが)。
|
|
posted at 16:00:16
#
|
|
| |
|
|
| |
| 2008-09-30
(*)
|
# pylint で del の扱いが変 |
|
とりあえずサンプルコード(testdel.py):
"""
'del name' without defining 'name'
"""
del name
これを python testdel.py と実行すれば当然 NameError になる。
ところが、pylint testdel.py の結果は完璧(10点)だ。
実は最初に del の扱いが変、と思ったのはこんな(testfuncdel.py):
"""
del in function
"""
def func1():
"""
del variable with typo
"""
namae = "mft"
print namae
del name
func1()
python で実行すると UnboundLocalError になるところだが、pylint の警告は「使われていない変数 name」だ。
この「使われていない変数」というのは、代入したのにその後使われないというような無駄なコードを指摘する警告なので、どうも pylint には del が代入文のように見えているようだ(name = None みたいな?)。
知られているバグだろうか。
|
|
posted at 02:48:48
#
|
|
| |
| 2008-09-03
(*)
|
# dev-python/rope-0.8.4 |
|
Gentoo に rope のパッケージが登場した。
Gentoo Bug #202700 にリクエストを出してほぼ半年位何の反応も無かったが、気付いたら「rope と ropeide は入れといたよ、ropemacs は後でね」というコメントとともにツリーに追加されていた。
この半年の間には ropevim というのも出てきてたりしたはず(だけど vim でプログラムは書かないので使ったことも使う気もない)で、これがどうなるんだろうというのが少し気になったりならなかったり。
|
|
posted at 20:09:52
#
|
|