最新 / RSS

hiChangeLog - 個人的なPC関連メモ

これらのメモが見た方のお役に立てれば幸いです。が、浅学非才の身ゆえ誤った認識や記述も存在するので、自己責任でお願い致します。

2010-03 /
2010-03
SMTWTFS
123456
78910111213
14151617181920
21222324252627
28293031

最近 7 日分 / 今月の一覧

2010-03-08 Mon

ipythonで任意の関数の実行時にデバッガを起動する [python]

ipythonは便利だ。pdbコマンドをトグルしておくとキャッチしてない例外発生時に自動的にそこに飛んでデバッガも起動してくれる。
従って、予期せぬ例外発生時には即座に対応できるし、また、怪しい箇所に適当に例外を投げるコードを入れておけば、そこからデバッガを開始できる。以下にもその旨解説されている。http://wiki.slash-reader.com/sonota--memo/ipython_
さて任意の関数の実行時にデバッガを起動したい場合どうするか。直前に述べたように、適当なコードをあらかじめ埋めておくのがひとつの方法。でもこれに以下の不満を抱くため、代替について調べた。
・コード埋める作業が面倒
・一時的な作業のためにソースファイルに手を入れたくない

runcallを使えばいけるようだ。
aはとあるクラス、fugaはそのクラスのメソッドとすれば、以下でデバッガが起動する。

In [xx]: import pdb
In [xx]: pdb.runcall(a.fuga)
引数を渡す場合は以下の様にする。
pdb.runcall(a.fuga, s1='foo', s2='bar')
さてこのpdbはpythonのデバッガだが、これに比べ、上で述べたipythonで起動してくれるデバッガは、色付けなんかをしてくれて圧倒的に見易い。こちらを使いたい場合は以下の様にする。(引数の文字列"Linux"で色使いを指定している。これが無いと色はつかない)
In [xx]: import IPython
In [xx]: p = IPython.Debugger.Pdb('Linux')
In [xx]: p.runcall(a.fuga, s1='foo', s2='bar')

Webで調べたところ、コードに pdb.set_trace とか例外コードを埋め込む解説が目立ったので、もしかしたら上記方法は作法としての欠点があるのかもしれないが、個人的には好みなのでしばらくこれでいってみる。

以下pdbについてのページ。
pdb の使い方 -- 導入編
pdb の使い方 -- コマンド編
Pythonのデバッガ(pdb)を使う

2009-12-14 Mon

TeXで序数をらくちんに書く [TeX]

1st, 2nd とかの序数をTeXでらくちんに書くためにはどうすればよいか。
自前でカウンタ作ってやってもいいが、微妙に面倒。
http://mechanics.civil.tohoku.ac.jp/~bear/bear-collections/style-files/style-fj.html にある ordinal.sty を使えばよい。内容をそのまま転載する。

% From: asnd@reg.triumf.ca (Donald Arseneau)
% Newsgroups: comp.text.tex
% Subject: Re: Ordinal Numbers in LaTeX
% Date: 26 May 1993 15:04 PST
% Keywords: ordinals, tex, latex
%
%  Takes an integer and returns the proper suffix for an 
%  ordinal number: \nth{1}  -> 1st
%                  \nth{23} -> 23rd   etc.
%
\def\nth#1{\begingroup % [call parameter (#1) "n"]
 \@tempcnta#1\relax \the\@tempcnta % emit n
 \ifnum\@tempcnta<\z@ \@tempcnta\z@\fi % negatives all get th
 \@tempcntb\@tempcnta \divide\@tempcntb100 % hundreds
 \multiply\@tempcntb100 \advance\@tempcnta-\@tempcntb % n mod 100
 \ifnum\@tempcnta<20 \ifnum\@tempcnta>9 \@tempcnta\z@\fi\fi % teens get th
 \@tempcntb\@tempcnta \divide\@tempcntb10 % tens
 \multiply\@tempcntb10 \advance\@tempcnta-\@tempcntb % n mod 10
 \ifcase\@tempcnta th\or st\or nd\or rd\else th\fi % emit suffix
 \endgroup}
%
% Example of use:
% \def\labelenumi{\theenumi.}
% \def\theenumi{\nth{enumi}}
% to make enumerated lists come out as 1st, 2nd, 3rd, 4th, ... 123rd...
使い方。
\documentclass{article}
\usepackage{ordinalno}
\begin{document}
\nth{1} \nth{2} \nth{3} \nth{4} \nth{5} \nth{6} \nth{7}
\end{document}
スタイルファイルにするのが面倒ならどうするか。定義部分をそのままプリアンブルに書いてもうまくいかない。以下のように \makeatletter, \makeatother で括る。
\documentclass{article}
\makeatletter 
\def\nth#1{\begingroup % [call parameter (#1) "n"]
 \@tempcnta#1\relax \the\@tempcnta % emit n
 \ifnum\@tempcnta<\z@ \@tempcnta\z@\fi % negatives all get th
 \@tempcntb\@tempcnta \divide\@tempcntb100 % hundreds
 \multiply\@tempcntb100 \advance\@tempcnta-\@tempcntb % n mod 100
 \ifnum\@tempcnta<20 \ifnum\@tempcnta>9 \@tempcnta\z@\fi\fi % teens get th
 \@tempcntb\@tempcnta \divide\@tempcntb10 % tens
 \multiply\@tempcntb10 \advance\@tempcnta-\@tempcntb % n mod 10
 \ifcase\@tempcnta th\or st\or nd\or rd\else th\fi % emit suffix
 \endgroup}
\makeatother 
\begin{document}
\nth{1} \nth{2} \nth{3} \nth{4} \nth{5} \nth{6} \nth{7}
\end{document}

2009-10-06 Tue

呼出し元の関数を調べる [python]

例えば以下のようにすれば、呼んだ関数が列挙される。

for record in inspect.stack():
    print record[3],

MoinMoinを触った [python]

MoinMoinを触ってみた。1.8.5。いい感じ。
ロクにマニュアルも見ていないが、身勝手な不満:
(1)添付ファイルへのリンクがファイルと直接繋がっていない(その添付ファイルにまつわるページに行く)
(2)添付ファイルリストが名前順であり、日付順にできない。

(1)
この不満はviewメソッドの振舞にある:getメソッドが私の望む動作である。
同様に考える人は多いようだが、設計上の一貫性から、設定で変更というわけにもいかぬようだ。
[Moin-user] Changing default behavior on downloads.
なので無理矢理変える方法を考える。
viewメソッドで、action/AttachFile.py中の、_do_viewが呼ばれる。よってここで、getメソッドの中身である_do_getを呼んでしまうのがひとつのテ。
attachment書式にviewメソッドを割当てているのはformatter/text_html.py 中 attachment_linkなので、これをgetにする方が素直な方法だろう。

(2)
action/AttachFile.py 中 _build_filelist をいじる必要がある。ここに添付ファイル名がfilesとなるリストに格納されており、この順に(ブラウザ上に見える)添付ファイルリストが作られているようだ。なんで、その処理の前に日付でソートしてしまえばよい。例えば14行目あたり、"if files:"以降に下記を入れる。

       d = {}
        for file in files:
            fullpath = os.path.join(attach_dir, file).encode(config.charset)
            st = os.stat(fullpath)
            d[file] = request.user.getFormattedDateTime(st.st_mtime)
        d = sorted(d.items(), key=lambda (k, v): (v, k))
        files = map(lambda t:t[0], d)

これらの改造が悪影響を出さぬ事を祈る。

2009-09-14 Mon

Acrobatを用いて外部プロセスからPDFにリンクを設定 [COM][python][PyWin32][PDF]

[2007-01-31-01]に「javascriptによるPDFリンク制御は上書きのみ」などと書いたが、やってみたらできた。また、[2007-01-08-01]にCOMからのリンク作成は無理っぽいなどと書いたが、これもjavascriptを経由しできた。顛末をメモする。WinXP SP3 Acrobat 9.1.3 pro

まずは結論。以下のスクリプトが動いた。
python(PyWin32):

import win32com.client
import winerror
win32com.client.dynamic.ERRORS_BAD_CONTEXT.append(winerror.E_NOTIMPL) # omajinai

doc = win32com.client.Dispatch("AcroExch.App").GetActiveDoc().GetPDDoc()
jso = doc.GetJSObject() # <= this requires omajinai
link = jso.addLink(0, (70,70,225,50))
link.borderWidth = 3
link.borderColor = (u'RGB', 0, 0, 255)
link.setAction("this.pageNum = 2")

javascript: (コンソールにペーストして全部選択しCtrl+Enterすれば実行できる)
var linkRect = [70,70,225,50];
var link1= this.addLink(0, linkRect);
link1.borderWidth = 3;
link1.borderColor = color.blue;      
link1.setAction("this.pageNum = 2")

--

Acrobatには豊富なjavascript APIが提供されている。COMインターフェースもあるが、これよりも充実している。
Adobe - Acrobat Developer Center - JavaScript for Acrobat
Adobe - Acrobat Developer Center - Interapplication Communication <= COM
Acrobatを完全操作するにはJavaScriptオブジェクト(JavaScriptAPI)を覚えないとダメ!?

Adobe Acrobat 7.0例文辞典にも文例が豊富。

さてCOMによるAcrobatの操作のためには、上記理由により、COMからのjavascript呼出しが勘所となる。このためのJSObjectなるインターフェースが用意されており、VBによる例文が上のリンク中"Developing Applications Using Interapplication Communication"に出ている。(C/C++からの利用方法は多少異なるようである。JS オブジェクトを C / C++ から利用する方法についてなるそのものズバリの記述もあるがこちらは試してない。

あとはこれをpythonから呼ぶだけだが、GetJSObjectメソッドは、戻り値がちょっと特殊でLPDISPATCH*となっており、そのままではエラーが出て実行できない。回避のためには、ERRORS_BAD_CONTEXTに上記の通り値をappendしてやればよい。[python-win32] COM, Acrobat and JavaScript

2009-04-23 Thu

とにかくUSBでPICを制御する [PIC][USB]

PCから自作電子回路を制御したい場合どうするか。
インターフェースとしてRS232Cが良く使われてきたが、昨今はこれを持たないPCも多いので、USBによる制御を行いたい。
最近、USB制御に関する書籍など情報も増えてきてはいるが、何かとややこしくて取っ掛かりが掴みにくい。
下記は、細かいシキタリはさておきとにかく動かしてみるまでのメモ。WinXP MCE SP3

PIC18F2550を使う。これはコネクタ付きのマイコンボード完成品が入手容易であるため。
ソフトウェア開発にはmikroCを使う。これは、私が慣れているCで開発したいためと、USB周りのライブラリが存在しているため。接続にあたっての初期化など定型処理は既存のものに任せたい。デモ版は2KBまでのhex出力は自由に行えるが、それ以上だと要レジスト。未確認だがデモ版で下記は作製できないかもしれない。

1) mikroCでプロジェクトを新規作成し、PICとしてPIC18F2550を選択し、クロック周波数として20MHzを選択。プロジェクトへのファイル追加は行わない。
2) Library Manager から"USB"にチェック
3) Tool => HID Terminal からディスクリプタを作成する。VIDは適切な値を入れる必要があるが、電気的な動作を定めるものではない。あとは下のラジオボタンでmikroC形式を選択し"Save descriptor"する。この時デフォルトで拡張子".c"がつかないので、あらわに要指定。
4) 3)で作成したUSBdsc.cをプロジェクトに追加する
5) mikroCのExample中の"HID Read Write Test"などにある Definit.h、VARs.h をプロジェクトのディレクトリにコピーする。
6) Project => Edit Projectする。"96MHz PLL Prescaler"を"Divide by 5 (20MHz input)"に、"Full-Speed USB Clock Source Selection"を"Clock src from 96MHz PLL/2"に、"USB Voltage Regulator"を"Enable"にする。
7) 既に自動的に作成された(殆ど)カラのcソースファイルがあるので、下記を記述しビルドし書き込んで終了。

unsigned char buf_read[16], buf_write[16];

void interrupt()
{
  HID_InterruptProc();
}

void main() {
     HID_Enable(&buf_read, &buf_write);
     Delay_ms(1000);
     while (1) {
         if(HID_Read()){
             switch(buf_read[0]){
             case 'a':
                  buf_write[0] = 'z';
                  break;
             default:
                 buf_write[0] = '?';
                 break;
             }
             while(!HID_Write(&buf_write, 1));
        }
    }
    HID_Disable();
}

Tool => HID Terminal から動作を確認できる。'a'を送信したら'z'が返り、それ以外は'?'が返る。

補足1) 上記はHIDクラスのUSBデバイスを実現する(マウス等と同等)。HIDの読み書きは通常OSの機能として可能(Windowsなら、APIのWriteFile/ReadFileで可能)なので、PC側ソフトウェア開発はそれほど難しくない。(参考:PSoCをUSB(HID)デバイスとして接続しデータを受信する)「ハイパーターミナル」的な標準ターミナルがあると便利なのだけれど。
補足2) 上記は自分なりに必要最小限と判断したもので、動作確認もしたが正常だった。でもまだ余計な部分、あるいは足りない部分などあるかもしれない。
補足3) 上記は1文字の通信を行っている。複数文字いっぺんに送るには、ディスクリプタのレポート長を大きくする。(のだろう。理解しきれていない)
補足4) FT232RLもコンパクトにUSB接続(USB<=>RS232C)が可能。

2009-03-29 Sun

SKKのインストール三度 [emacs]

[2008-05-07-2]と似てるが、Windows非標準のmakeを使わないのが異なる。EmacsW32に入れることを考える。APEL10.7、SKK20090322

APEL、SKKともに同じ。makeit.bat中106行目でのEMACS環境変数指定を以下に変える。

set EMACS=C:\Program Files\Emacs\emacs\bin\emacs.exe
次にmake1.batの36(40)行目、installターゲットのEMACS変数をダブルクォーテーションで括る。
:install
"%EMACS%" -q -batch -no-site-file -l APEL-MK -f install-apel NONE %LISPDIR% %VLISPDIR%
あとは以下でOK。
makeit install

2009-02-24 Tue

revtexでbibtex使用時5人以上の著者でet al.にするためのスクリプトを書いた [TeX][python]

revtexとbibtex使用時、referenceで5人以上の著者に対しet al.で省略したいと思った。
こんな機械的な操作は当然便利な方法が用意されているものと思ったが、どうやらそうではない。

http://authors.aps.org/revtex4/revtex4_faq.html#b9

At the request of the editors, the truncation only happens when there are 10 or more authors. You will need to edit the .bbl file manually.



というわけでpythonで書いてみた。出力されたbblを直接いじっているだけ。元のファイルは".orig"を付与し保存する。

fname = 'del.bbl'
maxlen = 5

import re, os
output = ''
fnameorig = fname + '.orig'
if os.access(fnameorig, os.F_OK):
    s = open(fnameorig).read()
else:
    s = open(fname).read()
    open(fnameorig, 'w').write(s)
head, sep, body = s.partition(r'\bibitem')
output += head
reg = re.compile(r'(\\bibitem.+?)\n\n', re.DOTALL)
reg_bibitem = re.compile(r'(.+?)((?: *?\\bibinfo{author}.+?(?=\\bibinfo))+)(.+)', re.DOTALL | re.MULTILINE)
for r in reg.finditer(sep + body):
    bibitembody = r.group(1)
    rr = reg_bibitem.search(bibitembody)
    if rr:
        output += rr.group(1) # head
        authors = rr.group(2)
        a = r'\bibinfo{author}'
        authorlist = authors.split(a)[1:] # the first element is blank
        if len(authorlist)>maxlen:
            output += (a + authorlist[0]).strip().replace(',', ' \\textit{et al.},\n')
        else:
            output += authors
        output += rr.group(3) # tail
        output += '\n\n'
    else:
        print '***** error ! *****\n', bibitembody

output += '\\end{thebibliography}\n'
open(fname, 'w').write(output)

2010 : 01 02 03 04 05 06 07 08 09 10 11 12
2009 : 01 02 03 04 05 06 07 08 09 10 11 12
2008 : 01 02 03 04 05 06 07 08 09 10 11 12
2007 : 01 02 03 04 05 06 07 08 09 10 11 12
2006 : 01 02 03 04 05 06 07 08 09 10 11 12

最終更新時間: 2010-03-08 22:21