dullhikoのだるいブログ

殆ど日記のだるいブログ

今更Excelに触れてみる

2005年08月16日 | ソフトウェア
今更だがMicrosoft Officeを導入。
Excelを使ってみた。

はあ、参照は=の後にセルアドレスを入力すればいいのか…
こんなことも知らないんだから恐ろしい > 俺

変な関数じゃなくてPythonスクリプトをセルの計算式に指定できれば面白いのだが。
もしかするとVBScriptなら可能なんだろうか。
まあ、どうでもいいけど。

とか言いつつ、Excelをいじるのって結構面白いと思ってしまった俺ガイル。

あと、合計にSUMという関数があるのにMULとかDIVが無い(と思う)のはいかがなものなのか。しかも合計はSUMなんか使わずに+で普通に出来るし、じゃあなんでSUMは存在するのか…これが世間というものか(やや意味不明)

Pythonのsetup.pyをちょいとかじる。

2005年08月15日 | Python
NoboNoboさんの書かれた小技集からdebugger.pyを、いちいち同じディレクトリに置くものアレなんで、site-packageにでもコピーして入れてみようと思ったのだが、そんなふうにただ入れるだけではヒネリが無い。

そういうわけで、setup.pyでも書いて、インストーラってのを後学のためにやってみようと思い立った。

これが面白い。
ヘルプにも書かれている当たり前のことだが、と前置きしておいて、

python setup.py install

これが普通のインストール方法だ。
そこで

python setup.py bdist_wininst

こいつだと、インストールではなく、なんとwindows版のバイナリ実行版インストーラを自動生成してくれるのだ。
常識なんだろうが、知らなかったのですごくびっくりした。Pygameやらなにやらで、あのインストーラは一体どうやってつくってるんだろう…とか思っていたが…すごいねPython。
ちなみにsetup.py自体はかなり奥が深いようで…まあ今はそんなに触ることもやめておいた。

Pythonで文字列を簡単に切り出す

2005年08月15日 | Python
Pythonなら何事でもシンプルに出来るはず、という思い込みがあって。
これは大抵の場合、正しいのだが。
必ずしも俺がその正しい方法にたどり着くことができるわけではないのが辛い。

今日はトークナイズというか文字列の切り出しについて考えていた。
実は今、GTKのGladeが吐き出すCソースコードをPythonスクリプトに自動変換するPythonスクリプト(ちょっとややこしい表現だ)を書いているのだが。

gtk_hoge(hogehoge, hoge, 8, 24)

みたいなコードがあった場合、引数をリストやらタプルに分解してしまいたいと思ったわけだ。
で、頭のよろしくない俺は最初はこう考えた。

ループして正規表現で切り分けてしまえ、と。

そりゃ、可能だ。
しかしそれはやはり、誰が見てもどう考えても美しくない。こんなありふれた処理は一発で出来るはずである。

そのとおり。出来ました。

文字列オブジェクトのsplitメソッドがそれ。一瞬です。

つーわけで一つ。Pythonでの日本語について。

2005年08月14日 | Python
せっかくPythonカテゴリを作ったのでここでひとつ。
Pythonでの日本語は簡単で、まあ、ソースファイルのエンコードをキッチリ指示して、u指定をつけたりしとけばまあ問題は無い。
って、これはあくまで表示や文字列としての話。

ファイルの保存となると話が違ってくる。
デフォルトではasciiコーデックが強制指定されており
マルチバイト文字列を通そうとしても拒否されてしまう。

システムデフォルトのエンコーディングをいじる、ということも出来るそうだが
その手段はあまり美しくない。と個人的な好みではそう思う。いやコードはきれいになるけど汎用性がないじゃん、と。
そこでヘルプ見たりググッてさまざまなサイトを見させていただいた結果、こういう感じの結論に達した。

fp=open("hoge.txt","w")
fp.write(u"テスト".encode('UTF-8'))
fp.close()

とすれば、UTF-8で書かれたテキストが出来上がる。

unicode("テスト").encode('UTF-8')
でもいいのかもしれない。

この内容はNoboNoboさんの書かれたPython小技集を必死でググッて発見、参考にさせていただきました。他にも環境変数参照の小技とか、なかなか最高。
というわけで初トラックバックさせていただこうと思ったが、その方法がいまいちわからなかったので断念。

Pythonカテゴリを新設した

2005年08月14日 | Weblog
なんかPythonのことばかり書いている気がしたので、いっそのこととして独立させてみたりした。
しかし、今まで書いた分はどうするのか…修正はめんどくさいからしないな、とも思う。なんだかなあ。

PythonでC++のstatic変数のようなものを使うには

2005年08月14日 | プログラミング
たとえば、gtkでは
gtk.WINDOW_TOPLEVEL
などとして、定数のように使っている機能のことだ。

クラスオブジェクトが存在せずとも(言い方を変えれば、生成せずとも)、グローバルに参照できる変数。
ちょうど、C++で言うところのstaticメンバをpublicとして宣言したようなものだ。
これは、以下のようにする。

class Testclass:
    CLASSDATA=1

このようにすると、いきなり
Testclass.CLASSDATA
という記述でアクセスできる。
このクラスに書き換えハンドラ(__setattr__)を実装して全ての変数を書き換え不能にしてしまえば、完全に定数のように使用することも可能だ…?

…と、思っていたのだが。なんと、この方式の変数には__setattr__でのトラップは効かないようだ。これが効くのはあくまでインスタンスのメンバ変数にのみ、ということらしい。

PyGTKでイベントを強制的に回すには

2005年08月12日 | プログラミング
重い処理の時。 VBならDoEvents(って、まだあるんだろうか?俺が触ったのは2.0だ…古っ)、
C言語などWin32API直叩きならPeekMessageなどの合わせ技。 たとえば。
変数の定義とはぶっ飛ばしてかいつまんで言えば

while(PeekMessage(&Msg,dWindow,0,0,PM_REMOVE))
{// メッセージ受信処理

  TranslateMessage(&Msg);
  DispatchMessage(&Msg);
 
  if(Msg.message==WM_QUIT)
  break; //ていうかアプリケーション抜ける処理もせねば
 
}

こういう類のでイベントキューを強制的に空にする。
あるいはスレッドを使うか。

この処理は、Python + PyGTKなら、こうだ。

while gtk.events_pending():
  gtk.main_iteration(1)
 
 
これでウィジェットは再描画もされる。
プログレスバーやラベルならquene_draw()とか別にいらない。

ググり方が悪くてruby用gtkのサイトから知ったのは内緒だ
というか、プログレスバーが全然更新されないので、重い処理中の 強制的イベントハンドラ開放を調べまくった俺。
ようやく回答にたどり着けた。

しかし俺の場合、実はプログレスバーが全然進捗していかない本当の原因は、
float()変換している値に対して整数値を ぶつけていたので、
結果としてprogressbar.set_fractionに入れる値が 整数、つまり0と1の二種類だけになっていた罠。

ちなみにスレッドも使ってみたんだが、結局join()でブロックするせいか効果がなかった。なかなか、Win32APIのようには行かないものだ。
やりかたが悪いんだろうか。

今回は、めんどくさくなって一瞬C言語(つかBCB)に手が伸びかけたが、Python & GTKの修練の為と思ってなんとか踏みとどまった。

ま、そういうわけで、俺と同じ目に遭っている人、あるいはこのことを忘れた自分、が必死で検索している時に備えて、GTK、再描画、イベント、Invalidateに相当、DoEvents、キュー、とかキーワードにしそうなのをここに列挙しておくtest。