35 posts tagged “memo”
sys.stderrにメッセージを出力しているモジュールがあって、それを書き換えずに何とかしたいので考えてみた。
とりあえずうまくいったけど、いいのかわからない。
(追記
すっかり忘れてたけど、sys.stderrをほかの変数で参照してたらだめだった。当たり前なんだけど…
別モジュールで、from sys import stderrなら
モジュール名.stderrを書き換えればOK)
import sys
import logging
from StringIO import StringIO
class redir(object):
def __init__(self, f):
self.f = f
self.eol = True
def write(self, buf):
if buf == '\n':
if self.eol:
self.f('')
else:
self.eol = True
else:
self.eol = False
self.f(buf)
print >>sys.stderr, "hoge"
logging.basicConfig(filename='hoge.log', level=logging.DEBUG)
sys.stderr = redir(logging.error)
print >>sys.stderr, "hoge1"
print >>sys.stderr
print >>sys.stderr, "hoge2"
これで、最初の出力(hoge)はstderrに、以降の出力(hoge1,改行のみ,hoge2)はhoge.logに出力される。
調べ方メモ
6.6. The print statementを見て、出力先のオブジェクトにwriteが必要なことと、(必要なときは)最後に'\n'がくることはわかった。
writeに渡されるバッファに最後の改行が含まれているのか、改行だけ別に呼ばれるのか気になるので調べてみた。
適当な関数を作って、disで調べた。
>>> import dis
>>> def f():
... print >>None, None,
...
>>> def fln():
... print >>None, None
...
>>> def fnl():
... print >>None
...
>>> dis.dis(f)
2 0 LOAD_CONST 0 (None)
3 DUP_TOP
4 LOAD_CONST 0 (None)
7 ROT_TWO
8 PRINT_ITEM_TO
9 POP_TOP
10 LOAD_CONST 0 (None)
13 RETURN_VALUE
>>> dis.dis(fln)
2 0 LOAD_CONST 0 (None)
3 DUP_TOP
4 LOAD_CONST 0 (None)
7 ROT_TWO
8 PRINT_ITEM_TO
9 PRINT_NEWLINE_TO
10 LOAD_CONST 0 (None)
13 RETURN_VALUE
>>> dis(fnl)
2 0 LOAD_CONST 0 (None)
3 PRINT_NEWLINE_TO
4 LOAD_CONST 0 (None)
7 RETURN_VALUE
>>>
たぶん、PRINT_ITEM_TOがデータの出力で、PRINT_NEWLINE_TOは改行であろうことはわかる。
改行付きのprintがPRINT_ITEM_TOと、PRINT_NEWLINE_TOと二つに分かれているので、2回に分けてwriteが呼ばれそうなこともわかる。
ともかく、PRINT_ITEM_TOとPRINT_NEWLINE_TOは間違いなくキーワードなので調べると、PRINT_ITEM_TOとPRINT_NEWLINE_TOは拡張版print statementで使われるのがわかる。それぞれ出力を行う命令なので、writeが二度呼ばれるものとして扱ってよさそう。
素直にそのままloggingすると、最後の改行までログに残ってしまうので邪魔。ただ、単純に'\n'だけ渡されたときに無視するようにすると、改行だけのやつ(fnlみたいなやつ)は捨てられてしまうので(ログに出すことしか考えていないので、許容できる場面もあると思うけど)簡単に対応しておく。
- 前回の出力が改行じゃないときは無視(PRINT_ITEM_TO->PRINT_NEWLINE_TOで呼ばれる場合)
- それ以外は空文字列を出力
結果から書くと出来てない.実パーティションならcoLinux側で/dev/xxxとかを指定するので出来るみたいだけど.
coLinux側を100Mぐらいの最低限boot可能なイメージにして、ほとんどをwubi用のイメージを使うようにした.
警告なしにboot出来るようにするには
- /bin
- /etc
- /lib
- /sbin
- /var
/varは/var/run, /var/lockを上からマウントしてしまうとメッセージが出てしまうので、それ以外はbindしてかぶせてしまって構わなそう.
auto-complete.elは思った以上に便利だった.
0.1.0にしてpythom-modeでは、pysmellを使った補完を使うようにしてみた.
flyspell-modeとpredicative-modeを使ってみた.確かに英文を書くときにはいいかも.
~/.aspell.confにを書かないとaspellが動かなくてハマる.
lang en_US
フォント設定
VL Gothic-9でしばらく固定する. これだとASCII文字と日本語の文字の幅が1:2でうまく揃う.
M+1VM+IPAG circleはいつの間にかスペースとかタブの幅が日本語文字の幅になってしまうようになった。
それなりに使う方法はあったけど微妙に揃わないのでやめた.
昔(10年前ぐらい?)はYaTeXを使っていたが、なんとなくAUCTeXが使ってみたかったので、今回はAUCTeXを使うことにした.AUCTeXはパッケージで入れたが、tex-jp.elがバグっているらしいので修正版を持ってくる. reftexはemacs-snapshot-commonに入っているのをそのまま使う.
自分で環境を維持するのは面倒なのと、かぶってしまうファイルの容量がもったいないので、UTF-8を直接処理するのを諦め、標準のptexパッケージを使った.
今回はこの環境で課題を仕上げて提出した.
周りに聞くと、学校の環境(windows+秀丸)で頑張った人が多いようだ.
学校の秀丸はコンパイルとかプレビューはマクロで簡単に呼び出せるけど、
編集とか入力のサポートはなかった気がする(そういうマクロがあるのは知ってるけど、説明はなかった).
他にやったことは、PDFのしおりが化ける問題の対応ぐらい.
どのパッケージニ入っているのか分からなかったので、
- atbegshi.sty
- infwarerr.sty
tex atbegshi.dtx; tex infwarerr.dtx
したあと出来たstyをパスが通ったところに置いただけ.
あと、いろんなところで見かけるが、最近のdvipdfmxからEUC-UCS2がなくなっているので適当に調達する.
Win32用のdvipdfm-32.tar.gzからファイルを取り出した。
/etc/texmf/texmf.d/80DVIPDFMx.cnfをみるとCMAPINPUTS = .;/usr/share/fonts/cmap//
となっていたので、/usr/share/fonts/cmapの直下に置いた.
結構前になってしまったが、大学の課題でTeXを使うものがあったので、環境を改善するためにインストールしてみたときのメモ.
もともとはcoLinuxで頑張っていたんだけど、コンパイルはともかくプレビューとかがちょっと重くてイライラしたので.
(まあPDFにしてWindowsのPDFviewerで見ればよかったんだが)
ということで、coLinuxとイメージが共有できそうだし、なんかおもしろそうだったので、wubiを使ってubuntuを入れてみた.
今回インストールしたのは8.10(intrepid)で、9.4(jaunty)にすぐ切り替えた。もともとcoLinuxで使ってたのがintrepidだったので。
wubiでのインストール自体はとっても簡単なのだが、唯一ハマったのはwubiでイメージをダウンロードすると、すごく時間がかかるのと、64bit対応環境だと64bit版のイメージを持ってきてしまうこと.
時間がかかるのはともかく、32bitのイメージをダウンロードさせる方法が分からなかったので、
自分で32bit版のイメージを持ってきてそれを使った(Wubi FAQのCan I use an existing ISO/CD instead of letting Wubi download a new one?)
今回はcoLinux側からもアクセスしたいので、32bitにしておきたかった(64bit環境自体はgentooがあるし).
入れたマシンはLJ700/HベースのLaVieGだがデバイスは一通り使えるようだ.取り合えず問題なく使っているのは、
- USB
- SDカード
- PCカード
- 無線LAN
- Bluetooth
- バッテリ(ちゃんと見える)
- HDD(SATAモード)
- GMA950(compizも大丈夫)
- 音源(snd_intel_hda, ALC262. そのままだと音が小さかったり変なので、ドライバをいじった)
- 有線LAN
- 外部ディスプレイ
- シリアルポート
- モデム
- TPM
カーネルを古くすれば動くみたいだけど、DRM/DRI関連とかでそれは避けたいので、取り合えずドライバ(vmb-1.10)をいじってる.
2.6.27ではもう少しな感じで, 2.6.28では今まで使えた関数がつかえなくなるので、さらに書き換えが必要になっている.
無線LANもちょっと問題があって、自宅では802.11aで特に問題なかったが、少し前の型のルーターを使っているところでは802.11aで繋がらなかった. 802.11b/gでは繋がりはするもののDHCPでアドレスが取得できない(これはよく調べなかった).
違いはJ52かW52ぐらいしか思いつかなかったので、ルーターのファームを更新してW52にしたら無事つながった.
後になって知ったが、J52でも使えたようだ.
キーボードはcapsをctrlにするのに、gnomeで設定(xkb_optionsにctrl:nocapsを指定)したのでは、emacsなどで困るのでxmodmapで対応する(参考).
ホームディレクトリに.Xmodmapというファイル名で作っておくと、gnomeの誰かが発見して毎回ロードするか聞いてくれた.
とりあえず、NetBeansとMathematicaがcoLinux上の環境よりとても快適になったので、やった価値はあったかな.
dvi/pdfのプレビューも快適になったし、emacsも軽くなった. あとは日本語入力をなんとかしたい.
その場で作ってすぐ実行するスレッドをThreadを継承した匿名クラスで実装する。このスレッドをdaemon化するのに、次のようなやり方ではIllegalThreadStateExceptionが発生してしまう。startしたらdaemon化出来ないため。
まあ変数に一度入れてsetDaemonしてやればいいのだが、それでは負けた気がするのでちょっと考えたら、initializer使えばいいのに気付いた。
new Thread() {
@Override
public void run() {
setDaemon(true);
System.out.println("hello");
}
}.start();
new Thread() {
{
setDaemon(true);
}
@Override
public void run() {
System.out.println("hello");
}
}.start();
longの下位32bitだけ取り出そうと思って、32bitのマスクを定数で指定したらはまった。
32bitだからintでいいだろう→longと演算する時点で拡張されるから駄目。
さらに、Lつけないとlongにならないのをすっかり忘れてた。
こんなかんじ
出力
long v = -1;
System.out.println(Long.toHexString(v&0xffffffff));
System.out.println(Long.toHexString(v&(long)0xffffffff));
System.out.println(Long.toHexString(v&0xffffffffL));
ffffffffffffffff
ffffffffffffffff
ffffffff
pgrepは普通に使っていたが、同じ名前のプロセスが沢山いるときに(pythonとかjavaなんかで動くやつ等)、
-f使えば全体でマッチさせられるのね。
$ pgrep -f "^/usr/local/jdk1.6.0_10/bin/java .+ /usr/local/jdk1.6.0_10/demo/jfc/SwingSet2/SwingSet2.jar"
3013
Processing-0152では、なにもしなくてもwithout java版が動くようになってました。
よって、以下の記述は過去のものです。
Processing-0144が出ていた。
WindowsでJava無し版が動かせなかった(140あたりから同梱されているJavaを消すと動かせなくなってたいたが)ので、ソースを見たら原因が分かった。とりあえず動かせるようになった。起動時に出るエラーは以下のような文言が書いてある。
Please install JDK 1.5 or later
Processing requires a full JDK (not just a JRE) to run. Please install JDK 1.5 or later.
More information can be found in the reference.
要するに、外部JDKのtools.jarをクラスパスに入れることが出来ないのが問題。JDK1.5が入っているかチェックするところで、tools.jarに入っているクラスを使うので怒られる。
ソースを読むと、環境変数のCLASSPATHは取得はしているものの使っていない。
そうすると、環境変数のQTJAVAを使うか、args.txtしか方法がなさそう(ソースを見るまでargs.txtの存在を知らなかったが...)
まあ、外部JDKをProcessingのディレクトリにJavaと言う名前でジャンクションを作ってもよさそう。
とりあえず他への影響と間違いがなさそうな、args.txtを使うことにする。
processingのディレクトリにlibというディレクトリがあるので、そこにargs.txtを以下のような内容で作ればOK.
-Xms128m -Xmx128m
processing.app.Base
..\..\jdk1.6.0_10\lib\tools.jar,antlr.jar,core.jar,ecj.jar,jna.jar,pde.jar
1行目はjavaのオプション
2行目はメインのクラス
3行目はjarのリストで,で区切る。processingのディレクトリ\lib\各jarと言うように解釈されるので、外部JDKまでたどればいい。
ptexliveをビルドするのに、isoイメージの中身が必要らしいので適当に調べた。
すぐ思いつくのは、イメージファイルをloopでマウントする方法だが、容量に余裕があまりないcolinux側に持って行きたくない。
他に簡単にやる方法がないかと思ってみていると、coLinux 0.8からはcoscsiと言うものが出来て、ディスクイメージを普通のデバイスとしてみることが出来るらしい。参考
なので、これを使ってみた。
confにscsi0=cdrom,texlive2007-live-20070212.isoを書いて再起動すると、sr0として見えるようになる。scsi0 : Cooperative Linux SCSI Adapter
scsi 0:0:0:0: CD-ROM coLinux COCD 1.01 PQ: 0 ANSI: 2
sr0: scsi3-mmc drive: 32x/32x cd/rw xa/form2 cdda tray
Uniform CD-ROM driver Revision: 3.20
sr 0:0:0:0: Attached scsi CD-ROM sr0
マウントすると普通にアクセスできるように見えるのだが、
ファイルの中身が見られない現象が多発したのでこの方法はあきらめた。
イメージがぶっ壊れてるのかも知れないと思ったけど、壊れてなかった。何かわかったらレポートしよう…
ubuntu kernel: attempt to access beyond end of device
ubuntu kernel: sr0: rw=0, want=3344004, limit=2097151
他の方法を考えていたら、cofsでマウントしている所にイメージファイルを置いたら、
loopでマウント出来そうだなと思ってやったら出来た。
これが、再起動もいらないし、一番簡単じゃないか…
ビルド自体は、libpng12-devとzlib1g-devを入れたぐらい。
pxdviは作らない(xdvi-jaでいい)のでX関係の開発用パッケージは不要だった。
いくつかは別に必要で入れてあったので、実は使ってるかも知れないけど。